From dc214e91815e28e3261dd270e113e90f7dfcb541 Mon Sep 17 00:00:00 2001 From: jos Date: Tue, 15 Jul 2014 10:20:13 +0200 Subject: [PATCH] Fixed #216: Added options `margin.item.horizontal` and `margin.item.vertical`, which allows to specify different margins horizontally/vertically. --- HISTORY.md | 3 + dist/vis.js | 27626 ++++++++++++++-------------- dist/vis.map | 2 +- dist/vis.min.js | 32 +- docs/timeline.html | 16 +- lib/timeline/Stack.js | 22 +- lib/timeline/component/Group.js | 6 +- lib/timeline/component/ItemSet.js | 34 +- 8 files changed, 13897 insertions(+), 13844 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 93077a0d..564ff235 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -6,6 +6,8 @@ http://visjs.org ### Timeline +- Added options `margin.item.horizontal` and `margin.item.vertical`, which + allows to specify different margins horizontally/vertically. - Removed check for number of arguments in callbacks `onAdd`, `onUpdate`, `onRemove`, and `onMove`. - Fixed items in groups sometimes being displayed but not positioned correctly. @@ -19,6 +21,7 @@ http://visjs.org - Option for inherited edge colors from connected nodes. - Option to disable the drawing of nodes or edges on drag. + ## 2014-07-07, version 3.0.0 ### Timeline diff --git a/dist/vis.js b/dist/vis.js index 40366c50..5d762273 100644 --- a/dist/vis.js +++ b/dist/vis.js @@ -5,7 +5,7 @@ * A dynamic, browser-based visualization library. * * @version 3.0.1-SNAPSHOT - * @date 2014-07-11 + * @date 2014-07-15 * * @license * Copyright (C) 2011-2014 Almende B.V, http://almende.com @@ -88,16 +88,16 @@ return /******/ (function(modules) { // webpackBootstrap exports.DataView = __webpack_require__(4); // Graph3d - exports.Graph3d = __webpack_require__(11); + exports.Graph3d = __webpack_require__(5); // Timeline - exports.Timeline = __webpack_require__(5); + exports.Timeline = __webpack_require__(6); exports.Graph2d = __webpack_require__(7); exports.timeline= { - DataStep: __webpack_require__(6), - Range: __webpack_require__(8), - stack: __webpack_require__(9), - TimeStep: __webpack_require__(10), + DataStep: __webpack_require__(8), + Range: __webpack_require__(9), + stack: __webpack_require__(10), + TimeStep: __webpack_require__(11), components: { items: { @@ -2835,6007 +2835,6005 @@ return /******/ (function(modules) { // webpackBootstrap /***/ function(module, exports, __webpack_require__) { var Emitter = __webpack_require__(41); - var Hammer = __webpack_require__(50); - var util = __webpack_require__(1); var DataSet = __webpack_require__(3); var DataView = __webpack_require__(4); - var Range = __webpack_require__(8); - var TimeAxis = __webpack_require__(21); - var CurrentTime = __webpack_require__(13); - var CustomTime = __webpack_require__(14); - var ItemSet = __webpack_require__(18); + var Point3d = __webpack_require__(33); + var Point2d = __webpack_require__(34); + var Filter = __webpack_require__(35); + var StepNumber = __webpack_require__(36); /** - * Create a timeline visualization - * @param {HTMLElement} container - * @param {vis.DataSet | Array | google.visualization.DataTable} [items] - * @param {Object} [options] See Timeline.setOptions for the available options. - * @constructor + * @constructor Graph3d + * Graph3d displays data in 3d. + * + * Graph3d is developed in javascript as a Google Visualization Chart. + * + * @param {Element} container The DOM element in which the Graph3d will + * be created. Normally a div element. + * @param {DataSet | DataView | Array} [data] + * @param {Object} [options] */ - function Timeline (container, items, options) { - if (!(this instanceof Timeline)) { + function Graph3d(container, data, options) { + if (!(this instanceof Graph3d)) { throw new SyntaxError('Constructor must be called with the new operator'); } - var me = this; - this.defaultOptions = { - start: null, - end: null, - - autoResize: true, - - orientation: 'bottom', - width: null, - height: null, - maxHeight: null, - minHeight: null - }; - this.options = util.deepExtend({}, this.defaultOptions); + // create variables and set default values + this.containerElement = container; + this.width = '400px'; + this.height = '400px'; + this.margin = 10; // px + this.defaultXCenter = '55%'; + this.defaultYCenter = '50%'; - // Create the DOM, props, and emitter - this._create(container); + this.xLabel = 'x'; + this.yLabel = 'y'; + this.zLabel = 'z'; + this.filterLabel = 'time'; + this.legendLabel = 'value'; - // all components listed here will be repainted automatically - this.components = []; + this.style = Graph3d.STYLE.DOT; + this.showPerspective = true; + this.showGrid = true; + this.keepAspectRatio = true; + this.showShadow = false; + this.showGrayBottom = false; // TODO: this does not work correctly + this.showTooltip = false; + this.verticalRatio = 0.5; // 0.1 to 1.0, where 1.0 results in a 'cube' - this.body = { - dom: this.dom, - domProps: this.props, - emitter: { - on: this.on.bind(this), - off: this.off.bind(this), - emit: this.emit.bind(this) - }, - util: { - snap: null, // will be specified after TimeAxis is created - toScreen: me._toScreen.bind(me), - toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width - toTime: me._toTime.bind(me), - toGlobalTime : me._toGlobalTime.bind(me) - } - }; + this.animationInterval = 1000; // milliseconds + this.animationPreload = false; - // range - this.range = new Range(this.body); - this.components.push(this.range); - this.body.range = this.range; + this.camera = new Graph3d.Camera(); + this.eye = new Point3d(0, 0, -1); // TODO: set eye.z about 3/4 of the width of the window? - // time axis - this.timeAxis = new TimeAxis(this.body); - this.components.push(this.timeAxis); - this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); + this.dataTable = null; // The original data table + this.dataPoints = null; // The table with point objects - // current time bar - this.currentTime = new CurrentTime(this.body); - this.components.push(this.currentTime); + // the column indexes + this.colX = undefined; + this.colY = undefined; + this.colZ = undefined; + this.colValue = undefined; + this.colFilter = undefined; - // custom time bar - // Note: time bar will be attached in this.setOptions when selected - this.customTime = new CustomTime(this.body); - this.components.push(this.customTime); + this.xMin = 0; + this.xStep = undefined; // auto by default + this.xMax = 1; + this.yMin = 0; + this.yStep = undefined; // auto by default + this.yMax = 1; + this.zMin = 0; + this.zStep = undefined; // auto by default + this.zMax = 1; + this.valueMin = 0; + this.valueMax = 1; + this.xBarWidth = 1; + this.yBarWidth = 1; + // TODO: customize axis range - // item set - this.itemSet = new ItemSet(this.body); - this.components.push(this.itemSet); + // constants + this.colorAxis = '#4D4D4D'; + this.colorGrid = '#D3D3D3'; + this.colorDot = '#7DC1FF'; + this.colorDotBorder = '#3267D2'; - this.itemsData = null; // DataSet - this.groupsData = null; // DataSet + // create a frame and canvas + this.create(); - // apply options - if (options) { - this.setOptions(options); - } + // apply options (also when undefined) + this.setOptions(options); - // create itemset - if (items) { - this.setItems(items); - } - else { - this.redraw(); + // apply data + if (data) { + this.setData(data); } } - // turn Timeline into an event emitter - Emitter(Timeline.prototype); + // Extend Graph3d with an Emitter mixin + Emitter(Graph3d.prototype); /** - * Create the main DOM for the Timeline: a root panel containing left, right, - * top, bottom, content, and background panel. - * @param {Element} container The container element where the Timeline will - * be attached. - * @private + * @class Camera + * The camera is mounted on a (virtual) camera arm. The camera arm can rotate + * The camera is always looking in the direction of the origin of the arm. + * This way, the camera always rotates around one fixed point, the location + * of the camera arm. + * + * Documentation: + * http://en.wikipedia.org/wiki/3D_projection */ - Timeline.prototype._create = function (container) { - this.dom = {}; + Graph3d.Camera = function () { + this.armLocation = new Point3d(); + this.armRotation = {}; + this.armRotation.horizontal = 0; + this.armRotation.vertical = 0; + this.armLength = 1.7; - this.dom.root = document.createElement('div'); - this.dom.background = document.createElement('div'); - this.dom.backgroundVertical = document.createElement('div'); - this.dom.backgroundHorizontal = document.createElement('div'); - this.dom.centerContainer = document.createElement('div'); - this.dom.leftContainer = document.createElement('div'); - this.dom.rightContainer = document.createElement('div'); - this.dom.center = document.createElement('div'); - this.dom.left = document.createElement('div'); - this.dom.right = document.createElement('div'); - this.dom.top = document.createElement('div'); - this.dom.bottom = document.createElement('div'); - this.dom.shadowTop = document.createElement('div'); - this.dom.shadowBottom = document.createElement('div'); - this.dom.shadowTopLeft = document.createElement('div'); - this.dom.shadowBottomLeft = document.createElement('div'); - this.dom.shadowTopRight = document.createElement('div'); - this.dom.shadowBottomRight = document.createElement('div'); + this.cameraLocation = new Point3d(); + this.cameraRotation = new Point3d(0.5*Math.PI, 0, 0); - this.dom.background.className = 'vispanel background'; - this.dom.backgroundVertical.className = 'vispanel background vertical'; - this.dom.backgroundHorizontal.className = 'vispanel background horizontal'; - this.dom.centerContainer.className = 'vispanel center'; - this.dom.leftContainer.className = 'vispanel left'; - this.dom.rightContainer.className = 'vispanel right'; - this.dom.top.className = 'vispanel top'; - this.dom.bottom.className = 'vispanel bottom'; - this.dom.left.className = 'content'; - this.dom.center.className = 'content'; - this.dom.right.className = 'content'; - this.dom.shadowTop.className = 'shadow top'; - this.dom.shadowBottom.className = 'shadow bottom'; - this.dom.shadowTopLeft.className = 'shadow top'; - this.dom.shadowBottomLeft.className = 'shadow bottom'; - this.dom.shadowTopRight.className = 'shadow top'; - this.dom.shadowBottomRight.className = 'shadow bottom'; + this.calculateCameraOrientation(); + }; - this.dom.root.appendChild(this.dom.background); - this.dom.root.appendChild(this.dom.backgroundVertical); - this.dom.root.appendChild(this.dom.backgroundHorizontal); - this.dom.root.appendChild(this.dom.centerContainer); - this.dom.root.appendChild(this.dom.leftContainer); - this.dom.root.appendChild(this.dom.rightContainer); - this.dom.root.appendChild(this.dom.top); - this.dom.root.appendChild(this.dom.bottom); + /** + * Set the location (origin) of the arm + * @param {Number} x Normalized value of x + * @param {Number} y Normalized value of y + * @param {Number} z Normalized value of z + */ + Graph3d.Camera.prototype.setArmLocation = function(x, y, z) { + this.armLocation.x = x; + this.armLocation.y = y; + this.armLocation.z = z; - this.dom.centerContainer.appendChild(this.dom.center); - this.dom.leftContainer.appendChild(this.dom.left); - this.dom.rightContainer.appendChild(this.dom.right); + this.calculateCameraOrientation(); + }; - this.dom.centerContainer.appendChild(this.dom.shadowTop); - this.dom.centerContainer.appendChild(this.dom.shadowBottom); - this.dom.leftContainer.appendChild(this.dom.shadowTopLeft); - this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft); - this.dom.rightContainer.appendChild(this.dom.shadowTopRight); - this.dom.rightContainer.appendChild(this.dom.shadowBottomRight); + /** + * Set the rotation of the camera arm + * @param {Number} horizontal The horizontal rotation, between 0 and 2*PI. + * Optional, can be left undefined. + * @param {Number} vertical The vertical rotation, between 0 and 0.5*PI + * if vertical=0.5*PI, the graph is shown from the + * top. Optional, can be left undefined. + */ + Graph3d.Camera.prototype.setArmRotation = function(horizontal, vertical) { + if (horizontal !== undefined) { + this.armRotation.horizontal = horizontal; + } - this.on('rangechange', this.redraw.bind(this)); - this.on('change', this.redraw.bind(this)); - this.on('touch', this._onTouch.bind(this)); - this.on('pinch', this._onPinch.bind(this)); - this.on('dragstart', this._onDragStart.bind(this)); - this.on('drag', this._onDrag.bind(this)); - - // create event listeners for all interesting events, these events will be - // emitted via emitter - this.hammer = Hammer(this.dom.root, { - prevent_default: true - }); - this.listeners = {}; - - var me = this; - var events = [ - 'touch', 'pinch', - 'tap', 'doubletap', 'hold', - 'dragstart', 'drag', 'dragend', - 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox - ]; - events.forEach(function (event) { - var listener = function () { - var args = [event].concat(Array.prototype.slice.call(arguments, 0)); - me.emit.apply(me, args); - }; - me.hammer.on(event, listener); - me.listeners[event] = listener; - }); - - // size properties of each of the panels - this.props = { - root: {}, - background: {}, - centerContainer: {}, - leftContainer: {}, - rightContainer: {}, - center: {}, - left: {}, - right: {}, - top: {}, - bottom: {}, - border: {}, - scrollTop: 0, - scrollTopMin: 0 - }; - this.touch = {}; // store state information needed for touch events + if (vertical !== undefined) { + this.armRotation.vertical = vertical; + if (this.armRotation.vertical < 0) this.armRotation.vertical = 0; + if (this.armRotation.vertical > 0.5*Math.PI) this.armRotation.vertical = 0.5*Math.PI; + } - // attach the root panel to the provided container - if (!container) throw new Error('No container provided'); - container.appendChild(this.dom.root); + if (horizontal !== undefined || vertical !== undefined) { + this.calculateCameraOrientation(); + } }; /** - * Destroy the Timeline, clean up all DOM elements and event listeners. + * Retrieve the current arm rotation + * @return {object} An object with parameters horizontal and vertical */ - Timeline.prototype.destroy = function () { - // unbind datasets - this.clear(); - - // remove all event listeners - this.off(); - - // stop checking for changed size - this._stopAutoResize(); - - // remove from DOM - if (this.dom.root.parentNode) { - this.dom.root.parentNode.removeChild(this.dom.root); - } - this.dom = null; - - // cleanup hammer touch events - for (var event in this.listeners) { - if (this.listeners.hasOwnProperty(event)) { - delete this.listeners[event]; - } - } - this.listeners = null; - this.hammer = null; - - // give all components the opportunity to cleanup - this.components.forEach(function (component) { - component.destroy(); - }); + Graph3d.Camera.prototype.getArmRotation = function() { + var rot = {}; + rot.horizontal = this.armRotation.horizontal; + rot.vertical = this.armRotation.vertical; - this.body = null; + return rot; }; /** - * Set options. Options will be passed to all components loaded in the Timeline. - * @param {Object} [options] - * {String} orientation - * Vertical orientation for the Timeline, - * can be 'bottom' (default) or 'top'. - * {String | Number} width - * Width for the timeline, a number in pixels or - * a css string like '1000px' or '75%'. '100%' by default. - * {String | Number} height - * Fixed height for the Timeline, a number in pixels or - * a css string like '400px' or '75%'. If undefined, - * The Timeline will automatically size such that - * its contents fit. - * {String | Number} minHeight - * Minimum height for the Timeline, a number in pixels or - * a css string like '400px' or '75%'. - * {String | Number} maxHeight - * Maximum height for the Timeline, a number in pixels or - * a css string like '400px' or '75%'. - * {Number | Date | String} start - * Start date for the visible window - * {Number | Date | String} end - * End date for the visible window + * Set the (normalized) length of the camera arm. + * @param {Number} length A length between 0.71 and 5.0 */ - Timeline.prototype.setOptions = function (options) { - if (options) { - // copy the known options - var fields = ['width', 'height', 'minHeight', 'maxHeight', 'autoResize', 'start', 'end', 'orientation']; - util.selectiveExtend(fields, this.options, options); + Graph3d.Camera.prototype.setArmLength = function(length) { + if (length === undefined) + return; - // enable/disable autoResize - this._initAutoResize(); - } + this.armLength = length; - // propagate options to all components - this.components.forEach(function (component) { - component.setOptions(options); - }); + // Radius must be larger than the corner of the graph, + // which has a distance of sqrt(0.5^2+0.5^2) = 0.71 from the center of the + // graph + if (this.armLength < 0.71) this.armLength = 0.71; + if (this.armLength > 5.0) this.armLength = 5.0; - // TODO: remove deprecation error one day (deprecated since version 0.8.0) - if (options && options.order) { - throw new Error('Option order is deprecated. There is no replacement for this feature.'); - } + this.calculateCameraOrientation(); + }; - // redraw everything - this.redraw(); + /** + * Retrieve the arm length + * @return {Number} length + */ + Graph3d.Camera.prototype.getArmLength = function() { + return this.armLength; }; /** - * Set a custom time bar - * @param {Date} time + * Retrieve the camera location + * @return {Point3d} cameraLocation */ - Timeline.prototype.setCustomTime = function (time) { - if (!this.customTime) { - throw new Error('Cannot get custom time: Custom time bar is not enabled'); - } + Graph3d.Camera.prototype.getCameraLocation = function() { + return this.cameraLocation; + }; - this.customTime.setCustomTime(time); + /** + * Retrieve the camera rotation + * @return {Point3d} cameraRotation + */ + Graph3d.Camera.prototype.getCameraRotation = function() { + return this.cameraRotation; }; /** - * Retrieve the current custom time. - * @return {Date} customTime + * Calculate the location and rotation of the camera based on the + * position and orientation of the camera arm */ - Timeline.prototype.getCustomTime = function() { - if (!this.customTime) { - throw new Error('Cannot get custom time: Custom time bar is not enabled'); - } + Graph3d.Camera.prototype.calculateCameraOrientation = function() { + // calculate location of the camera + this.cameraLocation.x = this.armLocation.x - this.armLength * Math.sin(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); + this.cameraLocation.y = this.armLocation.y - this.armLength * Math.cos(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); + this.cameraLocation.z = this.armLocation.z + this.armLength * Math.sin(this.armRotation.vertical); - return this.customTime.getCustomTime(); + // calculate rotation of the camera + this.cameraRotation.x = Math.PI/2 - this.armRotation.vertical; + this.cameraRotation.y = 0; + this.cameraRotation.z = -this.armRotation.horizontal; }; /** - * Set items - * @param {vis.DataSet | Array | google.visualization.DataTable | null} items + * Calculate the scaling values, dependent on the range in x, y, and z direction */ - Timeline.prototype.setItems = function(items) { - var initialLoad = (this.itemsData == null); + Graph3d.prototype._setScale = function() { + this.scale = new Point3d(1 / (this.xMax - this.xMin), + 1 / (this.yMax - this.yMin), + 1 / (this.zMax - this.zMin)); - // convert to type DataSet when needed - var newDataSet; - if (!items) { - newDataSet = null; - } - else if (items instanceof DataSet || items instanceof DataView) { - newDataSet = items; - } - else { - // turn an array into a dataset - newDataSet = new DataSet(items, { - type: { - start: 'Date', - end: 'Date' - } - }); + // keep aspect ration between x and y scale if desired + if (this.keepAspectRatio) { + if (this.scale.x < this.scale.y) { + //noinspection JSSuspiciousNameCombination + this.scale.y = this.scale.x; + } + else { + //noinspection JSSuspiciousNameCombination + this.scale.x = this.scale.y; + } } - // set items - this.itemsData = newDataSet; - this.itemSet && this.itemSet.setItems(newDataSet); - - if (initialLoad && ('start' in this.options || 'end' in this.options)) { - this.fit(); + // scale the vertical axis + this.scale.z *= this.verticalRatio; + // TODO: can this be automated? verticalRatio? - var start = ('start' in this.options) ? util.convert(this.options.start, 'Date') : null; - var end = ('end' in this.options) ? util.convert(this.options.end, 'Date') : null; + // determine scale for (optional) value + this.scale.value = 1 / (this.valueMax - this.valueMin); - this.setWindow(start, end); - } + // position the camera arm + var xCenter = (this.xMax + this.xMin) / 2 * this.scale.x; + var yCenter = (this.yMax + this.yMin) / 2 * this.scale.y; + var zCenter = (this.zMax + this.zMin) / 2 * this.scale.z; + this.camera.setArmLocation(xCenter, yCenter, zCenter); }; + /** - * Set groups - * @param {vis.DataSet | Array | google.visualization.DataTable} groups + * Convert a 3D location to a 2D location on screen + * http://en.wikipedia.org/wiki/3D_projection + * @param {Point3d} point3d A 3D point with parameters x, y, z + * @return {Point2d} point2d A 2D point with parameters x, y */ - Timeline.prototype.setGroups = function(groups) { - // convert to type DataSet when needed - var newDataSet; - if (!groups) { - newDataSet = null; - } - else if (groups instanceof DataSet || groups instanceof DataView) { - newDataSet = groups; - } - else { - // turn an array into a dataset - newDataSet = new DataSet(groups); - } - - this.groupsData = newDataSet; - this.itemSet.setGroups(newDataSet); + Graph3d.prototype._convert3Dto2D = function(point3d) { + var translation = this._convertPointToTranslation(point3d); + return this._convertTranslationToScreen(translation); }; /** - * Clear the Timeline. By Default, items, groups and options are cleared. - * Example usage: - * - * timeline.clear(); // clear items, groups, and options - * timeline.clear({options: true}); // clear options only - * - * @param {Object} [what] Optionally specify what to clear. By default: - * {items: true, groups: true, options: true} + * Convert a 3D location its translation seen from the camera + * http://en.wikipedia.org/wiki/3D_projection + * @param {Point3d} point3d A 3D point with parameters x, y, z + * @return {Point3d} translation A 3D point with parameters x, y, z This is + * the translation of the point, seen from the + * camera */ - Timeline.prototype.clear = function(what) { - // clear items - if (!what || what.items) { - this.setItems(null); - } + Graph3d.prototype._convertPointToTranslation = function(point3d) { + var ax = point3d.x * this.scale.x, + ay = point3d.y * this.scale.y, + az = point3d.z * this.scale.z, - // clear groups - if (!what || what.groups) { - this.setGroups(null); - } + cx = this.camera.getCameraLocation().x, + cy = this.camera.getCameraLocation().y, + cz = this.camera.getCameraLocation().z, - // clear options of timeline and of each of the components - if (!what || what.options) { - this.components.forEach(function (component) { - component.setOptions(component.defaultOptions); - }); + // calculate angles + sinTx = Math.sin(this.camera.getCameraRotation().x), + cosTx = Math.cos(this.camera.getCameraRotation().x), + sinTy = Math.sin(this.camera.getCameraRotation().y), + cosTy = Math.cos(this.camera.getCameraRotation().y), + sinTz = Math.sin(this.camera.getCameraRotation().z), + cosTz = Math.cos(this.camera.getCameraRotation().z), - this.setOptions(this.defaultOptions); // this will also do a redraw - } + // calculate translation + dx = cosTy * (sinTz * (ay - cy) + cosTz * (ax - cx)) - sinTy * (az - cz), + dy = sinTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) + cosTx * (cosTz * (ay - cy) - sinTz * (ax-cx)), + dz = cosTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) - sinTx * (cosTz * (ay - cy) - sinTz * (ax-cx)); + + return new Point3d(dx, dy, dz); }; /** - * Set Timeline window such that it fits all items + * Convert a translation point to a point on the screen + * @param {Point3d} translation A 3D point with parameters x, y, z This is + * the translation of the point, seen from the + * camera + * @return {Point2d} point2d A 2D point with parameters x, y */ - Timeline.prototype.fit = function() { - // apply the data range as range - var dataRange = this.getItemRange(); + Graph3d.prototype._convertTranslationToScreen = function(translation) { + var ex = this.eye.x, + ey = this.eye.y, + ez = this.eye.z, + dx = translation.x, + dy = translation.y, + dz = translation.z; - // add 5% space on both sides - var start = dataRange.min; - var end = dataRange.max; - if (start != null && end != null) { - var interval = (end.valueOf() - start.valueOf()); - if (interval <= 0) { - // prevent an empty interval - interval = 24 * 60 * 60 * 1000; // 1 day - } - start = new Date(start.valueOf() - interval * 0.05); - end = new Date(end.valueOf() + interval * 0.05); + // calculate position on screen from translation + var bx; + var by; + if (this.showPerspective) { + bx = (dx - ex) * (ez / dz); + by = (dy - ey) * (ez / dz); } - - // skip range set if there is no start and end date - if (start === null && end === null) { - return; + else { + bx = dx * -(ez / this.camera.getArmLength()); + by = dy * -(ez / this.camera.getArmLength()); } - this.range.setRange(start, end); + // shift and scale the point to the center of the screen + // use the width of the graph to scale both horizontally and vertically. + return new Point2d( + this.xcenter + bx * this.frame.canvas.clientWidth, + this.ycenter - by * this.frame.canvas.clientWidth); }; /** - * Get the data range of the item set. - * @returns {{min: Date, max: Date}} range A range with a start and end Date. - * When no minimum is found, min==null - * When no maximum is found, max==null + * Set the background styling for the graph + * @param {string | {fill: string, stroke: string, strokeWidth: string}} backgroundColor */ - Timeline.prototype.getItemRange = function() { - // calculate min from start filed - var dataset = this.itemsData.getDataSet(), - min = null, - max = null; - - if (dataset) { - // calculate the minimum value of the field 'start' - var minItem = dataset.min('start'); - min = minItem ? util.convert(minItem.start, 'Date').valueOf() : null; - // Note: we convert first to Date and then to number because else - // a conversion from ISODate to Number will fail + Graph3d.prototype._setBackgroundColor = function(backgroundColor) { + var fill = 'white'; + var stroke = 'gray'; + var strokeWidth = 1; - // calculate maximum value of fields 'start' and 'end' - var maxStartItem = dataset.max('start'); - if (maxStartItem) { - max = util.convert(maxStartItem.start, 'Date').valueOf(); - } - var maxEndItem = dataset.max('end'); - if (maxEndItem) { - if (max == null) { - max = util.convert(maxEndItem.end, 'Date').valueOf(); - } - else { - max = Math.max(max, util.convert(maxEndItem.end, 'Date').valueOf()); - } - } + if (typeof(backgroundColor) === 'string') { + fill = backgroundColor; + stroke = 'none'; + strokeWidth = 0; + } + else if (typeof(backgroundColor) === 'object') { + if (backgroundColor.fill !== undefined) fill = backgroundColor.fill; + if (backgroundColor.stroke !== undefined) stroke = backgroundColor.stroke; + if (backgroundColor.strokeWidth !== undefined) strokeWidth = backgroundColor.strokeWidth; + } + else if (backgroundColor === undefined) { + // use use defaults + } + else { + throw 'Unsupported type of backgroundColor'; } - return { - min: (min != null) ? new Date(min) : null, - max: (max != null) ? new Date(max) : null - }; + this.frame.style.backgroundColor = fill; + this.frame.style.borderColor = stroke; + this.frame.style.borderWidth = strokeWidth + 'px'; + this.frame.style.borderStyle = 'solid'; }; - /** - * Set selected items by their id. Replaces the current selection - * Unknown id's are silently ignored. - * @param {Array} [ids] An array with zero or more id's of the items to be - * selected. If ids is an empty array, all items will be - * unselected. - */ - Timeline.prototype.setSelection = function(ids) { - this.itemSet && this.itemSet.setSelection(ids); - }; - /** - * Get the selected items by their id - * @return {Array} ids The ids of the selected items - */ - Timeline.prototype.getSelection = function() { - return this.itemSet && this.itemSet.getSelection() || []; + /// enumerate the available styles + Graph3d.STYLE = { + BAR: 0, + BARCOLOR: 1, + BARSIZE: 2, + DOT : 3, + DOTLINE : 4, + DOTCOLOR: 5, + DOTSIZE: 6, + GRID : 7, + LINE: 8, + SURFACE : 9 }; /** - * Set the visible window. Both parameters are optional, you can change only - * start or only end. Syntax: - * - * TimeLine.setWindow(start, end) - * TimeLine.setWindow(range) - * - * Where start and end can be a Date, number, or string, and range is an - * object with properties start and end. - * - * @param {Date | Number | String | Object} [start] Start date of visible window - * @param {Date | Number | String} [end] End date of visible window + * Retrieve the style index from given styleName + * @param {string} styleName Style name such as 'dot', 'grid', 'dot-line' + * @return {Number} styleNumber Enumeration value representing the style, or -1 + * when not found */ - Timeline.prototype.setWindow = function(start, end) { - if (arguments.length == 1) { - var range = arguments[0]; - this.range.setRange(range.start, range.end); - } - else { - this.range.setRange(start, end); + Graph3d.prototype._getStyleNumber = function(styleName) { + switch (styleName) { + case 'dot': return Graph3d.STYLE.DOT; + case 'dot-line': return Graph3d.STYLE.DOTLINE; + case 'dot-color': return Graph3d.STYLE.DOTCOLOR; + case 'dot-size': return Graph3d.STYLE.DOTSIZE; + case 'line': return Graph3d.STYLE.LINE; + case 'grid': return Graph3d.STYLE.GRID; + case 'surface': return Graph3d.STYLE.SURFACE; + case 'bar': return Graph3d.STYLE.BAR; + case 'bar-color': return Graph3d.STYLE.BARCOLOR; + case 'bar-size': return Graph3d.STYLE.BARSIZE; } - }; - /** - * Get the visible window - * @return {{start: Date, end: Date}} Visible range - */ - Timeline.prototype.getWindow = function() { - var range = this.range.getRange(); - return { - start: new Date(range.start), - end: new Date(range.end) - }; + return -1; }; /** - * Force a redraw of the Timeline. Can be useful to manually redraw when - * option autoResize=false + * Determine the indexes of the data columns, based on the given style and data + * @param {DataSet} data + * @param {Number} style */ - Timeline.prototype.redraw = function() { - var resized = false, - options = this.options, - props = this.props, - dom = this.dom; - - if (!dom) return; // when destroyed - - // update class names - dom.root.className = 'vis timeline root ' + options.orientation; - - // update root width and height options - dom.root.style.maxHeight = util.option.asSize(options.maxHeight, ''); - dom.root.style.minHeight = util.option.asSize(options.minHeight, ''); - dom.root.style.width = util.option.asSize(options.width, ''); - - // calculate border widths - props.border.left = (dom.centerContainer.offsetWidth - dom.centerContainer.clientWidth) / 2; - props.border.right = props.border.left; - props.border.top = (dom.centerContainer.offsetHeight - dom.centerContainer.clientHeight) / 2; - props.border.bottom = props.border.top; - var borderRootHeight= dom.root.offsetHeight - dom.root.clientHeight; - var borderRootWidth = dom.root.offsetWidth - dom.root.clientWidth; - - // calculate the heights. If any of the side panels is empty, we set the height to - // minus the border width, such that the border will be invisible - props.center.height = dom.center.offsetHeight; - props.left.height = dom.left.offsetHeight; - props.right.height = dom.right.offsetHeight; - props.top.height = dom.top.clientHeight || -props.border.top; - props.bottom.height = dom.bottom.clientHeight || -props.border.bottom; - - // TODO: compensate borders when any of the panels is empty. - - // apply auto height - // TODO: only calculate autoHeight when needed (else we cause an extra reflow/repaint of the DOM) - var contentHeight = Math.max(props.left.height, props.center.height, props.right.height); - var autoHeight = props.top.height + contentHeight + props.bottom.height + - borderRootHeight + props.border.top + props.border.bottom; - dom.root.style.height = util.option.asSize(options.height, autoHeight + 'px'); - - // calculate heights of the content panels - props.root.height = dom.root.offsetHeight; - props.background.height = props.root.height - borderRootHeight; - var containerHeight = props.root.height - props.top.height - props.bottom.height - - borderRootHeight; - props.centerContainer.height = containerHeight; - props.leftContainer.height = containerHeight; - props.rightContainer.height = props.leftContainer.height; - - // calculate the widths of the panels - props.root.width = dom.root.offsetWidth; - props.background.width = props.root.width - borderRootWidth; - props.left.width = dom.leftContainer.clientWidth || -props.border.left; - props.leftContainer.width = props.left.width; - props.right.width = dom.rightContainer.clientWidth || -props.border.right; - props.rightContainer.width = props.right.width; - var centerWidth = props.root.width - props.left.width - props.right.width - borderRootWidth; - props.center.width = centerWidth; - props.centerContainer.width = centerWidth; - props.top.width = centerWidth; - props.bottom.width = centerWidth; + Graph3d.prototype._determineColumnIndexes = function(data, style) { + if (this.style === Graph3d.STYLE.DOT || + this.style === Graph3d.STYLE.DOTLINE || + this.style === Graph3d.STYLE.LINE || + this.style === Graph3d.STYLE.GRID || + this.style === Graph3d.STYLE.SURFACE || + this.style === Graph3d.STYLE.BAR) { + // 3 columns expected, and optionally a 4th with filter values + this.colX = 0; + this.colY = 1; + this.colZ = 2; + this.colValue = undefined; - // resize the panels - dom.background.style.height = props.background.height + 'px'; - dom.backgroundVertical.style.height = props.background.height + 'px'; - dom.backgroundHorizontal.style.height = props.centerContainer.height + 'px'; - dom.centerContainer.style.height = props.centerContainer.height + 'px'; - dom.leftContainer.style.height = props.leftContainer.height + 'px'; - dom.rightContainer.style.height = props.rightContainer.height + 'px'; + if (data.getNumberOfColumns() > 3) { + this.colFilter = 3; + } + } + else if (this.style === Graph3d.STYLE.DOTCOLOR || + this.style === Graph3d.STYLE.DOTSIZE || + this.style === Graph3d.STYLE.BARCOLOR || + this.style === Graph3d.STYLE.BARSIZE) { + // 4 columns expected, and optionally a 5th with filter values + this.colX = 0; + this.colY = 1; + this.colZ = 2; + this.colValue = 3; - dom.background.style.width = props.background.width + 'px'; - dom.backgroundVertical.style.width = props.centerContainer.width + 'px'; - dom.backgroundHorizontal.style.width = props.background.width + 'px'; - dom.centerContainer.style.width = props.center.width + 'px'; - dom.top.style.width = props.top.width + 'px'; - dom.bottom.style.width = props.bottom.width + 'px'; + if (data.getNumberOfColumns() > 4) { + this.colFilter = 4; + } + } + else { + throw 'Unknown style "' + this.style + '"'; + } + }; - // reposition the panels - dom.background.style.left = '0'; - dom.background.style.top = '0'; - dom.backgroundVertical.style.left = props.left.width + 'px'; - dom.backgroundVertical.style.top = '0'; - dom.backgroundHorizontal.style.left = '0'; - dom.backgroundHorizontal.style.top = props.top.height + 'px'; - dom.centerContainer.style.left = props.left.width + 'px'; - dom.centerContainer.style.top = props.top.height + 'px'; - dom.leftContainer.style.left = '0'; - dom.leftContainer.style.top = props.top.height + 'px'; - dom.rightContainer.style.left = (props.left.width + props.center.width) + 'px'; - dom.rightContainer.style.top = props.top.height + 'px'; - dom.top.style.left = props.left.width + 'px'; - dom.top.style.top = '0'; - dom.bottom.style.left = props.left.width + 'px'; - dom.bottom.style.top = (props.top.height + props.centerContainer.height) + 'px'; + Graph3d.prototype.getNumberOfRows = function(data) { + return data.length; + } - // update the scrollTop, feasible range for the offset can be changed - // when the height of the Timeline or of the contents of the center changed - this._updateScrollTop(); - // reposition the scrollable contents - var offset = this.props.scrollTop; - if (options.orientation == 'bottom') { - offset += Math.max(this.props.centerContainer.height - this.props.center.height - - this.props.border.top - this.props.border.bottom, 0); + Graph3d.prototype.getNumberOfColumns = function(data) { + var counter = 0; + for (var column in data[0]) { + if (data[0].hasOwnProperty(column)) { + counter++; + } } - dom.center.style.left = '0'; - dom.center.style.top = offset + 'px'; - dom.left.style.left = '0'; - dom.left.style.top = offset + 'px'; - dom.right.style.left = '0'; - dom.right.style.top = offset + 'px'; + return counter; + } - // show shadows when vertical scrolling is available - var visibilityTop = this.props.scrollTop == 0 ? 'hidden' : ''; - var visibilityBottom = this.props.scrollTop == this.props.scrollTopMin ? 'hidden' : ''; - dom.shadowTop.style.visibility = visibilityTop; - dom.shadowBottom.style.visibility = visibilityBottom; - dom.shadowTopLeft.style.visibility = visibilityTop; - dom.shadowBottomLeft.style.visibility = visibilityBottom; - dom.shadowTopRight.style.visibility = visibilityTop; - dom.shadowBottomRight.style.visibility = visibilityBottom; - // redraw all components - this.components.forEach(function (component) { - resized = component.redraw() || resized; - }); - if (resized) { - // keep repainting until all sizes are settled - this.redraw(); + Graph3d.prototype.getDistinctValues = function(data, column) { + var distinctValues = []; + for (var i = 0; i < data.length; i++) { + if (distinctValues.indexOf(data[i][column]) == -1) { + distinctValues.push(data[i][column]); + } } - }; - - // TODO: deprecated since version 1.1.0, remove some day - Timeline.prototype.repaint = function () { - throw new Error('Function repaint is deprecated. Use redraw instead.'); - }; - - /** - * Convert a position on screen (pixels) to a datetime - * @param {int} x Position on the screen in pixels - * @return {Date} time The datetime the corresponds with given position x - * @private - */ - // TODO: move this function to Range - Timeline.prototype._toTime = function(x) { - var conversion = this.range.conversion(this.props.center.width); - return new Date(x / conversion.scale + conversion.offset); - }; + return distinctValues; + } - /** - * Convert a position on the global screen (pixels) to a datetime - * @param {int} x Position on the screen in pixels - * @return {Date} time The datetime the corresponds with given position x - * @private - */ - // TODO: move this function to Range - Timeline.prototype._toGlobalTime = function(x) { - var conversion = this.range.conversion(this.props.root.width); - return new Date(x / conversion.scale + conversion.offset); + Graph3d.prototype.getColumnRange = function(data,column) { + var minMax = {min:data[0][column],max:data[0][column]}; + for (var i = 0; i < data.length; i++) { + if (minMax.min > data[i][column]) { minMax.min = data[i][column]; } + if (minMax.max < data[i][column]) { minMax.max = data[i][column]; } + } + return minMax; }; /** - * Convert a datetime (Date object) into a position on the screen - * @param {Date} time A date - * @return {int} x The position on the screen in pixels which corresponds - * with the given date. - * @private + * Initialize the data from the data table. Calculate minimum and maximum values + * and column index values + * @param {Array | DataSet | DataView} rawData The data containing the items for the Graph. + * @param {Number} style Style Number */ - // TODO: move this function to Range - Timeline.prototype._toScreen = function(time) { - var conversion = this.range.conversion(this.props.center.width); - return (time.valueOf() - conversion.offset) * conversion.scale; - }; + Graph3d.prototype._dataInitialize = function (rawData, style) { + var me = this; + // unsubscribe from the dataTable + if (this.dataSet) { + this.dataSet.off('*', this._onChange); + } - /** - * Convert a datetime (Date object) into a position on the root - * This is used to get the pixel density estimate for the screen, not the center panel - * @param {Date} time A date - * @return {int} x The position on root in pixels which corresponds - * with the given date. - * @private - */ - // TODO: move this function to Range - Timeline.prototype._toGlobalScreen = function(time) { - var conversion = this.range.conversion(this.props.root.width); - return (time.valueOf() - conversion.offset) * conversion.scale; - }; + if (rawData === undefined) + return; + if (Array.isArray(rawData)) { + rawData = new DataSet(rawData); + } - /** - * Initialize watching when option autoResize is true - * @private - */ - Timeline.prototype._initAutoResize = function () { - if (this.options.autoResize == true) { - this._startAutoResize(); + var data; + if (rawData instanceof DataSet || rawData instanceof DataView) { + data = rawData.get(); } else { - this._stopAutoResize(); + throw new Error('Array, DataSet, or DataView expected'); } - }; - /** - * Watch for changes in the size of the container. On resize, the Panel will - * automatically redraw itself. - * @private - */ - Timeline.prototype._startAutoResize = function () { - var me = this; + if (data.length == 0) + return; - this._stopAutoResize(); + this.dataSet = rawData; + this.dataTable = data; - this._onResize = function() { - if (me.options.autoResize != true) { - // stop watching when the option autoResize is changed to false - me._stopAutoResize(); - return; + // subscribe to changes in the dataset + this._onChange = function () { + me.setData(me.dataSet); + }; + this.dataSet.on('*', this._onChange); + + // _determineColumnIndexes + // getNumberOfRows (points) + // getNumberOfColumns (x,y,z,v,t,t1,t2...) + // getDistinctValues (unique values?) + // getColumnRange + + // determine the location of x,y,z,value,filter columns + this.colX = 'x'; + this.colY = 'y'; + this.colZ = 'z'; + this.colValue = 'style'; + this.colFilter = 'filter'; + + + + // check if a filter column is provided + if (data[0].hasOwnProperty('filter')) { + if (this.dataFilter === undefined) { + this.dataFilter = new Filter(rawData, this.colFilter, this); + this.dataFilter.setOnLoadCallback(function() {me.redraw();}); } + } - if (me.dom.root) { - // check whether the frame is resized - if ((me.dom.root.clientWidth != me.props.lastWidth) || - (me.dom.root.clientHeight != me.props.lastHeight)) { - me.props.lastWidth = me.dom.root.clientWidth; - me.props.lastHeight = me.dom.root.clientHeight; - me.emit('change'); - } + var withBars = this.style == Graph3d.STYLE.BAR || + this.style == Graph3d.STYLE.BARCOLOR || + this.style == Graph3d.STYLE.BARSIZE; + + // determine barWidth from data + if (withBars) { + if (this.defaultXBarWidth !== undefined) { + this.xBarWidth = this.defaultXBarWidth; + } + else { + var dataX = this.getDistinctValues(data,this.colX); + this.xBarWidth = (dataX[1] - dataX[0]) || 1; } - }; - // add event listener to window resize - util.addEventListener(window, 'resize', this._onResize); + if (this.defaultYBarWidth !== undefined) { + this.yBarWidth = this.defaultYBarWidth; + } + else { + var dataY = this.getDistinctValues(data,this.colY); + this.yBarWidth = (dataY[1] - dataY[0]) || 1; + } + } - this.watchTimer = setInterval(this._onResize, 1000); - }; + // calculate minimums and maximums + var xRange = this.getColumnRange(data,this.colX); + if (withBars) { + xRange.min -= this.xBarWidth / 2; + xRange.max += this.xBarWidth / 2; + } + this.xMin = (this.defaultXMin !== undefined) ? this.defaultXMin : xRange.min; + this.xMax = (this.defaultXMax !== undefined) ? this.defaultXMax : xRange.max; + if (this.xMax <= this.xMin) this.xMax = this.xMin + 1; + this.xStep = (this.defaultXStep !== undefined) ? this.defaultXStep : (this.xMax-this.xMin)/5; - /** - * Stop watching for a resize of the frame. - * @private - */ - Timeline.prototype._stopAutoResize = function () { - if (this.watchTimer) { - clearInterval(this.watchTimer); - this.watchTimer = undefined; + var yRange = this.getColumnRange(data,this.colY); + if (withBars) { + yRange.min -= this.yBarWidth / 2; + yRange.max += this.yBarWidth / 2; } + this.yMin = (this.defaultYMin !== undefined) ? this.defaultYMin : yRange.min; + this.yMax = (this.defaultYMax !== undefined) ? this.defaultYMax : yRange.max; + if (this.yMax <= this.yMin) this.yMax = this.yMin + 1; + this.yStep = (this.defaultYStep !== undefined) ? this.defaultYStep : (this.yMax-this.yMin)/5; - // remove event listener on window.resize - util.removeEventListener(window, 'resize', this._onResize); - this._onResize = null; - }; + var zRange = this.getColumnRange(data,this.colZ); + this.zMin = (this.defaultZMin !== undefined) ? this.defaultZMin : zRange.min; + this.zMax = (this.defaultZMax !== undefined) ? this.defaultZMax : zRange.max; + if (this.zMax <= this.zMin) this.zMax = this.zMin + 1; + this.zStep = (this.defaultZStep !== undefined) ? this.defaultZStep : (this.zMax-this.zMin)/5; - /** - * Start moving the timeline vertically - * @param {Event} event - * @private - */ - Timeline.prototype._onTouch = function (event) { - this.touch.allowDragging = true; - }; + if (this.colValue !== undefined) { + var valueRange = this.getColumnRange(data,this.colValue); + this.valueMin = (this.defaultValueMin !== undefined) ? this.defaultValueMin : valueRange.min; + this.valueMax = (this.defaultValueMax !== undefined) ? this.defaultValueMax : valueRange.max; + if (this.valueMax <= this.valueMin) this.valueMax = this.valueMin + 1; + } - /** - * Start moving the timeline vertically - * @param {Event} event - * @private - */ - Timeline.prototype._onPinch = function (event) { - this.touch.allowDragging = false; + // set the scale dependent on the ranges. + this._setScale(); }; - /** - * Start moving the timeline vertically - * @param {Event} event - * @private - */ - Timeline.prototype._onDragStart = function (event) { - this.touch.initialScrollTop = this.props.scrollTop; - }; + /** - * Move the timeline vertically - * @param {Event} event - * @private + * Filter the data based on the current filter + * @param {Array} data + * @return {Array} dataPoints Array with point objects which can be drawn on screen */ - Timeline.prototype._onDrag = function (event) { - // refuse to drag when we where pinching to prevent the timeline make a jump - // when releasing the fingers in opposite order from the touch screen - if (!this.touch.allowDragging) return; + Graph3d.prototype._getDataPoints = function (data) { + // TODO: store the created matrix dataPoints in the filters instead of reloading each time + var x, y, i, z, obj, point; - var delta = event.gesture.deltaY; + var dataPoints = []; - var oldScrollTop = this._getScrollTop(); - var newScrollTop = this._setScrollTop(this.touch.initialScrollTop + delta); + if (this.style === Graph3d.STYLE.GRID || + this.style === Graph3d.STYLE.SURFACE) { + // copy all values from the google data table to a matrix + // the provided values are supposed to form a grid of (x,y) positions - if (newScrollTop != oldScrollTop) { - this.redraw(); // TODO: this causes two redraws when dragging, the other is triggered by rangechange already - } - }; + // create two lists with all present x and y values + var dataX = []; + var dataY = []; + for (i = 0; i < this.getNumberOfRows(data); i++) { + x = data[i][this.colX] || 0; + y = data[i][this.colY] || 0; - /** - * Apply a scrollTop - * @param {Number} scrollTop - * @returns {Number} scrollTop Returns the applied scrollTop - * @private - */ - Timeline.prototype._setScrollTop = function (scrollTop) { - this.props.scrollTop = scrollTop; - this._updateScrollTop(); - return this.props.scrollTop; - }; + if (dataX.indexOf(x) === -1) { + dataX.push(x); + } + if (dataY.indexOf(y) === -1) { + dataY.push(y); + } + } - /** - * Update the current scrollTop when the height of the containers has been changed - * @returns {Number} scrollTop Returns the applied scrollTop - * @private - */ - Timeline.prototype._updateScrollTop = function () { - // recalculate the scrollTopMin - var scrollTopMin = Math.min(this.props.centerContainer.height - this.props.center.height, 0); // is negative or zero - if (scrollTopMin != this.props.scrollTopMin) { - // in case of bottom orientation, change the scrollTop such that the contents - // do not move relative to the time axis at the bottom - if (this.options.orientation == 'bottom') { - this.props.scrollTop += (scrollTopMin - this.props.scrollTopMin); + function sortNumber(a, b) { + return a - b; } - this.props.scrollTopMin = scrollTopMin; - } + dataX.sort(sortNumber); + dataY.sort(sortNumber); - // limit the scrollTop to the feasible scroll range - if (this.props.scrollTop > 0) this.props.scrollTop = 0; - if (this.props.scrollTop < scrollTopMin) this.props.scrollTop = scrollTopMin; + // create a grid, a 2d matrix, with all values. + var dataMatrix = []; // temporary data matrix + for (i = 0; i < data.length; i++) { + x = data[i][this.colX] || 0; + y = data[i][this.colY] || 0; + z = data[i][this.colZ] || 0; - return this.props.scrollTop; - }; + var xIndex = dataX.indexOf(x); // TODO: implement Array().indexOf() for Internet Explorer + var yIndex = dataY.indexOf(y); - /** - * Get the current scrollTop - * @returns {number} scrollTop - * @private - */ - Timeline.prototype._getScrollTop = function () { - return this.props.scrollTop; - }; + if (dataMatrix[xIndex] === undefined) { + dataMatrix[xIndex] = []; + } - module.exports = Timeline; + var point3d = new Point3d(); + point3d.x = x; + point3d.y = y; + point3d.z = z; + obj = {}; + obj.point = point3d; + obj.trans = undefined; + obj.screen = undefined; + obj.bottom = new Point3d(x, y, this.zMin); -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { + dataMatrix[xIndex][yIndex] = obj; - /** - * @constructor DataStep - * The class DataStep is an iterator for data for the lineGraph. You provide a start data point and an - * end data point. The class itself determines the best scale (step size) based on the - * provided start Date, end Date, and minimumStep. - * - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * - * Alternatively, you can set a scale by hand. - * After creation, you can initialize the class by executing first(). Then you - * can iterate from the start date to the end date via next(). You can check if - * the end date is reached with the function hasNext(). After each step, you can - * retrieve the current date via getCurrent(). - * The DataStep has scales ranging from milliseconds, seconds, minutes, hours, - * days, to years. - * - * Version: 1.2 - * - * @param {Date} [start] The start date, for example new Date(2010, 9, 21) - * or new Date(2010, 9, 21, 23, 45, 00) - * @param {Date} [end] The end date - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds - */ - function DataStep(start, end, minimumStep, containerHeight, forcedStepSize) { - // variables - this.current = 0; - - this.autoScale = true; - this.stepIndex = 0; - this.step = 1; - this.scale = 1; - - this.marginStart; - this.marginEnd; - - this.majorSteps = [1, 2, 5, 10]; - this.minorSteps = [0.25, 0.5, 1, 2]; - - this.setRange(start, end, minimumStep, containerHeight, forcedStepSize); - } + dataPoints.push(obj); + } + // fill in the pointers to the neighbors. + for (x = 0; x < dataMatrix.length; x++) { + for (y = 0; y < dataMatrix[x].length; y++) { + if (dataMatrix[x][y]) { + dataMatrix[x][y].pointRight = (x < dataMatrix.length-1) ? dataMatrix[x+1][y] : undefined; + dataMatrix[x][y].pointTop = (y < dataMatrix[x].length-1) ? dataMatrix[x][y+1] : undefined; + dataMatrix[x][y].pointCross = + (x < dataMatrix.length-1 && y < dataMatrix[x].length-1) ? + dataMatrix[x+1][y+1] : + undefined; + } + } + } + } + else { // 'dot', 'dot-line', etc. + // copy all values from the google data table to a list with Point3d objects + for (i = 0; i < data.length; i++) { + point = new Point3d(); + point.x = data[i][this.colX] || 0; + point.y = data[i][this.colY] || 0; + point.z = data[i][this.colZ] || 0; + if (this.colValue !== undefined) { + point.value = data[i][this.colValue] || 0; + } - /** - * Set a new range - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * @param {Number} [start] The start date and time. - * @param {Number} [end] The end date and time. - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds - */ - DataStep.prototype.setRange = function(start, end, minimumStep, containerHeight, forcedStepSize) { - this._start = start; - this._end = end; + obj = {}; + obj.point = point; + obj.bottom = new Point3d(point.x, point.y, this.zMin); + obj.trans = undefined; + obj.screen = undefined; - if (this.autoScale) { - this.setMinimumStep(minimumStep, containerHeight, forcedStepSize); + dataPoints.push(obj); + } } - this.setFirst(); + + return dataPoints; }; /** - * Automatically determine the scale that bests fits the provided minimum step - * @param {Number} [minimumStep] The minimum step size in milliseconds + * Create the main frame for the Graph3d. + * This function is executed once when a Graph3d object is created. The frame + * contains a canvas, and this canvas contains all objects like the axis and + * nodes. */ - DataStep.prototype.setMinimumStep = function(minimumStep, containerHeight) { - // round to floor - var size = this._end - this._start; - var safeSize = size * 1.1; - var minimumStepValue = minimumStep * (safeSize / containerHeight); - var orderOfMagnitude = Math.round(Math.log(safeSize)/Math.LN10); - - var minorStepIdx = -1; - var magnitudefactor = Math.pow(10,orderOfMagnitude); - - var start = 0; - if (orderOfMagnitude < 0) { - start = orderOfMagnitude; - } - - var solutionFound = false; - for (var i = start; Math.abs(i) <= Math.abs(orderOfMagnitude); i++) { - magnitudefactor = Math.pow(10,i); - for (var j = 0; j < this.minorSteps.length; j++) { - var stepSize = magnitudefactor * this.minorSteps[j]; - if (stepSize >= minimumStepValue) { - solutionFound = true; - minorStepIdx = j; - break; - } - } - if (solutionFound == true) { - break; - } + Graph3d.prototype.create = function () { + // remove all elements from the container element. + while (this.containerElement.hasChildNodes()) { + this.containerElement.removeChild(this.containerElement.firstChild); } - this.stepIndex = minorStepIdx; - this.scale = magnitudefactor; - this.step = magnitudefactor * this.minorSteps[minorStepIdx]; - }; + this.frame = document.createElement('div'); + this.frame.style.position = 'relative'; + this.frame.style.overflow = 'hidden'; - /** - * Set the range iterator to the start date. - */ - DataStep.prototype.first = function() { - this.setFirst(); - }; + // create the graph canvas (HTML canvas element) + this.frame.canvas = document.createElement( 'canvas' ); + this.frame.canvas.style.position = 'relative'; + this.frame.appendChild(this.frame.canvas); + //if (!this.frame.canvas.getContext) { + { + var noCanvas = document.createElement( 'DIV' ); + noCanvas.style.color = 'red'; + noCanvas.style.fontWeight = 'bold' ; + noCanvas.style.padding = '10px'; + noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; + this.frame.canvas.appendChild(noCanvas); + } - /** - * Round the current date to the first minor date value - * This must be executed once when the current date is set to start Date - */ - DataStep.prototype.setFirst = function() { - var niceStart = this._start - (this.scale * this.minorSteps[this.stepIndex]); - var niceEnd = this._end + (this.scale * this.minorSteps[this.stepIndex]); + this.frame.filter = document.createElement( 'div' ); + this.frame.filter.style.position = 'absolute'; + this.frame.filter.style.bottom = '0px'; + this.frame.filter.style.left = '0px'; + this.frame.filter.style.width = '100%'; + this.frame.appendChild(this.frame.filter); - this.marginEnd = this.roundToMinor(niceEnd); - this.marginStart = this.roundToMinor(niceStart); - this.marginRange = this.marginEnd - this.marginStart; + // add event listeners to handle moving and zooming the contents + var me = this; + var onmousedown = function (event) {me._onMouseDown(event);}; + var ontouchstart = function (event) {me._onTouchStart(event);}; + var onmousewheel = function (event) {me._onWheel(event);}; + var ontooltip = function (event) {me._onTooltip(event);}; + // TODO: these events are never cleaned up... can give a 'memory leakage' - this.current = this.marginEnd; + G3DaddEventListener(this.frame.canvas, 'keydown', onkeydown); + G3DaddEventListener(this.frame.canvas, 'mousedown', onmousedown); + G3DaddEventListener(this.frame.canvas, 'touchstart', ontouchstart); + G3DaddEventListener(this.frame.canvas, 'mousewheel', onmousewheel); + G3DaddEventListener(this.frame.canvas, 'mousemove', ontooltip); + // add the new graph to the container element + this.containerElement.appendChild(this.frame); }; - DataStep.prototype.roundToMinor = function(value) { - var rounded = value - (value % (this.scale * this.minorSteps[this.stepIndex])); - if (value % (this.scale * this.minorSteps[this.stepIndex]) > 0.5 * (this.scale * this.minorSteps[this.stepIndex])) { - return rounded + (this.scale * this.minorSteps[this.stepIndex]); - } - else { - return rounded; - } - } - /** - * Check if the there is a next step - * @return {boolean} true if the current date has not passed the end date + * Set a new size for the graph + * @param {string} width Width in pixels or percentage (for example '800px' + * or '50%') + * @param {string} height Height in pixels or percentage (for example '400px' + * or '30%') */ - DataStep.prototype.hasNext = function () { - return (this.current >= this.marginStart); + Graph3d.prototype.setSize = function(width, height) { + this.frame.style.width = width; + this.frame.style.height = height; + + this._resizeCanvas(); }; /** - * Do the next step + * Resize the canvas to the current size of the frame */ - DataStep.prototype.next = function() { - var prev = this.current; - this.current -= this.step; + Graph3d.prototype._resizeCanvas = function() { + this.frame.canvas.style.width = '100%'; + this.frame.canvas.style.height = '100%'; - // safety mechanism: if current time is still unchanged, move to the end - if (this.current == prev) { - this.current = this._end; - } + this.frame.canvas.width = this.frame.canvas.clientWidth; + this.frame.canvas.height = this.frame.canvas.clientHeight; + + // adjust with for margin + this.frame.filter.style.width = (this.frame.canvas.clientWidth - 2 * 10) + 'px'; }; /** - * Do the next step + * Start animation */ - DataStep.prototype.previous = function() { - this.current += this.step; - this.marginEnd += this.step; - this.marginRange = this.marginEnd - this.marginStart; - }; + Graph3d.prototype.animationStart = function() { + if (!this.frame.filter || !this.frame.filter.slider) + throw 'No animation available'; + this.frame.filter.slider.play(); + }; /** - * Get the current datetime - * @return {String} current The current date + * Stop animation */ - DataStep.prototype.getCurrent = function() { - var toPrecision = '' + Number(this.current).toPrecision(5); - for (var i = toPrecision.length-1; i > 0; i--) { - if (toPrecision[i] == "0") { - toPrecision = toPrecision.slice(0,i); - } - else if (toPrecision[i] == "." || toPrecision[i] == ",") { - toPrecision = toPrecision.slice(0,i); - break; - } - else{ - break; - } - } + Graph3d.prototype.animationStop = function() { + if (!this.frame.filter || !this.frame.filter.slider) return; - return toPrecision; + this.frame.filter.slider.stop(); }; - /** - * Snap a date to a rounded value. - * The snap intervals are dependent on the current scale and step. - * @param {Date} date the date to be snapped. - * @return {Date} snappedDate + * Resize the center position based on the current values in this.defaultXCenter + * and this.defaultYCenter (which are strings with a percentage or a value + * in pixels). The center positions are the variables this.xCenter + * and this.yCenter */ - DataStep.prototype.snap = function(date) { + Graph3d.prototype._resizeCenter = function() { + // calculate the horizontal center position + if (this.defaultXCenter.charAt(this.defaultXCenter.length-1) === '%') { + this.xcenter = + parseFloat(this.defaultXCenter) / 100 * + this.frame.canvas.clientWidth; + } + else { + this.xcenter = parseFloat(this.defaultXCenter); // supposed to be in px + } + // calculate the vertical center position + if (this.defaultYCenter.charAt(this.defaultYCenter.length-1) === '%') { + this.ycenter = + parseFloat(this.defaultYCenter) / 100 * + (this.frame.canvas.clientHeight - this.frame.filter.clientHeight); + } + else { + this.ycenter = parseFloat(this.defaultYCenter); // supposed to be in px + } }; /** - * Check if the current value is a major value (for example when the step - * is DAY, a major value is each first day of the MONTH) - * @return {boolean} true if current date is major, else false. + * Set the rotation and distance of the camera + * @param {Object} pos An object with the camera position. The object + * contains three parameters: + * - horizontal {Number} + * The horizontal rotation, between 0 and 2*PI. + * Optional, can be left undefined. + * - vertical {Number} + * The vertical rotation, between 0 and 0.5*PI + * if vertical=0.5*PI, the graph is shown from the + * top. Optional, can be left undefined. + * - distance {Number} + * The (normalized) distance of the camera to the + * center of the graph, a value between 0.71 and 5.0. + * Optional, can be left undefined. */ - DataStep.prototype.isMajor = function() { - return (this.current % (this.scale * this.majorSteps[this.stepIndex]) == 0); + Graph3d.prototype.setCameraPosition = function(pos) { + if (pos === undefined) { + return; + } + + if (pos.horizontal !== undefined && pos.vertical !== undefined) { + this.camera.setArmRotation(pos.horizontal, pos.vertical); + } + + if (pos.distance !== undefined) { + this.camera.setArmLength(pos.distance); + } + + this.redraw(); }; - module.exports = DataStep; + /** + * Retrieve the current camera rotation + * @return {object} An object with parameters horizontal, vertical, and + * distance + */ + Graph3d.prototype.getCameraPosition = function() { + var pos = this.camera.getArmRotation(); + pos.distance = this.camera.getArmLength(); + return pos; + }; + + /** + * Load data into the 3D Graph + */ + Graph3d.prototype._readData = function(data) { + // read the data + this._dataInitialize(data, this.style); -/***/ }, -/* 7 */ -/***/ function(module, exports, __webpack_require__) { - var Emitter = __webpack_require__(41); - var Hammer = __webpack_require__(50); - var util = __webpack_require__(1); - var DataSet = __webpack_require__(3); - var DataView = __webpack_require__(4); - var Range = __webpack_require__(8); - var TimeAxis = __webpack_require__(21); - var CurrentTime = __webpack_require__(13); - var CustomTime = __webpack_require__(14); - var LineGraph = __webpack_require__(20); + if (this.dataFilter) { + // apply filtering + this.dataPoints = this.dataFilter._getDataPoints(); + } + else { + // no filtering. load all data + this.dataPoints = this._getDataPoints(this.dataTable); + } + + // draw the filter + this._redrawFilter(); + }; /** - * Create a timeline visualization - * @param {HTMLElement} container - * @param {vis.DataSet | Array | google.visualization.DataTable} [items] - * @param {Object} [options] See Graph2d.setOptions for the available options. - * @constructor + * Replace the dataset of the Graph3d + * @param {Array | DataSet | DataView} data */ - function Graph2d (container, items, options, groups) { - var me = this; - this.defaultOptions = { - start: null, - end: null, + Graph3d.prototype.setData = function (data) { + this._readData(data); + this.redraw(); - autoResize: true, + // start animation when option is true + if (this.animationAutoStart && this.dataFilter) { + this.animationStart(); + } + }; - orientation: 'bottom', - width: null, - height: null, - maxHeight: null, - minHeight: null - }; - this.options = util.deepExtend({}, this.defaultOptions); + /** + * Update the options. Options will be merged with current options + * @param {Object} options + */ + Graph3d.prototype.setOptions = function (options) { + var cameraPosition = undefined; - // Create the DOM, props, and emitter - this._create(container); + this.animationStop(); - // all components listed here will be repainted automatically - this.components = []; + if (options !== undefined) { + // retrieve parameter values + if (options.width !== undefined) this.width = options.width; + if (options.height !== undefined) this.height = options.height; - this.body = { - dom: this.dom, - domProps: this.props, - emitter: { - on: this.on.bind(this), - off: this.off.bind(this), - emit: this.emit.bind(this) - }, - util: { - snap: null, // will be specified after TimeAxis is created - toScreen: me._toScreen.bind(me), - toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width - toTime: me._toTime.bind(me), - toGlobalTime : me._toGlobalTime.bind(me) - } - }; + if (options.xCenter !== undefined) this.defaultXCenter = options.xCenter; + if (options.yCenter !== undefined) this.defaultYCenter = options.yCenter; - // range - this.range = new Range(this.body); - this.components.push(this.range); - this.body.range = this.range; + if (options.filterLabel !== undefined) this.filterLabel = options.filterLabel; + if (options.legendLabel !== undefined) this.legendLabel = options.legendLabel; + if (options.xLabel !== undefined) this.xLabel = options.xLabel; + if (options.yLabel !== undefined) this.yLabel = options.yLabel; + if (options.zLabel !== undefined) this.zLabel = options.zLabel; - // time axis - this.timeAxis = new TimeAxis(this.body); - this.components.push(this.timeAxis); - this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); + if (options.style !== undefined) { + var styleNumber = this._getStyleNumber(options.style); + if (styleNumber !== -1) { + this.style = styleNumber; + } + } + if (options.showGrid !== undefined) this.showGrid = options.showGrid; + if (options.showPerspective !== undefined) this.showPerspective = options.showPerspective; + if (options.showShadow !== undefined) this.showShadow = options.showShadow; + if (options.tooltip !== undefined) this.showTooltip = options.tooltip; + if (options.showAnimationControls !== undefined) this.showAnimationControls = options.showAnimationControls; + if (options.keepAspectRatio !== undefined) this.keepAspectRatio = options.keepAspectRatio; + if (options.verticalRatio !== undefined) this.verticalRatio = options.verticalRatio; - // current time bar - this.currentTime = new CurrentTime(this.body); - this.components.push(this.currentTime); + if (options.animationInterval !== undefined) this.animationInterval = options.animationInterval; + if (options.animationPreload !== undefined) this.animationPreload = options.animationPreload; + if (options.animationAutoStart !== undefined)this.animationAutoStart = options.animationAutoStart; - // custom time bar - // Note: time bar will be attached in this.setOptions when selected - this.customTime = new CustomTime(this.body); - this.components.push(this.customTime); + if (options.xBarWidth !== undefined) this.defaultXBarWidth = options.xBarWidth; + if (options.yBarWidth !== undefined) this.defaultYBarWidth = options.yBarWidth; - // item set - this.linegraph = new LineGraph(this.body); - this.components.push(this.linegraph); + if (options.xMin !== undefined) this.defaultXMin = options.xMin; + if (options.xStep !== undefined) this.defaultXStep = options.xStep; + if (options.xMax !== undefined) this.defaultXMax = options.xMax; + if (options.yMin !== undefined) this.defaultYMin = options.yMin; + if (options.yStep !== undefined) this.defaultYStep = options.yStep; + if (options.yMax !== undefined) this.defaultYMax = options.yMax; + if (options.zMin !== undefined) this.defaultZMin = options.zMin; + if (options.zStep !== undefined) this.defaultZStep = options.zStep; + if (options.zMax !== undefined) this.defaultZMax = options.zMax; + if (options.valueMin !== undefined) this.defaultValueMin = options.valueMin; + if (options.valueMax !== undefined) this.defaultValueMax = options.valueMax; - this.itemsData = null; // DataSet - this.groupsData = null; // DataSet + if (options.cameraPosition !== undefined) cameraPosition = options.cameraPosition; - // apply options - if (options) { - this.setOptions(options); + if (cameraPosition !== undefined) { + this.camera.setArmRotation(cameraPosition.horizontal, cameraPosition.vertical); + this.camera.setArmLength(cameraPosition.distance); + } + else { + this.camera.setArmRotation(1.0, 0.5); + this.camera.setArmLength(1.7); + } } - // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS! - if (groups) { - this.setGroups(groups); - } + this._setBackgroundColor(options && options.backgroundColor); - // create itemset - if (items) { - this.setItems(items); - } - else { - this.redraw(); + this.setSize(this.width, this.height); + + // re-load the data + if (this.dataTable) { + this.setData(this.dataTable); } - } - // turn Graph2d into an event emitter - Emitter(Graph2d.prototype); + // start animation when option is true + if (this.animationAutoStart && this.dataFilter) { + this.animationStart(); + } + }; /** - * Create the main DOM for the Graph2d: a root panel containing left, right, - * top, bottom, content, and background panel. - * @param {Element} container The container element where the Graph2d will - * be attached. - * @private + * Redraw the Graph. */ - Graph2d.prototype._create = function (container) { - this.dom = {}; - - this.dom.root = document.createElement('div'); - this.dom.background = document.createElement('div'); - this.dom.backgroundVertical = document.createElement('div'); - this.dom.backgroundHorizontalContainer = document.createElement('div'); - this.dom.centerContainer = document.createElement('div'); - this.dom.leftContainer = document.createElement('div'); - this.dom.rightContainer = document.createElement('div'); - this.dom.backgroundHorizontal = document.createElement('div'); - this.dom.center = document.createElement('div'); - this.dom.left = document.createElement('div'); - this.dom.right = document.createElement('div'); - this.dom.top = document.createElement('div'); - this.dom.bottom = document.createElement('div'); - this.dom.shadowTop = document.createElement('div'); - this.dom.shadowBottom = document.createElement('div'); - this.dom.shadowTopLeft = document.createElement('div'); - this.dom.shadowBottomLeft = document.createElement('div'); - this.dom.shadowTopRight = document.createElement('div'); - this.dom.shadowBottomRight = document.createElement('div'); - - this.dom.background.className = 'vispanel background'; - this.dom.backgroundVertical.className = 'vispanel background vertical'; - this.dom.backgroundHorizontalContainer.className = 'vispanel background horizontal'; - this.dom.backgroundHorizontal.className = 'vispanel background horizontal'; - this.dom.centerContainer.className = 'vispanel center'; - this.dom.leftContainer.className = 'vispanel left'; - this.dom.rightContainer.className = 'vispanel right'; - this.dom.top.className = 'vispanel top'; - this.dom.bottom.className = 'vispanel bottom'; - this.dom.left.className = 'content'; - this.dom.center.className = 'content'; - this.dom.right.className = 'content'; - this.dom.shadowTop.className = 'shadow top'; - this.dom.shadowBottom.className = 'shadow bottom'; - this.dom.shadowTopLeft.className = 'shadow top'; - this.dom.shadowBottomLeft.className = 'shadow bottom'; - this.dom.shadowTopRight.className = 'shadow top'; - this.dom.shadowBottomRight.className = 'shadow bottom'; - - this.dom.root.appendChild(this.dom.background); - this.dom.root.appendChild(this.dom.backgroundVertical); - this.dom.root.appendChild(this.dom.backgroundHorizontalContainer); - this.dom.root.appendChild(this.dom.centerContainer); - this.dom.root.appendChild(this.dom.leftContainer); - this.dom.root.appendChild(this.dom.rightContainer); - this.dom.root.appendChild(this.dom.top); - this.dom.root.appendChild(this.dom.bottom); - - this.dom.backgroundHorizontalContainer.appendChild(this.dom.backgroundHorizontal); - this.dom.centerContainer.appendChild(this.dom.center); - this.dom.leftContainer.appendChild(this.dom.left); - this.dom.rightContainer.appendChild(this.dom.right); - - this.dom.centerContainer.appendChild(this.dom.shadowTop); - this.dom.centerContainer.appendChild(this.dom.shadowBottom); - this.dom.leftContainer.appendChild(this.dom.shadowTopLeft); - this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft); - this.dom.rightContainer.appendChild(this.dom.shadowTopRight); - this.dom.rightContainer.appendChild(this.dom.shadowBottomRight); + Graph3d.prototype.redraw = function() { + if (this.dataPoints === undefined) { + throw 'Error: graph data not initialized'; + } - this.on('rangechange', this.redraw.bind(this)); - this.on('change', this.redraw.bind(this)); - this.on('touch', this._onTouch.bind(this)); - this.on('pinch', this._onPinch.bind(this)); - this.on('dragstart', this._onDragStart.bind(this)); - this.on('drag', this._onDrag.bind(this)); + this._resizeCanvas(); + this._resizeCenter(); + this._redrawSlider(); + this._redrawClear(); + this._redrawAxis(); - // create event listeners for all interesting events, these events will be - // emitted via emitter - this.hammer = Hammer(this.dom.root, { - prevent_default: true - }); - this.listeners = {}; + if (this.style === Graph3d.STYLE.GRID || + this.style === Graph3d.STYLE.SURFACE) { + this._redrawDataGrid(); + } + else if (this.style === Graph3d.STYLE.LINE) { + this._redrawDataLine(); + } + else if (this.style === Graph3d.STYLE.BAR || + this.style === Graph3d.STYLE.BARCOLOR || + this.style === Graph3d.STYLE.BARSIZE) { + this._redrawDataBar(); + } + else { + // style is DOT, DOTLINE, DOTCOLOR, DOTSIZE + this._redrawDataDot(); + } - var me = this; - var events = [ - 'touch', 'pinch', - 'tap', 'doubletap', 'hold', - 'dragstart', 'drag', 'dragend', - 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox - ]; - events.forEach(function (event) { - var listener = function () { - var args = [event].concat(Array.prototype.slice.call(arguments, 0)); - me.emit.apply(me, args); - }; - me.hammer.on(event, listener); - me.listeners[event] = listener; - }); + this._redrawInfo(); + this._redrawLegend(); + }; - // size properties of each of the panels - this.props = { - root: {}, - background: {}, - centerContainer: {}, - leftContainer: {}, - rightContainer: {}, - center: {}, - left: {}, - right: {}, - top: {}, - bottom: {}, - border: {}, - scrollTop: 0, - scrollTopMin: 0 - }; - this.touch = {}; // store state information needed for touch events + /** + * Clear the canvas before redrawing + */ + Graph3d.prototype._redrawClear = function() { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); - // attach the root panel to the provided container - if (!container) throw new Error('No container provided'); - container.appendChild(this.dom.root); + ctx.clearRect(0, 0, canvas.width, canvas.height); }; + /** - * Destroy the Graph2d, clean up all DOM elements and event listeners. + * Redraw the legend showing the colors */ - Graph2d.prototype.destroy = function () { - // unbind datasets - this.clear(); - - // remove all event listeners - this.off(); + Graph3d.prototype._redrawLegend = function() { + var y; - // stop checking for changed size - this._stopAutoResize(); + if (this.style === Graph3d.STYLE.DOTCOLOR || + this.style === Graph3d.STYLE.DOTSIZE) { - // remove from DOM - if (this.dom.root.parentNode) { - this.dom.root.parentNode.removeChild(this.dom.root); - } - this.dom = null; + var dotSize = this.frame.clientWidth * 0.02; - // cleanup hammer touch events - for (var event in this.listeners) { - if (this.listeners.hasOwnProperty(event)) { - delete this.listeners[event]; + var widthMin, widthMax; + if (this.style === Graph3d.STYLE.DOTSIZE) { + widthMin = dotSize / 2; // px + widthMax = dotSize / 2 + dotSize * 2; // Todo: put this in one function + } + else { + widthMin = 20; // px + widthMax = 20; // px } - } - this.listeners = null; - this.hammer = null; - // give all components the opportunity to cleanup - this.components.forEach(function (component) { - component.destroy(); - }); + var height = Math.max(this.frame.clientHeight * 0.25, 100); + var top = this.margin; + var right = this.frame.clientWidth - this.margin; + var left = right - widthMax; + var bottom = top + height; + } - this.body = null; - }; + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + ctx.lineWidth = 1; + ctx.font = '14px arial'; // TODO: put in options - /** - * Set options. Options will be passed to all components loaded in the Graph2d. - * @param {Object} [options] - * {String} orientation - * Vertical orientation for the Graph2d, - * can be 'bottom' (default) or 'top'. - * {String | Number} width - * Width for the timeline, a number in pixels or - * a css string like '1000px' or '75%'. '100%' by default. - * {String | Number} height - * Fixed height for the Graph2d, a number in pixels or - * a css string like '400px' or '75%'. If undefined, - * The Graph2d will automatically size such that - * its contents fit. - * {String | Number} minHeight - * Minimum height for the Graph2d, a number in pixels or - * a css string like '400px' or '75%'. - * {String | Number} maxHeight - * Maximum height for the Graph2d, a number in pixels or - * a css string like '400px' or '75%'. - * {Number | Date | String} start - * Start date for the visible window - * {Number | Date | String} end - * End date for the visible window - */ - Graph2d.prototype.setOptions = function (options) { - if (options) { - // copy the known options - var fields = ['width', 'height', 'minHeight', 'maxHeight', 'autoResize', 'start', 'end', 'orientation']; - util.selectiveExtend(fields, this.options, options); + if (this.style === Graph3d.STYLE.DOTCOLOR) { + // draw the color bar + var ymin = 0; + var ymax = height; // Todo: make height customizable + for (y = ymin; y < ymax; y++) { + var f = (y - ymin) / (ymax - ymin); - // enable/disable autoResize - this._initAutoResize(); - } + //var width = (dotSize / 2 + (1-f) * dotSize * 2); // Todo: put this in one function + var hue = f * 240; + var color = this._hsv2rgb(hue, 1, 1); - // propagate options to all components - this.components.forEach(function (component) { - component.setOptions(options); - }); + ctx.strokeStyle = color; + ctx.beginPath(); + ctx.moveTo(left, top + y); + ctx.lineTo(right, top + y); + ctx.stroke(); + } - // TODO: remove deprecation error one day (deprecated since version 0.8.0) - if (options && options.order) { - throw new Error('Option order is deprecated. There is no replacement for this feature.'); + ctx.strokeStyle = this.colorAxis; + ctx.strokeRect(left, top, widthMax, height); } - // redraw everything - this.redraw(); - }; - - /** - * Set a custom time bar - * @param {Date} time - */ - Graph2d.prototype.setCustomTime = function (time) { - if (!this.customTime) { - throw new Error('Cannot get custom time: Custom time bar is not enabled'); + if (this.style === Graph3d.STYLE.DOTSIZE) { + // draw border around color bar + ctx.strokeStyle = this.colorAxis; + ctx.fillStyle = this.colorDot; + ctx.beginPath(); + ctx.moveTo(left, top); + ctx.lineTo(right, top); + ctx.lineTo(right - widthMax + widthMin, bottom); + ctx.lineTo(left, bottom); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); } - this.customTime.setCustomTime(time); - }; + if (this.style === Graph3d.STYLE.DOTCOLOR || + this.style === Graph3d.STYLE.DOTSIZE) { + // print values along the color bar + var gridLineLen = 5; // px + var step = new StepNumber(this.valueMin, this.valueMax, (this.valueMax-this.valueMin)/5, true); + step.start(); + if (step.getCurrent() < this.valueMin) { + step.next(); + } + while (!step.end()) { + y = bottom - (step.getCurrent() - this.valueMin) / (this.valueMax - this.valueMin) * height; - /** - * Retrieve the current custom time. - * @return {Date} customTime - */ - Graph2d.prototype.getCustomTime = function() { - if (!this.customTime) { - throw new Error('Cannot get custom time: Custom time bar is not enabled'); - } + ctx.beginPath(); + ctx.moveTo(left - gridLineLen, y); + ctx.lineTo(left, y); + ctx.stroke(); - return this.customTime.getCustomTime(); + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = this.colorAxis; + ctx.fillText(step.getCurrent(), left - 2 * gridLineLen, y); + + step.next(); + } + + ctx.textAlign = 'right'; + ctx.textBaseline = 'top'; + var label = this.legendLabel; + ctx.fillText(label, right, bottom + this.margin); + } }; /** - * Set items - * @param {vis.DataSet | Array | google.visualization.DataTable | null} items + * Redraw the filter */ - Graph2d.prototype.setItems = function(items) { - var initialLoad = (this.itemsData == null); + Graph3d.prototype._redrawFilter = function() { + this.frame.filter.innerHTML = ''; - // convert to type DataSet when needed - var newDataSet; - if (!items) { - newDataSet = null; - } - else if (items instanceof DataSet || items instanceof DataView) { - newDataSet = items; - } - else { - // turn an array into a dataset - newDataSet = new DataSet(items, { - type: { - start: 'Date', - end: 'Date' - } - }); - } + if (this.dataFilter) { + var options = { + 'visible': this.showAnimationControls + }; + var slider = new Slider(this.frame.filter, options); + this.frame.filter.slider = slider; - // set items - this.itemsData = newDataSet; - this.linegraph && this.linegraph.setItems(newDataSet); + // TODO: css here is not nice here... + this.frame.filter.style.padding = '10px'; + //this.frame.filter.style.backgroundColor = '#EFEFEF'; - if (initialLoad && ('start' in this.options || 'end' in this.options)) { - this.fit(); + slider.setValues(this.dataFilter.values); + slider.setPlayInterval(this.animationInterval); - var start = ('start' in this.options) ? util.convert(this.options.start, 'Date') : null; - var end = ('end' in this.options) ? util.convert(this.options.end, 'Date') : null; + // create an event handler + var me = this; + var onchange = function () { + var index = slider.getIndex(); - this.setWindow(start, end); - } - }; + me.dataFilter.selectValue(index); + me.dataPoints = me.dataFilter._getDataPoints(); - /** - * Set groups - * @param {vis.DataSet | Array | google.visualization.DataTable} groups - */ - Graph2d.prototype.setGroups = function(groups) { - // convert to type DataSet when needed - var newDataSet; - if (!groups) { - newDataSet = null; - } - else if (groups instanceof DataSet || groups instanceof DataView) { - newDataSet = groups; + me.redraw(); + }; + slider.setOnChangeCallback(onchange); } else { - // turn an array into a dataset - newDataSet = new DataSet(groups); + this.frame.filter.slider = undefined; } - - this.groupsData = newDataSet; - this.linegraph.setGroups(newDataSet); }; /** - * Clear the Graph2d. By Default, items, groups and options are cleared. - * Example usage: - * - * timeline.clear(); // clear items, groups, and options - * timeline.clear({options: true}); // clear options only - * - * @param {Object} [what] Optionally specify what to clear. By default: - * {items: true, groups: true, options: true} + * Redraw the slider */ - Graph2d.prototype.clear = function(what) { - // clear items - if (!what || what.items) { - this.setItems(null); - } - - // clear groups - if (!what || what.groups) { - this.setGroups(null); - } - - // clear options of timeline and of each of the components - if (!what || what.options) { - this.components.forEach(function (component) { - component.setOptions(component.defaultOptions); - }); - - this.setOptions(this.defaultOptions); // this will also do a redraw + Graph3d.prototype._redrawSlider = function() { + if ( this.frame.filter.slider !== undefined) { + this.frame.filter.slider.redraw(); } }; + /** - * Set Graph2d window such that it fits all items + * Redraw common information */ - Graph2d.prototype.fit = function() { - // apply the data range as range - var dataRange = this.getItemRange(); + Graph3d.prototype._redrawInfo = function() { + if (this.dataFilter) { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); - // add 5% space on both sides - var start = dataRange.min; - var end = dataRange.max; - if (start != null && end != null) { - var interval = (end.valueOf() - start.valueOf()); - if (interval <= 0) { - // prevent an empty interval - interval = 24 * 60 * 60 * 1000; // 1 day - } - start = new Date(start.valueOf() - interval * 0.05); - end = new Date(end.valueOf() + interval * 0.05); - } + ctx.font = '14px arial'; // TODO: put in options + ctx.lineStyle = 'gray'; + ctx.fillStyle = 'gray'; + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; - // skip range set if there is no start and end date - if (start === null && end === null) { - return; + var x = this.margin; + var y = this.margin; + ctx.fillText(this.dataFilter.getLabel() + ': ' + this.dataFilter.getSelectedValue(), x, y); } - - this.range.setRange(start, end); }; + /** - * Get the data range of the item set. - * @returns {{min: Date, max: Date}} range A range with a start and end Date. - * When no minimum is found, min==null - * When no maximum is found, max==null + * Redraw the axis */ - Graph2d.prototype.getItemRange = function() { - // calculate min from start filed - var itemsData = this.itemsData, - min = null, - max = null; + Graph3d.prototype._redrawAxis = function() { + var canvas = this.frame.canvas, + ctx = canvas.getContext('2d'), + from, to, step, prettyStep, + text, xText, yText, zText, + offset, xOffset, yOffset, + xMin2d, xMax2d; - if (itemsData) { - // calculate the minimum value of the field 'start' - var minItem = itemsData.min('start'); - min = minItem ? util.convert(minItem.start, 'Date').valueOf() : null; - // Note: we convert first to Date and then to number because else - // a conversion from ISODate to Number will fail + // TODO: get the actual rendered style of the containerElement + //ctx.font = this.containerElement.style.font; + ctx.font = 24 / this.camera.getArmLength() + 'px arial'; - // calculate maximum value of fields 'start' and 'end' - var maxStartItem = itemsData.max('start'); - if (maxStartItem) { - max = util.convert(maxStartItem.start, 'Date').valueOf(); - } - var maxEndItem = itemsData.max('end'); - if (maxEndItem) { - if (max == null) { - max = util.convert(maxEndItem.end, 'Date').valueOf(); - } - else { - max = Math.max(max, util.convert(maxEndItem.end, 'Date').valueOf()); - } - } + // calculate the length for the short grid lines + var gridLenX = 0.025 / this.scale.x; + var gridLenY = 0.025 / this.scale.y; + var textMargin = 5 / this.camera.getArmLength(); // px + var armAngle = this.camera.getArmRotation().horizontal; + + // draw x-grid lines + ctx.lineWidth = 1; + prettyStep = (this.defaultXStep === undefined); + step = new StepNumber(this.xMin, this.xMax, this.xStep, prettyStep); + step.start(); + if (step.getCurrent() < this.xMin) { + step.next(); } + while (!step.end()) { + var x = step.getCurrent(); - return { - min: (min != null) ? new Date(min) : null, - max: (max != null) ? new Date(max) : null - }; - }; - - /** - * Set the visible window. Both parameters are optional, you can change only - * start or only end. Syntax: - * - * TimeLine.setWindow(start, end) - * TimeLine.setWindow(range) - * - * Where start and end can be a Date, number, or string, and range is an - * object with properties start and end. - * - * @param {Date | Number | String | Object} [start] Start date of visible window - * @param {Date | Number | String} [end] End date of visible window - */ - Graph2d.prototype.setWindow = function(start, end) { - if (arguments.length == 1) { - var range = arguments[0]; - this.range.setRange(range.start, range.end); - } - else { - this.range.setRange(start, end); - } - }; - - /** - * Get the visible window - * @return {{start: Date, end: Date}} Visible range - */ - Graph2d.prototype.getWindow = function() { - var range = this.range.getRange(); - return { - start: new Date(range.start), - end: new Date(range.end) - }; - }; - - /** - * Force a redraw of the Graph2d. Can be useful to manually redraw when - * option autoResize=false - */ - Graph2d.prototype.redraw = function() { - var resized = false, - options = this.options, - props = this.props, - dom = this.dom; - - if (!dom) return; // when destroyed + if (this.showGrid) { + from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); + ctx.strokeStyle = this.colorGrid; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + } + else { + from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(x, this.yMin+gridLenX, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); - // update class names - dom.root.className = 'vis timeline root ' + options.orientation; + from = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); + to = this._convert3Dto2D(new Point3d(x, this.yMax-gridLenX, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + } - // update root width and height options - dom.root.style.maxHeight = util.option.asSize(options.maxHeight, ''); - dom.root.style.minHeight = util.option.asSize(options.minHeight, ''); - dom.root.style.width = util.option.asSize(options.width, ''); + yText = (Math.cos(armAngle) > 0) ? this.yMin : this.yMax; + text = this._convert3Dto2D(new Point3d(x, yText, this.zMin)); + if (Math.cos(armAngle * 2) > 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + text.y += textMargin; + } + else if (Math.sin(armAngle * 2) < 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + } + else { + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + } + ctx.fillStyle = this.colorAxis; + ctx.fillText(' ' + step.getCurrent() + ' ', text.x, text.y); - // calculate border widths - props.border.left = (dom.centerContainer.offsetWidth - dom.centerContainer.clientWidth) / 2; - props.border.right = props.border.left; - props.border.top = (dom.centerContainer.offsetHeight - dom.centerContainer.clientHeight) / 2; - props.border.bottom = props.border.top; - var borderRootHeight= dom.root.offsetHeight - dom.root.clientHeight; - var borderRootWidth = dom.root.offsetWidth - dom.root.clientWidth; + step.next(); + } - // calculate the heights. If any of the side panels is empty, we set the height to - // minus the border width, such that the border will be invisible - props.center.height = dom.center.offsetHeight; - props.left.height = dom.left.offsetHeight; - props.right.height = dom.right.offsetHeight; - props.top.height = dom.top.clientHeight || -props.border.top; - props.bottom.height = dom.bottom.clientHeight || -props.border.bottom; + // draw y-grid lines + ctx.lineWidth = 1; + prettyStep = (this.defaultYStep === undefined); + step = new StepNumber(this.yMin, this.yMax, this.yStep, prettyStep); + step.start(); + if (step.getCurrent() < this.yMin) { + step.next(); + } + while (!step.end()) { + if (this.showGrid) { + from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); + ctx.strokeStyle = this.colorGrid; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + } + else { + from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMin+gridLenY, step.getCurrent(), this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); - // TODO: compensate borders when any of the panels is empty. + from = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMax-gridLenY, step.getCurrent(), this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + } - // apply auto height - // TODO: only calculate autoHeight when needed (else we cause an extra reflow/repaint of the DOM) - var contentHeight = Math.max(props.left.height, props.center.height, props.right.height); - var autoHeight = props.top.height + contentHeight + props.bottom.height + - borderRootHeight + props.border.top + props.border.bottom; - dom.root.style.height = util.option.asSize(options.height, autoHeight + 'px'); + xText = (Math.sin(armAngle ) > 0) ? this.xMin : this.xMax; + text = this._convert3Dto2D(new Point3d(xText, step.getCurrent(), this.zMin)); + if (Math.cos(armAngle * 2) < 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + text.y += textMargin; + } + else if (Math.sin(armAngle * 2) > 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + } + else { + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + } + ctx.fillStyle = this.colorAxis; + ctx.fillText(' ' + step.getCurrent() + ' ', text.x, text.y); - // calculate heights of the content panels - props.root.height = dom.root.offsetHeight; - props.background.height = props.root.height - borderRootHeight; - var containerHeight = props.root.height - props.top.height - props.bottom.height - - borderRootHeight; - props.centerContainer.height = containerHeight; - props.leftContainer.height = containerHeight; - props.rightContainer.height = props.leftContainer.height; + step.next(); + } - // calculate the widths of the panels - props.root.width = dom.root.offsetWidth; - props.background.width = props.root.width - borderRootWidth; - props.left.width = dom.leftContainer.clientWidth || -props.border.left; - props.leftContainer.width = props.left.width; - props.right.width = dom.rightContainer.clientWidth || -props.border.right; - props.rightContainer.width = props.right.width; - var centerWidth = props.root.width - props.left.width - props.right.width - borderRootWidth; - props.center.width = centerWidth; - props.centerContainer.width = centerWidth; - props.top.width = centerWidth; - props.bottom.width = centerWidth; + // draw z-grid lines and axis + ctx.lineWidth = 1; + prettyStep = (this.defaultZStep === undefined); + step = new StepNumber(this.zMin, this.zMax, this.zStep, prettyStep); + step.start(); + if (step.getCurrent() < this.zMin) { + step.next(); + } + xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; + yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; + while (!step.end()) { + // TODO: make z-grid lines really 3d? + from = this._convert3Dto2D(new Point3d(xText, yText, step.getCurrent())); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(from.x - textMargin, from.y); + ctx.stroke(); - // resize the panels - dom.background.style.height = props.background.height + 'px'; - dom.backgroundVertical.style.height = props.background.height + 'px'; - dom.backgroundHorizontalContainer.style.height = props.centerContainer.height + 'px'; - dom.centerContainer.style.height = props.centerContainer.height + 'px'; - dom.leftContainer.style.height = props.leftContainer.height + 'px'; - dom.rightContainer.style.height = props.rightContainer.height + 'px'; + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = this.colorAxis; + ctx.fillText(step.getCurrent() + ' ', from.x - 5, from.y); - dom.background.style.width = props.background.width + 'px'; - dom.backgroundVertical.style.width = props.centerContainer.width + 'px'; - dom.backgroundHorizontalContainer.style.width = props.background.width + 'px'; - dom.backgroundHorizontal.style.width = props.background.width + 'px'; - dom.centerContainer.style.width = props.center.width + 'px'; - dom.top.style.width = props.top.width + 'px'; - dom.bottom.style.width = props.bottom.width + 'px'; + step.next(); + } + ctx.lineWidth = 1; + from = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); + to = this._convert3Dto2D(new Point3d(xText, yText, this.zMax)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); - // reposition the panels - dom.background.style.left = '0'; - dom.background.style.top = '0'; - dom.backgroundVertical.style.left = props.left.width + 'px'; - dom.backgroundVertical.style.top = '0'; - dom.backgroundHorizontalContainer.style.left = '0'; - dom.backgroundHorizontalContainer.style.top = props.top.height + 'px'; - dom.centerContainer.style.left = props.left.width + 'px'; - dom.centerContainer.style.top = props.top.height + 'px'; - dom.leftContainer.style.left = '0'; - dom.leftContainer.style.top = props.top.height + 'px'; - dom.rightContainer.style.left = (props.left.width + props.center.width) + 'px'; - dom.rightContainer.style.top = props.top.height + 'px'; - dom.top.style.left = props.left.width + 'px'; - dom.top.style.top = '0'; - dom.bottom.style.left = props.left.width + 'px'; - dom.bottom.style.top = (props.top.height + props.centerContainer.height) + 'px'; + // draw x-axis + ctx.lineWidth = 1; + // line at yMin + xMin2d = this._convert3Dto2D(new Point3d(this.xMin, this.yMin, this.zMin)); + xMax2d = this._convert3Dto2D(new Point3d(this.xMax, this.yMin, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(xMin2d.x, xMin2d.y); + ctx.lineTo(xMax2d.x, xMax2d.y); + ctx.stroke(); + // line at ymax + xMin2d = this._convert3Dto2D(new Point3d(this.xMin, this.yMax, this.zMin)); + xMax2d = this._convert3Dto2D(new Point3d(this.xMax, this.yMax, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(xMin2d.x, xMin2d.y); + ctx.lineTo(xMax2d.x, xMax2d.y); + ctx.stroke(); - // update the scrollTop, feasible range for the offset can be changed - // when the height of the Graph2d or of the contents of the center changed - this._updateScrollTop(); + // draw y-axis + ctx.lineWidth = 1; + // line at xMin + from = this._convert3Dto2D(new Point3d(this.xMin, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMin, this.yMax, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); + // line at xMax + from = this._convert3Dto2D(new Point3d(this.xMax, this.yMin, this.zMin)); + to = this._convert3Dto2D(new Point3d(this.xMax, this.yMax, this.zMin)); + ctx.strokeStyle = this.colorAxis; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + ctx.stroke(); - // reposition the scrollable contents - var offset = this.props.scrollTop; - if (options.orientation == 'bottom') { - offset += Math.max(this.props.centerContainer.height - this.props.center.height - - this.props.border.top - this.props.border.bottom, 0); + // draw x-label + var xLabel = this.xLabel; + if (xLabel.length > 0) { + yOffset = 0.1 / this.scale.y; + xText = (this.xMin + this.xMax) / 2; + yText = (Math.cos(armAngle) > 0) ? this.yMin - yOffset: this.yMax + yOffset; + text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); + if (Math.cos(armAngle * 2) > 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + } + else if (Math.sin(armAngle * 2) < 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + } + else { + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + } + ctx.fillStyle = this.colorAxis; + ctx.fillText(xLabel, text.x, text.y); } - dom.center.style.left = '0'; - dom.center.style.top = offset + 'px'; - dom.backgroundHorizontal.style.left = '0'; - dom.backgroundHorizontal.style.top = offset + 'px'; - dom.left.style.left = '0'; - dom.left.style.top = offset + 'px'; - dom.right.style.left = '0'; - dom.right.style.top = offset + 'px'; - // show shadows when vertical scrolling is available - var visibilityTop = this.props.scrollTop == 0 ? 'hidden' : ''; - var visibilityBottom = this.props.scrollTop == this.props.scrollTopMin ? 'hidden' : ''; - dom.shadowTop.style.visibility = visibilityTop; - dom.shadowBottom.style.visibility = visibilityBottom; - dom.shadowTopLeft.style.visibility = visibilityTop; - dom.shadowBottomLeft.style.visibility = visibilityBottom; - dom.shadowTopRight.style.visibility = visibilityTop; - dom.shadowBottomRight.style.visibility = visibilityBottom; + // draw y-label + var yLabel = this.yLabel; + if (yLabel.length > 0) { + xOffset = 0.1 / this.scale.x; + xText = (Math.sin(armAngle ) > 0) ? this.xMin - xOffset : this.xMax + xOffset; + yText = (this.yMin + this.yMax) / 2; + text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); + if (Math.cos(armAngle * 2) < 0) { + ctx.textAlign = 'center'; + ctx.textBaseline = 'top'; + } + else if (Math.sin(armAngle * 2) > 0){ + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + } + else { + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + } + ctx.fillStyle = this.colorAxis; + ctx.fillText(yLabel, text.x, text.y); + } - // redraw all components - this.components.forEach(function (component) { - resized = component.redraw() || resized; - }); - if (resized) { - // keep redrawing until all sizes are settled - this.redraw(); + // draw z-label + var zLabel = this.zLabel; + if (zLabel.length > 0) { + offset = 30; // pixels. // TODO: relate to the max width of the values on the z axis? + xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; + yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; + zText = (this.zMin + this.zMax) / 2; + text = this._convert3Dto2D(new Point3d(xText, yText, zText)); + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = this.colorAxis; + ctx.fillText(zLabel, text.x - offset, text.y); } }; /** - * Convert a position on screen (pixels) to a datetime - * @param {int} x Position on the screen in pixels - * @return {Date} time The datetime the corresponds with given position x - * @private + * Calculate the color based on the given value. + * @param {Number} H Hue, a value be between 0 and 360 + * @param {Number} S Saturation, a value between 0 and 1 + * @param {Number} V Value, a value between 0 and 1 */ - // TODO: move this function to Range - Graph2d.prototype._toTime = function(x) { - var conversion = this.range.conversion(this.props.center.width); - return new Date(x / conversion.scale + conversion.offset); - }; + Graph3d.prototype._hsv2rgb = function(H, S, V) { + var R, G, B, C, Hi, X; - /** - * Convert a datetime (Date object) into a position on the root - * This is used to get the pixel density estimate for the screen, not the center panel - * @param {Date} time A date - * @return {int} x The position on root in pixels which corresponds - * with the given date. - * @private - */ - // TODO: move this function to Range - Graph2d.prototype._toGlobalTime = function(x) { - var conversion = this.range.conversion(this.props.root.width); - return new Date(x / conversion.scale + conversion.offset); - }; + C = V * S; + Hi = Math.floor(H/60); // hi = 0,1,2,3,4,5 + X = C * (1 - Math.abs(((H/60) % 2) - 1)); - /** - * Convert a datetime (Date object) into a position on the screen - * @param {Date} time A date - * @return {int} x The position on the screen in pixels which corresponds - * with the given date. - * @private - */ - // TODO: move this function to Range - Graph2d.prototype._toScreen = function(time) { - var conversion = this.range.conversion(this.props.center.width); - return (time.valueOf() - conversion.offset) * conversion.scale; - }; + switch (Hi) { + case 0: R = C; G = X; B = 0; break; + case 1: R = X; G = C; B = 0; break; + case 2: R = 0; G = C; B = X; break; + case 3: R = 0; G = X; B = C; break; + case 4: R = X; G = 0; B = C; break; + case 5: R = C; G = 0; B = X; break; + default: R = 0; G = 0; B = 0; break; + } - /** - * Convert a datetime (Date object) into a position on the root - * This is used to get the pixel density estimate for the screen, not the center panel - * @param {Date} time A date - * @return {int} x The position on root in pixels which corresponds - * with the given date. - * @private - */ - // TODO: move this function to Range - Graph2d.prototype._toGlobalScreen = function(time) { - var conversion = this.range.conversion(this.props.root.width); - return (time.valueOf() - conversion.offset) * conversion.scale; + return 'RGB(' + parseInt(R*255) + ',' + parseInt(G*255) + ',' + parseInt(B*255) + ')'; }; - /** - * Initialize watching when option autoResize is true - * @private - */ - Graph2d.prototype._initAutoResize = function () { - if (this.options.autoResize == true) { - this._startAutoResize(); - } - else { - this._stopAutoResize(); - } - }; /** - * Watch for changes in the size of the container. On resize, the Panel will - * automatically redraw itself. - * @private + * Draw all datapoints as a grid + * This function can be used when the style is 'grid' */ - Graph2d.prototype._startAutoResize = function () { - var me = this; + Graph3d.prototype._redrawDataGrid = function() { + var canvas = this.frame.canvas, + ctx = canvas.getContext('2d'), + point, right, top, cross, + i, + topSideVisible, fillStyle, strokeStyle, lineWidth, + h, s, v, zAvg; - this._stopAutoResize(); - this._onResize = function() { - if (me.options.autoResize != true) { - // stop watching when the option autoResize is changed to false - me._stopAutoResize(); - return; - } + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? - if (me.dom.root) { - // check whether the frame is resized - if ((me.dom.root.clientWidth != me.props.lastWidth) || - (me.dom.root.clientHeight != me.props.lastHeight)) { - me.props.lastWidth = me.dom.root.clientWidth; - me.props.lastHeight = me.dom.root.clientHeight; + // calculate the translations and screen position of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); - me.emit('change'); - } - } + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; + + // calculate the translation of the point at the bottom (needed for sorting) + var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); + this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; + } + + // sort the points on depth of their (x,y) position (not on z) + var sortDepth = function (a, b) { + return b.dist - a.dist; }; + this.dataPoints.sort(sortDepth); - // add event listener to window resize - util.addEventListener(window, 'resize', this._onResize); + if (this.style === Graph3d.STYLE.SURFACE) { + for (i = 0; i < this.dataPoints.length; i++) { + point = this.dataPoints[i]; + right = this.dataPoints[i].pointRight; + top = this.dataPoints[i].pointTop; + cross = this.dataPoints[i].pointCross; - this.watchTimer = setInterval(this._onResize, 1000); - }; + if (point !== undefined && right !== undefined && top !== undefined && cross !== undefined) { - /** - * Stop watching for a resize of the frame. - * @private - */ - Graph2d.prototype._stopAutoResize = function () { - if (this.watchTimer) { - clearInterval(this.watchTimer); - this.watchTimer = undefined; + if (this.showGrayBottom || this.showShadow) { + // calculate the cross product of the two vectors from center + // to left and right, in order to know whether we are looking at the + // bottom or at the top side. We can also use the cross product + // for calculating light intensity + var aDiff = Point3d.subtract(cross.trans, point.trans); + var bDiff = Point3d.subtract(top.trans, right.trans); + var crossproduct = Point3d.crossProduct(aDiff, bDiff); + var len = crossproduct.length(); + // FIXME: there is a bug with determining the surface side (shadow or colored) + + topSideVisible = (crossproduct.z > 0); + } + else { + topSideVisible = true; + } + + if (topSideVisible) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + right.point.z + top.point.z + cross.point.z) / 4; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + s = 1; // saturation + + if (this.showShadow) { + v = Math.min(1 + (crossproduct.x / len) / 2, 1); // value. TODO: scale + fillStyle = this._hsv2rgb(h, s, v); + strokeStyle = fillStyle; + } + else { + v = 1; + fillStyle = this._hsv2rgb(h, s, v); + strokeStyle = this.colorAxis; + } + } + else { + fillStyle = 'gray'; + strokeStyle = this.colorAxis; + } + lineWidth = 0.5; + + ctx.lineWidth = lineWidth; + ctx.fillStyle = fillStyle; + ctx.strokeStyle = strokeStyle; + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(right.screen.x, right.screen.y); + ctx.lineTo(cross.screen.x, cross.screen.y); + ctx.lineTo(top.screen.x, top.screen.y); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } + } } + else { // grid style + for (i = 0; i < this.dataPoints.length; i++) { + point = this.dataPoints[i]; + right = this.dataPoints[i].pointRight; + top = this.dataPoints[i].pointTop; - // remove event listener on window.resize - util.removeEventListener(window, 'resize', this._onResize); - this._onResize = null; - }; + if (point !== undefined) { + if (this.showPerspective) { + lineWidth = 2 / -point.trans.z; + } + else { + lineWidth = 2 * -(this.eye.z / this.camera.getArmLength()); + } + } - /** - * Start moving the timeline vertically - * @param {Event} event - * @private - */ - Graph2d.prototype._onTouch = function (event) { - this.touch.allowDragging = true; - }; + if (point !== undefined && right !== undefined) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + right.point.z) / 2; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; - /** - * Start moving the timeline vertically - * @param {Event} event - * @private - */ - Graph2d.prototype._onPinch = function (event) { - this.touch.allowDragging = false; + ctx.lineWidth = lineWidth; + ctx.strokeStyle = this._hsv2rgb(h, 1, 1); + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(right.screen.x, right.screen.y); + ctx.stroke(); + } + + if (point !== undefined && top !== undefined) { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + zAvg = (point.point.z + top.point.z) / 2; + h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + + ctx.lineWidth = lineWidth; + ctx.strokeStyle = this._hsv2rgb(h, 1, 1); + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); + ctx.lineTo(top.screen.x, top.screen.y); + ctx.stroke(); + } + } + } }; - /** - * Start moving the timeline vertically - * @param {Event} event - * @private - */ - Graph2d.prototype._onDragStart = function (event) { - this.touch.initialScrollTop = this.props.scrollTop; - }; /** - * Move the timeline vertically - * @param {Event} event - * @private + * Draw all datapoints as dots. + * This function can be used when the style is 'dot' or 'dot-line' */ - Graph2d.prototype._onDrag = function (event) { - // refuse to drag when we where pinching to prevent the timeline make a jump - // when releasing the fingers in opposite order from the touch screen - if (!this.touch.allowDragging) return; + Graph3d.prototype._redrawDataDot = function() { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + var i; - var delta = event.gesture.deltaY; + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? - var oldScrollTop = this._getScrollTop(); - var newScrollTop = this._setScrollTop(this.touch.initialScrollTop + delta); + // calculate the translations of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; - if (newScrollTop != oldScrollTop) { - this.redraw(); // TODO: this causes two redraws when dragging, the other is triggered by rangechange already + // calculate the distance from the point at the bottom to the camera + var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); + this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; } - }; - /** - * Apply a scrollTop - * @param {Number} scrollTop - * @returns {Number} scrollTop Returns the applied scrollTop - * @private - */ - Graph2d.prototype._setScrollTop = function (scrollTop) { - this.props.scrollTop = scrollTop; - this._updateScrollTop(); - return this.props.scrollTop; - }; + // order the translated points by depth + var sortDepth = function (a, b) { + return b.dist - a.dist; + }; + this.dataPoints.sort(sortDepth); - /** - * Update the current scrollTop when the height of the containers has been changed - * @returns {Number} scrollTop Returns the applied scrollTop - * @private - */ - Graph2d.prototype._updateScrollTop = function () { - // recalculate the scrollTopMin - var scrollTopMin = Math.min(this.props.centerContainer.height - this.props.center.height, 0); // is negative or zero - if (scrollTopMin != this.props.scrollTopMin) { - // in case of bottom orientation, change the scrollTop such that the contents - // do not move relative to the time axis at the bottom - if (this.options.orientation == 'bottom') { - this.props.scrollTop += (scrollTopMin - this.props.scrollTopMin); + // draw the datapoints as colored circles + var dotSize = this.frame.clientWidth * 0.02; // px + for (i = 0; i < this.dataPoints.length; i++) { + var point = this.dataPoints[i]; + + if (this.style === Graph3d.STYLE.DOTLINE) { + // draw a vertical line from the bottom to the graph value + //var from = this._convert3Dto2D(new Point3d(point.point.x, point.point.y, this.zMin)); + var from = this._convert3Dto2D(point.bottom); + ctx.lineWidth = 1; + ctx.strokeStyle = this.colorGrid; + ctx.beginPath(); + ctx.moveTo(from.x, from.y); + ctx.lineTo(point.screen.x, point.screen.y); + ctx.stroke(); } - this.props.scrollTopMin = scrollTopMin; - } - // limit the scrollTop to the feasible scroll range - if (this.props.scrollTop > 0) this.props.scrollTop = 0; - if (this.props.scrollTop < scrollTopMin) this.props.scrollTop = scrollTopMin; + // calculate radius for the circle + var size; + if (this.style === Graph3d.STYLE.DOTSIZE) { + size = dotSize/2 + 2*dotSize * (point.point.value - this.valueMin) / (this.valueMax - this.valueMin); + } + else { + size = dotSize; + } - return this.props.scrollTop; + var radius; + if (this.showPerspective) { + radius = size / -point.trans.z; + } + else { + radius = size * -(this.eye.z / this.camera.getArmLength()); + } + if (radius < 0) { + radius = 0; + } + + var hue, color, borderColor; + if (this.style === Graph3d.STYLE.DOTCOLOR ) { + // calculate the color based on the value + hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); + } + else if (this.style === Graph3d.STYLE.DOTSIZE) { + color = this.colorDot; + borderColor = this.colorDotBorder; + } + else { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); + } + + // draw the circle + ctx.lineWidth = 1.0; + ctx.strokeStyle = borderColor; + ctx.fillStyle = color; + ctx.beginPath(); + ctx.arc(point.screen.x, point.screen.y, radius, 0, Math.PI*2, true); + ctx.fill(); + ctx.stroke(); + } }; /** - * Get the current scrollTop - * @returns {number} scrollTop - * @private + * Draw all datapoints as bars. + * This function can be used when the style is 'bar', 'bar-color', or 'bar-size' */ - Graph2d.prototype._getScrollTop = function () { - return this.props.scrollTop; - }; - - module.exports = Graph2d; + Graph3d.prototype._redrawDataBar = function() { + var canvas = this.frame.canvas; + var ctx = canvas.getContext('2d'); + var i, j, surface, corners; + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? -/***/ }, -/* 8 */ -/***/ function(module, exports, __webpack_require__) { + // calculate the translations of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; - var util = __webpack_require__(1); - var moment = __webpack_require__(39); - var Component = __webpack_require__(12); + // calculate the distance from the point at the bottom to the camera + var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); + this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; + } - /** - * @constructor Range - * A Range controls a numeric range with a start and end value. - * The Range adjusts the range based on mouse events or programmatic changes, - * and triggers events when the range is changing or has been changed. - * @param {{dom: Object, domProps: Object, emitter: Emitter}} body - * @param {Object} [options] See description at Range.setOptions - */ - function Range(body, options) { - var now = moment().hours(0).minutes(0).seconds(0).milliseconds(0); - this.start = now.clone().add('days', -3).valueOf(); // Number - this.end = now.clone().add('days', 4).valueOf(); // Number + // order the translated points by depth + var sortDepth = function (a, b) { + return b.dist - a.dist; + }; + this.dataPoints.sort(sortDepth); - this.body = body; + // draw the datapoints as bars + var xWidth = this.xBarWidth / 2; + var yWidth = this.yBarWidth / 2; + for (i = 0; i < this.dataPoints.length; i++) { + var point = this.dataPoints[i]; - // default options - this.defaultOptions = { - start: null, - end: null, - direction: 'horizontal', // 'horizontal' or 'vertical' - moveable: true, - zoomable: true, - min: null, - max: null, - zoomMin: 10, // milliseconds - zoomMax: 1000 * 60 * 60 * 24 * 365 * 10000 // milliseconds - }; - this.options = util.extend({}, this.defaultOptions); + // determine color + var hue, color, borderColor; + if (this.style === Graph3d.STYLE.BARCOLOR ) { + // calculate the color based on the value + hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); + } + else if (this.style === Graph3d.STYLE.BARSIZE) { + color = this.colorDot; + borderColor = this.colorDotBorder; + } + else { + // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 + hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; + color = this._hsv2rgb(hue, 1, 1); + borderColor = this._hsv2rgb(hue, 1, 0.8); + } - this.props = { - touch: {} - }; + // calculate size for the bar + if (this.style === Graph3d.STYLE.BARSIZE) { + xWidth = (this.xBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); + yWidth = (this.yBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); + } - // drag listeners for dragging - this.body.emitter.on('dragstart', this._onDragStart.bind(this)); - this.body.emitter.on('drag', this._onDrag.bind(this)); - this.body.emitter.on('dragend', this._onDragEnd.bind(this)); + // calculate all corner points + var me = this; + var point3d = point.point; + var top = [ + {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, point3d.z)}, + {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, point3d.z)}, + {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, point3d.z)}, + {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, point3d.z)} + ]; + var bottom = [ + {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, this.zMin)}, + {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, this.zMin)}, + {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, this.zMin)}, + {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, this.zMin)} + ]; - // ignore dragging when holding - this.body.emitter.on('hold', this._onHold.bind(this)); + // calculate screen location of the points + top.forEach(function (obj) { + obj.screen = me._convert3Dto2D(obj.point); + }); + bottom.forEach(function (obj) { + obj.screen = me._convert3Dto2D(obj.point); + }); - // mouse wheel for zooming - this.body.emitter.on('mousewheel', this._onMouseWheel.bind(this)); - this.body.emitter.on('DOMMouseScroll', this._onMouseWheel.bind(this)); // For FF + // create five sides, calculate both corner points and center points + var surfaces = [ + {corners: top, center: Point3d.avg(bottom[0].point, bottom[2].point)}, + {corners: [top[0], top[1], bottom[1], bottom[0]], center: Point3d.avg(bottom[1].point, bottom[0].point)}, + {corners: [top[1], top[2], bottom[2], bottom[1]], center: Point3d.avg(bottom[2].point, bottom[1].point)}, + {corners: [top[2], top[3], bottom[3], bottom[2]], center: Point3d.avg(bottom[3].point, bottom[2].point)}, + {corners: [top[3], top[0], bottom[0], bottom[3]], center: Point3d.avg(bottom[0].point, bottom[3].point)} + ]; + point.surfaces = surfaces; - // pinch to zoom - this.body.emitter.on('touch', this._onTouch.bind(this)); - this.body.emitter.on('pinch', this._onPinch.bind(this)); + // calculate the distance of each of the surface centers to the camera + for (j = 0; j < surfaces.length; j++) { + surface = surfaces[j]; + var transCenter = this._convertPointToTranslation(surface.center); + surface.dist = this.showPerspective ? transCenter.length() : -transCenter.z; + // TODO: this dept calculation doesn't work 100% of the cases due to perspective, + // but the current solution is fast/simple and works in 99.9% of all cases + // the issue is visible in example 14, with graph.setCameraPosition({horizontal: 2.97, vertical: 0.5, distance: 0.9}) + } - this.setOptions(options); - } + // order the surfaces by their (translated) depth + surfaces.sort(function (a, b) { + var diff = b.dist - a.dist; + if (diff) return diff; - Range.prototype = new Component(); + // if equal depth, sort the top surface last + if (a.corners === top) return 1; + if (b.corners === top) return -1; - /** - * Set options for the range controller - * @param {Object} options Available options: - * {Number | Date | String} start Start date for the range - * {Number | Date | String} end End date for the range - * {Number} min Minimum value for start - * {Number} max Maximum value for end - * {Number} zoomMin Set a minimum value for - * (end - start). - * {Number} zoomMax Set a maximum value for - * (end - start). - * {Boolean} moveable Enable moving of the range - * by dragging. True by default - * {Boolean} zoomable Enable zooming of the range - * by pinching/scrolling. True by default - */ - Range.prototype.setOptions = function (options) { - if (options) { - // copy the options that we know - var fields = ['direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable']; - util.selectiveExtend(fields, this.options, options); + // both are equal + return 0; + }); - if ('start' in options || 'end' in options) { - // apply a new range. both start and end are optional - this.setRange(options.start, options.end); + // draw the ordered surfaces + ctx.lineWidth = 1; + ctx.strokeStyle = borderColor; + ctx.fillStyle = color; + // NOTE: we start at j=2 instead of j=0 as we don't need to draw the two surfaces at the backside + for (j = 2; j < surfaces.length; j++) { + surface = surfaces[j]; + corners = surface.corners; + ctx.beginPath(); + ctx.moveTo(corners[3].screen.x, corners[3].screen.y); + ctx.lineTo(corners[0].screen.x, corners[0].screen.y); + ctx.lineTo(corners[1].screen.x, corners[1].screen.y); + ctx.lineTo(corners[2].screen.x, corners[2].screen.y); + ctx.lineTo(corners[3].screen.x, corners[3].screen.y); + ctx.fill(); + ctx.stroke(); } } }; - /** - * Test whether direction has a valid value - * @param {String} direction 'horizontal' or 'vertical' - */ - function validateDirection (direction) { - if (direction != 'horizontal' && direction != 'vertical') { - throw new TypeError('Unknown direction "' + direction + '". ' + - 'Choose "horizontal" or "vertical".'); - } - } /** - * Set a new start and end range - * @param {Number} [start] - * @param {Number} [end] + * Draw a line through all datapoints. + * This function can be used when the style is 'line' */ - Range.prototype.setRange = function(start, end) { - var changed = this._applyRange(start, end); - if (changed) { - var params = { - start: new Date(this.start), - end: new Date(this.end) - }; - this.body.emitter.emit('rangechange', params); - this.body.emitter.emit('rangechanged', params); - } - }; + Graph3d.prototype._redrawDataLine = function() { + var canvas = this.frame.canvas, + ctx = canvas.getContext('2d'), + point, i; - /** - * Set a new start and end range. This method is the same as setRange, but - * does not trigger a range change and range changed event, and it returns - * true when the range is changed - * @param {Number} [start] - * @param {Number} [end] - * @return {Boolean} changed - * @private - */ - Range.prototype._applyRange = function(start, end) { - var newStart = (start != null) ? util.convert(start, 'Date').valueOf() : this.start, - newEnd = (end != null) ? util.convert(end, 'Date').valueOf() : this.end, - max = (this.options.max != null) ? util.convert(this.options.max, 'Date').valueOf() : null, - min = (this.options.min != null) ? util.convert(this.options.min, 'Date').valueOf() : null, - diff; + if (this.dataPoints === undefined || this.dataPoints.length <= 0) + return; // TODO: throw exception? - // check for valid number - if (isNaN(newStart) || newStart === null) { - throw new Error('Invalid start "' + start + '"'); - } - if (isNaN(newEnd) || newEnd === null) { - throw new Error('Invalid end "' + end + '"'); - } + // calculate the translations of all points + for (i = 0; i < this.dataPoints.length; i++) { + var trans = this._convertPointToTranslation(this.dataPoints[i].point); + var screen = this._convertTranslationToScreen(trans); - // prevent start < end - if (newEnd < newStart) { - newEnd = newStart; + this.dataPoints[i].trans = trans; + this.dataPoints[i].screen = screen; } - // prevent start < min - if (min !== null) { - if (newStart < min) { - diff = (min - newStart); - newStart += diff; - newEnd += diff; + // start the line + if (this.dataPoints.length > 0) { + point = this.dataPoints[0]; - // prevent end > max - if (max != null) { - if (newEnd > max) { - newEnd = max; - } - } - } + ctx.lineWidth = 1; // TODO: make customizable + ctx.strokeStyle = 'blue'; // TODO: make customizable + ctx.beginPath(); + ctx.moveTo(point.screen.x, point.screen.y); } - // prevent end > max - if (max !== null) { - if (newEnd > max) { - diff = (newEnd - max); - newStart -= diff; - newEnd -= diff; - - // prevent start < min - if (min != null) { - if (newStart < min) { - newStart = min; - } - } - } + // draw the datapoints as colored circles + for (i = 1; i < this.dataPoints.length; i++) { + point = this.dataPoints[i]; + ctx.lineTo(point.screen.x, point.screen.y); } - // prevent (end-start) < zoomMin - if (this.options.zoomMin !== null) { - var zoomMin = parseFloat(this.options.zoomMin); - if (zoomMin < 0) { - zoomMin = 0; - } - if ((newEnd - newStart) < zoomMin) { - if ((this.end - this.start) === zoomMin) { - // ignore this action, we are already zoomed to the minimum - newStart = this.start; - newEnd = this.end; - } - else { - // zoom to the minimum - diff = (zoomMin - (newEnd - newStart)); - newStart -= diff / 2; - newEnd += diff / 2; - } - } + // finish the line + if (this.dataPoints.length > 0) { + ctx.stroke(); } + }; - // prevent (end-start) > zoomMax - if (this.options.zoomMax !== null) { - var zoomMax = parseFloat(this.options.zoomMax); - if (zoomMax < 0) { - zoomMax = 0; - } - if ((newEnd - newStart) > zoomMax) { - if ((this.end - this.start) === zoomMax) { - // ignore this action, we are already zoomed to the maximum - newStart = this.start; - newEnd = this.end; - } - else { - // zoom to the maximum - diff = ((newEnd - newStart) - zoomMax); - newStart += diff / 2; - newEnd -= diff / 2; - } - } + /** + * Start a moving operation inside the provided parent element + * @param {Event} event The event that occurred (required for + * retrieving the mouse position) + */ + Graph3d.prototype._onMouseDown = function(event) { + event = event || window.event; + + // check if mouse is still down (may be up when focus is lost for example + // in an iframe) + if (this.leftButtonDown) { + this._onMouseUp(event); } - var changed = (this.start != newStart || this.end != newEnd); + // only react on left mouse button down + this.leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); + if (!this.leftButtonDown && !this.touchDown) return; - this.start = newStart; - this.end = newEnd; + // get mouse position (different code for IE and all other browsers) + this.startMouseX = getMouseX(event); + this.startMouseY = getMouseY(event); - return changed; + this.startStart = new Date(this.start); + this.startEnd = new Date(this.end); + this.startArmRotation = this.camera.getArmRotation(); + + this.frame.style.cursor = 'move'; + + // add event listeners to handle moving the contents + // we store the function onmousemove and onmouseup in the graph, so we can + // remove the eventlisteners lateron in the function mouseUp() + var me = this; + this.onmousemove = function (event) {me._onMouseMove(event);}; + this.onmouseup = function (event) {me._onMouseUp(event);}; + G3DaddEventListener(document, 'mousemove', me.onmousemove); + G3DaddEventListener(document, 'mouseup', me.onmouseup); + G3DpreventDefault(event); }; - /** - * Retrieve the current range. - * @return {Object} An object with start and end properties - */ - Range.prototype.getRange = function() { - return { - start: this.start, - end: this.end - }; - }; /** - * Calculate the conversion offset and scale for current range, based on - * the provided width - * @param {Number} width - * @returns {{offset: number, scale: number}} conversion + * Perform moving operating. + * This function activated from within the funcion Graph.mouseDown(). + * @param {Event} event Well, eehh, the event */ - Range.prototype.conversion = function (width) { - return Range.conversion(this.start, this.end, width); - }; + Graph3d.prototype._onMouseMove = function (event) { + event = event || window.event; - /** - * Static method to calculate the conversion offset and scale for a range, - * based on the provided start, end, and width - * @param {Number} start - * @param {Number} end - * @param {Number} width - * @returns {{offset: number, scale: number}} conversion - */ - Range.conversion = function (start, end, width) { - if (width != 0 && (end - start != 0)) { - return { - offset: start, - scale: width / (end - start) - } + // calculate change in mouse position + var diffX = parseFloat(getMouseX(event)) - this.startMouseX; + var diffY = parseFloat(getMouseY(event)) - this.startMouseY; + + var horizontalNew = this.startArmRotation.horizontal + diffX / 200; + var verticalNew = this.startArmRotation.vertical + diffY / 200; + + var snapAngle = 4; // degrees + var snapValue = Math.sin(snapAngle / 360 * 2 * Math.PI); + + // snap horizontally to nice angles at 0pi, 0.5pi, 1pi, 1.5pi, etc... + // the -0.001 is to take care that the vertical axis is always drawn at the left front corner + if (Math.abs(Math.sin(horizontalNew)) < snapValue) { + horizontalNew = Math.round((horizontalNew / Math.PI)) * Math.PI - 0.001; } - else { - return { - offset: 0, - scale: 1 - }; + if (Math.abs(Math.cos(horizontalNew)) < snapValue) { + horizontalNew = (Math.round((horizontalNew/ Math.PI - 0.5)) + 0.5) * Math.PI - 0.001; } - }; - /** - * Start dragging horizontally or vertically - * @param {Event} event - * @private - */ - Range.prototype._onDragStart = function(event) { - // only allow dragging when configured as movable - if (!this.options.moveable) return; + // snap vertically to nice angles + if (Math.abs(Math.sin(verticalNew)) < snapValue) { + verticalNew = Math.round((verticalNew / Math.PI)) * Math.PI; + } + if (Math.abs(Math.cos(verticalNew)) < snapValue) { + verticalNew = (Math.round((verticalNew/ Math.PI - 0.5)) + 0.5) * Math.PI; + } - // refuse to drag when we where pinching to prevent the timeline make a jump - // when releasing the fingers in opposite order from the touch screen - if (!this.props.touch.allowDragging) return; + this.camera.setArmRotation(horizontalNew, verticalNew); + this.redraw(); - this.props.touch.start = this.start; - this.props.touch.end = this.end; + // fire a cameraPositionChange event + var parameters = this.getCameraPosition(); + this.emit('cameraPositionChange', parameters); - if (this.body.dom.root) { - this.body.dom.root.style.cursor = 'move'; - } + G3DpreventDefault(event); }; - /** - * Perform dragging operation - * @param {Event} event - * @private - */ - Range.prototype._onDrag = function (event) { - // only allow dragging when configured as movable - if (!this.options.moveable) return; - var direction = this.options.direction; - validateDirection(direction); - // refuse to drag when we where pinching to prevent the timeline make a jump - // when releasing the fingers in opposite order from the touch screen - if (!this.props.touch.allowDragging) return; - var delta = (direction == 'horizontal') ? event.gesture.deltaX : event.gesture.deltaY, - interval = (this.props.touch.end - this.props.touch.start), - width = (direction == 'horizontal') ? this.body.domProps.center.width : this.body.domProps.center.height, - diffRange = -delta / width * interval; - this._applyRange(this.props.touch.start + diffRange, this.props.touch.end + diffRange); - this.body.emitter.emit('rangechange', { - start: new Date(this.start), - end: new Date(this.end) - }); - }; /** - * Stop dragging operation - * @param {event} event - * @private + * Stop moving operating. + * This function activated from within the funcion Graph.mouseDown(). + * @param {event} event The event */ - Range.prototype._onDragEnd = function (event) { - // only allow dragging when configured as movable - if (!this.options.moveable) return; - - // refuse to drag when we where pinching to prevent the timeline make a jump - // when releasing the fingers in opposite order from the touch screen - if (!this.props.touch.allowDragging) return; - - if (this.body.dom.root) { - this.body.dom.root.style.cursor = 'auto'; - } + Graph3d.prototype._onMouseUp = function (event) { + this.frame.style.cursor = 'auto'; + this.leftButtonDown = false; - // fire a rangechanged event - this.body.emitter.emit('rangechanged', { - start: new Date(this.start), - end: new Date(this.end) - }); + // remove event listeners here + G3DremoveEventListener(document, 'mousemove', this.onmousemove); + G3DremoveEventListener(document, 'mouseup', this.onmouseup); + G3DpreventDefault(event); }; /** - * Event handler for mouse wheel event, used to zoom - * Code from http://adomas.org/javascript-mouse-wheel/ - * @param {Event} event - * @private + * After having moved the mouse, a tooltip should pop up when the mouse is resting on a data point + * @param {Event} event A mouse move event */ - Range.prototype._onMouseWheel = function(event) { - // only allow zooming when configured as zoomable and moveable - if (!(this.options.zoomable && this.options.moveable)) return; + Graph3d.prototype._onTooltip = function (event) { + var delay = 300; // ms + var mouseX = getMouseX(event) - getAbsoluteLeft(this.frame); + var mouseY = getMouseY(event) - getAbsoluteTop(this.frame); - // retrieve delta - var delta = 0; - if (event.wheelDelta) { /* IE/Opera. */ - delta = event.wheelDelta / 120; - } else if (event.detail) { /* Mozilla case. */ - // In Mozilla, sign of delta is different than in IE. - // Also, delta is multiple of 3. - delta = -event.detail / 3; + if (!this.showTooltip) { + return; } - // If delta is nonzero, handle it. - // Basically, delta is now positive if wheel was scrolled up, - // and negative, if wheel was scrolled down. - if (delta) { - // perform the zoom action. Delta is normally 1 or -1 + if (this.tooltipTimeout) { + clearTimeout(this.tooltipTimeout); + } - // adjust a negative delta such that zooming in with delta 0.1 - // equals zooming out with a delta -0.1 - var scale; - if (delta < 0) { - scale = 1 - (delta / 5); - } - else { - scale = 1 / (1 + (delta / 5)) ; - } + // (delayed) display of a tooltip only if no mouse button is down + if (this.leftButtonDown) { + this._hideTooltip(); + return; + } - // calculate center, the date to zoom around - var gesture = util.fakeGesture(this, event), - pointer = getPointer(gesture.center, this.body.dom.center), - pointerDate = this._pointerToDate(pointer); + if (this.tooltip && this.tooltip.dataPoint) { + // tooltip is currently visible + var dataPoint = this._dataPointFromXY(mouseX, mouseY); + if (dataPoint !== this.tooltip.dataPoint) { + // datapoint changed + if (dataPoint) { + this._showTooltip(dataPoint); + } + else { + this._hideTooltip(); + } + } + } + else { + // tooltip is currently not visible + var me = this; + this.tooltipTimeout = setTimeout(function () { + me.tooltipTimeout = null; - this.zoom(scale, pointerDate); + // show a tooltip if we have a data point + var dataPoint = me._dataPointFromXY(mouseX, mouseY); + if (dataPoint) { + me._showTooltip(dataPoint); + } + }, delay); } + }; - // Prevent default actions caused by mouse wheel - // (else the page and timeline both zoom and scroll) - event.preventDefault(); + /** + * Event handler for touchstart event on mobile devices + */ + Graph3d.prototype._onTouchStart = function(event) { + this.touchDown = true; + + var me = this; + this.ontouchmove = function (event) {me._onTouchMove(event);}; + this.ontouchend = function (event) {me._onTouchEnd(event);}; + G3DaddEventListener(document, 'touchmove', me.ontouchmove); + G3DaddEventListener(document, 'touchend', me.ontouchend); + + this._onMouseDown(event); }; /** - * Start of a touch gesture - * @private + * Event handler for touchmove event on mobile devices */ - Range.prototype._onTouch = function (event) { - this.props.touch.start = this.start; - this.props.touch.end = this.end; - this.props.touch.allowDragging = true; - this.props.touch.center = null; + Graph3d.prototype._onTouchMove = function(event) { + this._onMouseMove(event); }; /** - * On start of a hold gesture - * @private + * Event handler for touchend event on mobile devices */ - Range.prototype._onHold = function () { - this.props.touch.allowDragging = false; + Graph3d.prototype._onTouchEnd = function(event) { + this.touchDown = false; + + G3DremoveEventListener(document, 'touchmove', this.ontouchmove); + G3DremoveEventListener(document, 'touchend', this.ontouchend); + + this._onMouseUp(event); }; + /** - * Handle pinch event - * @param {Event} event - * @private + * Event handler for mouse wheel event, used to zoom the graph + * Code from http://adomas.org/javascript-mouse-wheel/ + * @param {event} event The event */ - Range.prototype._onPinch = function (event) { - // only allow zooming when configured as zoomable and moveable - if (!(this.options.zoomable && this.options.moveable)) return; - - this.props.touch.allowDragging = false; + Graph3d.prototype._onWheel = function(event) { + if (!event) /* For IE. */ + event = window.event; - if (event.gesture.touches.length > 1) { - if (!this.props.touch.center) { - this.props.touch.center = getPointer(event.gesture.center, this.body.dom.center); - } + // retrieve delta + var delta = 0; + if (event.wheelDelta) { /* IE/Opera. */ + delta = event.wheelDelta/120; + } else if (event.detail) { /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail/3; + } - var scale = 1 / event.gesture.scale, - initDate = this._pointerToDate(this.props.touch.center); + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta) { + var oldLength = this.camera.getArmLength(); + var newLength = oldLength * (1 - delta / 10); - // calculate new start and end - var newStart = parseInt(initDate + (this.props.touch.start - initDate) * scale); - var newEnd = parseInt(initDate + (this.props.touch.end - initDate) * scale); + this.camera.setArmLength(newLength); + this.redraw(); - // apply new range - this.setRange(newStart, newEnd); + this._hideTooltip(); } + + // fire a cameraPositionChange event + var parameters = this.getCameraPosition(); + this.emit('cameraPositionChange', parameters); + + // Prevent default actions caused by mouse wheel. + // That might be ugly, but we handle scrolls somehow + // anyway, so don't bother here.. + G3DpreventDefault(event); }; /** - * Helper function to calculate the center date for zooming - * @param {{x: Number, y: Number}} pointer - * @return {number} date + * Test whether a point lies inside given 2D triangle + * @param {Point2d} point + * @param {Point2d[]} triangle + * @return {boolean} Returns true if given point lies inside or on the edge of the triangle * @private */ - Range.prototype._pointerToDate = function (pointer) { - var conversion; - var direction = this.options.direction; - - validateDirection(direction); + Graph3d.prototype._insideTriangle = function (point, triangle) { + var a = triangle[0], + b = triangle[1], + c = triangle[2]; - if (direction == 'horizontal') { - var width = this.body.domProps.center.width; - conversion = this.conversion(width); - return pointer.x / conversion.scale + conversion.offset; - } - else { - var height = this.body.domProps.center.height; - conversion = this.conversion(height); - return pointer.y / conversion.scale + conversion.offset; + function sign (x) { + return x > 0 ? 1 : x < 0 ? -1 : 0; } + + var as = sign((b.x - a.x) * (point.y - a.y) - (b.y - a.y) * (point.x - a.x)); + var bs = sign((c.x - b.x) * (point.y - b.y) - (c.y - b.y) * (point.x - b.x)); + var cs = sign((a.x - c.x) * (point.y - c.y) - (a.y - c.y) * (point.x - c.x)); + + // each of the three signs must be either equal to each other or zero + return (as == 0 || bs == 0 || as == bs) && + (bs == 0 || cs == 0 || bs == cs) && + (as == 0 || cs == 0 || as == cs); }; /** - * Get the pointer location relative to the location of the dom element - * @param {{pageX: Number, pageY: Number}} touch - * @param {Element} element HTML DOM element - * @return {{x: Number, y: Number}} pointer + * Find a data point close to given screen position (x, y) + * @param {Number} x + * @param {Number} y + * @return {Object | null} The closest data point or null if not close to any data point * @private */ - function getPointer (touch, element) { - return { - x: touch.pageX - util.getAbsoluteLeft(element), - y: touch.pageY - util.getAbsoluteTop(element) - }; - } + Graph3d.prototype._dataPointFromXY = function (x, y) { + var i, + distMax = 100, // px + dataPoint = null, + closestDataPoint = null, + closestDist = null, + center = new Point2d(x, y); - /** - * Zoom the range the given scale in or out. Start and end date will - * be adjusted, and the timeline will be redrawn. You can optionally give a - * date around which to zoom. - * For example, try scale = 0.9 or 1.1 - * @param {Number} scale Scaling factor. Values above 1 will zoom out, - * values below 1 will zoom in. - * @param {Number} [center] Value representing a date around which will - * be zoomed. - */ - Range.prototype.zoom = function(scale, center) { - // if centerDate is not provided, take it half between start Date and end Date - if (center == null) { - center = (this.start + this.end) / 2; + if (this.style === Graph3d.STYLE.BAR || + this.style === Graph3d.STYLE.BARCOLOR || + this.style === Graph3d.STYLE.BARSIZE) { + // the data points are ordered from far away to closest + for (i = this.dataPoints.length - 1; i >= 0; i--) { + dataPoint = this.dataPoints[i]; + var surfaces = dataPoint.surfaces; + if (surfaces) { + for (var s = surfaces.length - 1; s >= 0; s--) { + // split each surface in two triangles, and see if the center point is inside one of these + var surface = surfaces[s]; + var corners = surface.corners; + var triangle1 = [corners[0].screen, corners[1].screen, corners[2].screen]; + var triangle2 = [corners[2].screen, corners[3].screen, corners[0].screen]; + if (this._insideTriangle(center, triangle1) || + this._insideTriangle(center, triangle2)) { + // return immediately at the first hit + return dataPoint; + } + } + } + } } + else { + // find the closest data point, using distance to the center of the point on 2d screen + for (i = 0; i < this.dataPoints.length; i++) { + dataPoint = this.dataPoints[i]; + var point = dataPoint.screen; + if (point) { + var distX = Math.abs(x - point.x); + var distY = Math.abs(y - point.y); + var dist = Math.sqrt(distX * distX + distY * distY); - // calculate new start and end - var newStart = center + (this.start - center) * scale; - var newEnd = center + (this.end - center) * scale; + if ((closestDist === null || dist < closestDist) && dist < distMax) { + closestDist = dist; + closestDataPoint = dataPoint; + } + } + } + } - this.setRange(newStart, newEnd); + + return closestDataPoint; }; /** - * Move the range with a given delta to the left or right. Start and end - * value will be adjusted. For example, try delta = 0.1 or -0.1 - * @param {Number} delta Moving amount. Positive value will move right, - * negative value will move left + * Display a tooltip for given data point + * @param {Object} dataPoint + * @private */ - Range.prototype.move = function(delta) { - // zoom start Date and end Date relative to the centerDate - var diff = (this.end - this.start); - - // apply new values - var newStart = this.start + diff * delta; - var newEnd = this.end + diff * delta; + Graph3d.prototype._showTooltip = function (dataPoint) { + var content, line, dot; - // TODO: reckon with min and max range + if (!this.tooltip) { + content = document.createElement('div'); + content.style.position = 'absolute'; + content.style.padding = '10px'; + content.style.border = '1px solid #4d4d4d'; + content.style.color = '#1a1a1a'; + content.style.background = 'rgba(255,255,255,0.7)'; + content.style.borderRadius = '2px'; + content.style.boxShadow = '5px 5px 10px rgba(128,128,128,0.5)'; - this.start = newStart; - this.end = newEnd; - }; + line = document.createElement('div'); + line.style.position = 'absolute'; + line.style.height = '40px'; + line.style.width = '0'; + line.style.borderLeft = '1px solid #4d4d4d'; - /** - * Move the range to a new center point - * @param {Number} moveTo New center point of the range - */ - Range.prototype.moveTo = function(moveTo) { - var center = (this.start + this.end) / 2; + dot = document.createElement('div'); + dot.style.position = 'absolute'; + dot.style.height = '0'; + dot.style.width = '0'; + dot.style.border = '5px solid #4d4d4d'; + dot.style.borderRadius = '5px'; - var diff = center - moveTo; + this.tooltip = { + dataPoint: null, + dom: { + content: content, + line: line, + dot: dot + } + }; + } + else { + content = this.tooltip.dom.content; + line = this.tooltip.dom.line; + dot = this.tooltip.dom.dot; + } - // calculate new start and end - var newStart = this.start - diff; - var newEnd = this.end - diff; + this._hideTooltip(); - this.setRange(newStart, newEnd); - }; + this.tooltip.dataPoint = dataPoint; + if (typeof this.showTooltip === 'function') { + content.innerHTML = this.showTooltip(dataPoint.point); + } + else { + content.innerHTML = '' + + '' + + '' + + '' + + '
x:' + dataPoint.point.x + '
y:' + dataPoint.point.y + '
z:' + dataPoint.point.z + '
'; + } - module.exports = Range; + content.style.left = '0'; + content.style.top = '0'; + this.frame.appendChild(content); + this.frame.appendChild(line); + this.frame.appendChild(dot); + // calculate sizes + var contentWidth = content.offsetWidth; + var contentHeight = content.offsetHeight; + var lineHeight = line.offsetHeight; + var dotWidth = dot.offsetWidth; + var dotHeight = dot.offsetHeight; -/***/ }, -/* 9 */ -/***/ function(module, exports, __webpack_require__) { + var left = dataPoint.screen.x - contentWidth / 2; + left = Math.min(Math.max(left, 10), this.frame.clientWidth - 10 - contentWidth); - // Utility functions for ordering and stacking of items - var EPSILON = 0.001; // used when checking collisions, to prevent round-off errors + line.style.left = dataPoint.screen.x + 'px'; + line.style.top = (dataPoint.screen.y - lineHeight) + 'px'; + content.style.left = left + 'px'; + content.style.top = (dataPoint.screen.y - lineHeight - contentHeight) + 'px'; + dot.style.left = (dataPoint.screen.x - dotWidth / 2) + 'px'; + dot.style.top = (dataPoint.screen.y - dotHeight / 2) + 'px'; + }; /** - * Order items by their start data - * @param {Item[]} items + * Hide the tooltip when displayed + * @private */ - exports.orderByStart = function(items) { - items.sort(function (a, b) { - return a.data.start - b.data.start; - }); + Graph3d.prototype._hideTooltip = function () { + if (this.tooltip) { + this.tooltip.dataPoint = null; + + for (var prop in this.tooltip.dom) { + if (this.tooltip.dom.hasOwnProperty(prop)) { + var elem = this.tooltip.dom[prop]; + if (elem && elem.parentNode) { + elem.parentNode.removeChild(elem); + } + } + } + } }; + /** - * Order items by their end date. If they have no end date, their start date - * is used. - * @param {Item[]} items + * Add and event listener. Works for all browsers + * @param {Element} element An html element + * @param {string} action The action, for example 'click', + * without the prefix 'on' + * @param {function} listener The callback function to be executed + * @param {boolean} useCapture */ - exports.orderByEnd = function(items) { - items.sort(function (a, b) { - var aTime = ('end' in a.data) ? a.data.end : a.data.start, - bTime = ('end' in b.data) ? b.data.end : b.data.start; + G3DaddEventListener = function(element, action, listener, useCapture) { + if (element.addEventListener) { + if (useCapture === undefined) + useCapture = false; - return aTime - bTime; - }); + if (action === 'mousewheel' && navigator.userAgent.indexOf('Firefox') >= 0) { + action = 'DOMMouseScroll'; // For Firefox + } + + element.addEventListener(action, listener, useCapture); + } else { + element.attachEvent('on' + action, listener); // IE browsers + } }; /** - * Adjust vertical positions of the items such that they don't overlap each - * other. - * @param {Item[]} items - * All visible items - * @param {{item: number, axis: number}} margin - * Margins between items and between items and the axis. - * @param {boolean} [force=false] - * If true, all items will be repositioned. If false (default), only - * items having a top===null will be re-stacked + * Remove an event listener from an element + * @param {Element} element An html dom element + * @param {string} action The name of the event, for example 'mousedown' + * @param {function} listener The listener function + * @param {boolean} useCapture */ - exports.stack = function(items, margin, force) { - var i, iMax; + G3DremoveEventListener = function(element, action, listener, useCapture) { + if (element.removeEventListener) { + // non-IE browsers + if (useCapture === undefined) + useCapture = false; - if (force) { - // reset top position of all items - for (i = 0, iMax = items.length; i < iMax; i++) { - items[i].top = null; + if (action === 'mousewheel' && navigator.userAgent.indexOf('Firefox') >= 0) { + action = 'DOMMouseScroll'; // For Firefox } - } - // calculate new, non-overlapping positions - for (i = 0, iMax = items.length; i < iMax; i++) { - var item = items[i]; - if (item.top === null) { - // initialize top position - item.top = margin.axis; + element.removeEventListener(action, listener, useCapture); + } else { + // IE browsers + element.detachEvent('on' + action, listener); + } + }; - do { - // TODO: optimize checking for overlap. when there is a gap without items, - // you only need to check for items from the next item on, not from zero - var collidingItem = null; - for (var j = 0, jj = items.length; j < jj; j++) { - var other = items[j]; - if (other.top !== null && other !== item && exports.collision(item, other, margin.item)) { - collidingItem = other; - break; - } - } + /** + * Stop event propagation + */ + G3DstopPropagation = function(event) { + if (!event) + event = window.event; - if (collidingItem != null) { - // There is a collision. Reposition the items above the colliding element - item.top = collidingItem.top + collidingItem.height + margin.item; - } - } while (collidingItem); - } + if (event.stopPropagation) { + event.stopPropagation(); // non-IE browsers + } + else { + event.cancelBubble = true; // IE browsers } }; + /** - * Adjust vertical positions of the items without stacking them - * @param {Item[]} items - * All visible items - * @param {{item: number, axis: number}} margin - * Margins between items and between items and the axis. + * Cancels the event if it is cancelable, without stopping further propagation of the event. */ - exports.nostack = function(items, margin) { - var i, iMax; + G3DpreventDefault = function (event) { + if (!event) + event = window.event; - // reset top position of all items - for (i = 0, iMax = items.length; i < iMax; i++) { - items[i].top = margin.axis; + if (event.preventDefault) { + event.preventDefault(); // non-IE browsers + } + else { + event.returnValue = false; // IE browsers } }; /** - * Test if the two provided items collide - * The items must have parameters left, width, top, and height. - * @param {Item} a The first item - * @param {Item} b The second item - * @param {Number} margin A minimum required margin. - * If margin is provided, the two items will be - * marked colliding when they overlap or - * when the margin between the two is smaller than - * the requested margin. - * @return {boolean} true if a and b collide, else false + * @constructor Slider + * + * An html slider control with start/stop/prev/next buttons + * @param {Element} container The element where the slider will be created + * @param {Object} options Available options: + * {boolean} visible If true (default) the + * slider is visible. */ - exports.collision = function(a, b, margin) { - return ((a.left - margin + EPSILON) < (b.left + b.width) && - (a.left + a.width + margin - EPSILON) > b.left && - (a.top - margin + EPSILON) < (b.top + b.height) && - (a.top + a.height + margin - EPSILON) > b.top); - }; + function Slider(container, options) { + if (container === undefined) { + throw 'Error: No container element defined'; + } + this.container = container; + this.visible = (options && options.visible != undefined) ? options.visible : true; + if (this.visible) { + this.frame = document.createElement('DIV'); + //this.frame.style.backgroundColor = '#E5E5E5'; + this.frame.style.width = '100%'; + this.frame.style.position = 'relative'; + this.container.appendChild(this.frame); -/***/ }, -/* 10 */ -/***/ function(module, exports, __webpack_require__) { + this.frame.prev = document.createElement('INPUT'); + this.frame.prev.type = 'BUTTON'; + this.frame.prev.value = 'Prev'; + this.frame.appendChild(this.frame.prev); - var moment = __webpack_require__(39); + this.frame.play = document.createElement('INPUT'); + this.frame.play.type = 'BUTTON'; + this.frame.play.value = 'Play'; + this.frame.appendChild(this.frame.play); - /** - * @constructor TimeStep - * The class TimeStep is an iterator for dates. You provide a start date and an - * end date. The class itself determines the best scale (step size) based on the - * provided start Date, end Date, and minimumStep. - * - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * - * Alternatively, you can set a scale by hand. - * After creation, you can initialize the class by executing first(). Then you - * can iterate from the start date to the end date via next(). You can check if - * the end date is reached with the function hasNext(). After each step, you can - * retrieve the current date via getCurrent(). - * The TimeStep has scales ranging from milliseconds, seconds, minutes, hours, - * days, to years. - * - * Version: 1.2 - * - * @param {Date} [start] The start date, for example new Date(2010, 9, 21) - * or new Date(2010, 9, 21, 23, 45, 00) - * @param {Date} [end] The end date - * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds - */ - function TimeStep(start, end, minimumStep) { - // variables - this.current = new Date(); - this._start = new Date(); - this._end = new Date(); + this.frame.next = document.createElement('INPUT'); + this.frame.next.type = 'BUTTON'; + this.frame.next.value = 'Next'; + this.frame.appendChild(this.frame.next); - this.autoScale = true; - this.scale = TimeStep.SCALE.DAY; - this.step = 1; + this.frame.bar = document.createElement('INPUT'); + this.frame.bar.type = 'BUTTON'; + this.frame.bar.style.position = 'absolute'; + this.frame.bar.style.border = '1px solid red'; + this.frame.bar.style.width = '100px'; + this.frame.bar.style.height = '6px'; + this.frame.bar.style.borderRadius = '2px'; + this.frame.bar.style.MozBorderRadius = '2px'; + this.frame.bar.style.border = '1px solid #7F7F7F'; + this.frame.bar.style.backgroundColor = '#E5E5E5'; + this.frame.appendChild(this.frame.bar); - // initialize the range - this.setRange(start, end, minimumStep); - } + this.frame.slide = document.createElement('INPUT'); + this.frame.slide.type = 'BUTTON'; + this.frame.slide.style.margin = '0px'; + this.frame.slide.value = ' '; + this.frame.slide.style.position = 'relative'; + this.frame.slide.style.left = '-100px'; + this.frame.appendChild(this.frame.slide); + + // create events + var me = this; + this.frame.slide.onmousedown = function (event) {me._onMouseDown(event);}; + this.frame.prev.onclick = function (event) {me.prev(event);}; + this.frame.play.onclick = function (event) {me.togglePlay(event);}; + this.frame.next.onclick = function (event) {me.next(event);}; + } - /// enum scale - TimeStep.SCALE = { - MILLISECOND: 1, - SECOND: 2, - MINUTE: 3, - HOUR: 4, - DAY: 5, - WEEKDAY: 6, - MONTH: 7, - YEAR: 8 - }; + this.onChangeCallback = undefined; + + this.values = []; + this.index = undefined; + this.playTimeout = undefined; + this.playInterval = 1000; // milliseconds + this.playLoop = true; + } /** - * Set a new range - * If minimumStep is provided, the step size is chosen as close as possible - * to the minimumStep but larger than minimumStep. If minimumStep is not - * provided, the scale is set to 1 DAY. - * The minimumStep should correspond with the onscreen size of about 6 characters - * @param {Date} [start] The start date and time. - * @param {Date} [end] The end date and time. - * @param {int} [minimumStep] Optional. Minimum step size in milliseconds + * Select the previous index */ - TimeStep.prototype.setRange = function(start, end, minimumStep) { - if (!(start instanceof Date) || !(end instanceof Date)) { - throw "No legal start or end date in method setRange"; - } - - this._start = (start != undefined) ? new Date(start.valueOf()) : new Date(); - this._end = (end != undefined) ? new Date(end.valueOf()) : new Date(); - - if (this.autoScale) { - this.setMinimumStep(minimumStep); + Slider.prototype.prev = function() { + var index = this.getIndex(); + if (index > 0) { + index--; + this.setIndex(index); } }; /** - * Set the range iterator to the start date. + * Select the next index */ - TimeStep.prototype.first = function() { - this.current = new Date(this._start.valueOf()); - this.roundToMinor(); + Slider.prototype.next = function() { + var index = this.getIndex(); + if (index < this.values.length - 1) { + index++; + this.setIndex(index); + } }; /** - * Round the current date to the first minor date value - * This must be executed once when the current date is set to start Date + * Select the next index */ - TimeStep.prototype.roundToMinor = function() { - // round to floor - // IMPORTANT: we have no breaks in this switch! (this is no bug) - //noinspection FallthroughInSwitchStatementJS - switch (this.scale) { - case TimeStep.SCALE.YEAR: - this.current.setFullYear(this.step * Math.floor(this.current.getFullYear() / this.step)); - this.current.setMonth(0); - case TimeStep.SCALE.MONTH: this.current.setDate(1); - case TimeStep.SCALE.DAY: // intentional fall through - case TimeStep.SCALE.WEEKDAY: this.current.setHours(0); - case TimeStep.SCALE.HOUR: this.current.setMinutes(0); - case TimeStep.SCALE.MINUTE: this.current.setSeconds(0); - case TimeStep.SCALE.SECOND: this.current.setMilliseconds(0); - //case TimeStep.SCALE.MILLISECOND: // nothing to do for milliseconds - } + Slider.prototype.playNext = function() { + var start = new Date(); - if (this.step != 1) { - // round down to the first minor value that is a multiple of the current step size - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: this.current.setMilliseconds(this.current.getMilliseconds() - this.current.getMilliseconds() % this.step); break; - case TimeStep.SCALE.SECOND: this.current.setSeconds(this.current.getSeconds() - this.current.getSeconds() % this.step); break; - case TimeStep.SCALE.MINUTE: this.current.setMinutes(this.current.getMinutes() - this.current.getMinutes() % this.step); break; - case TimeStep.SCALE.HOUR: this.current.setHours(this.current.getHours() - this.current.getHours() % this.step); break; - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: this.current.setDate((this.current.getDate()-1) - (this.current.getDate()-1) % this.step + 1); break; - case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() - this.current.getMonth() % this.step); break; - case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() - this.current.getFullYear() % this.step); break; - default: break; - } + var index = this.getIndex(); + if (index < this.values.length - 1) { + index++; + this.setIndex(index); + } + else if (this.playLoop) { + // jump to the start + index = 0; + this.setIndex(index); } + + var end = new Date(); + var diff = (end - start); + + // calculate how much time it to to set the index and to execute the callback + // function. + var interval = Math.max(this.playInterval - diff, 0); + // document.title = diff // TODO: cleanup + + var me = this; + this.playTimeout = setTimeout(function() {me.playNext();}, interval); }; /** - * Check if the there is a next step - * @return {boolean} true if the current date has not passed the end date + * Toggle start or stop playing */ - TimeStep.prototype.hasNext = function () { - return (this.current.valueOf() <= this._end.valueOf()); + Slider.prototype.togglePlay = function() { + if (this.playTimeout === undefined) { + this.play(); + } else { + this.stop(); + } }; /** - * Do the next step + * Start playing */ - TimeStep.prototype.next = function() { - var prev = this.current.valueOf(); + Slider.prototype.play = function() { + // Test whether already playing + if (this.playTimeout) return; - // Two cases, needed to prevent issues with switching daylight savings - // (end of March and end of October) - if (this.current.getMonth() < 6) { - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: + this.playNext(); - this.current = new Date(this.current.valueOf() + this.step); break; - case TimeStep.SCALE.SECOND: this.current = new Date(this.current.valueOf() + this.step * 1000); break; - case TimeStep.SCALE.MINUTE: this.current = new Date(this.current.valueOf() + this.step * 1000 * 60); break; - case TimeStep.SCALE.HOUR: - this.current = new Date(this.current.valueOf() + this.step * 1000 * 60 * 60); - // in case of skipping an hour for daylight savings, adjust the hour again (else you get: 0h 5h 9h ... instead of 0h 4h 8h ...) - var h = this.current.getHours(); - this.current.setHours(h - (h % this.step)); - break; - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: this.current.setDate(this.current.getDate() + this.step); break; - case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() + this.step); break; - case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() + this.step); break; - default: break; - } - } - else { - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: this.current = new Date(this.current.valueOf() + this.step); break; - case TimeStep.SCALE.SECOND: this.current.setSeconds(this.current.getSeconds() + this.step); break; - case TimeStep.SCALE.MINUTE: this.current.setMinutes(this.current.getMinutes() + this.step); break; - case TimeStep.SCALE.HOUR: this.current.setHours(this.current.getHours() + this.step); break; - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: this.current.setDate(this.current.getDate() + this.step); break; - case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() + this.step); break; - case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() + this.step); break; - default: break; - } + if (this.frame) { + this.frame.play.value = 'Stop'; } + }; - if (this.step != 1) { - // round down to the correct major value - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: if(this.current.getMilliseconds() < this.step) this.current.setMilliseconds(0); break; - case TimeStep.SCALE.SECOND: if(this.current.getSeconds() < this.step) this.current.setSeconds(0); break; - case TimeStep.SCALE.MINUTE: if(this.current.getMinutes() < this.step) this.current.setMinutes(0); break; - case TimeStep.SCALE.HOUR: if(this.current.getHours() < this.step) this.current.setHours(0); break; - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: if(this.current.getDate() < this.step+1) this.current.setDate(1); break; - case TimeStep.SCALE.MONTH: if(this.current.getMonth() < this.step) this.current.setMonth(0); break; - case TimeStep.SCALE.YEAR: break; // nothing to do for year - default: break; - } - } + /** + * Stop playing + */ + Slider.prototype.stop = function() { + clearInterval(this.playTimeout); + this.playTimeout = undefined; - // safety mechanism: if current time is still unchanged, move to the end - if (this.current.valueOf() == prev) { - this.current = new Date(this._end.valueOf()); + if (this.frame) { + this.frame.play.value = 'Play'; } }; + /** + * Set a callback function which will be triggered when the value of the + * slider bar has changed. + */ + Slider.prototype.setOnChangeCallback = function(callback) { + this.onChangeCallback = callback; + }; + + /** + * Set the interval for playing the list + * @param {Number} interval The interval in milliseconds + */ + Slider.prototype.setPlayInterval = function(interval) { + this.playInterval = interval; + }; /** - * Get the current datetime - * @return {Date} current The current date + * Retrieve the current play interval + * @return {Number} interval The interval in milliseconds */ - TimeStep.prototype.getCurrent = function() { - return this.current; + Slider.prototype.getPlayInterval = function(interval) { + return this.playInterval; }; /** - * Set a custom scale. Autoscaling will be disabled. - * For example setScale(SCALE.MINUTES, 5) will result - * in minor steps of 5 minutes, and major steps of an hour. - * - * @param {TimeStep.SCALE} newScale - * A scale. Choose from SCALE.MILLISECOND, - * SCALE.SECOND, SCALE.MINUTE, SCALE.HOUR, - * SCALE.WEEKDAY, SCALE.DAY, SCALE.MONTH, - * SCALE.YEAR. - * @param {Number} newStep A step size, by default 1. Choose for - * example 1, 2, 5, or 10. + * Set looping on or off + * @pararm {boolean} doLoop If true, the slider will jump to the start when + * the end is passed, and will jump to the end + * when the start is passed. */ - TimeStep.prototype.setScale = function(newScale, newStep) { - this.scale = newScale; + Slider.prototype.setPlayLoop = function(doLoop) { + this.playLoop = doLoop; + }; - if (newStep > 0) { - this.step = newStep; - } - this.autoScale = false; + /** + * Execute the onchange callback function + */ + Slider.prototype.onChange = function() { + if (this.onChangeCallback !== undefined) { + this.onChangeCallback(); + } }; /** - * Enable or disable autoscaling - * @param {boolean} enable If true, autoascaling is set true + * redraw the slider on the correct place */ - TimeStep.prototype.setAutoScale = function (enable) { - this.autoScale = enable; + Slider.prototype.redraw = function() { + if (this.frame) { + // resize the bar + this.frame.bar.style.top = (this.frame.clientHeight/2 - + this.frame.bar.offsetHeight/2) + 'px'; + this.frame.bar.style.width = (this.frame.clientWidth - + this.frame.prev.clientWidth - + this.frame.play.clientWidth - + this.frame.next.clientWidth - 30) + 'px'; + + // position the slider button + var left = this.indexToLeft(this.index); + this.frame.slide.style.left = (left) + 'px'; + } }; /** - * Automatically determine the scale that bests fits the provided minimum step - * @param {Number} [minimumStep] The minimum step size in milliseconds + * Set the list with values for the slider + * @param {Array} values A javascript array with values (any type) */ - TimeStep.prototype.setMinimumStep = function(minimumStep) { - if (minimumStep == undefined) { - return; - } - - var stepYear = (1000 * 60 * 60 * 24 * 30 * 12); - var stepMonth = (1000 * 60 * 60 * 24 * 30); - var stepDay = (1000 * 60 * 60 * 24); - var stepHour = (1000 * 60 * 60); - var stepMinute = (1000 * 60); - var stepSecond = (1000); - var stepMillisecond= (1); + Slider.prototype.setValues = function(values) { + this.values = values; - // find the smallest step that is larger than the provided minimumStep - if (stepYear*1000 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 1000;} - if (stepYear*500 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 500;} - if (stepYear*100 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 100;} - if (stepYear*50 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 50;} - if (stepYear*10 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 10;} - if (stepYear*5 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 5;} - if (stepYear > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 1;} - if (stepMonth*3 > minimumStep) {this.scale = TimeStep.SCALE.MONTH; this.step = 3;} - if (stepMonth > minimumStep) {this.scale = TimeStep.SCALE.MONTH; this.step = 1;} - if (stepDay*5 > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 5;} - if (stepDay*2 > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 2;} - if (stepDay > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 1;} - if (stepDay/2 > minimumStep) {this.scale = TimeStep.SCALE.WEEKDAY; this.step = 1;} - if (stepHour*4 > minimumStep) {this.scale = TimeStep.SCALE.HOUR; this.step = 4;} - if (stepHour > minimumStep) {this.scale = TimeStep.SCALE.HOUR; this.step = 1;} - if (stepMinute*15 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 15;} - if (stepMinute*10 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 10;} - if (stepMinute*5 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 5;} - if (stepMinute > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 1;} - if (stepSecond*15 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 15;} - if (stepSecond*10 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 10;} - if (stepSecond*5 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 5;} - if (stepSecond > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 1;} - if (stepMillisecond*200 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 200;} - if (stepMillisecond*100 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 100;} - if (stepMillisecond*50 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 50;} - if (stepMillisecond*10 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 10;} - if (stepMillisecond*5 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 5;} - if (stepMillisecond > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 1;} + if (this.values.length > 0) + this.setIndex(0); + else + this.index = undefined; }; /** - * Snap a date to a rounded value. - * The snap intervals are dependent on the current scale and step. - * @param {Date} date the date to be snapped. - * @return {Date} snappedDate + * Select a value by its index + * @param {Number} index */ - TimeStep.prototype.snap = function(date) { - var clone = new Date(date.valueOf()); - - if (this.scale == TimeStep.SCALE.YEAR) { - var year = clone.getFullYear() + Math.round(clone.getMonth() / 12); - clone.setFullYear(Math.round(year / this.step) * this.step); - clone.setMonth(0); - clone.setDate(0); - clone.setHours(0); - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } - else if (this.scale == TimeStep.SCALE.MONTH) { - if (clone.getDate() > 15) { - clone.setDate(1); - clone.setMonth(clone.getMonth() + 1); - // important: first set Date to 1, after that change the month. - } - else { - clone.setDate(1); - } + Slider.prototype.setIndex = function(index) { + if (index < this.values.length) { + this.index = index; - clone.setHours(0); - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } - else if (this.scale == TimeStep.SCALE.DAY) { - //noinspection FallthroughInSwitchStatementJS - switch (this.step) { - case 5: - case 2: - clone.setHours(Math.round(clone.getHours() / 24) * 24); break; - default: - clone.setHours(Math.round(clone.getHours() / 12) * 12); break; - } - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } - else if (this.scale == TimeStep.SCALE.WEEKDAY) { - //noinspection FallthroughInSwitchStatementJS - switch (this.step) { - case 5: - case 2: - clone.setHours(Math.round(clone.getHours() / 12) * 12); break; - default: - clone.setHours(Math.round(clone.getHours() / 6) * 6); break; - } - clone.setMinutes(0); - clone.setSeconds(0); - clone.setMilliseconds(0); - } - else if (this.scale == TimeStep.SCALE.HOUR) { - switch (this.step) { - case 4: - clone.setMinutes(Math.round(clone.getMinutes() / 60) * 60); break; - default: - clone.setMinutes(Math.round(clone.getMinutes() / 30) * 30); break; - } - clone.setSeconds(0); - clone.setMilliseconds(0); - } else if (this.scale == TimeStep.SCALE.MINUTE) { - //noinspection FallthroughInSwitchStatementJS - switch (this.step) { - case 15: - case 10: - clone.setMinutes(Math.round(clone.getMinutes() / 5) * 5); - clone.setSeconds(0); - break; - case 5: - clone.setSeconds(Math.round(clone.getSeconds() / 60) * 60); break; - default: - clone.setSeconds(Math.round(clone.getSeconds() / 30) * 30); break; - } - clone.setMilliseconds(0); - } - else if (this.scale == TimeStep.SCALE.SECOND) { - //noinspection FallthroughInSwitchStatementJS - switch (this.step) { - case 15: - case 10: - clone.setSeconds(Math.round(clone.getSeconds() / 5) * 5); - clone.setMilliseconds(0); - break; - case 5: - clone.setMilliseconds(Math.round(clone.getMilliseconds() / 1000) * 1000); break; - default: - clone.setMilliseconds(Math.round(clone.getMilliseconds() / 500) * 500); break; - } + this.redraw(); + this.onChange(); } - else if (this.scale == TimeStep.SCALE.MILLISECOND) { - var step = this.step > 5 ? this.step / 2 : 1; - clone.setMilliseconds(Math.round(clone.getMilliseconds() / step) * step); + else { + throw 'Error: index out of range'; } - - return clone; }; /** - * Check if the current value is a major value (for example when the step - * is DAY, a major value is each first day of the MONTH) - * @return {boolean} true if current date is major, else false. + * retrieve the index of the currently selected vaue + * @return {Number} index */ - TimeStep.prototype.isMajor = function() { - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: - return (this.current.getMilliseconds() == 0); - case TimeStep.SCALE.SECOND: - return (this.current.getSeconds() == 0); - case TimeStep.SCALE.MINUTE: - return (this.current.getHours() == 0) && (this.current.getMinutes() == 0); - // Note: this is no bug. Major label is equal for both minute and hour scale - case TimeStep.SCALE.HOUR: - return (this.current.getHours() == 0); - case TimeStep.SCALE.WEEKDAY: // intentional fall through - case TimeStep.SCALE.DAY: - return (this.current.getDate() == 1); - case TimeStep.SCALE.MONTH: - return (this.current.getMonth() == 0); - case TimeStep.SCALE.YEAR: - return false; - default: - return false; - } + Slider.prototype.getIndex = function() { + return this.index; }; /** - * Returns formatted text for the minor axislabel, depending on the current - * date and the scale. For example when scale is MINUTE, the current time is - * formatted as "hh:mm". - * @param {Date} [date] custom date. if not provided, current date is taken + * retrieve the currently selected value + * @return {*} value */ - TimeStep.prototype.getLabelMinor = function(date) { - if (date == undefined) { - date = this.current; - } + Slider.prototype.get = function() { + return this.values[this.index]; + }; - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND: return moment(date).format('SSS'); - case TimeStep.SCALE.SECOND: return moment(date).format('s'); - case TimeStep.SCALE.MINUTE: return moment(date).format('HH:mm'); - case TimeStep.SCALE.HOUR: return moment(date).format('HH:mm'); - case TimeStep.SCALE.WEEKDAY: return moment(date).format('ddd D'); - case TimeStep.SCALE.DAY: return moment(date).format('D'); - case TimeStep.SCALE.MONTH: return moment(date).format('MMM'); - case TimeStep.SCALE.YEAR: return moment(date).format('YYYY'); - default: return ''; - } + + Slider.prototype._onMouseDown = function(event) { + // only react on left mouse button down + var leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); + if (!leftButtonDown) return; + + this.startClientX = event.clientX; + this.startSlideX = parseFloat(this.frame.slide.style.left); + + this.frame.style.cursor = 'move'; + + // add event listeners to handle moving the contents + // we store the function onmousemove and onmouseup in the graph, so we can + // remove the eventlisteners lateron in the function mouseUp() + var me = this; + this.onmousemove = function (event) {me._onMouseMove(event);}; + this.onmouseup = function (event) {me._onMouseUp(event);}; + G3DaddEventListener(document, 'mousemove', this.onmousemove); + G3DaddEventListener(document, 'mouseup', this.onmouseup); + G3DpreventDefault(event); }; - /** - * Returns formatted text for the major axis label, depending on the current - * date and the scale. For example when scale is MINUTE, the major scale is - * hours, and the hour will be formatted as "hh". - * @param {Date} [date] custom date. if not provided, current date is taken - */ - TimeStep.prototype.getLabelMajor = function(date) { - if (date == undefined) { - date = this.current; - } + Slider.prototype.leftToIndex = function (left) { + var width = parseFloat(this.frame.bar.style.width) - + this.frame.slide.clientWidth - 10; + var x = left - 3; + + var index = Math.round(x / width * (this.values.length-1)); + if (index < 0) index = 0; + if (index > this.values.length-1) index = this.values.length-1; - //noinspection FallthroughInSwitchStatementJS - switch (this.scale) { - case TimeStep.SCALE.MILLISECOND:return moment(date).format('HH:mm:ss'); - case TimeStep.SCALE.SECOND: return moment(date).format('D MMMM HH:mm'); - case TimeStep.SCALE.MINUTE: - case TimeStep.SCALE.HOUR: return moment(date).format('ddd D MMMM'); - case TimeStep.SCALE.WEEKDAY: - case TimeStep.SCALE.DAY: return moment(date).format('MMMM YYYY'); - case TimeStep.SCALE.MONTH: return moment(date).format('YYYY'); - case TimeStep.SCALE.YEAR: return ''; - default: return ''; - } + return index; }; - module.exports = TimeStep; + Slider.prototype.indexToLeft = function (index) { + var width = parseFloat(this.frame.bar.style.width) - + this.frame.slide.clientWidth - 10; + var x = index / (this.values.length-1) * width; + var left = x + 3; -/***/ }, -/* 11 */ -/***/ function(module, exports, __webpack_require__) { + return left; + }; - var Emitter = __webpack_require__(41); - var DataSet = __webpack_require__(3); - var DataView = __webpack_require__(4); - var Point3d = __webpack_require__(33); - var Point2d = __webpack_require__(34); - var Filter = __webpack_require__(35); - var StepNumber = __webpack_require__(36); - /** - * @constructor Graph3d - * Graph3d displays data in 3d. - * - * Graph3d is developed in javascript as a Google Visualization Chart. - * - * @param {Element} container The DOM element in which the Graph3d will - * be created. Normally a div element. - * @param {DataSet | DataView | Array} [data] - * @param {Object} [options] - */ - function Graph3d(container, data, options) { - if (!(this instanceof Graph3d)) { - throw new SyntaxError('Constructor must be called with the new operator'); - } - // create variables and set default values - this.containerElement = container; - this.width = '400px'; - this.height = '400px'; - this.margin = 10; // px - this.defaultXCenter = '55%'; - this.defaultYCenter = '50%'; + Slider.prototype._onMouseMove = function (event) { + var diff = event.clientX - this.startClientX; + var x = this.startSlideX + diff; - this.xLabel = 'x'; - this.yLabel = 'y'; - this.zLabel = 'z'; - this.filterLabel = 'time'; - this.legendLabel = 'value'; + var index = this.leftToIndex(x); - this.style = Graph3d.STYLE.DOT; - this.showPerspective = true; - this.showGrid = true; - this.keepAspectRatio = true; - this.showShadow = false; - this.showGrayBottom = false; // TODO: this does not work correctly - this.showTooltip = false; - this.verticalRatio = 0.5; // 0.1 to 1.0, where 1.0 results in a 'cube' + this.setIndex(index); - this.animationInterval = 1000; // milliseconds - this.animationPreload = false; + G3DpreventDefault(); + }; - this.camera = new Graph3d.Camera(); - this.eye = new Point3d(0, 0, -1); // TODO: set eye.z about 3/4 of the width of the window? - this.dataTable = null; // The original data table - this.dataPoints = null; // The table with point objects + Slider.prototype._onMouseUp = function (event) { + this.frame.style.cursor = 'auto'; - // the column indexes - this.colX = undefined; - this.colY = undefined; - this.colZ = undefined; - this.colValue = undefined; - this.colFilter = undefined; + // remove event listeners + G3DremoveEventListener(document, 'mousemove', this.onmousemove); + G3DremoveEventListener(document, 'mouseup', this.onmouseup); - this.xMin = 0; - this.xStep = undefined; // auto by default - this.xMax = 1; - this.yMin = 0; - this.yStep = undefined; // auto by default - this.yMax = 1; - this.zMin = 0; - this.zStep = undefined; // auto by default - this.zMax = 1; - this.valueMin = 0; - this.valueMax = 1; - this.xBarWidth = 1; - this.yBarWidth = 1; - // TODO: customize axis range + G3DpreventDefault(); + }; - // constants - this.colorAxis = '#4D4D4D'; - this.colorGrid = '#D3D3D3'; - this.colorDot = '#7DC1FF'; - this.colorDotBorder = '#3267D2'; - // create a frame and canvas - this.create(); - // apply options (also when undefined) - this.setOptions(options); + /**--------------------------------------------------------------------------**/ - // apply data - if (data) { - this.setData(data); - } - } - // Extend Graph3d with an Emitter mixin - Emitter(Graph3d.prototype); /** - * @class Camera - * The camera is mounted on a (virtual) camera arm. The camera arm can rotate - * The camera is always looking in the direction of the origin of the arm. - * This way, the camera always rotates around one fixed point, the location - * of the camera arm. - * - * Documentation: - * http://en.wikipedia.org/wiki/3D_projection + * Retrieve the absolute left value of a DOM element + * @param {Element} elem A dom element, for example a div + * @return {Number} left The absolute left position of this element + * in the browser page. */ - Graph3d.Camera = function () { - this.armLocation = new Point3d(); - this.armRotation = {}; - this.armRotation.horizontal = 0; - this.armRotation.vertical = 0; - this.armLength = 1.7; - - this.cameraLocation = new Point3d(); - this.cameraRotation = new Point3d(0.5*Math.PI, 0, 0); - - this.calculateCameraOrientation(); + getAbsoluteLeft = function(elem) { + var left = 0; + while( elem !== null ) { + left += elem.offsetLeft; + left -= elem.scrollLeft; + elem = elem.offsetParent; + } + return left; }; /** - * Set the location (origin) of the arm - * @param {Number} x Normalized value of x - * @param {Number} y Normalized value of y - * @param {Number} z Normalized value of z + * Retrieve the absolute top value of a DOM element + * @param {Element} elem A dom element, for example a div + * @return {Number} top The absolute top position of this element + * in the browser page. */ - Graph3d.Camera.prototype.setArmLocation = function(x, y, z) { - this.armLocation.x = x; - this.armLocation.y = y; - this.armLocation.z = z; + getAbsoluteTop = function(elem) { + var top = 0; + while( elem !== null ) { + top += elem.offsetTop; + top -= elem.scrollTop; + elem = elem.offsetParent; + } + return top; + }; - this.calculateCameraOrientation(); + /** + * Get the horizontal mouse position from a mouse event + * @param {Event} event + * @return {Number} mouse x + */ + getMouseX = function(event) { + if ('clientX' in event) return event.clientX; + return event.targetTouches[0] && event.targetTouches[0].clientX || 0; }; /** - * Set the rotation of the camera arm - * @param {Number} horizontal The horizontal rotation, between 0 and 2*PI. - * Optional, can be left undefined. - * @param {Number} vertical The vertical rotation, between 0 and 0.5*PI - * if vertical=0.5*PI, the graph is shown from the - * top. Optional, can be left undefined. + * Get the vertical mouse position from a mouse event + * @param {Event} event + * @return {Number} mouse y */ - Graph3d.Camera.prototype.setArmRotation = function(horizontal, vertical) { - if (horizontal !== undefined) { - this.armRotation.horizontal = horizontal; - } + getMouseY = function(event) { + if ('clientY' in event) return event.clientY; + return event.targetTouches[0] && event.targetTouches[0].clientY || 0; + }; - if (vertical !== undefined) { - this.armRotation.vertical = vertical; - if (this.armRotation.vertical < 0) this.armRotation.vertical = 0; - if (this.armRotation.vertical > 0.5*Math.PI) this.armRotation.vertical = 0.5*Math.PI; - } + module.exports = Graph3d; - if (horizontal !== undefined || vertical !== undefined) { - this.calculateCameraOrientation(); - } - }; + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + var Emitter = __webpack_require__(41); + var Hammer = __webpack_require__(49); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var Range = __webpack_require__(9); + var TimeAxis = __webpack_require__(21); + var CurrentTime = __webpack_require__(13); + var CustomTime = __webpack_require__(14); + var ItemSet = __webpack_require__(18); /** - * Retrieve the current arm rotation - * @return {object} An object with parameters horizontal and vertical + * Create a timeline visualization + * @param {HTMLElement} container + * @param {vis.DataSet | Array | google.visualization.DataTable} [items] + * @param {Object} [options] See Timeline.setOptions for the available options. + * @constructor */ - Graph3d.Camera.prototype.getArmRotation = function() { - var rot = {}; - rot.horizontal = this.armRotation.horizontal; - rot.vertical = this.armRotation.vertical; + function Timeline (container, items, options) { + if (!(this instanceof Timeline)) { + throw new SyntaxError('Constructor must be called with the new operator'); + } + + var me = this; + this.defaultOptions = { + start: null, + end: null, + + autoResize: true, + + orientation: 'bottom', + width: null, + height: null, + maxHeight: null, + minHeight: null + }; + this.options = util.deepExtend({}, this.defaultOptions); + + // Create the DOM, props, and emitter + this._create(container); - return rot; - }; + // all components listed here will be repainted automatically + this.components = []; - /** - * Set the (normalized) length of the camera arm. - * @param {Number} length A length between 0.71 and 5.0 - */ - Graph3d.Camera.prototype.setArmLength = function(length) { - if (length === undefined) - return; + this.body = { + dom: this.dom, + domProps: this.props, + emitter: { + on: this.on.bind(this), + off: this.off.bind(this), + emit: this.emit.bind(this) + }, + util: { + snap: null, // will be specified after TimeAxis is created + toScreen: me._toScreen.bind(me), + toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width + toTime: me._toTime.bind(me), + toGlobalTime : me._toGlobalTime.bind(me) + } + }; - this.armLength = length; + // range + this.range = new Range(this.body); + this.components.push(this.range); + this.body.range = this.range; - // Radius must be larger than the corner of the graph, - // which has a distance of sqrt(0.5^2+0.5^2) = 0.71 from the center of the - // graph - if (this.armLength < 0.71) this.armLength = 0.71; - if (this.armLength > 5.0) this.armLength = 5.0; + // time axis + this.timeAxis = new TimeAxis(this.body); + this.components.push(this.timeAxis); + this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); - this.calculateCameraOrientation(); - }; + // current time bar + this.currentTime = new CurrentTime(this.body); + this.components.push(this.currentTime); - /** - * Retrieve the arm length - * @return {Number} length - */ - Graph3d.Camera.prototype.getArmLength = function() { - return this.armLength; - }; + // custom time bar + // Note: time bar will be attached in this.setOptions when selected + this.customTime = new CustomTime(this.body); + this.components.push(this.customTime); - /** - * Retrieve the camera location - * @return {Point3d} cameraLocation - */ - Graph3d.Camera.prototype.getCameraLocation = function() { - return this.cameraLocation; - }; + // item set + this.itemSet = new ItemSet(this.body); + this.components.push(this.itemSet); - /** - * Retrieve the camera rotation - * @return {Point3d} cameraRotation - */ - Graph3d.Camera.prototype.getCameraRotation = function() { - return this.cameraRotation; - }; + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet - /** - * Calculate the location and rotation of the camera based on the - * position and orientation of the camera arm - */ - Graph3d.Camera.prototype.calculateCameraOrientation = function() { - // calculate location of the camera - this.cameraLocation.x = this.armLocation.x - this.armLength * Math.sin(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); - this.cameraLocation.y = this.armLocation.y - this.armLength * Math.cos(this.armRotation.horizontal) * Math.cos(this.armRotation.vertical); - this.cameraLocation.z = this.armLocation.z + this.armLength * Math.sin(this.armRotation.vertical); + // apply options + if (options) { + this.setOptions(options); + } - // calculate rotation of the camera - this.cameraRotation.x = Math.PI/2 - this.armRotation.vertical; - this.cameraRotation.y = 0; - this.cameraRotation.z = -this.armRotation.horizontal; - }; + // create itemset + if (items) { + this.setItems(items); + } + else { + this.redraw(); + } + } + + // turn Timeline into an event emitter + Emitter(Timeline.prototype); /** - * Calculate the scaling values, dependent on the range in x, y, and z direction + * Create the main DOM for the Timeline: a root panel containing left, right, + * top, bottom, content, and background panel. + * @param {Element} container The container element where the Timeline will + * be attached. + * @private */ - Graph3d.prototype._setScale = function() { - this.scale = new Point3d(1 / (this.xMax - this.xMin), - 1 / (this.yMax - this.yMin), - 1 / (this.zMax - this.zMin)); - - // keep aspect ration between x and y scale if desired - if (this.keepAspectRatio) { - if (this.scale.x < this.scale.y) { - //noinspection JSSuspiciousNameCombination - this.scale.y = this.scale.x; - } - else { - //noinspection JSSuspiciousNameCombination - this.scale.x = this.scale.y; - } - } + Timeline.prototype._create = function (container) { + this.dom = {}; - // scale the vertical axis - this.scale.z *= this.verticalRatio; - // TODO: can this be automated? verticalRatio? + this.dom.root = document.createElement('div'); + this.dom.background = document.createElement('div'); + this.dom.backgroundVertical = document.createElement('div'); + this.dom.backgroundHorizontal = document.createElement('div'); + this.dom.centerContainer = document.createElement('div'); + this.dom.leftContainer = document.createElement('div'); + this.dom.rightContainer = document.createElement('div'); + this.dom.center = document.createElement('div'); + this.dom.left = document.createElement('div'); + this.dom.right = document.createElement('div'); + this.dom.top = document.createElement('div'); + this.dom.bottom = document.createElement('div'); + this.dom.shadowTop = document.createElement('div'); + this.dom.shadowBottom = document.createElement('div'); + this.dom.shadowTopLeft = document.createElement('div'); + this.dom.shadowBottomLeft = document.createElement('div'); + this.dom.shadowTopRight = document.createElement('div'); + this.dom.shadowBottomRight = document.createElement('div'); - // determine scale for (optional) value - this.scale.value = 1 / (this.valueMax - this.valueMin); + this.dom.background.className = 'vispanel background'; + this.dom.backgroundVertical.className = 'vispanel background vertical'; + this.dom.backgroundHorizontal.className = 'vispanel background horizontal'; + this.dom.centerContainer.className = 'vispanel center'; + this.dom.leftContainer.className = 'vispanel left'; + this.dom.rightContainer.className = 'vispanel right'; + this.dom.top.className = 'vispanel top'; + this.dom.bottom.className = 'vispanel bottom'; + this.dom.left.className = 'content'; + this.dom.center.className = 'content'; + this.dom.right.className = 'content'; + this.dom.shadowTop.className = 'shadow top'; + this.dom.shadowBottom.className = 'shadow bottom'; + this.dom.shadowTopLeft.className = 'shadow top'; + this.dom.shadowBottomLeft.className = 'shadow bottom'; + this.dom.shadowTopRight.className = 'shadow top'; + this.dom.shadowBottomRight.className = 'shadow bottom'; - // position the camera arm - var xCenter = (this.xMax + this.xMin) / 2 * this.scale.x; - var yCenter = (this.yMax + this.yMin) / 2 * this.scale.y; - var zCenter = (this.zMax + this.zMin) / 2 * this.scale.z; - this.camera.setArmLocation(xCenter, yCenter, zCenter); - }; + this.dom.root.appendChild(this.dom.background); + this.dom.root.appendChild(this.dom.backgroundVertical); + this.dom.root.appendChild(this.dom.backgroundHorizontal); + this.dom.root.appendChild(this.dom.centerContainer); + this.dom.root.appendChild(this.dom.leftContainer); + this.dom.root.appendChild(this.dom.rightContainer); + this.dom.root.appendChild(this.dom.top); + this.dom.root.appendChild(this.dom.bottom); + this.dom.centerContainer.appendChild(this.dom.center); + this.dom.leftContainer.appendChild(this.dom.left); + this.dom.rightContainer.appendChild(this.dom.right); - /** - * Convert a 3D location to a 2D location on screen - * http://en.wikipedia.org/wiki/3D_projection - * @param {Point3d} point3d A 3D point with parameters x, y, z - * @return {Point2d} point2d A 2D point with parameters x, y - */ - Graph3d.prototype._convert3Dto2D = function(point3d) { - var translation = this._convertPointToTranslation(point3d); - return this._convertTranslationToScreen(translation); - }; + this.dom.centerContainer.appendChild(this.dom.shadowTop); + this.dom.centerContainer.appendChild(this.dom.shadowBottom); + this.dom.leftContainer.appendChild(this.dom.shadowTopLeft); + this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft); + this.dom.rightContainer.appendChild(this.dom.shadowTopRight); + this.dom.rightContainer.appendChild(this.dom.shadowBottomRight); - /** - * Convert a 3D location its translation seen from the camera - * http://en.wikipedia.org/wiki/3D_projection - * @param {Point3d} point3d A 3D point with parameters x, y, z - * @return {Point3d} translation A 3D point with parameters x, y, z This is - * the translation of the point, seen from the - * camera - */ - Graph3d.prototype._convertPointToTranslation = function(point3d) { - var ax = point3d.x * this.scale.x, - ay = point3d.y * this.scale.y, - az = point3d.z * this.scale.z, + this.on('rangechange', this.redraw.bind(this)); + this.on('change', this.redraw.bind(this)); + this.on('touch', this._onTouch.bind(this)); + this.on('pinch', this._onPinch.bind(this)); + this.on('dragstart', this._onDragStart.bind(this)); + this.on('drag', this._onDrag.bind(this)); - cx = this.camera.getCameraLocation().x, - cy = this.camera.getCameraLocation().y, - cz = this.camera.getCameraLocation().z, + // create event listeners for all interesting events, these events will be + // emitted via emitter + this.hammer = Hammer(this.dom.root, { + prevent_default: true + }); + this.listeners = {}; - // calculate angles - sinTx = Math.sin(this.camera.getCameraRotation().x), - cosTx = Math.cos(this.camera.getCameraRotation().x), - sinTy = Math.sin(this.camera.getCameraRotation().y), - cosTy = Math.cos(this.camera.getCameraRotation().y), - sinTz = Math.sin(this.camera.getCameraRotation().z), - cosTz = Math.cos(this.camera.getCameraRotation().z), + var me = this; + var events = [ + 'touch', 'pinch', + 'tap', 'doubletap', 'hold', + 'dragstart', 'drag', 'dragend', + 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox + ]; + events.forEach(function (event) { + var listener = function () { + var args = [event].concat(Array.prototype.slice.call(arguments, 0)); + me.emit.apply(me, args); + }; + me.hammer.on(event, listener); + me.listeners[event] = listener; + }); - // calculate translation - dx = cosTy * (sinTz * (ay - cy) + cosTz * (ax - cx)) - sinTy * (az - cz), - dy = sinTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) + cosTx * (cosTz * (ay - cy) - sinTz * (ax-cx)), - dz = cosTx * (cosTy * (az - cz) + sinTy * (sinTz * (ay - cy) + cosTz * (ax - cx))) - sinTx * (cosTz * (ay - cy) - sinTz * (ax-cx)); + // size properties of each of the panels + this.props = { + root: {}, + background: {}, + centerContainer: {}, + leftContainer: {}, + rightContainer: {}, + center: {}, + left: {}, + right: {}, + top: {}, + bottom: {}, + border: {}, + scrollTop: 0, + scrollTopMin: 0 + }; + this.touch = {}; // store state information needed for touch events - return new Point3d(dx, dy, dz); + // attach the root panel to the provided container + if (!container) throw new Error('No container provided'); + container.appendChild(this.dom.root); }; /** - * Convert a translation point to a point on the screen - * @param {Point3d} translation A 3D point with parameters x, y, z This is - * the translation of the point, seen from the - * camera - * @return {Point2d} point2d A 2D point with parameters x, y + * Destroy the Timeline, clean up all DOM elements and event listeners. */ - Graph3d.prototype._convertTranslationToScreen = function(translation) { - var ex = this.eye.x, - ey = this.eye.y, - ez = this.eye.z, - dx = translation.x, - dy = translation.y, - dz = translation.z; + Timeline.prototype.destroy = function () { + // unbind datasets + this.clear(); - // calculate position on screen from translation - var bx; - var by; - if (this.showPerspective) { - bx = (dx - ex) * (ez / dz); - by = (dy - ey) * (ez / dz); + // remove all event listeners + this.off(); + + // stop checking for changed size + this._stopAutoResize(); + + // remove from DOM + if (this.dom.root.parentNode) { + this.dom.root.parentNode.removeChild(this.dom.root); } - else { - bx = dx * -(ez / this.camera.getArmLength()); - by = dy * -(ez / this.camera.getArmLength()); + this.dom = null; + + // cleanup hammer touch events + for (var event in this.listeners) { + if (this.listeners.hasOwnProperty(event)) { + delete this.listeners[event]; + } } + this.listeners = null; + this.hammer = null; - // shift and scale the point to the center of the screen - // use the width of the graph to scale both horizontally and vertically. - return new Point2d( - this.xcenter + bx * this.frame.canvas.clientWidth, - this.ycenter - by * this.frame.canvas.clientWidth); + // give all components the opportunity to cleanup + this.components.forEach(function (component) { + component.destroy(); + }); + + this.body = null; }; /** - * Set the background styling for the graph - * @param {string | {fill: string, stroke: string, strokeWidth: string}} backgroundColor + * Set options. Options will be passed to all components loaded in the Timeline. + * @param {Object} [options] + * {String} orientation + * Vertical orientation for the Timeline, + * can be 'bottom' (default) or 'top'. + * {String | Number} width + * Width for the timeline, a number in pixels or + * a css string like '1000px' or '75%'. '100%' by default. + * {String | Number} height + * Fixed height for the Timeline, a number in pixels or + * a css string like '400px' or '75%'. If undefined, + * The Timeline will automatically size such that + * its contents fit. + * {String | Number} minHeight + * Minimum height for the Timeline, a number in pixels or + * a css string like '400px' or '75%'. + * {String | Number} maxHeight + * Maximum height for the Timeline, a number in pixels or + * a css string like '400px' or '75%'. + * {Number | Date | String} start + * Start date for the visible window + * {Number | Date | String} end + * End date for the visible window */ - Graph3d.prototype._setBackgroundColor = function(backgroundColor) { - var fill = 'white'; - var stroke = 'gray'; - var strokeWidth = 1; + Timeline.prototype.setOptions = function (options) { + if (options) { + // copy the known options + var fields = ['width', 'height', 'minHeight', 'maxHeight', 'autoResize', 'start', 'end', 'orientation']; + util.selectiveExtend(fields, this.options, options); - if (typeof(backgroundColor) === 'string') { - fill = backgroundColor; - stroke = 'none'; - strokeWidth = 0; - } - else if (typeof(backgroundColor) === 'object') { - if (backgroundColor.fill !== undefined) fill = backgroundColor.fill; - if (backgroundColor.stroke !== undefined) stroke = backgroundColor.stroke; - if (backgroundColor.strokeWidth !== undefined) strokeWidth = backgroundColor.strokeWidth; - } - else if (backgroundColor === undefined) { - // use use defaults - } - else { - throw 'Unsupported type of backgroundColor'; + // enable/disable autoResize + this._initAutoResize(); } - this.frame.style.backgroundColor = fill; - this.frame.style.borderColor = stroke; - this.frame.style.borderWidth = strokeWidth + 'px'; - this.frame.style.borderStyle = 'solid'; - }; + // propagate options to all components + this.components.forEach(function (component) { + component.setOptions(options); + }); + // TODO: remove deprecation error one day (deprecated since version 0.8.0) + if (options && options.order) { + throw new Error('Option order is deprecated. There is no replacement for this feature.'); + } - /// enumerate the available styles - Graph3d.STYLE = { - BAR: 0, - BARCOLOR: 1, - BARSIZE: 2, - DOT : 3, - DOTLINE : 4, - DOTCOLOR: 5, - DOTSIZE: 6, - GRID : 7, - LINE: 8, - SURFACE : 9 + // redraw everything + this.redraw(); }; /** - * Retrieve the style index from given styleName - * @param {string} styleName Style name such as 'dot', 'grid', 'dot-line' - * @return {Number} styleNumber Enumeration value representing the style, or -1 - * when not found + * Set a custom time bar + * @param {Date} time */ - Graph3d.prototype._getStyleNumber = function(styleName) { - switch (styleName) { - case 'dot': return Graph3d.STYLE.DOT; - case 'dot-line': return Graph3d.STYLE.DOTLINE; - case 'dot-color': return Graph3d.STYLE.DOTCOLOR; - case 'dot-size': return Graph3d.STYLE.DOTSIZE; - case 'line': return Graph3d.STYLE.LINE; - case 'grid': return Graph3d.STYLE.GRID; - case 'surface': return Graph3d.STYLE.SURFACE; - case 'bar': return Graph3d.STYLE.BAR; - case 'bar-color': return Graph3d.STYLE.BARCOLOR; - case 'bar-size': return Graph3d.STYLE.BARSIZE; + Timeline.prototype.setCustomTime = function (time) { + if (!this.customTime) { + throw new Error('Cannot get custom time: Custom time bar is not enabled'); } - return -1; + this.customTime.setCustomTime(time); }; /** - * Determine the indexes of the data columns, based on the given style and data - * @param {DataSet} data - * @param {Number} style + * Retrieve the current custom time. + * @return {Date} customTime */ - Graph3d.prototype._determineColumnIndexes = function(data, style) { - if (this.style === Graph3d.STYLE.DOT || - this.style === Graph3d.STYLE.DOTLINE || - this.style === Graph3d.STYLE.LINE || - this.style === Graph3d.STYLE.GRID || - this.style === Graph3d.STYLE.SURFACE || - this.style === Graph3d.STYLE.BAR) { - // 3 columns expected, and optionally a 4th with filter values - this.colX = 0; - this.colY = 1; - this.colZ = 2; - this.colValue = undefined; - - if (data.getNumberOfColumns() > 3) { - this.colFilter = 3; - } + Timeline.prototype.getCustomTime = function() { + if (!this.customTime) { + throw new Error('Cannot get custom time: Custom time bar is not enabled'); } - else if (this.style === Graph3d.STYLE.DOTCOLOR || - this.style === Graph3d.STYLE.DOTSIZE || - this.style === Graph3d.STYLE.BARCOLOR || - this.style === Graph3d.STYLE.BARSIZE) { - // 4 columns expected, and optionally a 5th with filter values - this.colX = 0; - this.colY = 1; - this.colZ = 2; - this.colValue = 3; - if (data.getNumberOfColumns() > 4) { - this.colFilter = 4; - } - } - else { - throw 'Unknown style "' + this.style + '"'; - } + return this.customTime.getCustomTime(); }; - Graph3d.prototype.getNumberOfRows = function(data) { - return data.length; - } - + /** + * Set items + * @param {vis.DataSet | Array | google.visualization.DataTable | null} items + */ + Timeline.prototype.setItems = function(items) { + var initialLoad = (this.itemsData == null); - Graph3d.prototype.getNumberOfColumns = function(data) { - var counter = 0; - for (var column in data[0]) { - if (data[0].hasOwnProperty(column)) { - counter++; - } + // convert to type DataSet when needed + var newDataSet; + if (!items) { + newDataSet = null; } - return counter; - } - - - Graph3d.prototype.getDistinctValues = function(data, column) { - var distinctValues = []; - for (var i = 0; i < data.length; i++) { - if (distinctValues.indexOf(data[i][column]) == -1) { - distinctValues.push(data[i][column]); - } + else if (items instanceof DataSet || items instanceof DataView) { + newDataSet = items; + } + else { + // turn an array into a dataset + newDataSet = new DataSet(items, { + type: { + start: 'Date', + end: 'Date' + } + }); } - return distinctValues; - } + // set items + this.itemsData = newDataSet; + this.itemSet && this.itemSet.setItems(newDataSet); - Graph3d.prototype.getColumnRange = function(data,column) { - var minMax = {min:data[0][column],max:data[0][column]}; - for (var i = 0; i < data.length; i++) { - if (minMax.min > data[i][column]) { minMax.min = data[i][column]; } - if (minMax.max < data[i][column]) { minMax.max = data[i][column]; } + if (initialLoad && ('start' in this.options || 'end' in this.options)) { + this.fit(); + + var start = ('start' in this.options) ? util.convert(this.options.start, 'Date') : null; + var end = ('end' in this.options) ? util.convert(this.options.end, 'Date') : null; + + this.setWindow(start, end); } - return minMax; }; /** - * Initialize the data from the data table. Calculate minimum and maximum values - * and column index values - * @param {Array | DataSet | DataView} rawData The data containing the items for the Graph. - * @param {Number} style Style Number + * Set groups + * @param {vis.DataSet | Array | google.visualization.DataTable} groups */ - Graph3d.prototype._dataInitialize = function (rawData, style) { - var me = this; - - // unsubscribe from the dataTable - if (this.dataSet) { - this.dataSet.off('*', this._onChange); - } - - if (rawData === undefined) - return; - - if (Array.isArray(rawData)) { - rawData = new DataSet(rawData); + Timeline.prototype.setGroups = function(groups) { + // convert to type DataSet when needed + var newDataSet; + if (!groups) { + newDataSet = null; } - - var data; - if (rawData instanceof DataSet || rawData instanceof DataView) { - data = rawData.get(); + else if (groups instanceof DataSet || groups instanceof DataView) { + newDataSet = groups; } else { - throw new Error('Array, DataSet, or DataView expected'); + // turn an array into a dataset + newDataSet = new DataSet(groups); } - if (data.length == 0) - return; - - this.dataSet = rawData; - this.dataTable = data; + this.groupsData = newDataSet; + this.itemSet.setGroups(newDataSet); + }; - // subscribe to changes in the dataset - this._onChange = function () { - me.setData(me.dataSet); - }; - this.dataSet.on('*', this._onChange); + /** + * Clear the Timeline. By Default, items, groups and options are cleared. + * Example usage: + * + * timeline.clear(); // clear items, groups, and options + * timeline.clear({options: true}); // clear options only + * + * @param {Object} [what] Optionally specify what to clear. By default: + * {items: true, groups: true, options: true} + */ + Timeline.prototype.clear = function(what) { + // clear items + if (!what || what.items) { + this.setItems(null); + } - // _determineColumnIndexes - // getNumberOfRows (points) - // getNumberOfColumns (x,y,z,v,t,t1,t2...) - // getDistinctValues (unique values?) - // getColumnRange + // clear groups + if (!what || what.groups) { + this.setGroups(null); + } - // determine the location of x,y,z,value,filter columns - this.colX = 'x'; - this.colY = 'y'; - this.colZ = 'z'; - this.colValue = 'style'; - this.colFilter = 'filter'; + // clear options of timeline and of each of the components + if (!what || what.options) { + this.components.forEach(function (component) { + component.setOptions(component.defaultOptions); + }); + this.setOptions(this.defaultOptions); // this will also do a redraw + } + }; + /** + * Set Timeline window such that it fits all items + */ + Timeline.prototype.fit = function() { + // apply the data range as range + var dataRange = this.getItemRange(); - // check if a filter column is provided - if (data[0].hasOwnProperty('filter')) { - if (this.dataFilter === undefined) { - this.dataFilter = new Filter(rawData, this.colFilter, this); - this.dataFilter.setOnLoadCallback(function() {me.redraw();}); + // add 5% space on both sides + var start = dataRange.min; + var end = dataRange.max; + if (start != null && end != null) { + var interval = (end.valueOf() - start.valueOf()); + if (interval <= 0) { + // prevent an empty interval + interval = 24 * 60 * 60 * 1000; // 1 day } + start = new Date(start.valueOf() - interval * 0.05); + end = new Date(end.valueOf() + interval * 0.05); + } + + // skip range set if there is no start and end date + if (start === null && end === null) { + return; } + this.range.setRange(start, end); + }; - var withBars = this.style == Graph3d.STYLE.BAR || - this.style == Graph3d.STYLE.BARCOLOR || - this.style == Graph3d.STYLE.BARSIZE; + /** + * Get the data range of the item set. + * @returns {{min: Date, max: Date}} range A range with a start and end Date. + * When no minimum is found, min==null + * When no maximum is found, max==null + */ + Timeline.prototype.getItemRange = function() { + // calculate min from start filed + var dataset = this.itemsData.getDataSet(), + min = null, + max = null; - // determine barWidth from data - if (withBars) { - if (this.defaultXBarWidth !== undefined) { - this.xBarWidth = this.defaultXBarWidth; - } - else { - var dataX = this.getDistinctValues(data,this.colX); - this.xBarWidth = (dataX[1] - dataX[0]) || 1; - } + if (dataset) { + // calculate the minimum value of the field 'start' + var minItem = dataset.min('start'); + min = minItem ? util.convert(minItem.start, 'Date').valueOf() : null; + // Note: we convert first to Date and then to number because else + // a conversion from ISODate to Number will fail - if (this.defaultYBarWidth !== undefined) { - this.yBarWidth = this.defaultYBarWidth; + // calculate maximum value of fields 'start' and 'end' + var maxStartItem = dataset.max('start'); + if (maxStartItem) { + max = util.convert(maxStartItem.start, 'Date').valueOf(); } - else { - var dataY = this.getDistinctValues(data,this.colY); - this.yBarWidth = (dataY[1] - dataY[0]) || 1; + var maxEndItem = dataset.max('end'); + if (maxEndItem) { + if (max == null) { + max = util.convert(maxEndItem.end, 'Date').valueOf(); + } + else { + max = Math.max(max, util.convert(maxEndItem.end, 'Date').valueOf()); + } } } - // calculate minimums and maximums - var xRange = this.getColumnRange(data,this.colX); - if (withBars) { - xRange.min -= this.xBarWidth / 2; - xRange.max += this.xBarWidth / 2; - } - this.xMin = (this.defaultXMin !== undefined) ? this.defaultXMin : xRange.min; - this.xMax = (this.defaultXMax !== undefined) ? this.defaultXMax : xRange.max; - if (this.xMax <= this.xMin) this.xMax = this.xMin + 1; - this.xStep = (this.defaultXStep !== undefined) ? this.defaultXStep : (this.xMax-this.xMin)/5; + return { + min: (min != null) ? new Date(min) : null, + max: (max != null) ? new Date(max) : null + }; + }; - var yRange = this.getColumnRange(data,this.colY); - if (withBars) { - yRange.min -= this.yBarWidth / 2; - yRange.max += this.yBarWidth / 2; - } - this.yMin = (this.defaultYMin !== undefined) ? this.defaultYMin : yRange.min; - this.yMax = (this.defaultYMax !== undefined) ? this.defaultYMax : yRange.max; - if (this.yMax <= this.yMin) this.yMax = this.yMin + 1; - this.yStep = (this.defaultYStep !== undefined) ? this.defaultYStep : (this.yMax-this.yMin)/5; + /** + * Set selected items by their id. Replaces the current selection + * Unknown id's are silently ignored. + * @param {Array} [ids] An array with zero or more id's of the items to be + * selected. If ids is an empty array, all items will be + * unselected. + */ + Timeline.prototype.setSelection = function(ids) { + this.itemSet && this.itemSet.setSelection(ids); + }; - var zRange = this.getColumnRange(data,this.colZ); - this.zMin = (this.defaultZMin !== undefined) ? this.defaultZMin : zRange.min; - this.zMax = (this.defaultZMax !== undefined) ? this.defaultZMax : zRange.max; - if (this.zMax <= this.zMin) this.zMax = this.zMin + 1; - this.zStep = (this.defaultZStep !== undefined) ? this.defaultZStep : (this.zMax-this.zMin)/5; + /** + * Get the selected items by their id + * @return {Array} ids The ids of the selected items + */ + Timeline.prototype.getSelection = function() { + return this.itemSet && this.itemSet.getSelection() || []; + }; - if (this.colValue !== undefined) { - var valueRange = this.getColumnRange(data,this.colValue); - this.valueMin = (this.defaultValueMin !== undefined) ? this.defaultValueMin : valueRange.min; - this.valueMax = (this.defaultValueMax !== undefined) ? this.defaultValueMax : valueRange.max; - if (this.valueMax <= this.valueMin) this.valueMax = this.valueMin + 1; + /** + * Set the visible window. Both parameters are optional, you can change only + * start or only end. Syntax: + * + * TimeLine.setWindow(start, end) + * TimeLine.setWindow(range) + * + * Where start and end can be a Date, number, or string, and range is an + * object with properties start and end. + * + * @param {Date | Number | String | Object} [start] Start date of visible window + * @param {Date | Number | String} [end] End date of visible window + */ + Timeline.prototype.setWindow = function(start, end) { + if (arguments.length == 1) { + var range = arguments[0]; + this.range.setRange(range.start, range.end); + } + else { + this.range.setRange(start, end); } + }; - // set the scale dependent on the ranges. - this._setScale(); + /** + * Get the visible window + * @return {{start: Date, end: Date}} Visible range + */ + Timeline.prototype.getWindow = function() { + var range = this.range.getRange(); + return { + start: new Date(range.start), + end: new Date(range.end) + }; }; - - /** - * Filter the data based on the current filter - * @param {Array} data - * @return {Array} dataPoints Array with point objects which can be drawn on screen + * Force a redraw of the Timeline. Can be useful to manually redraw when + * option autoResize=false */ - Graph3d.prototype._getDataPoints = function (data) { - // TODO: store the created matrix dataPoints in the filters instead of reloading each time - var x, y, i, z, obj, point; - - var dataPoints = []; - - if (this.style === Graph3d.STYLE.GRID || - this.style === Graph3d.STYLE.SURFACE) { - // copy all values from the google data table to a matrix - // the provided values are supposed to form a grid of (x,y) positions - - // create two lists with all present x and y values - var dataX = []; - var dataY = []; - for (i = 0; i < this.getNumberOfRows(data); i++) { - x = data[i][this.colX] || 0; - y = data[i][this.colY] || 0; - - if (dataX.indexOf(x) === -1) { - dataX.push(x); - } - if (dataY.indexOf(y) === -1) { - dataY.push(y); - } - } - - function sortNumber(a, b) { - return a - b; - } - dataX.sort(sortNumber); - dataY.sort(sortNumber); - - // create a grid, a 2d matrix, with all values. - var dataMatrix = []; // temporary data matrix - for (i = 0; i < data.length; i++) { - x = data[i][this.colX] || 0; - y = data[i][this.colY] || 0; - z = data[i][this.colZ] || 0; + Timeline.prototype.redraw = function() { + var resized = false, + options = this.options, + props = this.props, + dom = this.dom; - var xIndex = dataX.indexOf(x); // TODO: implement Array().indexOf() for Internet Explorer - var yIndex = dataY.indexOf(y); + if (!dom) return; // when destroyed - if (dataMatrix[xIndex] === undefined) { - dataMatrix[xIndex] = []; - } + // update class names + dom.root.className = 'vis timeline root ' + options.orientation; - var point3d = new Point3d(); - point3d.x = x; - point3d.y = y; - point3d.z = z; + // update root width and height options + dom.root.style.maxHeight = util.option.asSize(options.maxHeight, ''); + dom.root.style.minHeight = util.option.asSize(options.minHeight, ''); + dom.root.style.width = util.option.asSize(options.width, ''); - obj = {}; - obj.point = point3d; - obj.trans = undefined; - obj.screen = undefined; - obj.bottom = new Point3d(x, y, this.zMin); + // calculate border widths + props.border.left = (dom.centerContainer.offsetWidth - dom.centerContainer.clientWidth) / 2; + props.border.right = props.border.left; + props.border.top = (dom.centerContainer.offsetHeight - dom.centerContainer.clientHeight) / 2; + props.border.bottom = props.border.top; + var borderRootHeight= dom.root.offsetHeight - dom.root.clientHeight; + var borderRootWidth = dom.root.offsetWidth - dom.root.clientWidth; - dataMatrix[xIndex][yIndex] = obj; + // calculate the heights. If any of the side panels is empty, we set the height to + // minus the border width, such that the border will be invisible + props.center.height = dom.center.offsetHeight; + props.left.height = dom.left.offsetHeight; + props.right.height = dom.right.offsetHeight; + props.top.height = dom.top.clientHeight || -props.border.top; + props.bottom.height = dom.bottom.clientHeight || -props.border.bottom; - dataPoints.push(obj); - } + // TODO: compensate borders when any of the panels is empty. - // fill in the pointers to the neighbors. - for (x = 0; x < dataMatrix.length; x++) { - for (y = 0; y < dataMatrix[x].length; y++) { - if (dataMatrix[x][y]) { - dataMatrix[x][y].pointRight = (x < dataMatrix.length-1) ? dataMatrix[x+1][y] : undefined; - dataMatrix[x][y].pointTop = (y < dataMatrix[x].length-1) ? dataMatrix[x][y+1] : undefined; - dataMatrix[x][y].pointCross = - (x < dataMatrix.length-1 && y < dataMatrix[x].length-1) ? - dataMatrix[x+1][y+1] : - undefined; - } - } - } - } - else { // 'dot', 'dot-line', etc. - // copy all values from the google data table to a list with Point3d objects - for (i = 0; i < data.length; i++) { - point = new Point3d(); - point.x = data[i][this.colX] || 0; - point.y = data[i][this.colY] || 0; - point.z = data[i][this.colZ] || 0; + // apply auto height + // TODO: only calculate autoHeight when needed (else we cause an extra reflow/repaint of the DOM) + var contentHeight = Math.max(props.left.height, props.center.height, props.right.height); + var autoHeight = props.top.height + contentHeight + props.bottom.height + + borderRootHeight + props.border.top + props.border.bottom; + dom.root.style.height = util.option.asSize(options.height, autoHeight + 'px'); - if (this.colValue !== undefined) { - point.value = data[i][this.colValue] || 0; - } + // calculate heights of the content panels + props.root.height = dom.root.offsetHeight; + props.background.height = props.root.height - borderRootHeight; + var containerHeight = props.root.height - props.top.height - props.bottom.height - + borderRootHeight; + props.centerContainer.height = containerHeight; + props.leftContainer.height = containerHeight; + props.rightContainer.height = props.leftContainer.height; - obj = {}; - obj.point = point; - obj.bottom = new Point3d(point.x, point.y, this.zMin); - obj.trans = undefined; - obj.screen = undefined; + // calculate the widths of the panels + props.root.width = dom.root.offsetWidth; + props.background.width = props.root.width - borderRootWidth; + props.left.width = dom.leftContainer.clientWidth || -props.border.left; + props.leftContainer.width = props.left.width; + props.right.width = dom.rightContainer.clientWidth || -props.border.right; + props.rightContainer.width = props.right.width; + var centerWidth = props.root.width - props.left.width - props.right.width - borderRootWidth; + props.center.width = centerWidth; + props.centerContainer.width = centerWidth; + props.top.width = centerWidth; + props.bottom.width = centerWidth; - dataPoints.push(obj); - } - } + // resize the panels + dom.background.style.height = props.background.height + 'px'; + dom.backgroundVertical.style.height = props.background.height + 'px'; + dom.backgroundHorizontal.style.height = props.centerContainer.height + 'px'; + dom.centerContainer.style.height = props.centerContainer.height + 'px'; + dom.leftContainer.style.height = props.leftContainer.height + 'px'; + dom.rightContainer.style.height = props.rightContainer.height + 'px'; - return dataPoints; - }; + dom.background.style.width = props.background.width + 'px'; + dom.backgroundVertical.style.width = props.centerContainer.width + 'px'; + dom.backgroundHorizontal.style.width = props.background.width + 'px'; + dom.centerContainer.style.width = props.center.width + 'px'; + dom.top.style.width = props.top.width + 'px'; + dom.bottom.style.width = props.bottom.width + 'px'; - /** - * Create the main frame for the Graph3d. - * This function is executed once when a Graph3d object is created. The frame - * contains a canvas, and this canvas contains all objects like the axis and - * nodes. - */ - Graph3d.prototype.create = function () { - // remove all elements from the container element. - while (this.containerElement.hasChildNodes()) { - this.containerElement.removeChild(this.containerElement.firstChild); - } + // reposition the panels + dom.background.style.left = '0'; + dom.background.style.top = '0'; + dom.backgroundVertical.style.left = props.left.width + 'px'; + dom.backgroundVertical.style.top = '0'; + dom.backgroundHorizontal.style.left = '0'; + dom.backgroundHorizontal.style.top = props.top.height + 'px'; + dom.centerContainer.style.left = props.left.width + 'px'; + dom.centerContainer.style.top = props.top.height + 'px'; + dom.leftContainer.style.left = '0'; + dom.leftContainer.style.top = props.top.height + 'px'; + dom.rightContainer.style.left = (props.left.width + props.center.width) + 'px'; + dom.rightContainer.style.top = props.top.height + 'px'; + dom.top.style.left = props.left.width + 'px'; + dom.top.style.top = '0'; + dom.bottom.style.left = props.left.width + 'px'; + dom.bottom.style.top = (props.top.height + props.centerContainer.height) + 'px'; - this.frame = document.createElement('div'); - this.frame.style.position = 'relative'; - this.frame.style.overflow = 'hidden'; + // update the scrollTop, feasible range for the offset can be changed + // when the height of the Timeline or of the contents of the center changed + this._updateScrollTop(); - // create the graph canvas (HTML canvas element) - this.frame.canvas = document.createElement( 'canvas' ); - this.frame.canvas.style.position = 'relative'; - this.frame.appendChild(this.frame.canvas); - //if (!this.frame.canvas.getContext) { - { - var noCanvas = document.createElement( 'DIV' ); - noCanvas.style.color = 'red'; - noCanvas.style.fontWeight = 'bold' ; - noCanvas.style.padding = '10px'; - noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; - this.frame.canvas.appendChild(noCanvas); + // reposition the scrollable contents + var offset = this.props.scrollTop; + if (options.orientation == 'bottom') { + offset += Math.max(this.props.centerContainer.height - this.props.center.height - + this.props.border.top - this.props.border.bottom, 0); } + dom.center.style.left = '0'; + dom.center.style.top = offset + 'px'; + dom.left.style.left = '0'; + dom.left.style.top = offset + 'px'; + dom.right.style.left = '0'; + dom.right.style.top = offset + 'px'; - this.frame.filter = document.createElement( 'div' ); - this.frame.filter.style.position = 'absolute'; - this.frame.filter.style.bottom = '0px'; - this.frame.filter.style.left = '0px'; - this.frame.filter.style.width = '100%'; - this.frame.appendChild(this.frame.filter); - - // add event listeners to handle moving and zooming the contents - var me = this; - var onmousedown = function (event) {me._onMouseDown(event);}; - var ontouchstart = function (event) {me._onTouchStart(event);}; - var onmousewheel = function (event) {me._onWheel(event);}; - var ontooltip = function (event) {me._onTooltip(event);}; - // TODO: these events are never cleaned up... can give a 'memory leakage' - - G3DaddEventListener(this.frame.canvas, 'keydown', onkeydown); - G3DaddEventListener(this.frame.canvas, 'mousedown', onmousedown); - G3DaddEventListener(this.frame.canvas, 'touchstart', ontouchstart); - G3DaddEventListener(this.frame.canvas, 'mousewheel', onmousewheel); - G3DaddEventListener(this.frame.canvas, 'mousemove', ontooltip); + // show shadows when vertical scrolling is available + var visibilityTop = this.props.scrollTop == 0 ? 'hidden' : ''; + var visibilityBottom = this.props.scrollTop == this.props.scrollTopMin ? 'hidden' : ''; + dom.shadowTop.style.visibility = visibilityTop; + dom.shadowBottom.style.visibility = visibilityBottom; + dom.shadowTopLeft.style.visibility = visibilityTop; + dom.shadowBottomLeft.style.visibility = visibilityBottom; + dom.shadowTopRight.style.visibility = visibilityTop; + dom.shadowBottomRight.style.visibility = visibilityBottom; - // add the new graph to the container element - this.containerElement.appendChild(this.frame); + // redraw all components + this.components.forEach(function (component) { + resized = component.redraw() || resized; + }); + if (resized) { + // keep repainting until all sizes are settled + this.redraw(); + } }; + // TODO: deprecated since version 1.1.0, remove some day + Timeline.prototype.repaint = function () { + throw new Error('Function repaint is deprecated. Use redraw instead.'); + }; /** - * Set a new size for the graph - * @param {string} width Width in pixels or percentage (for example '800px' - * or '50%') - * @param {string} height Height in pixels or percentage (for example '400px' - * or '30%') + * Convert a position on screen (pixels) to a datetime + * @param {int} x Position on the screen in pixels + * @return {Date} time The datetime the corresponds with given position x + * @private */ - Graph3d.prototype.setSize = function(width, height) { - this.frame.style.width = width; - this.frame.style.height = height; - - this._resizeCanvas(); + // TODO: move this function to Range + Timeline.prototype._toTime = function(x) { + var conversion = this.range.conversion(this.props.center.width); + return new Date(x / conversion.scale + conversion.offset); }; + /** - * Resize the canvas to the current size of the frame + * Convert a position on the global screen (pixels) to a datetime + * @param {int} x Position on the screen in pixels + * @return {Date} time The datetime the corresponds with given position x + * @private */ - Graph3d.prototype._resizeCanvas = function() { - this.frame.canvas.style.width = '100%'; - this.frame.canvas.style.height = '100%'; - - this.frame.canvas.width = this.frame.canvas.clientWidth; - this.frame.canvas.height = this.frame.canvas.clientHeight; - - // adjust with for margin - this.frame.filter.style.width = (this.frame.canvas.clientWidth - 2 * 10) + 'px'; + // TODO: move this function to Range + Timeline.prototype._toGlobalTime = function(x) { + var conversion = this.range.conversion(this.props.root.width); + return new Date(x / conversion.scale + conversion.offset); }; /** - * Start animation + * Convert a datetime (Date object) into a position on the screen + * @param {Date} time A date + * @return {int} x The position on the screen in pixels which corresponds + * with the given date. + * @private */ - Graph3d.prototype.animationStart = function() { - if (!this.frame.filter || !this.frame.filter.slider) - throw 'No animation available'; - - this.frame.filter.slider.play(); + // TODO: move this function to Range + Timeline.prototype._toScreen = function(time) { + var conversion = this.range.conversion(this.props.center.width); + return (time.valueOf() - conversion.offset) * conversion.scale; }; /** - * Stop animation + * Convert a datetime (Date object) into a position on the root + * This is used to get the pixel density estimate for the screen, not the center panel + * @param {Date} time A date + * @return {int} x The position on root in pixels which corresponds + * with the given date. + * @private */ - Graph3d.prototype.animationStop = function() { - if (!this.frame.filter || !this.frame.filter.slider) return; - - this.frame.filter.slider.stop(); + // TODO: move this function to Range + Timeline.prototype._toGlobalScreen = function(time) { + var conversion = this.range.conversion(this.props.root.width); + return (time.valueOf() - conversion.offset) * conversion.scale; }; /** - * Resize the center position based on the current values in this.defaultXCenter - * and this.defaultYCenter (which are strings with a percentage or a value - * in pixels). The center positions are the variables this.xCenter - * and this.yCenter + * Initialize watching when option autoResize is true + * @private */ - Graph3d.prototype._resizeCenter = function() { - // calculate the horizontal center position - if (this.defaultXCenter.charAt(this.defaultXCenter.length-1) === '%') { - this.xcenter = - parseFloat(this.defaultXCenter) / 100 * - this.frame.canvas.clientWidth; - } - else { - this.xcenter = parseFloat(this.defaultXCenter); // supposed to be in px - } - - // calculate the vertical center position - if (this.defaultYCenter.charAt(this.defaultYCenter.length-1) === '%') { - this.ycenter = - parseFloat(this.defaultYCenter) / 100 * - (this.frame.canvas.clientHeight - this.frame.filter.clientHeight); + Timeline.prototype._initAutoResize = function () { + if (this.options.autoResize == true) { + this._startAutoResize(); } else { - this.ycenter = parseFloat(this.defaultYCenter); // supposed to be in px + this._stopAutoResize(); } }; /** - * Set the rotation and distance of the camera - * @param {Object} pos An object with the camera position. The object - * contains three parameters: - * - horizontal {Number} - * The horizontal rotation, between 0 and 2*PI. - * Optional, can be left undefined. - * - vertical {Number} - * The vertical rotation, between 0 and 0.5*PI - * if vertical=0.5*PI, the graph is shown from the - * top. Optional, can be left undefined. - * - distance {Number} - * The (normalized) distance of the camera to the - * center of the graph, a value between 0.71 and 5.0. - * Optional, can be left undefined. + * Watch for changes in the size of the container. On resize, the Panel will + * automatically redraw itself. + * @private */ - Graph3d.prototype.setCameraPosition = function(pos) { - if (pos === undefined) { - return; - } + Timeline.prototype._startAutoResize = function () { + var me = this; - if (pos.horizontal !== undefined && pos.vertical !== undefined) { - this.camera.setArmRotation(pos.horizontal, pos.vertical); - } + this._stopAutoResize(); - if (pos.distance !== undefined) { - this.camera.setArmLength(pos.distance); + this._onResize = function() { + if (me.options.autoResize != true) { + // stop watching when the option autoResize is changed to false + me._stopAutoResize(); + return; + } + + if (me.dom.root) { + // check whether the frame is resized + if ((me.dom.root.clientWidth != me.props.lastWidth) || + (me.dom.root.clientHeight != me.props.lastHeight)) { + me.props.lastWidth = me.dom.root.clientWidth; + me.props.lastHeight = me.dom.root.clientHeight; + + me.emit('change'); + } + } + }; + + // add event listener to window resize + util.addEventListener(window, 'resize', this._onResize); + + this.watchTimer = setInterval(this._onResize, 1000); + }; + + /** + * Stop watching for a resize of the frame. + * @private + */ + Timeline.prototype._stopAutoResize = function () { + if (this.watchTimer) { + clearInterval(this.watchTimer); + this.watchTimer = undefined; } - this.redraw(); + // remove event listener on window.resize + util.removeEventListener(window, 'resize', this._onResize); + this._onResize = null; }; + /** + * Start moving the timeline vertically + * @param {Event} event + * @private + */ + Timeline.prototype._onTouch = function (event) { + this.touch.allowDragging = true; + }; /** - * Retrieve the current camera rotation - * @return {object} An object with parameters horizontal, vertical, and - * distance + * Start moving the timeline vertically + * @param {Event} event + * @private */ - Graph3d.prototype.getCameraPosition = function() { - var pos = this.camera.getArmRotation(); - pos.distance = this.camera.getArmLength(); - return pos; + Timeline.prototype._onPinch = function (event) { + this.touch.allowDragging = false; }; /** - * Load data into the 3D Graph + * Start moving the timeline vertically + * @param {Event} event + * @private */ - Graph3d.prototype._readData = function(data) { - // read the data - this._dataInitialize(data, this.style); + Timeline.prototype._onDragStart = function (event) { + this.touch.initialScrollTop = this.props.scrollTop; + }; + /** + * Move the timeline vertically + * @param {Event} event + * @private + */ + Timeline.prototype._onDrag = function (event) { + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.touch.allowDragging) return; - if (this.dataFilter) { - // apply filtering - this.dataPoints = this.dataFilter._getDataPoints(); - } - else { - // no filtering. load all data - this.dataPoints = this._getDataPoints(this.dataTable); - } + var delta = event.gesture.deltaY; - // draw the filter - this._redrawFilter(); + var oldScrollTop = this._getScrollTop(); + var newScrollTop = this._setScrollTop(this.touch.initialScrollTop + delta); + + if (newScrollTop != oldScrollTop) { + this.redraw(); // TODO: this causes two redraws when dragging, the other is triggered by rangechange already + } }; /** - * Replace the dataset of the Graph3d - * @param {Array | DataSet | DataView} data + * Apply a scrollTop + * @param {Number} scrollTop + * @returns {Number} scrollTop Returns the applied scrollTop + * @private */ - Graph3d.prototype.setData = function (data) { - this._readData(data); - this.redraw(); + Timeline.prototype._setScrollTop = function (scrollTop) { + this.props.scrollTop = scrollTop; + this._updateScrollTop(); + return this.props.scrollTop; + }; - // start animation when option is true - if (this.animationAutoStart && this.dataFilter) { - this.animationStart(); + /** + * Update the current scrollTop when the height of the containers has been changed + * @returns {Number} scrollTop Returns the applied scrollTop + * @private + */ + Timeline.prototype._updateScrollTop = function () { + // recalculate the scrollTopMin + var scrollTopMin = Math.min(this.props.centerContainer.height - this.props.center.height, 0); // is negative or zero + if (scrollTopMin != this.props.scrollTopMin) { + // in case of bottom orientation, change the scrollTop such that the contents + // do not move relative to the time axis at the bottom + if (this.options.orientation == 'bottom') { + this.props.scrollTop += (scrollTopMin - this.props.scrollTopMin); + } + this.props.scrollTopMin = scrollTopMin; } + + // limit the scrollTop to the feasible scroll range + if (this.props.scrollTop > 0) this.props.scrollTop = 0; + if (this.props.scrollTop < scrollTopMin) this.props.scrollTop = scrollTopMin; + + return this.props.scrollTop; }; /** - * Update the options. Options will be merged with current options - * @param {Object} options + * Get the current scrollTop + * @returns {number} scrollTop + * @private */ - Graph3d.prototype.setOptions = function (options) { - var cameraPosition = undefined; + Timeline.prototype._getScrollTop = function () { + return this.props.scrollTop; + }; - this.animationStop(); + module.exports = Timeline; - if (options !== undefined) { - // retrieve parameter values - if (options.width !== undefined) this.width = options.width; - if (options.height !== undefined) this.height = options.height; - if (options.xCenter !== undefined) this.defaultXCenter = options.xCenter; - if (options.yCenter !== undefined) this.defaultYCenter = options.yCenter; +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { - if (options.filterLabel !== undefined) this.filterLabel = options.filterLabel; - if (options.legendLabel !== undefined) this.legendLabel = options.legendLabel; - if (options.xLabel !== undefined) this.xLabel = options.xLabel; - if (options.yLabel !== undefined) this.yLabel = options.yLabel; - if (options.zLabel !== undefined) this.zLabel = options.zLabel; + var Emitter = __webpack_require__(41); + var Hammer = __webpack_require__(49); + var util = __webpack_require__(1); + var DataSet = __webpack_require__(3); + var DataView = __webpack_require__(4); + var Range = __webpack_require__(9); + var TimeAxis = __webpack_require__(21); + var CurrentTime = __webpack_require__(13); + var CustomTime = __webpack_require__(14); + var LineGraph = __webpack_require__(20); - if (options.style !== undefined) { - var styleNumber = this._getStyleNumber(options.style); - if (styleNumber !== -1) { - this.style = styleNumber; - } - } - if (options.showGrid !== undefined) this.showGrid = options.showGrid; - if (options.showPerspective !== undefined) this.showPerspective = options.showPerspective; - if (options.showShadow !== undefined) this.showShadow = options.showShadow; - if (options.tooltip !== undefined) this.showTooltip = options.tooltip; - if (options.showAnimationControls !== undefined) this.showAnimationControls = options.showAnimationControls; - if (options.keepAspectRatio !== undefined) this.keepAspectRatio = options.keepAspectRatio; - if (options.verticalRatio !== undefined) this.verticalRatio = options.verticalRatio; + /** + * Create a timeline visualization + * @param {HTMLElement} container + * @param {vis.DataSet | Array | google.visualization.DataTable} [items] + * @param {Object} [options] See Graph2d.setOptions for the available options. + * @constructor + */ + function Graph2d (container, items, options, groups) { + var me = this; + this.defaultOptions = { + start: null, + end: null, - if (options.animationInterval !== undefined) this.animationInterval = options.animationInterval; - if (options.animationPreload !== undefined) this.animationPreload = options.animationPreload; - if (options.animationAutoStart !== undefined)this.animationAutoStart = options.animationAutoStart; + autoResize: true, - if (options.xBarWidth !== undefined) this.defaultXBarWidth = options.xBarWidth; - if (options.yBarWidth !== undefined) this.defaultYBarWidth = options.yBarWidth; + orientation: 'bottom', + width: null, + height: null, + maxHeight: null, + minHeight: null + }; + this.options = util.deepExtend({}, this.defaultOptions); - if (options.xMin !== undefined) this.defaultXMin = options.xMin; - if (options.xStep !== undefined) this.defaultXStep = options.xStep; - if (options.xMax !== undefined) this.defaultXMax = options.xMax; - if (options.yMin !== undefined) this.defaultYMin = options.yMin; - if (options.yStep !== undefined) this.defaultYStep = options.yStep; - if (options.yMax !== undefined) this.defaultYMax = options.yMax; - if (options.zMin !== undefined) this.defaultZMin = options.zMin; - if (options.zStep !== undefined) this.defaultZStep = options.zStep; - if (options.zMax !== undefined) this.defaultZMax = options.zMax; - if (options.valueMin !== undefined) this.defaultValueMin = options.valueMin; - if (options.valueMax !== undefined) this.defaultValueMax = options.valueMax; + // Create the DOM, props, and emitter + this._create(container); - if (options.cameraPosition !== undefined) cameraPosition = options.cameraPosition; + // all components listed here will be repainted automatically + this.components = []; - if (cameraPosition !== undefined) { - this.camera.setArmRotation(cameraPosition.horizontal, cameraPosition.vertical); - this.camera.setArmLength(cameraPosition.distance); - } - else { - this.camera.setArmRotation(1.0, 0.5); - this.camera.setArmLength(1.7); + this.body = { + dom: this.dom, + domProps: this.props, + emitter: { + on: this.on.bind(this), + off: this.off.bind(this), + emit: this.emit.bind(this) + }, + util: { + snap: null, // will be specified after TimeAxis is created + toScreen: me._toScreen.bind(me), + toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width + toTime: me._toTime.bind(me), + toGlobalTime : me._toGlobalTime.bind(me) } - } + }; - this._setBackgroundColor(options && options.backgroundColor); + // range + this.range = new Range(this.body); + this.components.push(this.range); + this.body.range = this.range; - this.setSize(this.width, this.height); + // time axis + this.timeAxis = new TimeAxis(this.body); + this.components.push(this.timeAxis); + this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); - // re-load the data - if (this.dataTable) { - this.setData(this.dataTable); - } + // current time bar + this.currentTime = new CurrentTime(this.body); + this.components.push(this.currentTime); - // start animation when option is true - if (this.animationAutoStart && this.dataFilter) { - this.animationStart(); - } - }; + // custom time bar + // Note: time bar will be attached in this.setOptions when selected + this.customTime = new CustomTime(this.body); + this.components.push(this.customTime); - /** - * Redraw the Graph. - */ - Graph3d.prototype.redraw = function() { - if (this.dataPoints === undefined) { - throw 'Error: graph data not initialized'; - } + // item set + this.linegraph = new LineGraph(this.body); + this.components.push(this.linegraph); - this._resizeCanvas(); - this._resizeCenter(); - this._redrawSlider(); - this._redrawClear(); - this._redrawAxis(); + this.itemsData = null; // DataSet + this.groupsData = null; // DataSet - if (this.style === Graph3d.STYLE.GRID || - this.style === Graph3d.STYLE.SURFACE) { - this._redrawDataGrid(); + // apply options + if (options) { + this.setOptions(options); } - else if (this.style === Graph3d.STYLE.LINE) { - this._redrawDataLine(); + + // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS! + if (groups) { + this.setGroups(groups); } - else if (this.style === Graph3d.STYLE.BAR || - this.style === Graph3d.STYLE.BARCOLOR || - this.style === Graph3d.STYLE.BARSIZE) { - this._redrawDataBar(); + + // create itemset + if (items) { + this.setItems(items); } else { - // style is DOT, DOTLINE, DOTCOLOR, DOTSIZE - this._redrawDataDot(); + this.redraw(); } + } - this._redrawInfo(); - this._redrawLegend(); - }; - - /** - * Clear the canvas before redrawing - */ - Graph3d.prototype._redrawClear = function() { - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - - ctx.clearRect(0, 0, canvas.width, canvas.height); - }; - + // turn Graph2d into an event emitter + Emitter(Graph2d.prototype); /** - * Redraw the legend showing the colors + * Create the main DOM for the Graph2d: a root panel containing left, right, + * top, bottom, content, and background panel. + * @param {Element} container The container element where the Graph2d will + * be attached. + * @private */ - Graph3d.prototype._redrawLegend = function() { - var y; - - if (this.style === Graph3d.STYLE.DOTCOLOR || - this.style === Graph3d.STYLE.DOTSIZE) { - - var dotSize = this.frame.clientWidth * 0.02; - - var widthMin, widthMax; - if (this.style === Graph3d.STYLE.DOTSIZE) { - widthMin = dotSize / 2; // px - widthMax = dotSize / 2 + dotSize * 2; // Todo: put this in one function - } - else { - widthMin = 20; // px - widthMax = 20; // px - } - - var height = Math.max(this.frame.clientHeight * 0.25, 100); - var top = this.margin; - var right = this.frame.clientWidth - this.margin; - var left = right - widthMax; - var bottom = top + height; - } - - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - ctx.lineWidth = 1; - ctx.font = '14px arial'; // TODO: put in options + Graph2d.prototype._create = function (container) { + this.dom = {}; - if (this.style === Graph3d.STYLE.DOTCOLOR) { - // draw the color bar - var ymin = 0; - var ymax = height; // Todo: make height customizable - for (y = ymin; y < ymax; y++) { - var f = (y - ymin) / (ymax - ymin); + this.dom.root = document.createElement('div'); + this.dom.background = document.createElement('div'); + this.dom.backgroundVertical = document.createElement('div'); + this.dom.backgroundHorizontalContainer = document.createElement('div'); + this.dom.centerContainer = document.createElement('div'); + this.dom.leftContainer = document.createElement('div'); + this.dom.rightContainer = document.createElement('div'); + this.dom.backgroundHorizontal = document.createElement('div'); + this.dom.center = document.createElement('div'); + this.dom.left = document.createElement('div'); + this.dom.right = document.createElement('div'); + this.dom.top = document.createElement('div'); + this.dom.bottom = document.createElement('div'); + this.dom.shadowTop = document.createElement('div'); + this.dom.shadowBottom = document.createElement('div'); + this.dom.shadowTopLeft = document.createElement('div'); + this.dom.shadowBottomLeft = document.createElement('div'); + this.dom.shadowTopRight = document.createElement('div'); + this.dom.shadowBottomRight = document.createElement('div'); - //var width = (dotSize / 2 + (1-f) * dotSize * 2); // Todo: put this in one function - var hue = f * 240; - var color = this._hsv2rgb(hue, 1, 1); + this.dom.background.className = 'vispanel background'; + this.dom.backgroundVertical.className = 'vispanel background vertical'; + this.dom.backgroundHorizontalContainer.className = 'vispanel background horizontal'; + this.dom.backgroundHorizontal.className = 'vispanel background horizontal'; + this.dom.centerContainer.className = 'vispanel center'; + this.dom.leftContainer.className = 'vispanel left'; + this.dom.rightContainer.className = 'vispanel right'; + this.dom.top.className = 'vispanel top'; + this.dom.bottom.className = 'vispanel bottom'; + this.dom.left.className = 'content'; + this.dom.center.className = 'content'; + this.dom.right.className = 'content'; + this.dom.shadowTop.className = 'shadow top'; + this.dom.shadowBottom.className = 'shadow bottom'; + this.dom.shadowTopLeft.className = 'shadow top'; + this.dom.shadowBottomLeft.className = 'shadow bottom'; + this.dom.shadowTopRight.className = 'shadow top'; + this.dom.shadowBottomRight.className = 'shadow bottom'; - ctx.strokeStyle = color; - ctx.beginPath(); - ctx.moveTo(left, top + y); - ctx.lineTo(right, top + y); - ctx.stroke(); - } + this.dom.root.appendChild(this.dom.background); + this.dom.root.appendChild(this.dom.backgroundVertical); + this.dom.root.appendChild(this.dom.backgroundHorizontalContainer); + this.dom.root.appendChild(this.dom.centerContainer); + this.dom.root.appendChild(this.dom.leftContainer); + this.dom.root.appendChild(this.dom.rightContainer); + this.dom.root.appendChild(this.dom.top); + this.dom.root.appendChild(this.dom.bottom); - ctx.strokeStyle = this.colorAxis; - ctx.strokeRect(left, top, widthMax, height); - } + this.dom.backgroundHorizontalContainer.appendChild(this.dom.backgroundHorizontal); + this.dom.centerContainer.appendChild(this.dom.center); + this.dom.leftContainer.appendChild(this.dom.left); + this.dom.rightContainer.appendChild(this.dom.right); - if (this.style === Graph3d.STYLE.DOTSIZE) { - // draw border around color bar - ctx.strokeStyle = this.colorAxis; - ctx.fillStyle = this.colorDot; - ctx.beginPath(); - ctx.moveTo(left, top); - ctx.lineTo(right, top); - ctx.lineTo(right - widthMax + widthMin, bottom); - ctx.lineTo(left, bottom); - ctx.closePath(); - ctx.fill(); - ctx.stroke(); - } + this.dom.centerContainer.appendChild(this.dom.shadowTop); + this.dom.centerContainer.appendChild(this.dom.shadowBottom); + this.dom.leftContainer.appendChild(this.dom.shadowTopLeft); + this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft); + this.dom.rightContainer.appendChild(this.dom.shadowTopRight); + this.dom.rightContainer.appendChild(this.dom.shadowBottomRight); - if (this.style === Graph3d.STYLE.DOTCOLOR || - this.style === Graph3d.STYLE.DOTSIZE) { - // print values along the color bar - var gridLineLen = 5; // px - var step = new StepNumber(this.valueMin, this.valueMax, (this.valueMax-this.valueMin)/5, true); - step.start(); - if (step.getCurrent() < this.valueMin) { - step.next(); - } - while (!step.end()) { - y = bottom - (step.getCurrent() - this.valueMin) / (this.valueMax - this.valueMin) * height; + this.on('rangechange', this.redraw.bind(this)); + this.on('change', this.redraw.bind(this)); + this.on('touch', this._onTouch.bind(this)); + this.on('pinch', this._onPinch.bind(this)); + this.on('dragstart', this._onDragStart.bind(this)); + this.on('drag', this._onDrag.bind(this)); - ctx.beginPath(); - ctx.moveTo(left - gridLineLen, y); - ctx.lineTo(left, y); - ctx.stroke(); + // create event listeners for all interesting events, these events will be + // emitted via emitter + this.hammer = Hammer(this.dom.root, { + prevent_default: true + }); + this.listeners = {}; - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = this.colorAxis; - ctx.fillText(step.getCurrent(), left - 2 * gridLineLen, y); + var me = this; + var events = [ + 'touch', 'pinch', + 'tap', 'doubletap', 'hold', + 'dragstart', 'drag', 'dragend', + 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox + ]; + events.forEach(function (event) { + var listener = function () { + var args = [event].concat(Array.prototype.slice.call(arguments, 0)); + me.emit.apply(me, args); + }; + me.hammer.on(event, listener); + me.listeners[event] = listener; + }); - step.next(); - } + // size properties of each of the panels + this.props = { + root: {}, + background: {}, + centerContainer: {}, + leftContainer: {}, + rightContainer: {}, + center: {}, + left: {}, + right: {}, + top: {}, + bottom: {}, + border: {}, + scrollTop: 0, + scrollTopMin: 0 + }; + this.touch = {}; // store state information needed for touch events - ctx.textAlign = 'right'; - ctx.textBaseline = 'top'; - var label = this.legendLabel; - ctx.fillText(label, right, bottom + this.margin); - } + // attach the root panel to the provided container + if (!container) throw new Error('No container provided'); + container.appendChild(this.dom.root); }; /** - * Redraw the filter + * Destroy the Graph2d, clean up all DOM elements and event listeners. */ - Graph3d.prototype._redrawFilter = function() { - this.frame.filter.innerHTML = ''; + Graph2d.prototype.destroy = function () { + // unbind datasets + this.clear(); - if (this.dataFilter) { - var options = { - 'visible': this.showAnimationControls - }; - var slider = new Slider(this.frame.filter, options); - this.frame.filter.slider = slider; + // remove all event listeners + this.off(); - // TODO: css here is not nice here... - this.frame.filter.style.padding = '10px'; - //this.frame.filter.style.backgroundColor = '#EFEFEF'; + // stop checking for changed size + this._stopAutoResize(); - slider.setValues(this.dataFilter.values); - slider.setPlayInterval(this.animationInterval); + // remove from DOM + if (this.dom.root.parentNode) { + this.dom.root.parentNode.removeChild(this.dom.root); + } + this.dom = null; - // create an event handler - var me = this; - var onchange = function () { - var index = slider.getIndex(); + // cleanup hammer touch events + for (var event in this.listeners) { + if (this.listeners.hasOwnProperty(event)) { + delete this.listeners[event]; + } + } + this.listeners = null; + this.hammer = null; - me.dataFilter.selectValue(index); - me.dataPoints = me.dataFilter._getDataPoints(); + // give all components the opportunity to cleanup + this.components.forEach(function (component) { + component.destroy(); + }); - me.redraw(); - }; - slider.setOnChangeCallback(onchange); - } - else { - this.frame.filter.slider = undefined; - } + this.body = null; }; /** - * Redraw the slider + * Set options. Options will be passed to all components loaded in the Graph2d. + * @param {Object} [options] + * {String} orientation + * Vertical orientation for the Graph2d, + * can be 'bottom' (default) or 'top'. + * {String | Number} width + * Width for the timeline, a number in pixels or + * a css string like '1000px' or '75%'. '100%' by default. + * {String | Number} height + * Fixed height for the Graph2d, a number in pixels or + * a css string like '400px' or '75%'. If undefined, + * The Graph2d will automatically size such that + * its contents fit. + * {String | Number} minHeight + * Minimum height for the Graph2d, a number in pixels or + * a css string like '400px' or '75%'. + * {String | Number} maxHeight + * Maximum height for the Graph2d, a number in pixels or + * a css string like '400px' or '75%'. + * {Number | Date | String} start + * Start date for the visible window + * {Number | Date | String} end + * End date for the visible window */ - Graph3d.prototype._redrawSlider = function() { - if ( this.frame.filter.slider !== undefined) { - this.frame.filter.slider.redraw(); - } - }; - + Graph2d.prototype.setOptions = function (options) { + if (options) { + // copy the known options + var fields = ['width', 'height', 'minHeight', 'maxHeight', 'autoResize', 'start', 'end', 'orientation']; + util.selectiveExtend(fields, this.options, options); - /** - * Redraw common information - */ - Graph3d.prototype._redrawInfo = function() { - if (this.dataFilter) { - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); + // enable/disable autoResize + this._initAutoResize(); + } - ctx.font = '14px arial'; // TODO: put in options - ctx.lineStyle = 'gray'; - ctx.fillStyle = 'gray'; - ctx.textAlign = 'left'; - ctx.textBaseline = 'top'; + // propagate options to all components + this.components.forEach(function (component) { + component.setOptions(options); + }); - var x = this.margin; - var y = this.margin; - ctx.fillText(this.dataFilter.getLabel() + ': ' + this.dataFilter.getSelectedValue(), x, y); + // TODO: remove deprecation error one day (deprecated since version 0.8.0) + if (options && options.order) { + throw new Error('Option order is deprecated. There is no replacement for this feature.'); } - }; + // redraw everything + this.redraw(); + }; /** - * Redraw the axis + * Set a custom time bar + * @param {Date} time */ - Graph3d.prototype._redrawAxis = function() { - var canvas = this.frame.canvas, - ctx = canvas.getContext('2d'), - from, to, step, prettyStep, - text, xText, yText, zText, - offset, xOffset, yOffset, - xMin2d, xMax2d; - - // TODO: get the actual rendered style of the containerElement - //ctx.font = this.containerElement.style.font; - ctx.font = 24 / this.camera.getArmLength() + 'px arial'; + Graph2d.prototype.setCustomTime = function (time) { + if (!this.customTime) { + throw new Error('Cannot get custom time: Custom time bar is not enabled'); + } - // calculate the length for the short grid lines - var gridLenX = 0.025 / this.scale.x; - var gridLenY = 0.025 / this.scale.y; - var textMargin = 5 / this.camera.getArmLength(); // px - var armAngle = this.camera.getArmRotation().horizontal; + this.customTime.setCustomTime(time); + }; - // draw x-grid lines - ctx.lineWidth = 1; - prettyStep = (this.defaultXStep === undefined); - step = new StepNumber(this.xMin, this.xMax, this.xStep, prettyStep); - step.start(); - if (step.getCurrent() < this.xMin) { - step.next(); + /** + * Retrieve the current custom time. + * @return {Date} customTime + */ + Graph2d.prototype.getCustomTime = function() { + if (!this.customTime) { + throw new Error('Cannot get custom time: Custom time bar is not enabled'); } - while (!step.end()) { - var x = step.getCurrent(); - - if (this.showGrid) { - from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); - to = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); - ctx.strokeStyle = this.colorGrid; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - } - else { - from = this._convert3Dto2D(new Point3d(x, this.yMin, this.zMin)); - to = this._convert3Dto2D(new Point3d(x, this.yMin+gridLenX, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - from = this._convert3Dto2D(new Point3d(x, this.yMax, this.zMin)); - to = this._convert3Dto2D(new Point3d(x, this.yMax-gridLenX, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - } + return this.customTime.getCustomTime(); + }; - yText = (Math.cos(armAngle) > 0) ? this.yMin : this.yMax; - text = this._convert3Dto2D(new Point3d(x, yText, this.zMin)); - if (Math.cos(armAngle * 2) > 0) { - ctx.textAlign = 'center'; - ctx.textBaseline = 'top'; - text.y += textMargin; - } - else if (Math.sin(armAngle * 2) < 0){ - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - } - else { - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; - } - ctx.fillStyle = this.colorAxis; - ctx.fillText(' ' + step.getCurrent() + ' ', text.x, text.y); + /** + * Set items + * @param {vis.DataSet | Array | google.visualization.DataTable | null} items + */ + Graph2d.prototype.setItems = function(items) { + var initialLoad = (this.itemsData == null); - step.next(); + // convert to type DataSet when needed + var newDataSet; + if (!items) { + newDataSet = null; } - - // draw y-grid lines - ctx.lineWidth = 1; - prettyStep = (this.defaultYStep === undefined); - step = new StepNumber(this.yMin, this.yMax, this.yStep, prettyStep); - step.start(); - if (step.getCurrent() < this.yMin) { - step.next(); + else if (items instanceof DataSet || items instanceof DataView) { + newDataSet = items; + } + else { + // turn an array into a dataset + newDataSet = new DataSet(items, { + type: { + start: 'Date', + end: 'Date' + } + }); } - while (!step.end()) { - if (this.showGrid) { - from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); - ctx.strokeStyle = this.colorGrid; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - } - else { - from = this._convert3Dto2D(new Point3d(this.xMin, step.getCurrent(), this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMin+gridLenY, step.getCurrent(), this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - from = this._convert3Dto2D(new Point3d(this.xMax, step.getCurrent(), this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMax-gridLenY, step.getCurrent(), this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - } + // set items + this.itemsData = newDataSet; + this.linegraph && this.linegraph.setItems(newDataSet); - xText = (Math.sin(armAngle ) > 0) ? this.xMin : this.xMax; - text = this._convert3Dto2D(new Point3d(xText, step.getCurrent(), this.zMin)); - if (Math.cos(armAngle * 2) < 0) { - ctx.textAlign = 'center'; - ctx.textBaseline = 'top'; - text.y += textMargin; - } - else if (Math.sin(armAngle * 2) > 0){ - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - } - else { - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; - } - ctx.fillStyle = this.colorAxis; - ctx.fillText(' ' + step.getCurrent() + ' ', text.x, text.y); + if (initialLoad && ('start' in this.options || 'end' in this.options)) { + this.fit(); - step.next(); - } + var start = ('start' in this.options) ? util.convert(this.options.start, 'Date') : null; + var end = ('end' in this.options) ? util.convert(this.options.end, 'Date') : null; - // draw z-grid lines and axis - ctx.lineWidth = 1; - prettyStep = (this.defaultZStep === undefined); - step = new StepNumber(this.zMin, this.zMax, this.zStep, prettyStep); - step.start(); - if (step.getCurrent() < this.zMin) { - step.next(); + this.setWindow(start, end); } - xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; - yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; - while (!step.end()) { - // TODO: make z-grid lines really 3d? - from = this._convert3Dto2D(new Point3d(xText, yText, step.getCurrent())); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(from.x - textMargin, from.y); - ctx.stroke(); - - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = this.colorAxis; - ctx.fillText(step.getCurrent() + ' ', from.x - 5, from.y); + }; - step.next(); + /** + * Set groups + * @param {vis.DataSet | Array | google.visualization.DataTable} groups + */ + Graph2d.prototype.setGroups = function(groups) { + // convert to type DataSet when needed + var newDataSet; + if (!groups) { + newDataSet = null; + } + else if (groups instanceof DataSet || groups instanceof DataView) { + newDataSet = groups; + } + else { + // turn an array into a dataset + newDataSet = new DataSet(groups); } - ctx.lineWidth = 1; - from = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); - to = this._convert3Dto2D(new Point3d(xText, yText, this.zMax)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - // draw x-axis - ctx.lineWidth = 1; - // line at yMin - xMin2d = this._convert3Dto2D(new Point3d(this.xMin, this.yMin, this.zMin)); - xMax2d = this._convert3Dto2D(new Point3d(this.xMax, this.yMin, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(xMin2d.x, xMin2d.y); - ctx.lineTo(xMax2d.x, xMax2d.y); - ctx.stroke(); - // line at ymax - xMin2d = this._convert3Dto2D(new Point3d(this.xMin, this.yMax, this.zMin)); - xMax2d = this._convert3Dto2D(new Point3d(this.xMax, this.yMax, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(xMin2d.x, xMin2d.y); - ctx.lineTo(xMax2d.x, xMax2d.y); - ctx.stroke(); + this.groupsData = newDataSet; + this.linegraph.setGroups(newDataSet); + }; + + /** + * Clear the Graph2d. By Default, items, groups and options are cleared. + * Example usage: + * + * timeline.clear(); // clear items, groups, and options + * timeline.clear({options: true}); // clear options only + * + * @param {Object} [what] Optionally specify what to clear. By default: + * {items: true, groups: true, options: true} + */ + Graph2d.prototype.clear = function(what) { + // clear items + if (!what || what.items) { + this.setItems(null); + } - // draw y-axis - ctx.lineWidth = 1; - // line at xMin - from = this._convert3Dto2D(new Point3d(this.xMin, this.yMin, this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMin, this.yMax, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); - // line at xMax - from = this._convert3Dto2D(new Point3d(this.xMax, this.yMin, this.zMin)); - to = this._convert3Dto2D(new Point3d(this.xMax, this.yMax, this.zMin)); - ctx.strokeStyle = this.colorAxis; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - ctx.stroke(); + // clear groups + if (!what || what.groups) { + this.setGroups(null); + } - // draw x-label - var xLabel = this.xLabel; - if (xLabel.length > 0) { - yOffset = 0.1 / this.scale.y; - xText = (this.xMin + this.xMax) / 2; - yText = (Math.cos(armAngle) > 0) ? this.yMin - yOffset: this.yMax + yOffset; - text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); - if (Math.cos(armAngle * 2) > 0) { - ctx.textAlign = 'center'; - ctx.textBaseline = 'top'; - } - else if (Math.sin(armAngle * 2) < 0){ - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - } - else { - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; - } - ctx.fillStyle = this.colorAxis; - ctx.fillText(xLabel, text.x, text.y); + // clear options of timeline and of each of the components + if (!what || what.options) { + this.components.forEach(function (component) { + component.setOptions(component.defaultOptions); + }); + + this.setOptions(this.defaultOptions); // this will also do a redraw } + }; - // draw y-label - var yLabel = this.yLabel; - if (yLabel.length > 0) { - xOffset = 0.1 / this.scale.x; - xText = (Math.sin(armAngle ) > 0) ? this.xMin - xOffset : this.xMax + xOffset; - yText = (this.yMin + this.yMax) / 2; - text = this._convert3Dto2D(new Point3d(xText, yText, this.zMin)); - if (Math.cos(armAngle * 2) < 0) { - ctx.textAlign = 'center'; - ctx.textBaseline = 'top'; - } - else if (Math.sin(armAngle * 2) > 0){ - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - } - else { - ctx.textAlign = 'left'; - ctx.textBaseline = 'middle'; + /** + * Set Graph2d window such that it fits all items + */ + Graph2d.prototype.fit = function() { + // apply the data range as range + var dataRange = this.getItemRange(); + + // add 5% space on both sides + var start = dataRange.min; + var end = dataRange.max; + if (start != null && end != null) { + var interval = (end.valueOf() - start.valueOf()); + if (interval <= 0) { + // prevent an empty interval + interval = 24 * 60 * 60 * 1000; // 1 day } - ctx.fillStyle = this.colorAxis; - ctx.fillText(yLabel, text.x, text.y); + start = new Date(start.valueOf() - interval * 0.05); + end = new Date(end.valueOf() + interval * 0.05); } - // draw z-label - var zLabel = this.zLabel; - if (zLabel.length > 0) { - offset = 30; // pixels. // TODO: relate to the max width of the values on the z axis? - xText = (Math.cos(armAngle ) > 0) ? this.xMin : this.xMax; - yText = (Math.sin(armAngle ) < 0) ? this.yMin : this.yMax; - zText = (this.zMin + this.zMax) / 2; - text = this._convert3Dto2D(new Point3d(xText, yText, zText)); - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - ctx.fillStyle = this.colorAxis; - ctx.fillText(zLabel, text.x - offset, text.y); + // skip range set if there is no start and end date + if (start === null && end === null) { + return; } + + this.range.setRange(start, end); }; /** - * Calculate the color based on the given value. - * @param {Number} H Hue, a value be between 0 and 360 - * @param {Number} S Saturation, a value between 0 and 1 - * @param {Number} V Value, a value between 0 and 1 + * Get the data range of the item set. + * @returns {{min: Date, max: Date}} range A range with a start and end Date. + * When no minimum is found, min==null + * When no maximum is found, max==null */ - Graph3d.prototype._hsv2rgb = function(H, S, V) { - var R, G, B, C, Hi, X; - - C = V * S; - Hi = Math.floor(H/60); // hi = 0,1,2,3,4,5 - X = C * (1 - Math.abs(((H/60) % 2) - 1)); + Graph2d.prototype.getItemRange = function() { + // calculate min from start filed + var itemsData = this.itemsData, + min = null, + max = null; - switch (Hi) { - case 0: R = C; G = X; B = 0; break; - case 1: R = X; G = C; B = 0; break; - case 2: R = 0; G = C; B = X; break; - case 3: R = 0; G = X; B = C; break; - case 4: R = X; G = 0; B = C; break; - case 5: R = C; G = 0; B = X; break; + if (itemsData) { + // calculate the minimum value of the field 'start' + var minItem = itemsData.min('start'); + min = minItem ? util.convert(minItem.start, 'Date').valueOf() : null; + // Note: we convert first to Date and then to number because else + // a conversion from ISODate to Number will fail - default: R = 0; G = 0; B = 0; break; + // calculate maximum value of fields 'start' and 'end' + var maxStartItem = itemsData.max('start'); + if (maxStartItem) { + max = util.convert(maxStartItem.start, 'Date').valueOf(); + } + var maxEndItem = itemsData.max('end'); + if (maxEndItem) { + if (max == null) { + max = util.convert(maxEndItem.end, 'Date').valueOf(); + } + else { + max = Math.max(max, util.convert(maxEndItem.end, 'Date').valueOf()); + } + } } - return 'RGB(' + parseInt(R*255) + ',' + parseInt(G*255) + ',' + parseInt(B*255) + ')'; + return { + min: (min != null) ? new Date(min) : null, + max: (max != null) ? new Date(max) : null + }; }; - /** - * Draw all datapoints as a grid - * This function can be used when the style is 'grid' + * Set the visible window. Both parameters are optional, you can change only + * start or only end. Syntax: + * + * TimeLine.setWindow(start, end) + * TimeLine.setWindow(range) + * + * Where start and end can be a Date, number, or string, and range is an + * object with properties start and end. + * + * @param {Date | Number | String | Object} [start] Start date of visible window + * @param {Date | Number | String} [end] End date of visible window */ - Graph3d.prototype._redrawDataGrid = function() { - var canvas = this.frame.canvas, - ctx = canvas.getContext('2d'), - point, right, top, cross, - i, - topSideVisible, fillStyle, strokeStyle, lineWidth, - h, s, v, zAvg; + Graph2d.prototype.setWindow = function(start, end) { + if (arguments.length == 1) { + var range = arguments[0]; + this.range.setRange(range.start, range.end); + } + else { + this.range.setRange(start, end); + } + }; + /** + * Get the visible window + * @return {{start: Date, end: Date}} Visible range + */ + Graph2d.prototype.getWindow = function() { + var range = this.range.getRange(); + return { + start: new Date(range.start), + end: new Date(range.end) + }; + }; - if (this.dataPoints === undefined || this.dataPoints.length <= 0) - return; // TODO: throw exception? + /** + * Force a redraw of the Graph2d. Can be useful to manually redraw when + * option autoResize=false + */ + Graph2d.prototype.redraw = function() { + var resized = false, + options = this.options, + props = this.props, + dom = this.dom; - // calculate the translations and screen position of all points - for (i = 0; i < this.dataPoints.length; i++) { - var trans = this._convertPointToTranslation(this.dataPoints[i].point); - var screen = this._convertTranslationToScreen(trans); + if (!dom) return; // when destroyed - this.dataPoints[i].trans = trans; - this.dataPoints[i].screen = screen; + // update class names + dom.root.className = 'vis timeline root ' + options.orientation; - // calculate the translation of the point at the bottom (needed for sorting) - var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); - this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; - } + // update root width and height options + dom.root.style.maxHeight = util.option.asSize(options.maxHeight, ''); + dom.root.style.minHeight = util.option.asSize(options.minHeight, ''); + dom.root.style.width = util.option.asSize(options.width, ''); - // sort the points on depth of their (x,y) position (not on z) - var sortDepth = function (a, b) { - return b.dist - a.dist; - }; - this.dataPoints.sort(sortDepth); + // calculate border widths + props.border.left = (dom.centerContainer.offsetWidth - dom.centerContainer.clientWidth) / 2; + props.border.right = props.border.left; + props.border.top = (dom.centerContainer.offsetHeight - dom.centerContainer.clientHeight) / 2; + props.border.bottom = props.border.top; + var borderRootHeight= dom.root.offsetHeight - dom.root.clientHeight; + var borderRootWidth = dom.root.offsetWidth - dom.root.clientWidth; - if (this.style === Graph3d.STYLE.SURFACE) { - for (i = 0; i < this.dataPoints.length; i++) { - point = this.dataPoints[i]; - right = this.dataPoints[i].pointRight; - top = this.dataPoints[i].pointTop; - cross = this.dataPoints[i].pointCross; + // calculate the heights. If any of the side panels is empty, we set the height to + // minus the border width, such that the border will be invisible + props.center.height = dom.center.offsetHeight; + props.left.height = dom.left.offsetHeight; + props.right.height = dom.right.offsetHeight; + props.top.height = dom.top.clientHeight || -props.border.top; + props.bottom.height = dom.bottom.clientHeight || -props.border.bottom; - if (point !== undefined && right !== undefined && top !== undefined && cross !== undefined) { + // TODO: compensate borders when any of the panels is empty. - if (this.showGrayBottom || this.showShadow) { - // calculate the cross product of the two vectors from center - // to left and right, in order to know whether we are looking at the - // bottom or at the top side. We can also use the cross product - // for calculating light intensity - var aDiff = Point3d.subtract(cross.trans, point.trans); - var bDiff = Point3d.subtract(top.trans, right.trans); - var crossproduct = Point3d.crossProduct(aDiff, bDiff); - var len = crossproduct.length(); - // FIXME: there is a bug with determining the surface side (shadow or colored) + // apply auto height + // TODO: only calculate autoHeight when needed (else we cause an extra reflow/repaint of the DOM) + var contentHeight = Math.max(props.left.height, props.center.height, props.right.height); + var autoHeight = props.top.height + contentHeight + props.bottom.height + + borderRootHeight + props.border.top + props.border.bottom; + dom.root.style.height = util.option.asSize(options.height, autoHeight + 'px'); - topSideVisible = (crossproduct.z > 0); - } - else { - topSideVisible = true; - } + // calculate heights of the content panels + props.root.height = dom.root.offsetHeight; + props.background.height = props.root.height - borderRootHeight; + var containerHeight = props.root.height - props.top.height - props.bottom.height - + borderRootHeight; + props.centerContainer.height = containerHeight; + props.leftContainer.height = containerHeight; + props.rightContainer.height = props.leftContainer.height; - if (topSideVisible) { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - zAvg = (point.point.z + right.point.z + top.point.z + cross.point.z) / 4; - h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; - s = 1; // saturation + // calculate the widths of the panels + props.root.width = dom.root.offsetWidth; + props.background.width = props.root.width - borderRootWidth; + props.left.width = dom.leftContainer.clientWidth || -props.border.left; + props.leftContainer.width = props.left.width; + props.right.width = dom.rightContainer.clientWidth || -props.border.right; + props.rightContainer.width = props.right.width; + var centerWidth = props.root.width - props.left.width - props.right.width - borderRootWidth; + props.center.width = centerWidth; + props.centerContainer.width = centerWidth; + props.top.width = centerWidth; + props.bottom.width = centerWidth; - if (this.showShadow) { - v = Math.min(1 + (crossproduct.x / len) / 2, 1); // value. TODO: scale - fillStyle = this._hsv2rgb(h, s, v); - strokeStyle = fillStyle; - } - else { - v = 1; - fillStyle = this._hsv2rgb(h, s, v); - strokeStyle = this.colorAxis; - } - } - else { - fillStyle = 'gray'; - strokeStyle = this.colorAxis; - } - lineWidth = 0.5; + // resize the panels + dom.background.style.height = props.background.height + 'px'; + dom.backgroundVertical.style.height = props.background.height + 'px'; + dom.backgroundHorizontalContainer.style.height = props.centerContainer.height + 'px'; + dom.centerContainer.style.height = props.centerContainer.height + 'px'; + dom.leftContainer.style.height = props.leftContainer.height + 'px'; + dom.rightContainer.style.height = props.rightContainer.height + 'px'; - ctx.lineWidth = lineWidth; - ctx.fillStyle = fillStyle; - ctx.strokeStyle = strokeStyle; - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); - ctx.lineTo(right.screen.x, right.screen.y); - ctx.lineTo(cross.screen.x, cross.screen.y); - ctx.lineTo(top.screen.x, top.screen.y); - ctx.closePath(); - ctx.fill(); - ctx.stroke(); - } - } - } - else { // grid style - for (i = 0; i < this.dataPoints.length; i++) { - point = this.dataPoints[i]; - right = this.dataPoints[i].pointRight; - top = this.dataPoints[i].pointTop; + dom.background.style.width = props.background.width + 'px'; + dom.backgroundVertical.style.width = props.centerContainer.width + 'px'; + dom.backgroundHorizontalContainer.style.width = props.background.width + 'px'; + dom.backgroundHorizontal.style.width = props.background.width + 'px'; + dom.centerContainer.style.width = props.center.width + 'px'; + dom.top.style.width = props.top.width + 'px'; + dom.bottom.style.width = props.bottom.width + 'px'; - if (point !== undefined) { - if (this.showPerspective) { - lineWidth = 2 / -point.trans.z; - } - else { - lineWidth = 2 * -(this.eye.z / this.camera.getArmLength()); - } - } + // reposition the panels + dom.background.style.left = '0'; + dom.background.style.top = '0'; + dom.backgroundVertical.style.left = props.left.width + 'px'; + dom.backgroundVertical.style.top = '0'; + dom.backgroundHorizontalContainer.style.left = '0'; + dom.backgroundHorizontalContainer.style.top = props.top.height + 'px'; + dom.centerContainer.style.left = props.left.width + 'px'; + dom.centerContainer.style.top = props.top.height + 'px'; + dom.leftContainer.style.left = '0'; + dom.leftContainer.style.top = props.top.height + 'px'; + dom.rightContainer.style.left = (props.left.width + props.center.width) + 'px'; + dom.rightContainer.style.top = props.top.height + 'px'; + dom.top.style.left = props.left.width + 'px'; + dom.top.style.top = '0'; + dom.bottom.style.left = props.left.width + 'px'; + dom.bottom.style.top = (props.top.height + props.centerContainer.height) + 'px'; - if (point !== undefined && right !== undefined) { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - zAvg = (point.point.z + right.point.z) / 2; - h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + // update the scrollTop, feasible range for the offset can be changed + // when the height of the Graph2d or of the contents of the center changed + this._updateScrollTop(); - ctx.lineWidth = lineWidth; - ctx.strokeStyle = this._hsv2rgb(h, 1, 1); - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); - ctx.lineTo(right.screen.x, right.screen.y); - ctx.stroke(); - } + // reposition the scrollable contents + var offset = this.props.scrollTop; + if (options.orientation == 'bottom') { + offset += Math.max(this.props.centerContainer.height - this.props.center.height - + this.props.border.top - this.props.border.bottom, 0); + } + dom.center.style.left = '0'; + dom.center.style.top = offset + 'px'; + dom.backgroundHorizontal.style.left = '0'; + dom.backgroundHorizontal.style.top = offset + 'px'; + dom.left.style.left = '0'; + dom.left.style.top = offset + 'px'; + dom.right.style.left = '0'; + dom.right.style.top = offset + 'px'; - if (point !== undefined && top !== undefined) { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - zAvg = (point.point.z + top.point.z) / 2; - h = (1 - (zAvg - this.zMin) * this.scale.z / this.verticalRatio) * 240; + // show shadows when vertical scrolling is available + var visibilityTop = this.props.scrollTop == 0 ? 'hidden' : ''; + var visibilityBottom = this.props.scrollTop == this.props.scrollTopMin ? 'hidden' : ''; + dom.shadowTop.style.visibility = visibilityTop; + dom.shadowBottom.style.visibility = visibilityBottom; + dom.shadowTopLeft.style.visibility = visibilityTop; + dom.shadowBottomLeft.style.visibility = visibilityBottom; + dom.shadowTopRight.style.visibility = visibilityTop; + dom.shadowBottomRight.style.visibility = visibilityBottom; - ctx.lineWidth = lineWidth; - ctx.strokeStyle = this._hsv2rgb(h, 1, 1); - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); - ctx.lineTo(top.screen.x, top.screen.y); - ctx.stroke(); - } - } + // redraw all components + this.components.forEach(function (component) { + resized = component.redraw() || resized; + }); + if (resized) { + // keep redrawing until all sizes are settled + this.redraw(); } }; + /** + * Convert a position on screen (pixels) to a datetime + * @param {int} x Position on the screen in pixels + * @return {Date} time The datetime the corresponds with given position x + * @private + */ + // TODO: move this function to Range + Graph2d.prototype._toTime = function(x) { + var conversion = this.range.conversion(this.props.center.width); + return new Date(x / conversion.scale + conversion.offset); + }; /** - * Draw all datapoints as dots. - * This function can be used when the style is 'dot' or 'dot-line' + * Convert a datetime (Date object) into a position on the root + * This is used to get the pixel density estimate for the screen, not the center panel + * @param {Date} time A date + * @return {int} x The position on root in pixels which corresponds + * with the given date. + * @private */ - Graph3d.prototype._redrawDataDot = function() { - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - var i; + // TODO: move this function to Range + Graph2d.prototype._toGlobalTime = function(x) { + var conversion = this.range.conversion(this.props.root.width); + return new Date(x / conversion.scale + conversion.offset); + }; - if (this.dataPoints === undefined || this.dataPoints.length <= 0) - return; // TODO: throw exception? + /** + * Convert a datetime (Date object) into a position on the screen + * @param {Date} time A date + * @return {int} x The position on the screen in pixels which corresponds + * with the given date. + * @private + */ + // TODO: move this function to Range + Graph2d.prototype._toScreen = function(time) { + var conversion = this.range.conversion(this.props.center.width); + return (time.valueOf() - conversion.offset) * conversion.scale; + }; - // calculate the translations of all points - for (i = 0; i < this.dataPoints.length; i++) { - var trans = this._convertPointToTranslation(this.dataPoints[i].point); - var screen = this._convertTranslationToScreen(trans); - this.dataPoints[i].trans = trans; - this.dataPoints[i].screen = screen; - // calculate the distance from the point at the bottom to the camera - var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); - this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; - } + /** + * Convert a datetime (Date object) into a position on the root + * This is used to get the pixel density estimate for the screen, not the center panel + * @param {Date} time A date + * @return {int} x The position on root in pixels which corresponds + * with the given date. + * @private + */ + // TODO: move this function to Range + Graph2d.prototype._toGlobalScreen = function(time) { + var conversion = this.range.conversion(this.props.root.width); + return (time.valueOf() - conversion.offset) * conversion.scale; + }; - // order the translated points by depth - var sortDepth = function (a, b) { - return b.dist - a.dist; - }; - this.dataPoints.sort(sortDepth); + /** + * Initialize watching when option autoResize is true + * @private + */ + Graph2d.prototype._initAutoResize = function () { + if (this.options.autoResize == true) { + this._startAutoResize(); + } + else { + this._stopAutoResize(); + } + }; - // draw the datapoints as colored circles - var dotSize = this.frame.clientWidth * 0.02; // px - for (i = 0; i < this.dataPoints.length; i++) { - var point = this.dataPoints[i]; + /** + * Watch for changes in the size of the container. On resize, the Panel will + * automatically redraw itself. + * @private + */ + Graph2d.prototype._startAutoResize = function () { + var me = this; - if (this.style === Graph3d.STYLE.DOTLINE) { - // draw a vertical line from the bottom to the graph value - //var from = this._convert3Dto2D(new Point3d(point.point.x, point.point.y, this.zMin)); - var from = this._convert3Dto2D(point.bottom); - ctx.lineWidth = 1; - ctx.strokeStyle = this.colorGrid; - ctx.beginPath(); - ctx.moveTo(from.x, from.y); - ctx.lineTo(point.screen.x, point.screen.y); - ctx.stroke(); - } + this._stopAutoResize(); - // calculate radius for the circle - var size; - if (this.style === Graph3d.STYLE.DOTSIZE) { - size = dotSize/2 + 2*dotSize * (point.point.value - this.valueMin) / (this.valueMax - this.valueMin); - } - else { - size = dotSize; + this._onResize = function() { + if (me.options.autoResize != true) { + // stop watching when the option autoResize is changed to false + me._stopAutoResize(); + return; } - var radius; - if (this.showPerspective) { - radius = size / -point.trans.z; - } - else { - radius = size * -(this.eye.z / this.camera.getArmLength()); - } - if (radius < 0) { - radius = 0; - } + if (me.dom.root) { + // check whether the frame is resized + if ((me.dom.root.clientWidth != me.props.lastWidth) || + (me.dom.root.clientHeight != me.props.lastHeight)) { + me.props.lastWidth = me.dom.root.clientWidth; + me.props.lastHeight = me.dom.root.clientHeight; - var hue, color, borderColor; - if (this.style === Graph3d.STYLE.DOTCOLOR ) { - // calculate the color based on the value - hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; - color = this._hsv2rgb(hue, 1, 1); - borderColor = this._hsv2rgb(hue, 1, 0.8); - } - else if (this.style === Graph3d.STYLE.DOTSIZE) { - color = this.colorDot; - borderColor = this.colorDotBorder; - } - else { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; - color = this._hsv2rgb(hue, 1, 1); - borderColor = this._hsv2rgb(hue, 1, 0.8); + me.emit('change'); + } } + }; - // draw the circle - ctx.lineWidth = 1.0; - ctx.strokeStyle = borderColor; - ctx.fillStyle = color; - ctx.beginPath(); - ctx.arc(point.screen.x, point.screen.y, radius, 0, Math.PI*2, true); - ctx.fill(); - ctx.stroke(); - } + // add event listener to window resize + util.addEventListener(window, 'resize', this._onResize); + + this.watchTimer = setInterval(this._onResize, 1000); }; /** - * Draw all datapoints as bars. - * This function can be used when the style is 'bar', 'bar-color', or 'bar-size' + * Stop watching for a resize of the frame. + * @private */ - Graph3d.prototype._redrawDataBar = function() { - var canvas = this.frame.canvas; - var ctx = canvas.getContext('2d'); - var i, j, surface, corners; - - if (this.dataPoints === undefined || this.dataPoints.length <= 0) - return; // TODO: throw exception? - - // calculate the translations of all points - for (i = 0; i < this.dataPoints.length; i++) { - var trans = this._convertPointToTranslation(this.dataPoints[i].point); - var screen = this._convertTranslationToScreen(trans); - this.dataPoints[i].trans = trans; - this.dataPoints[i].screen = screen; - - // calculate the distance from the point at the bottom to the camera - var transBottom = this._convertPointToTranslation(this.dataPoints[i].bottom); - this.dataPoints[i].dist = this.showPerspective ? transBottom.length() : -transBottom.z; + Graph2d.prototype._stopAutoResize = function () { + if (this.watchTimer) { + clearInterval(this.watchTimer); + this.watchTimer = undefined; } - // order the translated points by depth - var sortDepth = function (a, b) { - return b.dist - a.dist; - }; - this.dataPoints.sort(sortDepth); + // remove event listener on window.resize + util.removeEventListener(window, 'resize', this._onResize); + this._onResize = null; + }; - // draw the datapoints as bars - var xWidth = this.xBarWidth / 2; - var yWidth = this.yBarWidth / 2; - for (i = 0; i < this.dataPoints.length; i++) { - var point = this.dataPoints[i]; + /** + * Start moving the timeline vertically + * @param {Event} event + * @private + */ + Graph2d.prototype._onTouch = function (event) { + this.touch.allowDragging = true; + }; - // determine color - var hue, color, borderColor; - if (this.style === Graph3d.STYLE.BARCOLOR ) { - // calculate the color based on the value - hue = (1 - (point.point.value - this.valueMin) * this.scale.value) * 240; - color = this._hsv2rgb(hue, 1, 1); - borderColor = this._hsv2rgb(hue, 1, 0.8); - } - else if (this.style === Graph3d.STYLE.BARSIZE) { - color = this.colorDot; - borderColor = this.colorDotBorder; - } - else { - // calculate Hue from the current value. At zMin the hue is 240, at zMax the hue is 0 - hue = (1 - (point.point.z - this.zMin) * this.scale.z / this.verticalRatio) * 240; - color = this._hsv2rgb(hue, 1, 1); - borderColor = this._hsv2rgb(hue, 1, 0.8); - } + /** + * Start moving the timeline vertically + * @param {Event} event + * @private + */ + Graph2d.prototype._onPinch = function (event) { + this.touch.allowDragging = false; + }; - // calculate size for the bar - if (this.style === Graph3d.STYLE.BARSIZE) { - xWidth = (this.xBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); - yWidth = (this.yBarWidth / 2) * ((point.point.value - this.valueMin) / (this.valueMax - this.valueMin) * 0.8 + 0.2); - } + /** + * Start moving the timeline vertically + * @param {Event} event + * @private + */ + Graph2d.prototype._onDragStart = function (event) { + this.touch.initialScrollTop = this.props.scrollTop; + }; - // calculate all corner points - var me = this; - var point3d = point.point; - var top = [ - {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, point3d.z)}, - {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, point3d.z)}, - {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, point3d.z)}, - {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, point3d.z)} - ]; - var bottom = [ - {point: new Point3d(point3d.x - xWidth, point3d.y - yWidth, this.zMin)}, - {point: new Point3d(point3d.x + xWidth, point3d.y - yWidth, this.zMin)}, - {point: new Point3d(point3d.x + xWidth, point3d.y + yWidth, this.zMin)}, - {point: new Point3d(point3d.x - xWidth, point3d.y + yWidth, this.zMin)} - ]; + /** + * Move the timeline vertically + * @param {Event} event + * @private + */ + Graph2d.prototype._onDrag = function (event) { + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.touch.allowDragging) return; - // calculate screen location of the points - top.forEach(function (obj) { - obj.screen = me._convert3Dto2D(obj.point); - }); - bottom.forEach(function (obj) { - obj.screen = me._convert3Dto2D(obj.point); - }); + var delta = event.gesture.deltaY; - // create five sides, calculate both corner points and center points - var surfaces = [ - {corners: top, center: Point3d.avg(bottom[0].point, bottom[2].point)}, - {corners: [top[0], top[1], bottom[1], bottom[0]], center: Point3d.avg(bottom[1].point, bottom[0].point)}, - {corners: [top[1], top[2], bottom[2], bottom[1]], center: Point3d.avg(bottom[2].point, bottom[1].point)}, - {corners: [top[2], top[3], bottom[3], bottom[2]], center: Point3d.avg(bottom[3].point, bottom[2].point)}, - {corners: [top[3], top[0], bottom[0], bottom[3]], center: Point3d.avg(bottom[0].point, bottom[3].point)} - ]; - point.surfaces = surfaces; + var oldScrollTop = this._getScrollTop(); + var newScrollTop = this._setScrollTop(this.touch.initialScrollTop + delta); - // calculate the distance of each of the surface centers to the camera - for (j = 0; j < surfaces.length; j++) { - surface = surfaces[j]; - var transCenter = this._convertPointToTranslation(surface.center); - surface.dist = this.showPerspective ? transCenter.length() : -transCenter.z; - // TODO: this dept calculation doesn't work 100% of the cases due to perspective, - // but the current solution is fast/simple and works in 99.9% of all cases - // the issue is visible in example 14, with graph.setCameraPosition({horizontal: 2.97, vertical: 0.5, distance: 0.9}) - } + if (newScrollTop != oldScrollTop) { + this.redraw(); // TODO: this causes two redraws when dragging, the other is triggered by rangechange already + } + }; - // order the surfaces by their (translated) depth - surfaces.sort(function (a, b) { - var diff = b.dist - a.dist; - if (diff) return diff; + /** + * Apply a scrollTop + * @param {Number} scrollTop + * @returns {Number} scrollTop Returns the applied scrollTop + * @private + */ + Graph2d.prototype._setScrollTop = function (scrollTop) { + this.props.scrollTop = scrollTop; + this._updateScrollTop(); + return this.props.scrollTop; + }; + + /** + * Update the current scrollTop when the height of the containers has been changed + * @returns {Number} scrollTop Returns the applied scrollTop + * @private + */ + Graph2d.prototype._updateScrollTop = function () { + // recalculate the scrollTopMin + var scrollTopMin = Math.min(this.props.centerContainer.height - this.props.center.height, 0); // is negative or zero + if (scrollTopMin != this.props.scrollTopMin) { + // in case of bottom orientation, change the scrollTop such that the contents + // do not move relative to the time axis at the bottom + if (this.options.orientation == 'bottom') { + this.props.scrollTop += (scrollTopMin - this.props.scrollTopMin); + } + this.props.scrollTopMin = scrollTopMin; + } - // if equal depth, sort the top surface last - if (a.corners === top) return 1; - if (b.corners === top) return -1; + // limit the scrollTop to the feasible scroll range + if (this.props.scrollTop > 0) this.props.scrollTop = 0; + if (this.props.scrollTop < scrollTopMin) this.props.scrollTop = scrollTopMin; - // both are equal - return 0; - }); + return this.props.scrollTop; + }; - // draw the ordered surfaces - ctx.lineWidth = 1; - ctx.strokeStyle = borderColor; - ctx.fillStyle = color; - // NOTE: we start at j=2 instead of j=0 as we don't need to draw the two surfaces at the backside - for (j = 2; j < surfaces.length; j++) { - surface = surfaces[j]; - corners = surface.corners; - ctx.beginPath(); - ctx.moveTo(corners[3].screen.x, corners[3].screen.y); - ctx.lineTo(corners[0].screen.x, corners[0].screen.y); - ctx.lineTo(corners[1].screen.x, corners[1].screen.y); - ctx.lineTo(corners[2].screen.x, corners[2].screen.y); - ctx.lineTo(corners[3].screen.x, corners[3].screen.y); - ctx.fill(); - ctx.stroke(); - } - } + /** + * Get the current scrollTop + * @returns {number} scrollTop + * @private + */ + Graph2d.prototype._getScrollTop = function () { + return this.props.scrollTop; }; + module.exports = Graph2d; + + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { /** - * Draw a line through all datapoints. - * This function can be used when the style is 'line' + * @constructor DataStep + * The class DataStep is an iterator for data for the lineGraph. You provide a start data point and an + * end data point. The class itself determines the best scale (step size) based on the + * provided start Date, end Date, and minimumStep. + * + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * + * Alternatively, you can set a scale by hand. + * After creation, you can initialize the class by executing first(). Then you + * can iterate from the start date to the end date via next(). You can check if + * the end date is reached with the function hasNext(). After each step, you can + * retrieve the current date via getCurrent(). + * The DataStep has scales ranging from milliseconds, seconds, minutes, hours, + * days, to years. + * + * Version: 1.2 + * + * @param {Date} [start] The start date, for example new Date(2010, 9, 21) + * or new Date(2010, 9, 21, 23, 45, 00) + * @param {Date} [end] The end date + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds */ - Graph3d.prototype._redrawDataLine = function() { - var canvas = this.frame.canvas, - ctx = canvas.getContext('2d'), - point, i; - - if (this.dataPoints === undefined || this.dataPoints.length <= 0) - return; // TODO: throw exception? + function DataStep(start, end, minimumStep, containerHeight, forcedStepSize) { + // variables + this.current = 0; - // calculate the translations of all points - for (i = 0; i < this.dataPoints.length; i++) { - var trans = this._convertPointToTranslation(this.dataPoints[i].point); - var screen = this._convertTranslationToScreen(trans); + this.autoScale = true; + this.stepIndex = 0; + this.step = 1; + this.scale = 1; - this.dataPoints[i].trans = trans; - this.dataPoints[i].screen = screen; - } + this.marginStart; + this.marginEnd; - // start the line - if (this.dataPoints.length > 0) { - point = this.dataPoints[0]; + this.majorSteps = [1, 2, 5, 10]; + this.minorSteps = [0.25, 0.5, 1, 2]; - ctx.lineWidth = 1; // TODO: make customizable - ctx.strokeStyle = 'blue'; // TODO: make customizable - ctx.beginPath(); - ctx.moveTo(point.screen.x, point.screen.y); - } + this.setRange(start, end, minimumStep, containerHeight, forcedStepSize); + } - // draw the datapoints as colored circles - for (i = 1; i < this.dataPoints.length; i++) { - point = this.dataPoints[i]; - ctx.lineTo(point.screen.x, point.screen.y); - } - // finish the line - if (this.dataPoints.length > 0) { - ctx.stroke(); - } - }; /** - * Start a moving operation inside the provided parent element - * @param {Event} event The event that occurred (required for - * retrieving the mouse position) + * Set a new range + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * @param {Number} [start] The start date and time. + * @param {Number} [end] The end date and time. + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds */ - Graph3d.prototype._onMouseDown = function(event) { - event = event || window.event; + DataStep.prototype.setRange = function(start, end, minimumStep, containerHeight, forcedStepSize) { + this._start = start; + this._end = end; - // check if mouse is still down (may be up when focus is lost for example - // in an iframe) - if (this.leftButtonDown) { - this._onMouseUp(event); + if (this.autoScale) { + this.setMinimumStep(minimumStep, containerHeight, forcedStepSize); } + this.setFirst(); + }; - // only react on left mouse button down - this.leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); - if (!this.leftButtonDown && !this.touchDown) return; - - // get mouse position (different code for IE and all other browsers) - this.startMouseX = getMouseX(event); - this.startMouseY = getMouseY(event); + /** + * Automatically determine the scale that bests fits the provided minimum step + * @param {Number} [minimumStep] The minimum step size in milliseconds + */ + DataStep.prototype.setMinimumStep = function(minimumStep, containerHeight) { + // round to floor + var size = this._end - this._start; + var safeSize = size * 1.1; + var minimumStepValue = minimumStep * (safeSize / containerHeight); + var orderOfMagnitude = Math.round(Math.log(safeSize)/Math.LN10); - this.startStart = new Date(this.start); - this.startEnd = new Date(this.end); - this.startArmRotation = this.camera.getArmRotation(); + var minorStepIdx = -1; + var magnitudefactor = Math.pow(10,orderOfMagnitude); - this.frame.style.cursor = 'move'; + var start = 0; + if (orderOfMagnitude < 0) { + start = orderOfMagnitude; + } - // add event listeners to handle moving the contents - // we store the function onmousemove and onmouseup in the graph, so we can - // remove the eventlisteners lateron in the function mouseUp() - var me = this; - this.onmousemove = function (event) {me._onMouseMove(event);}; - this.onmouseup = function (event) {me._onMouseUp(event);}; - G3DaddEventListener(document, 'mousemove', me.onmousemove); - G3DaddEventListener(document, 'mouseup', me.onmouseup); - G3DpreventDefault(event); + var solutionFound = false; + for (var i = start; Math.abs(i) <= Math.abs(orderOfMagnitude); i++) { + magnitudefactor = Math.pow(10,i); + for (var j = 0; j < this.minorSteps.length; j++) { + var stepSize = magnitudefactor * this.minorSteps[j]; + if (stepSize >= minimumStepValue) { + solutionFound = true; + minorStepIdx = j; + break; + } + } + if (solutionFound == true) { + break; + } + } + this.stepIndex = minorStepIdx; + this.scale = magnitudefactor; + this.step = magnitudefactor * this.minorSteps[minorStepIdx]; }; /** - * Perform moving operating. - * This function activated from within the funcion Graph.mouseDown(). - * @param {Event} event Well, eehh, the event + * Set the range iterator to the start date. */ - Graph3d.prototype._onMouseMove = function (event) { - event = event || window.event; + DataStep.prototype.first = function() { + this.setFirst(); + }; - // calculate change in mouse position - var diffX = parseFloat(getMouseX(event)) - this.startMouseX; - var diffY = parseFloat(getMouseY(event)) - this.startMouseY; + /** + * Round the current date to the first minor date value + * This must be executed once when the current date is set to start Date + */ + DataStep.prototype.setFirst = function() { + var niceStart = this._start - (this.scale * this.minorSteps[this.stepIndex]); + var niceEnd = this._end + (this.scale * this.minorSteps[this.stepIndex]); - var horizontalNew = this.startArmRotation.horizontal + diffX / 200; - var verticalNew = this.startArmRotation.vertical + diffY / 200; + this.marginEnd = this.roundToMinor(niceEnd); + this.marginStart = this.roundToMinor(niceStart); + this.marginRange = this.marginEnd - this.marginStart; - var snapAngle = 4; // degrees - var snapValue = Math.sin(snapAngle / 360 * 2 * Math.PI); + this.current = this.marginEnd; - // snap horizontally to nice angles at 0pi, 0.5pi, 1pi, 1.5pi, etc... - // the -0.001 is to take care that the vertical axis is always drawn at the left front corner - if (Math.abs(Math.sin(horizontalNew)) < snapValue) { - horizontalNew = Math.round((horizontalNew / Math.PI)) * Math.PI - 0.001; - } - if (Math.abs(Math.cos(horizontalNew)) < snapValue) { - horizontalNew = (Math.round((horizontalNew/ Math.PI - 0.5)) + 0.5) * Math.PI - 0.001; - } + }; - // snap vertically to nice angles - if (Math.abs(Math.sin(verticalNew)) < snapValue) { - verticalNew = Math.round((verticalNew / Math.PI)) * Math.PI; + DataStep.prototype.roundToMinor = function(value) { + var rounded = value - (value % (this.scale * this.minorSteps[this.stepIndex])); + if (value % (this.scale * this.minorSteps[this.stepIndex]) > 0.5 * (this.scale * this.minorSteps[this.stepIndex])) { + return rounded + (this.scale * this.minorSteps[this.stepIndex]); } - if (Math.abs(Math.cos(verticalNew)) < snapValue) { - verticalNew = (Math.round((verticalNew/ Math.PI - 0.5)) + 0.5) * Math.PI; + else { + return rounded; } + } - this.camera.setArmRotation(horizontalNew, verticalNew); - this.redraw(); - - // fire a cameraPositionChange event - var parameters = this.getCameraPosition(); - this.emit('cameraPositionChange', parameters); - G3DpreventDefault(event); + /** + * Check if the there is a next step + * @return {boolean} true if the current date has not passed the end date + */ + DataStep.prototype.hasNext = function () { + return (this.current >= this.marginStart); }; - /** - * Stop moving operating. - * This function activated from within the funcion Graph.mouseDown(). - * @param {event} event The event + * Do the next step */ - Graph3d.prototype._onMouseUp = function (event) { - this.frame.style.cursor = 'auto'; - this.leftButtonDown = false; + DataStep.prototype.next = function() { + var prev = this.current; + this.current -= this.step; - // remove event listeners here - G3DremoveEventListener(document, 'mousemove', this.onmousemove); - G3DremoveEventListener(document, 'mouseup', this.onmouseup); - G3DpreventDefault(event); + // safety mechanism: if current time is still unchanged, move to the end + if (this.current == prev) { + this.current = this._end; + } }; /** - * After having moved the mouse, a tooltip should pop up when the mouse is resting on a data point - * @param {Event} event A mouse move event + * Do the next step */ - Graph3d.prototype._onTooltip = function (event) { - var delay = 300; // ms - var mouseX = getMouseX(event) - getAbsoluteLeft(this.frame); - var mouseY = getMouseY(event) - getAbsoluteTop(this.frame); - - if (!this.showTooltip) { - return; - } + DataStep.prototype.previous = function() { + this.current += this.step; + this.marginEnd += this.step; + this.marginRange = this.marginEnd - this.marginStart; + }; - if (this.tooltipTimeout) { - clearTimeout(this.tooltipTimeout); - } - // (delayed) display of a tooltip only if no mouse button is down - if (this.leftButtonDown) { - this._hideTooltip(); - return; - } - if (this.tooltip && this.tooltip.dataPoint) { - // tooltip is currently visible - var dataPoint = this._dataPointFromXY(mouseX, mouseY); - if (dataPoint !== this.tooltip.dataPoint) { - // datapoint changed - if (dataPoint) { - this._showTooltip(dataPoint); - } - else { - this._hideTooltip(); - } + /** + * Get the current datetime + * @return {String} current The current date + */ + DataStep.prototype.getCurrent = function() { + var toPrecision = '' + Number(this.current).toPrecision(5); + for (var i = toPrecision.length-1; i > 0; i--) { + if (toPrecision[i] == "0") { + toPrecision = toPrecision.slice(0,i); + } + else if (toPrecision[i] == "." || toPrecision[i] == ",") { + toPrecision = toPrecision.slice(0,i); + break; + } + else{ + break; } } - else { - // tooltip is currently not visible - var me = this; - this.tooltipTimeout = setTimeout(function () { - me.tooltipTimeout = null; - // show a tooltip if we have a data point - var dataPoint = me._dataPointFromXY(mouseX, mouseY); - if (dataPoint) { - me._showTooltip(dataPoint); - } - }, delay); - } + return toPrecision; }; + + /** - * Event handler for touchstart event on mobile devices + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * @param {Date} date the date to be snapped. + * @return {Date} snappedDate */ - Graph3d.prototype._onTouchStart = function(event) { - this.touchDown = true; - - var me = this; - this.ontouchmove = function (event) {me._onTouchMove(event);}; - this.ontouchend = function (event) {me._onTouchEnd(event);}; - G3DaddEventListener(document, 'touchmove', me.ontouchmove); - G3DaddEventListener(document, 'touchend', me.ontouchend); + DataStep.prototype.snap = function(date) { - this._onMouseDown(event); }; /** - * Event handler for touchmove event on mobile devices + * Check if the current value is a major value (for example when the step + * is DAY, a major value is each first day of the MONTH) + * @return {boolean} true if current date is major, else false. */ - Graph3d.prototype._onTouchMove = function(event) { - this._onMouseMove(event); + DataStep.prototype.isMajor = function() { + return (this.current % (this.scale * this.majorSteps[this.stepIndex]) == 0); }; - /** - * Event handler for touchend event on mobile devices - */ - Graph3d.prototype._onTouchEnd = function(event) { - this.touchDown = false; + module.exports = DataStep; - G3DremoveEventListener(document, 'touchmove', this.ontouchmove); - G3DremoveEventListener(document, 'touchend', this.ontouchend); - this._onMouseUp(event); - }; +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + var util = __webpack_require__(1); + var moment = __webpack_require__(39); + var Component = __webpack_require__(12); /** - * Event handler for mouse wheel event, used to zoom the graph - * Code from http://adomas.org/javascript-mouse-wheel/ - * @param {event} event The event + * @constructor Range + * A Range controls a numeric range with a start and end value. + * The Range adjusts the range based on mouse events or programmatic changes, + * and triggers events when the range is changing or has been changed. + * @param {{dom: Object, domProps: Object, emitter: Emitter}} body + * @param {Object} [options] See description at Range.setOptions */ - Graph3d.prototype._onWheel = function(event) { - if (!event) /* For IE. */ - event = window.event; + function Range(body, options) { + var now = moment().hours(0).minutes(0).seconds(0).milliseconds(0); + this.start = now.clone().add('days', -3).valueOf(); // Number + this.end = now.clone().add('days', 4).valueOf(); // Number - // retrieve delta - var delta = 0; - if (event.wheelDelta) { /* IE/Opera. */ - delta = event.wheelDelta/120; - } else if (event.detail) { /* Mozilla case. */ - // In Mozilla, sign of delta is different than in IE. - // Also, delta is multiple of 3. - delta = -event.detail/3; - } + this.body = body; - // If delta is nonzero, handle it. - // Basically, delta is now positive if wheel was scrolled up, - // and negative, if wheel was scrolled down. - if (delta) { - var oldLength = this.camera.getArmLength(); - var newLength = oldLength * (1 - delta / 10); + // default options + this.defaultOptions = { + start: null, + end: null, + direction: 'horizontal', // 'horizontal' or 'vertical' + moveable: true, + zoomable: true, + min: null, + max: null, + zoomMin: 10, // milliseconds + zoomMax: 1000 * 60 * 60 * 24 * 365 * 10000 // milliseconds + }; + this.options = util.extend({}, this.defaultOptions); - this.camera.setArmLength(newLength); - this.redraw(); + this.props = { + touch: {} + }; - this._hideTooltip(); - } + // drag listeners for dragging + this.body.emitter.on('dragstart', this._onDragStart.bind(this)); + this.body.emitter.on('drag', this._onDrag.bind(this)); + this.body.emitter.on('dragend', this._onDragEnd.bind(this)); - // fire a cameraPositionChange event - var parameters = this.getCameraPosition(); - this.emit('cameraPositionChange', parameters); + // ignore dragging when holding + this.body.emitter.on('hold', this._onHold.bind(this)); - // Prevent default actions caused by mouse wheel. - // That might be ugly, but we handle scrolls somehow - // anyway, so don't bother here.. - G3DpreventDefault(event); + // mouse wheel for zooming + this.body.emitter.on('mousewheel', this._onMouseWheel.bind(this)); + this.body.emitter.on('DOMMouseScroll', this._onMouseWheel.bind(this)); // For FF + + // pinch to zoom + this.body.emitter.on('touch', this._onTouch.bind(this)); + this.body.emitter.on('pinch', this._onPinch.bind(this)); + + this.setOptions(options); + } + + Range.prototype = new Component(); + + /** + * Set options for the range controller + * @param {Object} options Available options: + * {Number | Date | String} start Start date for the range + * {Number | Date | String} end End date for the range + * {Number} min Minimum value for start + * {Number} max Maximum value for end + * {Number} zoomMin Set a minimum value for + * (end - start). + * {Number} zoomMax Set a maximum value for + * (end - start). + * {Boolean} moveable Enable moving of the range + * by dragging. True by default + * {Boolean} zoomable Enable zooming of the range + * by pinching/scrolling. True by default + */ + Range.prototype.setOptions = function (options) { + if (options) { + // copy the options that we know + var fields = ['direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable']; + util.selectiveExtend(fields, this.options, options); + + if ('start' in options || 'end' in options) { + // apply a new range. both start and end are optional + this.setRange(options.start, options.end); + } + } }; /** - * Test whether a point lies inside given 2D triangle - * @param {Point2d} point - * @param {Point2d[]} triangle - * @return {boolean} Returns true if given point lies inside or on the edge of the triangle - * @private + * Test whether direction has a valid value + * @param {String} direction 'horizontal' or 'vertical' */ - Graph3d.prototype._insideTriangle = function (point, triangle) { - var a = triangle[0], - b = triangle[1], - c = triangle[2]; + function validateDirection (direction) { + if (direction != 'horizontal' && direction != 'vertical') { + throw new TypeError('Unknown direction "' + direction + '". ' + + 'Choose "horizontal" or "vertical".'); + } + } - function sign (x) { - return x > 0 ? 1 : x < 0 ? -1 : 0; + /** + * Set a new start and end range + * @param {Number} [start] + * @param {Number} [end] + */ + Range.prototype.setRange = function(start, end) { + var changed = this._applyRange(start, end); + if (changed) { + var params = { + start: new Date(this.start), + end: new Date(this.end) + }; + this.body.emitter.emit('rangechange', params); + this.body.emitter.emit('rangechanged', params); } - - var as = sign((b.x - a.x) * (point.y - a.y) - (b.y - a.y) * (point.x - a.x)); - var bs = sign((c.x - b.x) * (point.y - b.y) - (c.y - b.y) * (point.x - b.x)); - var cs = sign((a.x - c.x) * (point.y - c.y) - (a.y - c.y) * (point.x - c.x)); - - // each of the three signs must be either equal to each other or zero - return (as == 0 || bs == 0 || as == bs) && - (bs == 0 || cs == 0 || bs == cs) && - (as == 0 || cs == 0 || as == cs); }; /** - * Find a data point close to given screen position (x, y) - * @param {Number} x - * @param {Number} y - * @return {Object | null} The closest data point or null if not close to any data point + * Set a new start and end range. This method is the same as setRange, but + * does not trigger a range change and range changed event, and it returns + * true when the range is changed + * @param {Number} [start] + * @param {Number} [end] + * @return {Boolean} changed * @private */ - Graph3d.prototype._dataPointFromXY = function (x, y) { - var i, - distMax = 100, // px - dataPoint = null, - closestDataPoint = null, - closestDist = null, - center = new Point2d(x, y); + Range.prototype._applyRange = function(start, end) { + var newStart = (start != null) ? util.convert(start, 'Date').valueOf() : this.start, + newEnd = (end != null) ? util.convert(end, 'Date').valueOf() : this.end, + max = (this.options.max != null) ? util.convert(this.options.max, 'Date').valueOf() : null, + min = (this.options.min != null) ? util.convert(this.options.min, 'Date').valueOf() : null, + diff; - if (this.style === Graph3d.STYLE.BAR || - this.style === Graph3d.STYLE.BARCOLOR || - this.style === Graph3d.STYLE.BARSIZE) { - // the data points are ordered from far away to closest - for (i = this.dataPoints.length - 1; i >= 0; i--) { - dataPoint = this.dataPoints[i]; - var surfaces = dataPoint.surfaces; - if (surfaces) { - for (var s = surfaces.length - 1; s >= 0; s--) { - // split each surface in two triangles, and see if the center point is inside one of these - var surface = surfaces[s]; - var corners = surface.corners; - var triangle1 = [corners[0].screen, corners[1].screen, corners[2].screen]; - var triangle2 = [corners[2].screen, corners[3].screen, corners[0].screen]; - if (this._insideTriangle(center, triangle1) || - this._insideTriangle(center, triangle2)) { - // return immediately at the first hit - return dataPoint; - } + // check for valid number + if (isNaN(newStart) || newStart === null) { + throw new Error('Invalid start "' + start + '"'); + } + if (isNaN(newEnd) || newEnd === null) { + throw new Error('Invalid end "' + end + '"'); + } + + // prevent start < end + if (newEnd < newStart) { + newEnd = newStart; + } + + // prevent start < min + if (min !== null) { + if (newStart < min) { + diff = (min - newStart); + newStart += diff; + newEnd += diff; + + // prevent end > max + if (max != null) { + if (newEnd > max) { + newEnd = max; } } } } - else { - // find the closest data point, using distance to the center of the point on 2d screen - for (i = 0; i < this.dataPoints.length; i++) { - dataPoint = this.dataPoints[i]; - var point = dataPoint.screen; - if (point) { - var distX = Math.abs(x - point.x); - var distY = Math.abs(y - point.y); - var dist = Math.sqrt(distX * distX + distY * distY); - if ((closestDist === null || dist < closestDist) && dist < distMax) { - closestDist = dist; - closestDataPoint = dataPoint; + // prevent end > max + if (max !== null) { + if (newEnd > max) { + diff = (newEnd - max); + newStart -= diff; + newEnd -= diff; + + // prevent start < min + if (min != null) { + if (newStart < min) { + newStart = min; } } } } - - return closestDataPoint; - }; - - /** - * Display a tooltip for given data point - * @param {Object} dataPoint - * @private - */ - Graph3d.prototype._showTooltip = function (dataPoint) { - var content, line, dot; - - if (!this.tooltip) { - content = document.createElement('div'); - content.style.position = 'absolute'; - content.style.padding = '10px'; - content.style.border = '1px solid #4d4d4d'; - content.style.color = '#1a1a1a'; - content.style.background = 'rgba(255,255,255,0.7)'; - content.style.borderRadius = '2px'; - content.style.boxShadow = '5px 5px 10px rgba(128,128,128,0.5)'; - - line = document.createElement('div'); - line.style.position = 'absolute'; - line.style.height = '40px'; - line.style.width = '0'; - line.style.borderLeft = '1px solid #4d4d4d'; - - dot = document.createElement('div'); - dot.style.position = 'absolute'; - dot.style.height = '0'; - dot.style.width = '0'; - dot.style.border = '5px solid #4d4d4d'; - dot.style.borderRadius = '5px'; - - this.tooltip = { - dataPoint: null, - dom: { - content: content, - line: line, - dot: dot + // prevent (end-start) < zoomMin + if (this.options.zoomMin !== null) { + var zoomMin = parseFloat(this.options.zoomMin); + if (zoomMin < 0) { + zoomMin = 0; + } + if ((newEnd - newStart) < zoomMin) { + if ((this.end - this.start) === zoomMin) { + // ignore this action, we are already zoomed to the minimum + newStart = this.start; + newEnd = this.end; } - }; + else { + // zoom to the minimum + diff = (zoomMin - (newEnd - newStart)); + newStart -= diff / 2; + newEnd += diff / 2; + } + } } - else { - content = this.tooltip.dom.content; - line = this.tooltip.dom.line; - dot = this.tooltip.dom.dot; + + // prevent (end-start) > zoomMax + if (this.options.zoomMax !== null) { + var zoomMax = parseFloat(this.options.zoomMax); + if (zoomMax < 0) { + zoomMax = 0; + } + if ((newEnd - newStart) > zoomMax) { + if ((this.end - this.start) === zoomMax) { + // ignore this action, we are already zoomed to the maximum + newStart = this.start; + newEnd = this.end; + } + else { + // zoom to the maximum + diff = ((newEnd - newStart) - zoomMax); + newStart += diff / 2; + newEnd -= diff / 2; + } + } } - this._hideTooltip(); + var changed = (this.start != newStart || this.end != newEnd); - this.tooltip.dataPoint = dataPoint; - if (typeof this.showTooltip === 'function') { - content.innerHTML = this.showTooltip(dataPoint.point); - } - else { - content.innerHTML = '' + - '' + - '' + - '' + - '
x:' + dataPoint.point.x + '
y:' + dataPoint.point.y + '
z:' + dataPoint.point.z + '
'; - } + this.start = newStart; + this.end = newEnd; - content.style.left = '0'; - content.style.top = '0'; - this.frame.appendChild(content); - this.frame.appendChild(line); - this.frame.appendChild(dot); + return changed; + }; - // calculate sizes - var contentWidth = content.offsetWidth; - var contentHeight = content.offsetHeight; - var lineHeight = line.offsetHeight; - var dotWidth = dot.offsetWidth; - var dotHeight = dot.offsetHeight; + /** + * Retrieve the current range. + * @return {Object} An object with start and end properties + */ + Range.prototype.getRange = function() { + return { + start: this.start, + end: this.end + }; + }; - var left = dataPoint.screen.x - contentWidth / 2; - left = Math.min(Math.max(left, 10), this.frame.clientWidth - 10 - contentWidth); + /** + * Calculate the conversion offset and scale for current range, based on + * the provided width + * @param {Number} width + * @returns {{offset: number, scale: number}} conversion + */ + Range.prototype.conversion = function (width) { + return Range.conversion(this.start, this.end, width); + }; - line.style.left = dataPoint.screen.x + 'px'; - line.style.top = (dataPoint.screen.y - lineHeight) + 'px'; - content.style.left = left + 'px'; - content.style.top = (dataPoint.screen.y - lineHeight - contentHeight) + 'px'; - dot.style.left = (dataPoint.screen.x - dotWidth / 2) + 'px'; - dot.style.top = (dataPoint.screen.y - dotHeight / 2) + 'px'; + /** + * Static method to calculate the conversion offset and scale for a range, + * based on the provided start, end, and width + * @param {Number} start + * @param {Number} end + * @param {Number} width + * @returns {{offset: number, scale: number}} conversion + */ + Range.conversion = function (start, end, width) { + if (width != 0 && (end - start != 0)) { + return { + offset: start, + scale: width / (end - start) + } + } + else { + return { + offset: 0, + scale: 1 + }; + } }; /** - * Hide the tooltip when displayed + * Start dragging horizontally or vertically + * @param {Event} event * @private */ - Graph3d.prototype._hideTooltip = function () { - if (this.tooltip) { - this.tooltip.dataPoint = null; + Range.prototype._onDragStart = function(event) { + // only allow dragging when configured as movable + if (!this.options.moveable) return; - for (var prop in this.tooltip.dom) { - if (this.tooltip.dom.hasOwnProperty(prop)) { - var elem = this.tooltip.dom[prop]; - if (elem && elem.parentNode) { - elem.parentNode.removeChild(elem); - } - } - } + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.props.touch.allowDragging) return; + + this.props.touch.start = this.start; + this.props.touch.end = this.end; + + if (this.body.dom.root) { + this.body.dom.root.style.cursor = 'move'; } }; + /** + * Perform dragging operation + * @param {Event} event + * @private + */ + Range.prototype._onDrag = function (event) { + // only allow dragging when configured as movable + if (!this.options.moveable) return; + var direction = this.options.direction; + validateDirection(direction); + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.props.touch.allowDragging) return; + var delta = (direction == 'horizontal') ? event.gesture.deltaX : event.gesture.deltaY, + interval = (this.props.touch.end - this.props.touch.start), + width = (direction == 'horizontal') ? this.body.domProps.center.width : this.body.domProps.center.height, + diffRange = -delta / width * interval; + this._applyRange(this.props.touch.start + diffRange, this.props.touch.end + diffRange); + this.body.emitter.emit('rangechange', { + start: new Date(this.start), + end: new Date(this.end) + }); + }; /** - * Add and event listener. Works for all browsers - * @param {Element} element An html element - * @param {string} action The action, for example 'click', - * without the prefix 'on' - * @param {function} listener The callback function to be executed - * @param {boolean} useCapture + * Stop dragging operation + * @param {event} event + * @private */ - G3DaddEventListener = function(element, action, listener, useCapture) { - if (element.addEventListener) { - if (useCapture === undefined) - useCapture = false; + Range.prototype._onDragEnd = function (event) { + // only allow dragging when configured as movable + if (!this.options.moveable) return; - if (action === 'mousewheel' && navigator.userAgent.indexOf('Firefox') >= 0) { - action = 'DOMMouseScroll'; // For Firefox - } + // refuse to drag when we where pinching to prevent the timeline make a jump + // when releasing the fingers in opposite order from the touch screen + if (!this.props.touch.allowDragging) return; - element.addEventListener(action, listener, useCapture); - } else { - element.attachEvent('on' + action, listener); // IE browsers + if (this.body.dom.root) { + this.body.dom.root.style.cursor = 'auto'; } + + // fire a rangechanged event + this.body.emitter.emit('rangechanged', { + start: new Date(this.start), + end: new Date(this.end) + }); }; /** - * Remove an event listener from an element - * @param {Element} element An html dom element - * @param {string} action The name of the event, for example 'mousedown' - * @param {function} listener The listener function - * @param {boolean} useCapture + * Event handler for mouse wheel event, used to zoom + * Code from http://adomas.org/javascript-mouse-wheel/ + * @param {Event} event + * @private */ - G3DremoveEventListener = function(element, action, listener, useCapture) { - if (element.removeEventListener) { - // non-IE browsers - if (useCapture === undefined) - useCapture = false; + Range.prototype._onMouseWheel = function(event) { + // only allow zooming when configured as zoomable and moveable + if (!(this.options.zoomable && this.options.moveable)) return; - if (action === 'mousewheel' && navigator.userAgent.indexOf('Firefox') >= 0) { - action = 'DOMMouseScroll'; // For Firefox + // retrieve delta + var delta = 0; + if (event.wheelDelta) { /* IE/Opera. */ + delta = event.wheelDelta / 120; + } else if (event.detail) { /* Mozilla case. */ + // In Mozilla, sign of delta is different than in IE. + // Also, delta is multiple of 3. + delta = -event.detail / 3; + } + + // If delta is nonzero, handle it. + // Basically, delta is now positive if wheel was scrolled up, + // and negative, if wheel was scrolled down. + if (delta) { + // perform the zoom action. Delta is normally 1 or -1 + + // adjust a negative delta such that zooming in with delta 0.1 + // equals zooming out with a delta -0.1 + var scale; + if (delta < 0) { + scale = 1 - (delta / 5); + } + else { + scale = 1 / (1 + (delta / 5)) ; } - element.removeEventListener(action, listener, useCapture); - } else { - // IE browsers - element.detachEvent('on' + action, listener); + // calculate center, the date to zoom around + var gesture = util.fakeGesture(this, event), + pointer = getPointer(gesture.center, this.body.dom.center), + pointerDate = this._pointerToDate(pointer); + + this.zoom(scale, pointerDate); } + + // Prevent default actions caused by mouse wheel + // (else the page and timeline both zoom and scroll) + event.preventDefault(); }; /** - * Stop event propagation + * Start of a touch gesture + * @private */ - G3DstopPropagation = function(event) { - if (!event) - event = window.event; - - if (event.stopPropagation) { - event.stopPropagation(); // non-IE browsers - } - else { - event.cancelBubble = true; // IE browsers - } + Range.prototype._onTouch = function (event) { + this.props.touch.start = this.start; + this.props.touch.end = this.end; + this.props.touch.allowDragging = true; + this.props.touch.center = null; }; - /** - * Cancels the event if it is cancelable, without stopping further propagation of the event. + * On start of a hold gesture + * @private */ - G3DpreventDefault = function (event) { - if (!event) - event = window.event; - - if (event.preventDefault) { - event.preventDefault(); // non-IE browsers - } - else { - event.returnValue = false; // IE browsers - } + Range.prototype._onHold = function () { + this.props.touch.allowDragging = false; }; /** - * @constructor Slider - * - * An html slider control with start/stop/prev/next buttons - * @param {Element} container The element where the slider will be created - * @param {Object} options Available options: - * {boolean} visible If true (default) the - * slider is visible. + * Handle pinch event + * @param {Event} event + * @private */ - function Slider(container, options) { - if (container === undefined) { - throw 'Error: No container element defined'; - } - this.container = container; - this.visible = (options && options.visible != undefined) ? options.visible : true; - - if (this.visible) { - this.frame = document.createElement('DIV'); - //this.frame.style.backgroundColor = '#E5E5E5'; - this.frame.style.width = '100%'; - this.frame.style.position = 'relative'; - this.container.appendChild(this.frame); - - this.frame.prev = document.createElement('INPUT'); - this.frame.prev.type = 'BUTTON'; - this.frame.prev.value = 'Prev'; - this.frame.appendChild(this.frame.prev); + Range.prototype._onPinch = function (event) { + // only allow zooming when configured as zoomable and moveable + if (!(this.options.zoomable && this.options.moveable)) return; - this.frame.play = document.createElement('INPUT'); - this.frame.play.type = 'BUTTON'; - this.frame.play.value = 'Play'; - this.frame.appendChild(this.frame.play); + this.props.touch.allowDragging = false; - this.frame.next = document.createElement('INPUT'); - this.frame.next.type = 'BUTTON'; - this.frame.next.value = 'Next'; - this.frame.appendChild(this.frame.next); + if (event.gesture.touches.length > 1) { + if (!this.props.touch.center) { + this.props.touch.center = getPointer(event.gesture.center, this.body.dom.center); + } - this.frame.bar = document.createElement('INPUT'); - this.frame.bar.type = 'BUTTON'; - this.frame.bar.style.position = 'absolute'; - this.frame.bar.style.border = '1px solid red'; - this.frame.bar.style.width = '100px'; - this.frame.bar.style.height = '6px'; - this.frame.bar.style.borderRadius = '2px'; - this.frame.bar.style.MozBorderRadius = '2px'; - this.frame.bar.style.border = '1px solid #7F7F7F'; - this.frame.bar.style.backgroundColor = '#E5E5E5'; - this.frame.appendChild(this.frame.bar); + var scale = 1 / event.gesture.scale, + initDate = this._pointerToDate(this.props.touch.center); - this.frame.slide = document.createElement('INPUT'); - this.frame.slide.type = 'BUTTON'; - this.frame.slide.style.margin = '0px'; - this.frame.slide.value = ' '; - this.frame.slide.style.position = 'relative'; - this.frame.slide.style.left = '-100px'; - this.frame.appendChild(this.frame.slide); + // calculate new start and end + var newStart = parseInt(initDate + (this.props.touch.start - initDate) * scale); + var newEnd = parseInt(initDate + (this.props.touch.end - initDate) * scale); - // create events - var me = this; - this.frame.slide.onmousedown = function (event) {me._onMouseDown(event);}; - this.frame.prev.onclick = function (event) {me.prev(event);}; - this.frame.play.onclick = function (event) {me.togglePlay(event);}; - this.frame.next.onclick = function (event) {me.next(event);}; + // apply new range + this.setRange(newStart, newEnd); } + }; - this.onChangeCallback = undefined; + /** + * Helper function to calculate the center date for zooming + * @param {{x: Number, y: Number}} pointer + * @return {number} date + * @private + */ + Range.prototype._pointerToDate = function (pointer) { + var conversion; + var direction = this.options.direction; - this.values = []; - this.index = undefined; + validateDirection(direction); - this.playTimeout = undefined; - this.playInterval = 1000; // milliseconds - this.playLoop = true; + if (direction == 'horizontal') { + var width = this.body.domProps.center.width; + conversion = this.conversion(width); + return pointer.x / conversion.scale + conversion.offset; + } + else { + var height = this.body.domProps.center.height; + conversion = this.conversion(height); + return pointer.y / conversion.scale + conversion.offset; + } + }; + + /** + * Get the pointer location relative to the location of the dom element + * @param {{pageX: Number, pageY: Number}} touch + * @param {Element} element HTML DOM element + * @return {{x: Number, y: Number}} pointer + * @private + */ + function getPointer (touch, element) { + return { + x: touch.pageX - util.getAbsoluteLeft(element), + y: touch.pageY - util.getAbsoluteTop(element) + }; } /** - * Select the previous index + * Zoom the range the given scale in or out. Start and end date will + * be adjusted, and the timeline will be redrawn. You can optionally give a + * date around which to zoom. + * For example, try scale = 0.9 or 1.1 + * @param {Number} scale Scaling factor. Values above 1 will zoom out, + * values below 1 will zoom in. + * @param {Number} [center] Value representing a date around which will + * be zoomed. */ - Slider.prototype.prev = function() { - var index = this.getIndex(); - if (index > 0) { - index--; - this.setIndex(index); + Range.prototype.zoom = function(scale, center) { + // if centerDate is not provided, take it half between start Date and end Date + if (center == null) { + center = (this.start + this.end) / 2; } + + // calculate new start and end + var newStart = center + (this.start - center) * scale; + var newEnd = center + (this.end - center) * scale; + + this.setRange(newStart, newEnd); }; /** - * Select the next index + * Move the range with a given delta to the left or right. Start and end + * value will be adjusted. For example, try delta = 0.1 or -0.1 + * @param {Number} delta Moving amount. Positive value will move right, + * negative value will move left */ - Slider.prototype.next = function() { - var index = this.getIndex(); - if (index < this.values.length - 1) { - index++; - this.setIndex(index); - } + Range.prototype.move = function(delta) { + // zoom start Date and end Date relative to the centerDate + var diff = (this.end - this.start); + + // apply new values + var newStart = this.start + diff * delta; + var newEnd = this.end + diff * delta; + + // TODO: reckon with min and max range + + this.start = newStart; + this.end = newEnd; }; /** - * Select the next index + * Move the range to a new center point + * @param {Number} moveTo New center point of the range */ - Slider.prototype.playNext = function() { - var start = new Date(); + Range.prototype.moveTo = function(moveTo) { + var center = (this.start + this.end) / 2; - var index = this.getIndex(); - if (index < this.values.length - 1) { - index++; - this.setIndex(index); - } - else if (this.playLoop) { - // jump to the start - index = 0; - this.setIndex(index); - } + var diff = center - moveTo; - var end = new Date(); - var diff = (end - start); + // calculate new start and end + var newStart = this.start - diff; + var newEnd = this.end - diff; - // calculate how much time it to to set the index and to execute the callback - // function. - var interval = Math.max(this.playInterval - diff, 0); - // document.title = diff // TODO: cleanup + this.setRange(newStart, newEnd); + }; - var me = this; - this.playTimeout = setTimeout(function() {me.playNext();}, interval); + module.exports = Range; + + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + // Utility functions for ordering and stacking of items + var EPSILON = 0.001; // used when checking collisions, to prevent round-off errors + + /** + * Order items by their start data + * @param {Item[]} items + */ + exports.orderByStart = function(items) { + items.sort(function (a, b) { + return a.data.start - b.data.start; + }); }; /** - * Toggle start or stop playing + * Order items by their end date. If they have no end date, their start date + * is used. + * @param {Item[]} items */ - Slider.prototype.togglePlay = function() { - if (this.playTimeout === undefined) { - this.play(); - } else { - this.stop(); - } + exports.orderByEnd = function(items) { + items.sort(function (a, b) { + var aTime = ('end' in a.data) ? a.data.end : a.data.start, + bTime = ('end' in b.data) ? b.data.end : b.data.start; + + return aTime - bTime; + }); }; /** - * Start playing + * Adjust vertical positions of the items such that they don't overlap each + * other. + * @param {Item[]} items + * All visible items + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * Margins between items and between items and the axis. + * @param {boolean} [force=false] + * If true, all items will be repositioned. If false (default), only + * items having a top===null will be re-stacked */ - Slider.prototype.play = function() { - // Test whether already playing - if (this.playTimeout) return; + exports.stack = function(items, margin, force) { + var i, iMax; - this.playNext(); + if (force) { + // reset top position of all items + for (i = 0, iMax = items.length; i < iMax; i++) { + items[i].top = null; + } + } - if (this.frame) { - this.frame.play.value = 'Stop'; + // calculate new, non-overlapping positions + for (i = 0, iMax = items.length; i < iMax; i++) { + var item = items[i]; + if (item.top === null) { + // initialize top position + item.top = margin.axis; + + do { + // TODO: optimize checking for overlap. when there is a gap without items, + // you only need to check for items from the next item on, not from zero + var collidingItem = null; + for (var j = 0, jj = items.length; j < jj; j++) { + var other = items[j]; + if (other.top !== null && other !== item && exports.collision(item, other, margin.item)) { + collidingItem = other; + break; + } + } + + if (collidingItem != null) { + // There is a collision. Reposition the items above the colliding element + item.top = collidingItem.top + collidingItem.height + margin.item.vertical; + } + } while (collidingItem); + } } }; /** - * Stop playing + * Adjust vertical positions of the items without stacking them + * @param {Item[]} items + * All visible items + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin + * Margins between items and between items and the axis. */ - Slider.prototype.stop = function() { - clearInterval(this.playTimeout); - this.playTimeout = undefined; + exports.nostack = function(items, margin) { + var i, iMax; - if (this.frame) { - this.frame.play.value = 'Play'; + // reset top position of all items + for (i = 0, iMax = items.length; i < iMax; i++) { + items[i].top = margin.axis; } }; /** - * Set a callback function which will be triggered when the value of the - * slider bar has changed. + * Test if the two provided items collide + * The items must have parameters left, width, top, and height. + * @param {Item} a The first item + * @param {Item} b The second item + * @param {{horizontal: number, vertical: number}} margin + * An object containing a horizontal and vertical + * minimum required margin. + * @return {boolean} true if a and b collide, else false */ - Slider.prototype.setOnChangeCallback = function(callback) { - this.onChangeCallback = callback; + exports.collision = function(a, b, margin) { + return ((a.left - margin.horizontal + EPSILON) < (b.left + b.width) && + (a.left + a.width + margin.horizontal - EPSILON) > b.left && + (a.top - margin.vertical + EPSILON) < (b.top + b.height) && + (a.top + a.height + margin.vertical - EPSILON) > b.top); }; + +/***/ }, +/* 11 */ +/***/ function(module, exports, __webpack_require__) { + + var moment = __webpack_require__(39); + /** - * Set the interval for playing the list - * @param {Number} interval The interval in milliseconds + * @constructor TimeStep + * The class TimeStep is an iterator for dates. You provide a start date and an + * end date. The class itself determines the best scale (step size) based on the + * provided start Date, end Date, and minimumStep. + * + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * + * Alternatively, you can set a scale by hand. + * After creation, you can initialize the class by executing first(). Then you + * can iterate from the start date to the end date via next(). You can check if + * the end date is reached with the function hasNext(). After each step, you can + * retrieve the current date via getCurrent(). + * The TimeStep has scales ranging from milliseconds, seconds, minutes, hours, + * days, to years. + * + * Version: 1.2 + * + * @param {Date} [start] The start date, for example new Date(2010, 9, 21) + * or new Date(2010, 9, 21, 23, 45, 00) + * @param {Date} [end] The end date + * @param {Number} [minimumStep] Optional. Minimum step size in milliseconds */ - Slider.prototype.setPlayInterval = function(interval) { - this.playInterval = interval; - }; + function TimeStep(start, end, minimumStep) { + // variables + this.current = new Date(); + this._start = new Date(); + this._end = new Date(); - /** - * Retrieve the current play interval - * @return {Number} interval The interval in milliseconds - */ - Slider.prototype.getPlayInterval = function(interval) { - return this.playInterval; - }; + this.autoScale = true; + this.scale = TimeStep.SCALE.DAY; + this.step = 1; - /** - * Set looping on or off - * @pararm {boolean} doLoop If true, the slider will jump to the start when - * the end is passed, and will jump to the end - * when the start is passed. - */ - Slider.prototype.setPlayLoop = function(doLoop) { - this.playLoop = doLoop; + // initialize the range + this.setRange(start, end, minimumStep); + } + + /// enum scale + TimeStep.SCALE = { + MILLISECOND: 1, + SECOND: 2, + MINUTE: 3, + HOUR: 4, + DAY: 5, + WEEKDAY: 6, + MONTH: 7, + YEAR: 8 }; /** - * Execute the onchange callback function + * Set a new range + * If minimumStep is provided, the step size is chosen as close as possible + * to the minimumStep but larger than minimumStep. If minimumStep is not + * provided, the scale is set to 1 DAY. + * The minimumStep should correspond with the onscreen size of about 6 characters + * @param {Date} [start] The start date and time. + * @param {Date} [end] The end date and time. + * @param {int} [minimumStep] Optional. Minimum step size in milliseconds */ - Slider.prototype.onChange = function() { - if (this.onChangeCallback !== undefined) { - this.onChangeCallback(); + TimeStep.prototype.setRange = function(start, end, minimumStep) { + if (!(start instanceof Date) || !(end instanceof Date)) { + throw "No legal start or end date in method setRange"; } - }; - /** - * redraw the slider on the correct place - */ - Slider.prototype.redraw = function() { - if (this.frame) { - // resize the bar - this.frame.bar.style.top = (this.frame.clientHeight/2 - - this.frame.bar.offsetHeight/2) + 'px'; - this.frame.bar.style.width = (this.frame.clientWidth - - this.frame.prev.clientWidth - - this.frame.play.clientWidth - - this.frame.next.clientWidth - 30) + 'px'; + this._start = (start != undefined) ? new Date(start.valueOf()) : new Date(); + this._end = (end != undefined) ? new Date(end.valueOf()) : new Date(); - // position the slider button - var left = this.indexToLeft(this.index); - this.frame.slide.style.left = (left) + 'px'; + if (this.autoScale) { + this.setMinimumStep(minimumStep); } }; - /** - * Set the list with values for the slider - * @param {Array} values A javascript array with values (any type) + * Set the range iterator to the start date. */ - Slider.prototype.setValues = function(values) { - this.values = values; - - if (this.values.length > 0) - this.setIndex(0); - else - this.index = undefined; + TimeStep.prototype.first = function() { + this.current = new Date(this._start.valueOf()); + this.roundToMinor(); }; /** - * Select a value by its index - * @param {Number} index + * Round the current date to the first minor date value + * This must be executed once when the current date is set to start Date */ - Slider.prototype.setIndex = function(index) { - if (index < this.values.length) { - this.index = index; - - this.redraw(); - this.onChange(); + TimeStep.prototype.roundToMinor = function() { + // round to floor + // IMPORTANT: we have no breaks in this switch! (this is no bug) + //noinspection FallthroughInSwitchStatementJS + switch (this.scale) { + case TimeStep.SCALE.YEAR: + this.current.setFullYear(this.step * Math.floor(this.current.getFullYear() / this.step)); + this.current.setMonth(0); + case TimeStep.SCALE.MONTH: this.current.setDate(1); + case TimeStep.SCALE.DAY: // intentional fall through + case TimeStep.SCALE.WEEKDAY: this.current.setHours(0); + case TimeStep.SCALE.HOUR: this.current.setMinutes(0); + case TimeStep.SCALE.MINUTE: this.current.setSeconds(0); + case TimeStep.SCALE.SECOND: this.current.setMilliseconds(0); + //case TimeStep.SCALE.MILLISECOND: // nothing to do for milliseconds } - else { - throw 'Error: index out of range'; + + if (this.step != 1) { + // round down to the first minor value that is a multiple of the current step size + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: this.current.setMilliseconds(this.current.getMilliseconds() - this.current.getMilliseconds() % this.step); break; + case TimeStep.SCALE.SECOND: this.current.setSeconds(this.current.getSeconds() - this.current.getSeconds() % this.step); break; + case TimeStep.SCALE.MINUTE: this.current.setMinutes(this.current.getMinutes() - this.current.getMinutes() % this.step); break; + case TimeStep.SCALE.HOUR: this.current.setHours(this.current.getHours() - this.current.getHours() % this.step); break; + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: this.current.setDate((this.current.getDate()-1) - (this.current.getDate()-1) % this.step + 1); break; + case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() - this.current.getMonth() % this.step); break; + case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() - this.current.getFullYear() % this.step); break; + default: break; + } } }; /** - * retrieve the index of the currently selected vaue - * @return {Number} index + * Check if the there is a next step + * @return {boolean} true if the current date has not passed the end date */ - Slider.prototype.getIndex = function() { - return this.index; + TimeStep.prototype.hasNext = function () { + return (this.current.valueOf() <= this._end.valueOf()); }; - /** - * retrieve the currently selected value - * @return {*} value + * Do the next step */ - Slider.prototype.get = function() { - return this.values[this.index]; - }; - - - Slider.prototype._onMouseDown = function(event) { - // only react on left mouse button down - var leftButtonDown = event.which ? (event.which === 1) : (event.button === 1); - if (!leftButtonDown) return; - - this.startClientX = event.clientX; - this.startSlideX = parseFloat(this.frame.slide.style.left); - - this.frame.style.cursor = 'move'; - - // add event listeners to handle moving the contents - // we store the function onmousemove and onmouseup in the graph, so we can - // remove the eventlisteners lateron in the function mouseUp() - var me = this; - this.onmousemove = function (event) {me._onMouseMove(event);}; - this.onmouseup = function (event) {me._onMouseUp(event);}; - G3DaddEventListener(document, 'mousemove', this.onmousemove); - G3DaddEventListener(document, 'mouseup', this.onmouseup); - G3DpreventDefault(event); - }; - - - Slider.prototype.leftToIndex = function (left) { - var width = parseFloat(this.frame.bar.style.width) - - this.frame.slide.clientWidth - 10; - var x = left - 3; - - var index = Math.round(x / width * (this.values.length-1)); - if (index < 0) index = 0; - if (index > this.values.length-1) index = this.values.length-1; + TimeStep.prototype.next = function() { + var prev = this.current.valueOf(); - return index; - }; + // Two cases, needed to prevent issues with switching daylight savings + // (end of March and end of October) + if (this.current.getMonth() < 6) { + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: - Slider.prototype.indexToLeft = function (index) { - var width = parseFloat(this.frame.bar.style.width) - - this.frame.slide.clientWidth - 10; + this.current = new Date(this.current.valueOf() + this.step); break; + case TimeStep.SCALE.SECOND: this.current = new Date(this.current.valueOf() + this.step * 1000); break; + case TimeStep.SCALE.MINUTE: this.current = new Date(this.current.valueOf() + this.step * 1000 * 60); break; + case TimeStep.SCALE.HOUR: + this.current = new Date(this.current.valueOf() + this.step * 1000 * 60 * 60); + // in case of skipping an hour for daylight savings, adjust the hour again (else you get: 0h 5h 9h ... instead of 0h 4h 8h ...) + var h = this.current.getHours(); + this.current.setHours(h - (h % this.step)); + break; + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: this.current.setDate(this.current.getDate() + this.step); break; + case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() + this.step); break; + case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() + this.step); break; + default: break; + } + } + else { + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: this.current = new Date(this.current.valueOf() + this.step); break; + case TimeStep.SCALE.SECOND: this.current.setSeconds(this.current.getSeconds() + this.step); break; + case TimeStep.SCALE.MINUTE: this.current.setMinutes(this.current.getMinutes() + this.step); break; + case TimeStep.SCALE.HOUR: this.current.setHours(this.current.getHours() + this.step); break; + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: this.current.setDate(this.current.getDate() + this.step); break; + case TimeStep.SCALE.MONTH: this.current.setMonth(this.current.getMonth() + this.step); break; + case TimeStep.SCALE.YEAR: this.current.setFullYear(this.current.getFullYear() + this.step); break; + default: break; + } + } - var x = index / (this.values.length-1) * width; - var left = x + 3; + if (this.step != 1) { + // round down to the correct major value + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: if(this.current.getMilliseconds() < this.step) this.current.setMilliseconds(0); break; + case TimeStep.SCALE.SECOND: if(this.current.getSeconds() < this.step) this.current.setSeconds(0); break; + case TimeStep.SCALE.MINUTE: if(this.current.getMinutes() < this.step) this.current.setMinutes(0); break; + case TimeStep.SCALE.HOUR: if(this.current.getHours() < this.step) this.current.setHours(0); break; + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: if(this.current.getDate() < this.step+1) this.current.setDate(1); break; + case TimeStep.SCALE.MONTH: if(this.current.getMonth() < this.step) this.current.setMonth(0); break; + case TimeStep.SCALE.YEAR: break; // nothing to do for year + default: break; + } + } - return left; + // safety mechanism: if current time is still unchanged, move to the end + if (this.current.valueOf() == prev) { + this.current = new Date(this._end.valueOf()); + } }; - - Slider.prototype._onMouseMove = function (event) { - var diff = event.clientX - this.startClientX; - var x = this.startSlideX + diff; - - var index = this.leftToIndex(x); - - this.setIndex(index); - - G3DpreventDefault(); + /** + * Get the current datetime + * @return {Date} current The current date + */ + TimeStep.prototype.getCurrent = function() { + return this.current; }; + /** + * Set a custom scale. Autoscaling will be disabled. + * For example setScale(SCALE.MINUTES, 5) will result + * in minor steps of 5 minutes, and major steps of an hour. + * + * @param {TimeStep.SCALE} newScale + * A scale. Choose from SCALE.MILLISECOND, + * SCALE.SECOND, SCALE.MINUTE, SCALE.HOUR, + * SCALE.WEEKDAY, SCALE.DAY, SCALE.MONTH, + * SCALE.YEAR. + * @param {Number} newStep A step size, by default 1. Choose for + * example 1, 2, 5, or 10. + */ + TimeStep.prototype.setScale = function(newScale, newStep) { + this.scale = newScale; - Slider.prototype._onMouseUp = function (event) { - this.frame.style.cursor = 'auto'; - - // remove event listeners - G3DremoveEventListener(document, 'mousemove', this.onmousemove); - G3DremoveEventListener(document, 'mouseup', this.onmouseup); + if (newStep > 0) { + this.step = newStep; + } - G3DpreventDefault(); + this.autoScale = false; }; + /** + * Enable or disable autoscaling + * @param {boolean} enable If true, autoascaling is set true + */ + TimeStep.prototype.setAutoScale = function (enable) { + this.autoScale = enable; + }; - /**--------------------------------------------------------------------------**/ + /** + * Automatically determine the scale that bests fits the provided minimum step + * @param {Number} [minimumStep] The minimum step size in milliseconds + */ + TimeStep.prototype.setMinimumStep = function(minimumStep) { + if (minimumStep == undefined) { + return; + } + var stepYear = (1000 * 60 * 60 * 24 * 30 * 12); + var stepMonth = (1000 * 60 * 60 * 24 * 30); + var stepDay = (1000 * 60 * 60 * 24); + var stepHour = (1000 * 60 * 60); + var stepMinute = (1000 * 60); + var stepSecond = (1000); + var stepMillisecond= (1); + // find the smallest step that is larger than the provided minimumStep + if (stepYear*1000 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 1000;} + if (stepYear*500 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 500;} + if (stepYear*100 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 100;} + if (stepYear*50 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 50;} + if (stepYear*10 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 10;} + if (stepYear*5 > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 5;} + if (stepYear > minimumStep) {this.scale = TimeStep.SCALE.YEAR; this.step = 1;} + if (stepMonth*3 > minimumStep) {this.scale = TimeStep.SCALE.MONTH; this.step = 3;} + if (stepMonth > minimumStep) {this.scale = TimeStep.SCALE.MONTH; this.step = 1;} + if (stepDay*5 > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 5;} + if (stepDay*2 > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 2;} + if (stepDay > minimumStep) {this.scale = TimeStep.SCALE.DAY; this.step = 1;} + if (stepDay/2 > minimumStep) {this.scale = TimeStep.SCALE.WEEKDAY; this.step = 1;} + if (stepHour*4 > minimumStep) {this.scale = TimeStep.SCALE.HOUR; this.step = 4;} + if (stepHour > minimumStep) {this.scale = TimeStep.SCALE.HOUR; this.step = 1;} + if (stepMinute*15 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 15;} + if (stepMinute*10 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 10;} + if (stepMinute*5 > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 5;} + if (stepMinute > minimumStep) {this.scale = TimeStep.SCALE.MINUTE; this.step = 1;} + if (stepSecond*15 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 15;} + if (stepSecond*10 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 10;} + if (stepSecond*5 > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 5;} + if (stepSecond > minimumStep) {this.scale = TimeStep.SCALE.SECOND; this.step = 1;} + if (stepMillisecond*200 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 200;} + if (stepMillisecond*100 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 100;} + if (stepMillisecond*50 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 50;} + if (stepMillisecond*10 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 10;} + if (stepMillisecond*5 > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 5;} + if (stepMillisecond > minimumStep) {this.scale = TimeStep.SCALE.MILLISECOND; this.step = 1;} + }; /** - * Retrieve the absolute left value of a DOM element - * @param {Element} elem A dom element, for example a div - * @return {Number} left The absolute left position of this element - * in the browser page. + * Snap a date to a rounded value. + * The snap intervals are dependent on the current scale and step. + * @param {Date} date the date to be snapped. + * @return {Date} snappedDate */ - getAbsoluteLeft = function(elem) { - var left = 0; - while( elem !== null ) { - left += elem.offsetLeft; - left -= elem.scrollLeft; - elem = elem.offsetParent; + TimeStep.prototype.snap = function(date) { + var clone = new Date(date.valueOf()); + + if (this.scale == TimeStep.SCALE.YEAR) { + var year = clone.getFullYear() + Math.round(clone.getMonth() / 12); + clone.setFullYear(Math.round(year / this.step) * this.step); + clone.setMonth(0); + clone.setDate(0); + clone.setHours(0); + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); } - return left; + else if (this.scale == TimeStep.SCALE.MONTH) { + if (clone.getDate() > 15) { + clone.setDate(1); + clone.setMonth(clone.getMonth() + 1); + // important: first set Date to 1, after that change the month. + } + else { + clone.setDate(1); + } + + clone.setHours(0); + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); + } + else if (this.scale == TimeStep.SCALE.DAY) { + //noinspection FallthroughInSwitchStatementJS + switch (this.step) { + case 5: + case 2: + clone.setHours(Math.round(clone.getHours() / 24) * 24); break; + default: + clone.setHours(Math.round(clone.getHours() / 12) * 12); break; + } + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); + } + else if (this.scale == TimeStep.SCALE.WEEKDAY) { + //noinspection FallthroughInSwitchStatementJS + switch (this.step) { + case 5: + case 2: + clone.setHours(Math.round(clone.getHours() / 12) * 12); break; + default: + clone.setHours(Math.round(clone.getHours() / 6) * 6); break; + } + clone.setMinutes(0); + clone.setSeconds(0); + clone.setMilliseconds(0); + } + else if (this.scale == TimeStep.SCALE.HOUR) { + switch (this.step) { + case 4: + clone.setMinutes(Math.round(clone.getMinutes() / 60) * 60); break; + default: + clone.setMinutes(Math.round(clone.getMinutes() / 30) * 30); break; + } + clone.setSeconds(0); + clone.setMilliseconds(0); + } else if (this.scale == TimeStep.SCALE.MINUTE) { + //noinspection FallthroughInSwitchStatementJS + switch (this.step) { + case 15: + case 10: + clone.setMinutes(Math.round(clone.getMinutes() / 5) * 5); + clone.setSeconds(0); + break; + case 5: + clone.setSeconds(Math.round(clone.getSeconds() / 60) * 60); break; + default: + clone.setSeconds(Math.round(clone.getSeconds() / 30) * 30); break; + } + clone.setMilliseconds(0); + } + else if (this.scale == TimeStep.SCALE.SECOND) { + //noinspection FallthroughInSwitchStatementJS + switch (this.step) { + case 15: + case 10: + clone.setSeconds(Math.round(clone.getSeconds() / 5) * 5); + clone.setMilliseconds(0); + break; + case 5: + clone.setMilliseconds(Math.round(clone.getMilliseconds() / 1000) * 1000); break; + default: + clone.setMilliseconds(Math.round(clone.getMilliseconds() / 500) * 500); break; + } + } + else if (this.scale == TimeStep.SCALE.MILLISECOND) { + var step = this.step > 5 ? this.step / 2 : 1; + clone.setMilliseconds(Math.round(clone.getMilliseconds() / step) * step); + } + + return clone; }; /** - * Retrieve the absolute top value of a DOM element - * @param {Element} elem A dom element, for example a div - * @return {Number} top The absolute top position of this element - * in the browser page. + * Check if the current value is a major value (for example when the step + * is DAY, a major value is each first day of the MONTH) + * @return {boolean} true if current date is major, else false. */ - getAbsoluteTop = function(elem) { - var top = 0; - while( elem !== null ) { - top += elem.offsetTop; - top -= elem.scrollTop; - elem = elem.offsetParent; + TimeStep.prototype.isMajor = function() { + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: + return (this.current.getMilliseconds() == 0); + case TimeStep.SCALE.SECOND: + return (this.current.getSeconds() == 0); + case TimeStep.SCALE.MINUTE: + return (this.current.getHours() == 0) && (this.current.getMinutes() == 0); + // Note: this is no bug. Major label is equal for both minute and hour scale + case TimeStep.SCALE.HOUR: + return (this.current.getHours() == 0); + case TimeStep.SCALE.WEEKDAY: // intentional fall through + case TimeStep.SCALE.DAY: + return (this.current.getDate() == 1); + case TimeStep.SCALE.MONTH: + return (this.current.getMonth() == 0); + case TimeStep.SCALE.YEAR: + return false; + default: + return false; } - return top; }; + /** - * Get the horizontal mouse position from a mouse event - * @param {Event} event - * @return {Number} mouse x + * Returns formatted text for the minor axislabel, depending on the current + * date and the scale. For example when scale is MINUTE, the current time is + * formatted as "hh:mm". + * @param {Date} [date] custom date. if not provided, current date is taken */ - getMouseX = function(event) { - if ('clientX' in event) return event.clientX; - return event.targetTouches[0] && event.targetTouches[0].clientX || 0; + TimeStep.prototype.getLabelMinor = function(date) { + if (date == undefined) { + date = this.current; + } + + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND: return moment(date).format('SSS'); + case TimeStep.SCALE.SECOND: return moment(date).format('s'); + case TimeStep.SCALE.MINUTE: return moment(date).format('HH:mm'); + case TimeStep.SCALE.HOUR: return moment(date).format('HH:mm'); + case TimeStep.SCALE.WEEKDAY: return moment(date).format('ddd D'); + case TimeStep.SCALE.DAY: return moment(date).format('D'); + case TimeStep.SCALE.MONTH: return moment(date).format('MMM'); + case TimeStep.SCALE.YEAR: return moment(date).format('YYYY'); + default: return ''; + } }; + /** - * Get the vertical mouse position from a mouse event - * @param {Event} event - * @return {Number} mouse y + * Returns formatted text for the major axis label, depending on the current + * date and the scale. For example when scale is MINUTE, the major scale is + * hours, and the hour will be formatted as "hh". + * @param {Date} [date] custom date. if not provided, current date is taken */ - getMouseY = function(event) { - if ('clientY' in event) return event.clientY; - return event.targetTouches[0] && event.targetTouches[0].clientY || 0; + TimeStep.prototype.getLabelMajor = function(date) { + if (date == undefined) { + date = this.current; + } + + //noinspection FallthroughInSwitchStatementJS + switch (this.scale) { + case TimeStep.SCALE.MILLISECOND:return moment(date).format('HH:mm:ss'); + case TimeStep.SCALE.SECOND: return moment(date).format('D MMMM HH:mm'); + case TimeStep.SCALE.MINUTE: + case TimeStep.SCALE.HOUR: return moment(date).format('ddd D MMMM'); + case TimeStep.SCALE.WEEKDAY: + case TimeStep.SCALE.DAY: return moment(date).format('MMMM YYYY'); + case TimeStep.SCALE.MONTH: return moment(date).format('YYYY'); + case TimeStep.SCALE.YEAR: return ''; + default: return ''; + } }; - module.exports = Graph3d; + module.exports = TimeStep; /***/ }, @@ -9040,7 +9038,7 @@ return /******/ (function(modules) { // webpackBootstrap /* 14 */ /***/ function(module, exports, __webpack_require__) { - var Hammer = __webpack_require__(50); + var Hammer = __webpack_require__(49); var util = __webpack_require__(1); var Component = __webpack_require__(12); @@ -9237,7 +9235,7 @@ return /******/ (function(modules) { // webpackBootstrap var util = __webpack_require__(1); var DOMutil = __webpack_require__(2); var Component = __webpack_require__(12); - var DataStep = __webpack_require__(6); + var DataStep = __webpack_require__(8); /** * A horizontal time axis @@ -9843,7 +9841,7 @@ return /******/ (function(modules) { // webpackBootstrap /***/ function(module, exports, __webpack_require__) { var util = __webpack_require__(1); - var stack = __webpack_require__(9); + var stack = __webpack_require__(10); var ItemRange = __webpack_require__(25); /** @@ -9967,7 +9965,7 @@ return /******/ (function(modules) { // webpackBootstrap /** * Repaint this group * @param {{start: number, end: number}} range - * @param {{item: number, axis: number}} margin + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin * @param {boolean} [restack=false] Force restacking of all items * @return {boolean} Returns true if the group is resized */ @@ -10016,10 +10014,10 @@ return /******/ (function(modules) { // webpackBootstrap item.top -= offset; }); } - height = max + margin.item / 2; + height = max + margin.item.vertical / 2; } else { - height = margin.axis + margin.item; + height = margin.axis + margin.item.vertical; } height = Math.max(height, this.props.label.height); @@ -10272,7 +10270,7 @@ return /******/ (function(modules) { // webpackBootstrap /* 18 */ /***/ function(module, exports, __webpack_require__) { - var Hammer = __webpack_require__(50); + var Hammer = __webpack_require__(49); var util = __webpack_require__(1); var DataSet = __webpack_require__(3); var DataView = __webpack_require__(4); @@ -10326,7 +10324,10 @@ return /******/ (function(modules) { // webpackBootstrap }, margin: { - item: 10, + item: { + horizontal: 10, + vertical: 10 + }, axis: 20 }, padding: 5 @@ -10485,8 +10486,15 @@ return /******/ (function(modules) { // webpackBootstrap * {Number} margin.axis * Margin between the axis and the items in pixels. * Default is 20. + * {Number} margin.item.horizontal + * Horizontal margin between items in pixels. + * Default is 10. + * {Number} margin.item.vertical + * Vertical Margin between items in pixels. + * Default is 10. * {Number} margin.item - * Margin between items in pixels. Default is 10. + * Margin between items in pixels in both horizontal + * and vertical direction. Default is 10. * {Number} margin * Set margin for both axis and items in pixels. * {Number} padding @@ -10528,10 +10536,20 @@ return /******/ (function(modules) { // webpackBootstrap if ('margin' in options) { if (typeof options.margin === 'number') { this.options.margin.axis = options.margin; - this.options.margin.item = options.margin; - } - else if (typeof options.margin === 'object'){ - util.selectiveExtend(['axis', 'item'], this.options.margin, options.margin); + this.options.margin.item.horizontal = options.margin; + this.options.margin.item.vertical = options.margin; + } + else if (typeof options.margin === 'object') { + util.selectiveExtend(['axis'], this.options.margin, options.margin); + if ('item' in options.margin) { + if (typeof options.margin.item === 'number') { + this.options.margin.item.horizontal = options.margin.item; + this.options.margin.item.vertical = options.margin.item; + } + else if (typeof options.margin.item === 'object') { + util.selectiveExtend(['horizontal', 'vertical'], this.options.margin.item, options.margin.item); + } + } } } @@ -10722,10 +10740,10 @@ return /******/ (function(modules) { // webpackBootstrap }, nonFirstMargin = { item: margin.item, - axis: margin.item / 2 + axis: margin.item.vertical / 2 }, height = 0, - minHeight = margin.axis + margin.item; + minHeight = margin.axis + margin.item.vertical; util.forEach(this.groups, function (group) { var groupMargin = (group == firstGroup) ? firstMargin : nonFirstMargin; var groupResized = group.redraw(range, groupMargin, restack); @@ -12878,7 +12896,7 @@ return /******/ (function(modules) { // webpackBootstrap var util = __webpack_require__(1); var Component = __webpack_require__(12); - var TimeStep = __webpack_require__(10); + var TimeStep = __webpack_require__(11); /** * A horizontal time axis @@ -13277,7 +13295,7 @@ return /******/ (function(modules) { // webpackBootstrap /* 22 */ /***/ function(module, exports, __webpack_require__) { - var Hammer = __webpack_require__(50); + var Hammer = __webpack_require__(49); /** * @constructor Item @@ -13878,7 +13896,7 @@ return /******/ (function(modules) { // webpackBootstrap /* 25 */ /***/ function(module, exports, __webpack_require__) { - var Hammer = __webpack_require__(50); + var Hammer = __webpack_require__(49); var Item = __webpack_require__(22); /** @@ -14176,8 +14194,8 @@ return /******/ (function(modules) { // webpackBootstrap /***/ function(module, exports, __webpack_require__) { var Emitter = __webpack_require__(41); - var Hammer = __webpack_require__(50); - var mousetrap = __webpack_require__(48); + var Hammer = __webpack_require__(49); + var mousetrap = __webpack_require__(42); var util = __webpack_require__(1); var DataSet = __webpack_require__(3); var DataView = __webpack_require__(4); @@ -16047,1465 +16065,803 @@ return /******/ (function(modules) { // webpackBootstrap * @private */ Network.prototype._YconvertDOMtoCanvas = function(y) { - return (y - this.translation.y) / this.scale; - }; - - /** - * Convert the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to - * the Y coordinate in DOM-space (coordinate point in browser relative to the container div) - * @param {number} y - * @returns {number} - * @private - */ - Network.prototype._YconvertCanvasToDOM = function(y) { - return y * this.scale + this.translation.y ; - }; - - - /** - * - * @param {object} pos = {x: number, y: number} - * @returns {{x: number, y: number}} - * @constructor - */ - Network.prototype.canvasToDOM = function(pos) { - return {x:this._XconvertCanvasToDOM(pos.x),y:this._YconvertCanvasToDOM(pos.y)}; - } - - /** - * - * @param {object} pos = {x: number, y: number} - * @returns {{x: number, y: number}} - * @constructor - */ - Network.prototype.DOMtoCanvas = function(pos) { - return {x:this._XconvertDOMtoCanvas(pos.x),y:this._YconvertDOMtoCanvas(pos.y)}; - } - - /** - * Redraw all nodes - * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); - * @param {CanvasRenderingContext2D} ctx - * @param {Boolean} [alwaysShow] - * @private - */ - Network.prototype._drawNodes = function(ctx,alwaysShow) { - if (alwaysShow === undefined) { - alwaysShow = false; - } - - // first draw the unselected nodes - var nodes = this.nodes; - var selected = []; - - for (var id in nodes) { - if (nodes.hasOwnProperty(id)) { - nodes[id].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight); - if (nodes[id].isSelected()) { - selected.push(id); - } - else { - if (nodes[id].inArea() || alwaysShow) { - nodes[id].draw(ctx); - } - } - } - } - - // draw the selected nodes on top - for (var s = 0, sMax = selected.length; s < sMax; s++) { - if (nodes[selected[s]].inArea() || alwaysShow) { - nodes[selected[s]].draw(ctx); - } - } - }; - - /** - * Redraw all edges - * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); - * @param {CanvasRenderingContext2D} ctx - * @private - */ - Network.prototype._drawEdges = function(ctx) { - var edges = this.edges; - for (var id in edges) { - if (edges.hasOwnProperty(id)) { - var edge = edges[id]; - edge.setScale(this.scale); - if (edge.connected) { - edges[id].draw(ctx); - } - } - } - }; - - /** - * Redraw all edges - * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); - * @param {CanvasRenderingContext2D} ctx - * @private - */ - Network.prototype._drawControlNodes = function(ctx) { - var edges = this.edges; - for (var id in edges) { - if (edges.hasOwnProperty(id)) { - edges[id]._drawControlNodes(ctx); - } - } - }; - - /** - * Find a stable position for all nodes - * @private - */ - Network.prototype._stabilize = function() { - if (this.constants.freezeForStabilization == true) { - this._freezeDefinedNodes(); - } - - // find stable position - var count = 0; - while (this.moving && count < this.constants.stabilizationIterations) { - this._physicsTick(); - count++; - } - this.zoomExtent(false,true); - if (this.constants.freezeForStabilization == true) { - this._restoreFrozenNodes(); - } - this.emit("stabilized",{iterations:count}); - }; - - /** - * When initializing and stabilizing, we can freeze nodes with a predefined position. This greatly speeds up stabilization - * because only the supportnodes for the smoothCurves have to settle. - * - * @private - */ - Network.prototype._freezeDefinedNodes = function() { - var nodes = this.nodes; - for (var id in nodes) { - if (nodes.hasOwnProperty(id)) { - if (nodes[id].x != null && nodes[id].y != null) { - nodes[id].fixedData.x = nodes[id].xFixed; - nodes[id].fixedData.y = nodes[id].yFixed; - nodes[id].xFixed = true; - nodes[id].yFixed = true; - } - } - } - }; - - /** - * Unfreezes the nodes that have been frozen by _freezeDefinedNodes. - * - * @private - */ - Network.prototype._restoreFrozenNodes = function() { - var nodes = this.nodes; - for (var id in nodes) { - if (nodes.hasOwnProperty(id)) { - if (nodes[id].fixedData.x != null) { - nodes[id].xFixed = nodes[id].fixedData.x; - nodes[id].yFixed = nodes[id].fixedData.y; - } - } - } - }; - - - /** - * Check if any of the nodes is still moving - * @param {number} vmin the minimum velocity considered as 'moving' - * @return {boolean} true if moving, false if non of the nodes is moving - * @private - */ - Network.prototype._isMoving = function(vmin) { - var nodes = this.nodes; - for (var id in nodes) { - if (nodes.hasOwnProperty(id) && nodes[id].isMoving(vmin)) { - return true; - } - } - return false; - }; - - - /** - * /** - * Perform one discrete step for all nodes - * - * @private - */ - Network.prototype._discreteStepNodes = function() { - var interval = this.physicsDiscreteStepsize; - var nodes = this.nodes; - var nodeId; - var nodesPresent = false; - - if (this.constants.maxVelocity > 0) { - for (nodeId in nodes) { - if (nodes.hasOwnProperty(nodeId)) { - nodes[nodeId].discreteStepLimited(interval, this.constants.maxVelocity); - nodesPresent = true; - } - } - } - else { - for (nodeId in nodes) { - if (nodes.hasOwnProperty(nodeId)) { - nodes[nodeId].discreteStep(interval); - nodesPresent = true; - } - } - } - - if (nodesPresent == true) { - var vminCorrected = this.constants.minVelocity / Math.max(this.scale,0.05); - if (vminCorrected > 0.5*this.constants.maxVelocity) { - this.moving = true; - } - else { - this.moving = this._isMoving(vminCorrected) || this.constants.configurePhysics; - } - } + return (y - this.translation.y) / this.scale; }; /** - * A single simulation step (or "tick") in the physics simulation - * + * Convert the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to + * the Y coordinate in DOM-space (coordinate point in browser relative to the container div) + * @param {number} y + * @returns {number} * @private */ - Network.prototype._physicsTick = function() { - if (!this.freezeSimulation) { - if (this.moving) { - this._doInAllActiveSectors("_initializeForceCalculation"); - this._doInAllActiveSectors("_discreteStepNodes"); - if (this.constants.smoothCurves) { - this._doInSupportSector("_discreteStepNodes"); - } - this._findCenter(this._getRange()) - } - } + Network.prototype._YconvertCanvasToDOM = function(y) { + return y * this.scale + this.translation.y ; }; /** - * This function runs one step of the animation. It calls an x amount of physics ticks and one render tick. - * It reschedules itself at the beginning of the function * - * @private + * @param {object} pos = {x: number, y: number} + * @returns {{x: number, y: number}} + * @constructor */ - Network.prototype._animationStep = function() { - // reset the timer so a new scheduled animation step can be set - this.timer = undefined; - // handle the keyboad movement - this._handleNavigation(); - - // this schedules a new animation step - this.start(); - - // start the physics simulation - var calculationTime = Date.now(); - var maxSteps = 1; - this._physicsTick(); - var timeRequired = Date.now() - calculationTime; - while (timeRequired < 0.9*(this.renderTimestep - this.renderTime) && maxSteps < this.maxPhysicsTicksPerRender) { - this._physicsTick(); - timeRequired = Date.now() - calculationTime; - maxSteps++; - } - - // start the rendering process - var renderTime = Date.now(); - this._redraw(); - this.renderTime = Date.now() - renderTime; - - }; + Network.prototype.canvasToDOM = function(pos) { + return {x:this._XconvertCanvasToDOM(pos.x),y:this._YconvertCanvasToDOM(pos.y)}; + } - if (typeof window !== 'undefined') { - window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || - window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; + /** + * + * @param {object} pos = {x: number, y: number} + * @returns {{x: number, y: number}} + * @constructor + */ + Network.prototype.DOMtoCanvas = function(pos) { + return {x:this._XconvertDOMtoCanvas(pos.x),y:this._YconvertDOMtoCanvas(pos.y)}; } /** - * Schedule a animation step with the refreshrate interval. + * Redraw all nodes + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @param {Boolean} [alwaysShow] + * @private */ - Network.prototype.start = function() { - if (this.moving || this.xIncrement != 0 || this.yIncrement != 0 || this.zoomIncrement != 0) { - if (!this.timer) { - var ua = navigator.userAgent.toLowerCase(); + Network.prototype._drawNodes = function(ctx,alwaysShow) { + if (alwaysShow === undefined) { + alwaysShow = false; + } - var requiresTimeout = false; - if (ua.indexOf('msie 9.0') != -1) { // IE 9 - requiresTimeout = true; - } - else if (ua.indexOf('safari') != -1) { // safari - if (ua.indexOf('chrome') <= -1) { - requiresTimeout = true; - } - } + // first draw the unselected nodes + var nodes = this.nodes; + var selected = []; - if (requiresTimeout == true) { - this.timer = window.setTimeout(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + nodes[id].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight); + if (nodes[id].isSelected()) { + selected.push(id); } - else{ - this.timer = window.requestAnimationFrame(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function + else { + if (nodes[id].inArea() || alwaysShow) { + nodes[id].draw(ctx); + } } } } - else { - this._redraw(); + + // draw the selected nodes on top + for (var s = 0, sMax = selected.length; s < sMax; s++) { + if (nodes[selected[s]].inArea() || alwaysShow) { + nodes[selected[s]].draw(ctx); + } } }; - /** - * Move the network according to the keyboard presses. - * + * Redraw all edges + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx * @private */ - Network.prototype._handleNavigation = function() { - if (this.xIncrement != 0 || this.yIncrement != 0) { - var translation = this._getTranslation(); - this._setTranslation(translation.x+this.xIncrement, translation.y+this.yIncrement); - } - if (this.zoomIncrement != 0) { - var center = { - x: this.frame.canvas.clientWidth / 2, - y: this.frame.canvas.clientHeight / 2 - }; - this._zoom(this.scale*(1 + this.zoomIncrement), center); + Network.prototype._drawEdges = function(ctx) { + var edges = this.edges; + for (var id in edges) { + if (edges.hasOwnProperty(id)) { + var edge = edges[id]; + edge.setScale(this.scale); + if (edge.connected) { + edges[id].draw(ctx); + } + } } }; - /** - * Freeze the _animationStep + * Redraw all edges + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @private */ - Network.prototype.toggleFreeze = function() { - if (this.freezeSimulation == false) { - this.freezeSimulation = true; - } - else { - this.freezeSimulation = false; - this.start(); + Network.prototype._drawControlNodes = function(ctx) { + var edges = this.edges; + for (var id in edges) { + if (edges.hasOwnProperty(id)) { + edges[id]._drawControlNodes(ctx); + } } }; - /** - * This function cleans the support nodes if they are not needed and adds them when they are. - * - * @param {boolean} [disableStart] + * Find a stable position for all nodes * @private */ - Network.prototype._configureSmoothCurves = function(disableStart) { - if (disableStart === undefined) { - disableStart = true; - } - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - this._createBezierNodes(); + Network.prototype._stabilize = function() { + if (this.constants.freezeForStabilization == true) { + this._freezeDefinedNodes(); } - else { - // delete the support nodes - this.sectors['support']['nodes'] = {}; - for (var edgeId in this.edges) { - if (this.edges.hasOwnProperty(edgeId)) { - this.edges[edgeId].smooth = false; - this.edges[edgeId].via = null; - } - } + + // find stable position + var count = 0; + while (this.moving && count < this.constants.stabilizationIterations) { + this._physicsTick(); + count++; } - this._updateCalculationNodes(); - if (!disableStart) { - this.moving = true; - this.start(); + this.zoomExtent(false,true); + if (this.constants.freezeForStabilization == true) { + this._restoreFrozenNodes(); } + this.emit("stabilized",{iterations:count}); }; - /** - * Bezier curves require an anchor point to calculate the smooth flow. These points are nodes. These nodes are invisible but - * are used for the force calculation. + * When initializing and stabilizing, we can freeze nodes with a predefined position. This greatly speeds up stabilization + * because only the supportnodes for the smoothCurves have to settle. * * @private */ - Network.prototype._createBezierNodes = function() { - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - for (var edgeId in this.edges) { - if (this.edges.hasOwnProperty(edgeId)) { - var edge = this.edges[edgeId]; - if (edge.via == null) { - edge.smooth = true; - var nodeId = "edgeId:".concat(edge.id); - this.sectors['support']['nodes'][nodeId] = new Node( - {id:nodeId, - mass:1, - shape:'circle', - image:"", - internalMultiplier:1 - },{},{},this.constants); - edge.via = this.sectors['support']['nodes'][nodeId]; - edge.via.parentEdgeId = edge.id; - edge.positionBezierNode(); - } + Network.prototype._freezeDefinedNodes = function() { + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + if (nodes[id].x != null && nodes[id].y != null) { + nodes[id].fixedData.x = nodes[id].xFixed; + nodes[id].fixedData.y = nodes[id].yFixed; + nodes[id].xFixed = true; + nodes[id].yFixed = true; } } } }; /** - * load the functions that load the mixins into the prototype. + * Unfreezes the nodes that have been frozen by _freezeDefinedNodes. * * @private */ - Network.prototype._initializeMixinLoaders = function () { - for (var mixin in MixinLoader) { - if (MixinLoader.hasOwnProperty(mixin)) { - Network.prototype[mixin] = MixinLoader[mixin]; - } - } - }; - - /** - * Load the XY positions of the nodes into the dataset. - */ - Network.prototype.storePosition = function() { - var dataArray = []; - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - var node = this.nodes[nodeId]; - var allowedToMoveX = !this.nodes.xFixed; - var allowedToMoveY = !this.nodes.yFixed; - if (this.nodesData._data[nodeId].x != Math.round(node.x) || this.nodesData._data[nodeId].y != Math.round(node.y)) { - dataArray.push({id:nodeId,x:Math.round(node.x),y:Math.round(node.y),allowedToMoveX:allowedToMoveX,allowedToMoveY:allowedToMoveY}); + Network.prototype._restoreFrozenNodes = function() { + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id)) { + if (nodes[id].fixedData.x != null) { + nodes[id].xFixed = nodes[id].fixedData.x; + nodes[id].yFixed = nodes[id].fixedData.y; } } } - this.nodesData.update(dataArray); }; /** - * Center a node in view. - * - * @param {Number} nodeId - * @param {Number} [zoomLevel] + * Check if any of the nodes is still moving + * @param {number} vmin the minimum velocity considered as 'moving' + * @return {boolean} true if moving, false if non of the nodes is moving + * @private */ - Network.prototype.focusOnNode = function (nodeId, zoomLevel) { - if (this.nodes.hasOwnProperty(nodeId)) { - if (zoomLevel === undefined) { - zoomLevel = this._getScale(); + Network.prototype._isMoving = function(vmin) { + var nodes = this.nodes; + for (var id in nodes) { + if (nodes.hasOwnProperty(id) && nodes[id].isMoving(vmin)) { + return true; } - var nodePosition= {x: this.nodes[nodeId].x, y: this.nodes[nodeId].y}; - - var requiredScale = zoomLevel; - this._setScale(requiredScale); - - var canvasCenter = this.DOMtoCanvas({x:0.5 * this.frame.canvas.width,y:0.5 * this.frame.canvas.height}); - var translation = this._getTranslation(); - - var distanceFromCenter = {x:canvasCenter.x - nodePosition.x, - y:canvasCenter.y - nodePosition.y}; - - this._setTranslation(translation.x + requiredScale * distanceFromCenter.x, - translation.y + requiredScale * distanceFromCenter.y); - this.redraw(); - } - else { - console.log("This nodeId cannot be found.") } + return false; }; - module.exports = Network; - - -/***/ }, -/* 27 */ -/***/ function(module, exports, __webpack_require__) { - - var util = __webpack_require__(1); - var Node = __webpack_require__(30); /** - * @class Edge + * /** + * Perform one discrete step for all nodes * - * A edge connects two nodes - * @param {Object} properties Object with properties. Must contain - * At least properties from and to. - * Available properties: from (number), - * to (number), label (string, color (string), - * width (number), style (string), - * length (number), title (string) - * @param {Network} network A Network object, used to find and edge to - * nodes. - * @param {Object} constants An object with default values for - * example for the color - */ - function Edge (properties, network, constants) { - if (!network) { - throw "No network provided"; - } - this.network = network; - - // initialize constants - this.widthMin = constants.edges.widthMin; - this.widthMax = constants.edges.widthMax; - - // initialize variables - this.id = undefined; - this.fromId = undefined; - this.toId = undefined; - this.style = constants.edges.style; - this.title = undefined; - this.width = constants.edges.width; - this.widthSelectionMultiplier = constants.edges.widthSelectionMultiplier; - this.widthSelected = this.width * this.widthSelectionMultiplier; - this.hoverWidth = constants.edges.hoverWidth; - this.value = undefined; - this.length = constants.physics.springLength; - this.customLength = false; - this.selected = false; - this.hover = false; - this.smoothCurves = constants.smoothCurves; - this.dynamicSmoothCurves = constants.dynamicSmoothCurves; - this.arrowScaleFactor = constants.edges.arrowScaleFactor; - this.inheritColor = constants.edges.inheritColor; - - this.from = null; // a node - this.to = null; // a node - this.via = null; // a temp node - - // we use this to be able to reconnect the edge to a cluster if its node is put into a cluster - // by storing the original information we can revert to the original connection when the cluser is opened. - this.originalFromId = []; - this.originalToId = []; - - this.connected = false; - - // Added to support dashed lines - // David Jordan - // 2012-08-08 - this.dash = util.extend({}, constants.edges.dash); // contains properties length, gap, altLength - - this.color = {color:constants.edges.color.color, - highlight:constants.edges.color.highlight, - hover:constants.edges.color.hover}; - this.widthFixed = false; - this.lengthFixed = false; - - this.setProperties(properties, constants); - - this.controlNodesEnabled = false; - this.controlNodes = {from:null, to:null, positions:{}}; - this.connectedNode = null; - } - - /** - * Set or overwrite properties for the edge - * @param {Object} properties an object with properties - * @param {Object} constants and object with default, global properties + * @private */ - Edge.prototype.setProperties = function(properties, constants) { - if (!properties) { - return; - } - - if (properties.from !== undefined) {this.fromId = properties.from;} - if (properties.to !== undefined) {this.toId = properties.to;} - - if (properties.id !== undefined) {this.id = properties.id;} - if (properties.style !== undefined) {this.style = properties.style;} - if (properties.label !== undefined) {this.label = properties.label;} - - if (this.label) { - this.fontSize = constants.edges.fontSize; - this.fontFace = constants.edges.fontFace; - this.fontColor = constants.edges.fontColor; - this.fontFill = constants.edges.fontFill; + Network.prototype._discreteStepNodes = function() { + var interval = this.physicsDiscreteStepsize; + var nodes = this.nodes; + var nodeId; + var nodesPresent = false; - if (properties.fontColor !== undefined) {this.fontColor = properties.fontColor;} - if (properties.fontSize !== undefined) {this.fontSize = properties.fontSize;} - if (properties.fontFace !== undefined) {this.fontFace = properties.fontFace;} - if (properties.fontFill !== undefined) {this.fontFill = properties.fontFill;} + if (this.constants.maxVelocity > 0) { + for (nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + nodes[nodeId].discreteStepLimited(interval, this.constants.maxVelocity); + nodesPresent = true; + } + } } - - if (properties.title !== undefined) {this.title = properties.title;} - if (properties.width !== undefined) {this.width = properties.width;} - if (properties.widthSelectionMultiplier !== undefined) - {this.widthSelectionMultiplier = properties.widthSelectionMultiplier;} - if (properties.hoverWidth !== undefined) {this.hoverWidth = properties.hoverWidth;} - if (properties.value !== undefined) {this.value = properties.value;} - if (properties.length !== undefined) {this.length = properties.length; - this.customLength = true;} - - // scale the arrow - if (properties.arrowScaleFactor !== undefined) {this.arrowScaleFactor = properties.arrowScaleFactor;} - - if (properties.inheritColor !== undefined) {this.inheritColor = properties.inheritColor;} - - // Added to support dashed lines - // David Jordan - // 2012-08-08 - if (properties.dash) { - if (properties.dash.length !== undefined) {this.dash.length = properties.dash.length;} - if (properties.dash.gap !== undefined) {this.dash.gap = properties.dash.gap;} - if (properties.dash.altLength !== undefined) {this.dash.altLength = properties.dash.altLength;} + else { + for (nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + nodes[nodeId].discreteStep(interval); + nodesPresent = true; + } + } } - if (properties.color !== undefined) { - if (util.isString(properties.color)) { - this.color.color = properties.color; - this.color.highlight = properties.color; + if (nodesPresent == true) { + var vminCorrected = this.constants.minVelocity / Math.max(this.scale,0.05); + if (vminCorrected > 0.5*this.constants.maxVelocity) { + this.moving = true; } else { - if (properties.color.color !== undefined) {this.color.color = properties.color.color;} - if (properties.color.highlight !== undefined) {this.color.highlight = properties.color.highlight;} - if (properties.color.hover !== undefined) {this.color.hover = properties.color.hover;} + this.moving = this._isMoving(vminCorrected) || this.constants.configurePhysics; } } + }; - // A node is connected when it has a from and to node. - this.connect(); + /** + * A single simulation step (or "tick") in the physics simulation + * + * @private + */ + Network.prototype._physicsTick = function() { + if (!this.freezeSimulation) { + if (this.moving) { + this._doInAllActiveSectors("_initializeForceCalculation"); + this._doInAllActiveSectors("_discreteStepNodes"); + if (this.constants.smoothCurves) { + this._doInSupportSector("_discreteStepNodes"); + } + this._findCenter(this._getRange()) + } + } + }; - this.widthFixed = this.widthFixed || (properties.width !== undefined); - this.lengthFixed = this.lengthFixed || (properties.length !== undefined); - this.widthSelected = this.width * this.widthSelectionMultiplier; + /** + * This function runs one step of the animation. It calls an x amount of physics ticks and one render tick. + * It reschedules itself at the beginning of the function + * + * @private + */ + Network.prototype._animationStep = function() { + // reset the timer so a new scheduled animation step can be set + this.timer = undefined; + // handle the keyboad movement + this._handleNavigation(); - // set draw method based on style - switch (this.style) { - case 'line': this.draw = this._drawLine; break; - case 'arrow': this.draw = this._drawArrow; break; - case 'arrow-center': this.draw = this._drawArrowCenter; break; - case 'dash-line': this.draw = this._drawDashLine; break; - default: this.draw = this._drawLine; break; + // this schedules a new animation step + this.start(); + + // start the physics simulation + var calculationTime = Date.now(); + var maxSteps = 1; + this._physicsTick(); + var timeRequired = Date.now() - calculationTime; + while (timeRequired < 0.9*(this.renderTimestep - this.renderTime) && maxSteps < this.maxPhysicsTicksPerRender) { + this._physicsTick(); + timeRequired = Date.now() - calculationTime; + maxSteps++; } + + // start the rendering process + var renderTime = Date.now(); + this._redraw(); + this.renderTime = Date.now() - renderTime; + }; + if (typeof window !== 'undefined') { + window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; + } + /** - * Connect an edge to its nodes + * Schedule a animation step with the refreshrate interval. */ - Edge.prototype.connect = function () { - this.disconnect(); + Network.prototype.start = function() { + if (this.moving || this.xIncrement != 0 || this.yIncrement != 0 || this.zoomIncrement != 0) { + if (!this.timer) { + var ua = navigator.userAgent.toLowerCase(); - this.from = this.network.nodes[this.fromId] || null; - this.to = this.network.nodes[this.toId] || null; - this.connected = (this.from && this.to); + var requiresTimeout = false; + if (ua.indexOf('msie 9.0') != -1) { // IE 9 + requiresTimeout = true; + } + else if (ua.indexOf('safari') != -1) { // safari + if (ua.indexOf('chrome') <= -1) { + requiresTimeout = true; + } + } - if (this.connected) { - this.from.attachEdge(this); - this.to.attachEdge(this); + if (requiresTimeout == true) { + this.timer = window.setTimeout(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function + } + else{ + this.timer = window.requestAnimationFrame(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function + } + } } else { - if (this.from) { - this.from.detachEdge(this); - } - if (this.to) { - this.to.detachEdge(this); - } + this._redraw(); } }; + /** - * Disconnect an edge from its nodes + * Move the network according to the keyboard presses. + * + * @private */ - Edge.prototype.disconnect = function () { - if (this.from) { - this.from.detachEdge(this); - this.from = null; + Network.prototype._handleNavigation = function() { + if (this.xIncrement != 0 || this.yIncrement != 0) { + var translation = this._getTranslation(); + this._setTranslation(translation.x+this.xIncrement, translation.y+this.yIncrement); } - if (this.to) { - this.to.detachEdge(this); - this.to = null; + if (this.zoomIncrement != 0) { + var center = { + x: this.frame.canvas.clientWidth / 2, + y: this.frame.canvas.clientHeight / 2 + }; + this._zoom(this.scale*(1 + this.zoomIncrement), center); } - - this.connected = false; - }; - - /** - * get the title of this edge. - * @return {string} title The title of the edge, or undefined when no title - * has been set. - */ - Edge.prototype.getTitle = function() { - return typeof this.title === "function" ? this.title() : this.title; }; /** - * Retrieve the value of the edge. Can be undefined - * @return {Number} value - */ - Edge.prototype.getValue = function() { - return this.value; - }; - - /** - * Adjust the value range of the edge. The edge will adjust it's width - * based on its value. - * @param {Number} min - * @param {Number} max + * Freeze the _animationStep */ - Edge.prototype.setValueRange = function(min, max) { - if (!this.widthFixed && this.value !== undefined) { - var scale = (this.widthMax - this.widthMin) / (max - min); - this.width = (this.value - min) * scale + this.widthMin; + Network.prototype.toggleFreeze = function() { + if (this.freezeSimulation == false) { + this.freezeSimulation = true; + } + else { + this.freezeSimulation = false; + this.start(); } }; - /** - * Redraw a edge - * Draw this edge in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx - */ - Edge.prototype.draw = function(ctx) { - throw "Method draw not initialized in edge"; - }; /** - * Check if this object is overlapping with the provided object - * @param {Object} obj an object with parameters left, top - * @return {boolean} True if location is located on the edge + * This function cleans the support nodes if they are not needed and adds them when they are. + * + * @param {boolean} [disableStart] + * @private */ - Edge.prototype.isOverlappingWith = function(obj) { - if (this.connected) { - var distMax = 10; - var xFrom = this.from.x; - var yFrom = this.from.y; - var xTo = this.to.x; - var yTo = this.to.y; - var xObj = obj.left; - var yObj = obj.top; - - var dist = this._getDistanceToEdge(xFrom, yFrom, xTo, yTo, xObj, yObj); - - return (dist < distMax); + Network.prototype._configureSmoothCurves = function(disableStart) { + if (disableStart === undefined) { + disableStart = true; } - else { - return false + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this._createBezierNodes(); } - }; - - Edge.prototype._getColor = function() { - var colorObj = this.color; - if (this.inheritColor == "to") { - colorObj = { - highlight: this.to.color.highlight.border, - hover: this.to.color.hover.border, - color: this.to.color.border - }; + else { + // delete the support nodes + this.sectors['support']['nodes'] = {}; + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + this.edges[edgeId].smooth = false; + this.edges[edgeId].via = null; + } + } } - else if (this.inheritColor == "from" || this.inheritColor == true) { - colorObj = { - highlight: this.from.color.highlight.border, - hover: this.from.color.hover.border, - color: this.from.color.border - }; + this._updateCalculationNodes(); + if (!disableStart) { + this.moving = true; + this.start(); } - - if (this.selected == true) {return colorObj.highlight;} - else if (this.hover == true) {return colorObj.hover;} - else {return colorObj.color;} - } + }; /** - * Redraw a edge as a line - * Draw this edge in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx + * Bezier curves require an anchor point to calculate the smooth flow. These points are nodes. These nodes are invisible but + * are used for the force calculation. + * * @private */ - Edge.prototype._drawLine = function(ctx) { - // set style - ctx.strokeStyle = this._getColor(); - ctx.lineWidth = this._getLineWidth(); - - if (this.from != this.to) { - // draw line - var via = this._line(ctx); - - // draw label - var point; - if (this.label) { - if (this.smoothCurves.enabled == true && via != null) { - var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); - var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); - point = {x:midpointX, y:midpointY}; - } - else { - point = this._pointOnLine(0.5); + Network.prototype._createBezierNodes = function() { + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + var edge = this.edges[edgeId]; + if (edge.via == null) { + edge.smooth = true; + var nodeId = "edgeId:".concat(edge.id); + this.sectors['support']['nodes'][nodeId] = new Node( + {id:nodeId, + mass:1, + shape:'circle', + image:"", + internalMultiplier:1 + },{},{},this.constants); + edge.via = this.sectors['support']['nodes'][nodeId]; + edge.via.parentEdgeId = edge.id; + edge.positionBezierNode(); + } } - this._label(ctx, this.label, point.x, point.y); } } - else { - var x, y; - var radius = this.length / 4; - var node = this.from; - if (!node.width) { - node.resize(ctx); - } - if (node.width > node.height) { - x = node.x + node.width / 2; - y = node.y - radius; + }; + + /** + * load the functions that load the mixins into the prototype. + * + * @private + */ + Network.prototype._initializeMixinLoaders = function () { + for (var mixin in MixinLoader) { + if (MixinLoader.hasOwnProperty(mixin)) { + Network.prototype[mixin] = MixinLoader[mixin]; } - else { - x = node.x + radius; - y = node.y - node.height / 2; + } + }; + + /** + * Load the XY positions of the nodes into the dataset. + */ + Network.prototype.storePosition = function() { + var dataArray = []; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + var allowedToMoveX = !this.nodes.xFixed; + var allowedToMoveY = !this.nodes.yFixed; + if (this.nodesData._data[nodeId].x != Math.round(node.x) || this.nodesData._data[nodeId].y != Math.round(node.y)) { + dataArray.push({id:nodeId,x:Math.round(node.x),y:Math.round(node.y),allowedToMoveX:allowedToMoveX,allowedToMoveY:allowedToMoveY}); + } } - this._circle(ctx, x, y, radius); - point = this._pointOnCircle(x, y, radius, 0.5); - this._label(ctx, this.label, point.x, point.y); } + this.nodesData.update(dataArray); }; + /** - * Get the line width of the edge. Depends on width and whether one of the - * connected nodes is selected. - * @return {Number} width - * @private + * Center a node in view. + * + * @param {Number} nodeId + * @param {Number} [zoomLevel] */ - Edge.prototype._getLineWidth = function() { - if (this.selected == true) { - return Math.min(this.widthSelected, this.widthMax)*this.networkScaleInv; + Network.prototype.focusOnNode = function (nodeId, zoomLevel) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (zoomLevel === undefined) { + zoomLevel = this._getScale(); + } + var nodePosition= {x: this.nodes[nodeId].x, y: this.nodes[nodeId].y}; + + var requiredScale = zoomLevel; + this._setScale(requiredScale); + + var canvasCenter = this.DOMtoCanvas({x:0.5 * this.frame.canvas.width,y:0.5 * this.frame.canvas.height}); + var translation = this._getTranslation(); + + var distanceFromCenter = {x:canvasCenter.x - nodePosition.x, + y:canvasCenter.y - nodePosition.y}; + + this._setTranslation(translation.x + requiredScale * distanceFromCenter.x, + translation.y + requiredScale * distanceFromCenter.y); + this.redraw(); } else { - if (this.hover == true) { - return Math.min(this.hoverWidth, this.widthMax)*this.networkScaleInv; - } - else { - return this.width*this.networkScaleInv; - } + console.log("This nodeId cannot be found.") } }; - Edge.prototype._getViaCoordinates = function () { - var xVia = null; - var yVia = null; - var factor = this.smoothCurves.roundness; - var type = this.smoothCurves.type; - if (factor == 0) { - return {x:null,y:null}; - } + module.exports = Network; - var dx = Math.abs(this.from.x - this.to.x); - var dy = Math.abs(this.from.y - this.to.y); - if (type == 'discrete' || type == 'diagonalCross') { - if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { - if (this.from.y > this.to.y) { - if (this.from.x < this.to.x) { - xVia = this.from.x + factor * dy; - yVia = this.from.y - factor * dy; - } - else if (this.from.x > this.to.x) { - xVia = this.from.x - factor * dy; - yVia = this.from.y - factor * dy; - } - } - else if (this.from.y < this.to.y) { - if (this.from.x < this.to.x) { - xVia = this.from.x + factor * dy; - yVia = this.from.y + factor * dy; - } - else if (this.from.x > this.to.x) { - xVia = this.from.x - factor * dy; - yVia = this.from.y + factor * dy; - } - } - if (type == "discrete") { - xVia = dx < factor * dy ? this.from.x : xVia; - } - } - else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { - if (this.from.y > this.to.y) { - if (this.from.x < this.to.x) { - xVia = this.from.x + factor * dx; - yVia = this.from.y - factor * dx; - } - else if (this.from.x > this.to.x) { - xVia = this.from.x - factor * dx; - yVia = this.from.y - factor * dx; - } - } - else if (this.from.y < this.to.y) { - if (this.from.x < this.to.x) { - xVia = this.from.x + factor * dx; - yVia = this.from.y + factor * dx; - } - else if (this.from.x > this.to.x) { - xVia = this.from.x - factor * dx; - yVia = this.from.y + factor * dx; - } - } - if (type == "discrete") { - yVia = dy < factor * dx ? this.from.y : yVia; - } - } - } - else if (type == "straightCross") { - if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { - xVia = this.from.x; - yVia = this.to.y - } - else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { - xVia = this.to.x; - yVia = this.from.y; - } - } - else if (type == 'horizontal') { - xVia = this.to.x; - yVia = this.from.y; - } - else if (type == 'vertical') { - xVia = this.from.x; - yVia = this.to.y; - } - else { // continuous - if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { - if (this.from.y > this.to.y) { - if (this.from.x < this.to.x) { - // console.log(1) - xVia = this.from.x + factor * dy; - yVia = this.from.y - factor * dy; - xVia = this.to.x < xVia ? this.to.x : xVia; - } - else if (this.from.x > this.to.x) { - // console.log(2) - xVia = this.from.x - factor * dy; - yVia = this.from.y - factor * dy; - xVia = this.to.x > xVia ? this.to.x :xVia; - } - } - else if (this.from.y < this.to.y) { - if (this.from.x < this.to.x) { - // console.log(3) - xVia = this.from.x + factor * dy; - yVia = this.from.y + factor * dy; - xVia = this.to.x < xVia ? this.to.x : xVia; - } - else if (this.from.x > this.to.x) { - // console.log(4, this.from.x, this.to.x) - xVia = this.from.x - factor * dy; - yVia = this.from.y + factor * dy; - xVia = this.to.x > xVia ? this.to.x : xVia; - } - } - } - else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { - if (this.from.y > this.to.y) { - if (this.from.x < this.to.x) { - // console.log(5) - xVia = this.from.x + factor * dx; - yVia = this.from.y - factor * dx; - yVia = this.to.y > yVia ? this.to.y : yVia; - } - else if (this.from.x > this.to.x) { - // console.log(6) - xVia = this.from.x - factor * dx; - yVia = this.from.y - factor * dx; - yVia = this.to.y > yVia ? this.to.y : yVia; - } - } - else if (this.from.y < this.to.y) { - if (this.from.x < this.to.x) { - // console.log(7) - xVia = this.from.x + factor * dx; - yVia = this.from.y + factor * dx; - yVia = this.to.y < yVia ? this.to.y : yVia; - } - else if (this.from.x > this.to.x) { - // console.log(8) - xVia = this.from.x - factor * dx; - yVia = this.from.y + factor * dx; - yVia = this.to.y < yVia ? this.to.y : yVia; - } - } - } + +/***/ }, +/* 27 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); + var Node = __webpack_require__(30); + + /** + * @class Edge + * + * A edge connects two nodes + * @param {Object} properties Object with properties. Must contain + * At least properties from and to. + * Available properties: from (number), + * to (number), label (string, color (string), + * width (number), style (string), + * length (number), title (string) + * @param {Network} network A Network object, used to find and edge to + * nodes. + * @param {Object} constants An object with default values for + * example for the color + */ + function Edge (properties, network, constants) { + if (!network) { + throw "No network provided"; } + this.network = network; + + // initialize constants + this.widthMin = constants.edges.widthMin; + this.widthMax = constants.edges.widthMax; + + // initialize variables + this.id = undefined; + this.fromId = undefined; + this.toId = undefined; + this.style = constants.edges.style; + this.title = undefined; + this.width = constants.edges.width; + this.widthSelectionMultiplier = constants.edges.widthSelectionMultiplier; + this.widthSelected = this.width * this.widthSelectionMultiplier; + this.hoverWidth = constants.edges.hoverWidth; + this.value = undefined; + this.length = constants.physics.springLength; + this.customLength = false; + this.selected = false; + this.hover = false; + this.smoothCurves = constants.smoothCurves; + this.dynamicSmoothCurves = constants.dynamicSmoothCurves; + this.arrowScaleFactor = constants.edges.arrowScaleFactor; + this.inheritColor = constants.edges.inheritColor; + + this.from = null; // a node + this.to = null; // a node + this.via = null; // a temp node + + // we use this to be able to reconnect the edge to a cluster if its node is put into a cluster + // by storing the original information we can revert to the original connection when the cluser is opened. + this.originalFromId = []; + this.originalToId = []; + + this.connected = false; + + // Added to support dashed lines + // David Jordan + // 2012-08-08 + this.dash = util.extend({}, constants.edges.dash); // contains properties length, gap, altLength + + this.color = {color:constants.edges.color.color, + highlight:constants.edges.color.highlight, + hover:constants.edges.color.hover}; + this.widthFixed = false; + this.lengthFixed = false; + this.setProperties(properties, constants); - return {x:xVia, y:yVia}; + this.controlNodesEnabled = false; + this.controlNodes = {from:null, to:null, positions:{}}; + this.connectedNode = null; } /** - * Draw a line between two nodes - * @param {CanvasRenderingContext2D} ctx - * @private + * Set or overwrite properties for the edge + * @param {Object} properties an object with properties + * @param {Object} constants and object with default, global properties */ - Edge.prototype._line = function (ctx) { - // draw a straight line - ctx.beginPath(); - ctx.moveTo(this.from.x, this.from.y); - if (this.smoothCurves.enabled == true) { - if (this.smoothCurves.dynamic == false) { - var via = this._getViaCoordinates(); - if (via.x == null) { - ctx.lineTo(this.to.x, this.to.y); - ctx.stroke(); - return null; - } - else { - // this.via.x = via.x; - // this.via.y = via.y; - ctx.quadraticCurveTo(via.x,via.y,this.to.x, this.to.y); - ctx.stroke(); - return via; - } - } - else { - ctx.quadraticCurveTo(this.via.x,this.via.y,this.to.x, this.to.y); - ctx.stroke(); - return this.via; - } - } - else { - ctx.lineTo(this.to.x, this.to.y); - ctx.stroke(); - return null; + Edge.prototype.setProperties = function(properties, constants) { + if (!properties) { + return; } - }; - /** - * Draw a line from a node to itself, a circle - * @param {CanvasRenderingContext2D} ctx - * @param {Number} x - * @param {Number} y - * @param {Number} radius - * @private - */ - Edge.prototype._circle = function (ctx, x, y, radius) { - // draw a circle - ctx.beginPath(); - ctx.arc(x, y, radius, 0, 2 * Math.PI, false); - ctx.stroke(); - }; + if (properties.from !== undefined) {this.fromId = properties.from;} + if (properties.to !== undefined) {this.toId = properties.to;} - /** - * Draw label with white background and with the middle at (x, y) - * @param {CanvasRenderingContext2D} ctx - * @param {String} text - * @param {Number} x - * @param {Number} y - * @private - */ - Edge.prototype._label = function (ctx, text, x, y) { - if (text) { - // TODO: cache the calculated size - ctx.font = ((this.from.selected || this.to.selected) ? "bold " : "") + - this.fontSize + "px " + this.fontFace; - ctx.fillStyle = this.fontFill; - var width = ctx.measureText(text).width; - var height = this.fontSize; - var left = x - width / 2; - var top = y - height / 2; + if (properties.id !== undefined) {this.id = properties.id;} + if (properties.style !== undefined) {this.style = properties.style;} + if (properties.label !== undefined) {this.label = properties.label;} - ctx.fillRect(left, top, width, height); + if (this.label) { + this.fontSize = constants.edges.fontSize; + this.fontFace = constants.edges.fontFace; + this.fontColor = constants.edges.fontColor; + this.fontFill = constants.edges.fontFill; - // draw text - ctx.fillStyle = this.fontColor || "black"; - ctx.textAlign = "left"; - ctx.textBaseline = "top"; - ctx.fillText(text, left, top); + if (properties.fontColor !== undefined) {this.fontColor = properties.fontColor;} + if (properties.fontSize !== undefined) {this.fontSize = properties.fontSize;} + if (properties.fontFace !== undefined) {this.fontFace = properties.fontFace;} + if (properties.fontFill !== undefined) {this.fontFill = properties.fontFill;} } - }; - /** - * Redraw a edge as a dashed line - * Draw this edge in the given canvas - * @author David Jordan - * @date 2012-08-08 - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx - * @private - */ - Edge.prototype._drawDashLine = function(ctx) { - // set style - if (this.selected == true) {ctx.strokeStyle = this.color.highlight;} - else if (this.hover == true) {ctx.strokeStyle = this.color.hover;} - else {ctx.strokeStyle = this.color.color;} + if (properties.title !== undefined) {this.title = properties.title;} + if (properties.width !== undefined) {this.width = properties.width;} + if (properties.widthSelectionMultiplier !== undefined) + {this.widthSelectionMultiplier = properties.widthSelectionMultiplier;} + if (properties.hoverWidth !== undefined) {this.hoverWidth = properties.hoverWidth;} + if (properties.value !== undefined) {this.value = properties.value;} + if (properties.length !== undefined) {this.length = properties.length; + this.customLength = true;} - ctx.lineWidth = this._getLineWidth(); + // scale the arrow + if (properties.arrowScaleFactor !== undefined) {this.arrowScaleFactor = properties.arrowScaleFactor;} - var via = null; - // only firefox and chrome support this method, else we use the legacy one. - if (ctx.mozDash !== undefined || ctx.setLineDash !== undefined) { - // configure the dash pattern - var pattern = [0]; - if (this.dash.length !== undefined && this.dash.gap !== undefined) { - pattern = [this.dash.length,this.dash.gap]; + if (properties.inheritColor !== undefined) {this.inheritColor = properties.inheritColor;} + + // Added to support dashed lines + // David Jordan + // 2012-08-08 + if (properties.dash) { + if (properties.dash.length !== undefined) {this.dash.length = properties.dash.length;} + if (properties.dash.gap !== undefined) {this.dash.gap = properties.dash.gap;} + if (properties.dash.altLength !== undefined) {this.dash.altLength = properties.dash.altLength;} + } + + if (properties.color !== undefined) { + if (util.isString(properties.color)) { + this.color.color = properties.color; + this.color.highlight = properties.color; } else { - pattern = [5,5]; + if (properties.color.color !== undefined) {this.color.color = properties.color.color;} + if (properties.color.highlight !== undefined) {this.color.highlight = properties.color.highlight;} + if (properties.color.hover !== undefined) {this.color.hover = properties.color.hover;} } + } - // set dash settings for chrome or firefox - if (typeof ctx.setLineDash !== 'undefined') { //Chrome - ctx.setLineDash(pattern); - ctx.lineDashOffset = 0; + // A node is connected when it has a from and to node. + this.connect(); - } else { //Firefox - ctx.mozDash = pattern; - ctx.mozDashOffset = 0; - } + this.widthFixed = this.widthFixed || (properties.width !== undefined); + this.lengthFixed = this.lengthFixed || (properties.length !== undefined); - // draw the line - via = this._line(ctx); + this.widthSelected = this.width * this.widthSelectionMultiplier; - // restore the dash settings. - if (typeof ctx.setLineDash !== 'undefined') { //Chrome - ctx.setLineDash([0]); - ctx.lineDashOffset = 0; + // set draw method based on style + switch (this.style) { + case 'line': this.draw = this._drawLine; break; + case 'arrow': this.draw = this._drawArrow; break; + case 'arrow-center': this.draw = this._drawArrowCenter; break; + case 'dash-line': this.draw = this._drawDashLine; break; + default: this.draw = this._drawLine; break; + } + }; - } else { //Firefox - ctx.mozDash = [0]; - ctx.mozDashOffset = 0; - } + /** + * Connect an edge to its nodes + */ + Edge.prototype.connect = function () { + this.disconnect(); + + this.from = this.network.nodes[this.fromId] || null; + this.to = this.network.nodes[this.toId] || null; + this.connected = (this.from && this.to); + + if (this.connected) { + this.from.attachEdge(this); + this.to.attachEdge(this); } - else { // unsupporting smooth lines - // draw dashed line - ctx.beginPath(); - ctx.lineCap = 'round'; - if (this.dash.altLength !== undefined) //If an alt dash value has been set add to the array this value - { - ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, - [this.dash.length,this.dash.gap,this.dash.altLength,this.dash.gap]); - } - else if (this.dash.length !== undefined && this.dash.gap !== undefined) //If a dash and gap value has been set add to the array this value - { - ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, - [this.dash.length,this.dash.gap]); + else { + if (this.from) { + this.from.detachEdge(this); } - else //If all else fails draw a line - { - ctx.moveTo(this.from.x, this.from.y); - ctx.lineTo(this.to.x, this.to.y); + if (this.to) { + this.to.detachEdge(this); } - ctx.stroke(); } + }; - // draw label - if (this.label) { - var point; - if (this.smoothCurves.enabled == true && via != null) { - var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); - var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); - point = {x:midpointX, y:midpointY}; - } - else { - point = this._pointOnLine(0.5); - } - this._label(ctx, this.label, point.x, point.y); + /** + * Disconnect an edge from its nodes + */ + Edge.prototype.disconnect = function () { + if (this.from) { + this.from.detachEdge(this); + this.from = null; + } + if (this.to) { + this.to.detachEdge(this); + this.to = null; } + + this.connected = false; + }; + + /** + * get the title of this edge. + * @return {string} title The title of the edge, or undefined when no title + * has been set. + */ + Edge.prototype.getTitle = function() { + return typeof this.title === "function" ? this.title() : this.title; }; + /** - * Get a point on a line - * @param {Number} percentage. Value between 0 (line start) and 1 (line end) - * @return {Object} point - * @private + * Retrieve the value of the edge. Can be undefined + * @return {Number} value */ - Edge.prototype._pointOnLine = function (percentage) { - return { - x: (1 - percentage) * this.from.x + percentage * this.to.x, - y: (1 - percentage) * this.from.y + percentage * this.to.y - } + Edge.prototype.getValue = function() { + return this.value; }; /** - * Get a point on a circle - * @param {Number} x - * @param {Number} y - * @param {Number} radius - * @param {Number} percentage. Value between 0 (line start) and 1 (line end) - * @return {Object} point - * @private + * Adjust the value range of the edge. The edge will adjust it's width + * based on its value. + * @param {Number} min + * @param {Number} max */ - Edge.prototype._pointOnCircle = function (x, y, radius, percentage) { - var angle = (percentage - 3/8) * 2 * Math.PI; - return { - x: x + radius * Math.cos(angle), - y: y - radius * Math.sin(angle) + Edge.prototype.setValueRange = function(min, max) { + if (!this.widthFixed && this.value !== undefined) { + var scale = (this.widthMax - this.widthMin) / (max - min); + this.width = (this.value - min) * scale + this.widthMin; } }; /** - * Redraw a edge as a line with an arrow halfway the line + * Redraw a edge * Draw this edge in the given canvas * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); * @param {CanvasRenderingContext2D} ctx - * @private */ - Edge.prototype._drawArrowCenter = function(ctx) { - var point; - // set style - if (this.selected == true) {ctx.strokeStyle = this.color.highlight; ctx.fillStyle = this.color.highlight;} - else if (this.hover == true) {ctx.strokeStyle = this.color.hover; ctx.fillStyle = this.color.hover;} - else {ctx.strokeStyle = this.color.color; ctx.fillStyle = this.color.color;} - ctx.lineWidth = this._getLineWidth(); - - if (this.from != this.to) { - // draw line - var via = this._line(ctx); - - var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); - var length = (10 + 5 * this.width) * this.arrowScaleFactor; - // draw an arrow halfway the line - if (this.smoothCurves.enabled == true && via != null) { - var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); - var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); - point = {x:midpointX, y:midpointY}; - } - else { - point = this._pointOnLine(0.5); - } - - ctx.arrow(point.x, point.y, angle, length); - ctx.fill(); - ctx.stroke(); - - // draw label - if (this.label) { - this._label(ctx, this.label, point.x, point.y); - } - } - else { - // draw circle - var x, y; - var radius = 0.25 * Math.max(100,this.length); - var node = this.from; - if (!node.width) { - node.resize(ctx); - } - if (node.width > node.height) { - x = node.x + node.width * 0.5; - y = node.y - radius; - } - else { - x = node.x + radius; - y = node.y - node.height * 0.5; - } - this._circle(ctx, x, y, radius); - - // draw all arrows - var angle = 0.2 * Math.PI; - var length = (10 + 5 * this.width) * this.arrowScaleFactor; - point = this._pointOnCircle(x, y, radius, 0.5); - ctx.arrow(point.x, point.y, angle, length); - ctx.fill(); - ctx.stroke(); - - // draw label - if (this.label) { - point = this._pointOnCircle(x, y, radius, 0.5); - this._label(ctx, this.label, point.x, point.y); - } - } + Edge.prototype.draw = function(ctx) { + throw "Method draw not initialized in edge"; }; - - /** - * Redraw a edge as a line with an arrow - * Draw this edge in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx - * @private + * Check if this object is overlapping with the provided object + * @param {Object} obj an object with parameters left, top + * @return {boolean} True if location is located on the edge */ - Edge.prototype._drawArrow = function(ctx) { - // set style - if (this.selected == true) {ctx.strokeStyle = this.color.highlight; ctx.fillStyle = this.color.highlight;} - else if (this.hover == true) {ctx.strokeStyle = this.color.hover; ctx.fillStyle = this.color.hover;} - else {ctx.strokeStyle = this.color.color; ctx.fillStyle = this.color.color;} - - ctx.lineWidth = this._getLineWidth(); - - var angle, length; - //draw a line - if (this.from != this.to) { - angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); - var dx = (this.to.x - this.from.x); - var dy = (this.to.y - this.from.y); - var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); - - var fromBorderDist = this.from.distanceToBorder(ctx, angle + Math.PI); - var fromBorderPoint = (edgeSegmentLength - fromBorderDist) / edgeSegmentLength; - var xFrom = (fromBorderPoint) * this.from.x + (1 - fromBorderPoint) * this.to.x; - var yFrom = (fromBorderPoint) * this.from.y + (1 - fromBorderPoint) * this.to.y; - - var via; - if (this.smoothCurves.dynamic == true && this.smoothCurves.enabled == true ) { - via = this.via; - } - else if (this.smoothCurves.enabled == true) { - via = this._getViaCoordinates(); - } - - if (this.smoothCurves.enabled == true && via.x != null) { - angle = Math.atan2((this.to.y - via.y), (this.to.x - via.x)); - dx = (this.to.x - via.x); - dy = (this.to.y - via.y); - edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); - } - var toBorderDist = this.to.distanceToBorder(ctx, angle); - var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; - - var xTo,yTo; - if (this.smoothCurves.enabled == true && via.x != null) { - xTo = (1 - toBorderPoint) * via.x + toBorderPoint * this.to.x; - yTo = (1 - toBorderPoint) * via.y + toBorderPoint * this.to.y; - } - else { - xTo = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; - yTo = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; - } - - ctx.beginPath(); - ctx.moveTo(xFrom,yFrom); - if (this.smoothCurves.enabled == true && via.x != null) { - ctx.quadraticCurveTo(via.x,via.y,xTo, yTo); - } - else { - ctx.lineTo(xTo, yTo); - } - ctx.stroke(); + Edge.prototype.isOverlappingWith = function(obj) { + if (this.connected) { + var distMax = 10; + var xFrom = this.from.x; + var yFrom = this.from.y; + var xTo = this.to.x; + var yTo = this.to.y; + var xObj = obj.left; + var yObj = obj.top; - // draw arrow at the end of the line - length = (10 + 5 * this.width) * this.arrowScaleFactor; - ctx.arrow(xTo, yTo, angle, length); - ctx.fill(); - ctx.stroke(); + var dist = this._getDistanceToEdge(xFrom, yFrom, xTo, yTo, xObj, yObj); - // draw label - if (this.label) { - var point; - if (this.smoothCurves.enabled == true && via != null) { - var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); - var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); - point = {x:midpointX, y:midpointY}; - } - else { - point = this._pointOnLine(0.5); - } - this._label(ctx, this.label, point.x, point.y); - } + return (dist < distMax); } else { - // draw circle - var node = this.from; - var x, y, arrow; - var radius = 0.25 * Math.max(100,this.length); - if (!node.width) { - node.resize(ctx); - } - if (node.width > node.height) { - x = node.x + node.width * 0.5; - y = node.y - radius; - arrow = { - x: x, - y: node.y, - angle: 0.9 * Math.PI - }; - } - else { - x = node.x + radius; - y = node.y - node.height * 0.5; - arrow = { - x: node.x, - y: y, - angle: 0.6 * Math.PI - }; - } - ctx.beginPath(); - // TODO: similarly, for a line without arrows, draw to the border of the nodes instead of the center - ctx.arc(x, y, radius, 0, 2 * Math.PI, false); - ctx.stroke(); - - // draw all arrows - var length = (10 + 5 * this.width) * this.arrowScaleFactor; - ctx.arrow(arrow.x, arrow.y, arrow.angle, length); - ctx.fill(); - ctx.stroke(); + return false + } + }; - // draw label - if (this.label) { - point = this._pointOnCircle(x, y, radius, 0.5); - this._label(ctx, this.label, point.x, point.y); - } + Edge.prototype._getColor = function() { + var colorObj = this.color; + if (this.inheritColor == "to") { + colorObj = { + highlight: this.to.color.highlight.border, + hover: this.to.color.hover.border, + color: this.to.color.border + }; + } + else if (this.inheritColor == "from" || this.inheritColor == true) { + colorObj = { + highlight: this.from.color.highlight.border, + hover: this.from.color.hover.border, + color: this.from.color.border + }; } - }; + if (this.selected == true) {return colorObj.highlight;} + else if (this.hover == true) {return colorObj.hover;} + else {return colorObj.color;} + } /** - * Calculate the distance between a point (x3,y3) and a line segment from - * (x1,y1) to (x2,y2). - * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment - * @param {number} x1 - * @param {number} y1 - * @param {number} x2 - * @param {number} y2 - * @param {number} x3 - * @param {number} y3 + * Redraw a edge as a line + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx * @private */ - Edge.prototype._getDistanceToEdge = function (x1,y1, x2,y2, x3,y3) { // x3,y3 is the point + Edge.prototype._drawLine = function(ctx) { + // set style + ctx.strokeStyle = this._getColor(); + ctx.lineWidth = this._getLineWidth(); + if (this.from != this.to) { - if (this.smoothCurves.enabled == true) { - var xVia, yVia; - if (this.smoothCurves.enabled == true && this.smoothCurves.dynamic == true) { - xVia = this.via.x; - yVia = this.via.y; - } - else { - var via = this._getViaCoordinates(); - xVia = via.x; - yVia = via.y; - } - var minDistance = 1e9; - var i,t,x,y,dx,dy; - for (i = 0; i < 10; i++) { - t = 0.1*i; - x = Math.pow(1-t,2)*x1 + (2*t*(1 - t))*xVia + Math.pow(t,2)*x2; - y = Math.pow(1-t,2)*y1 + (2*t*(1 - t))*yVia + Math.pow(t,2)*y2; - dx = Math.abs(x3-x); - dy = Math.abs(y3-y); - minDistance = Math.min(minDistance,Math.sqrt(dx*dx + dy*dy)); - } - return minDistance - } - else { - var px = x2-x1, - py = y2-y1, - something = px*px + py*py, - u = ((x3 - x1) * px + (y3 - y1) * py) / something; + // draw line + var via = this._line(ctx); - if (u > 1) { - u = 1; + // draw label + var point; + if (this.label) { + if (this.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; } - else if (u < 0) { - u = 0; + else { + point = this._pointOnLine(0.5); } - - var x = x1 + u * px, - y = y1 + u * py, - dx = x - x3, - dy = y - y3; - - //# Note: If the actual distance does not matter, - //# if you only want to compare what this function - //# returns to other results of this function, you - //# can just return the squared distance instead - //# (i.e. remove the sqrt) to gain a little performance - - return Math.sqrt(dx*dx + dy*dy); + this._label(ctx, this.label, point.x, point.y); } } else { - var x, y, dx, dy; + var x, y; var radius = this.length / 4; var node = this.from; if (!node.width) { @@ -17519,9842 +16875,10504 @@ return /******/ (function(modules) { // webpackBootstrap x = node.x + radius; y = node.y - node.height / 2; } - dx = x - x3; - dy = y - y3; - return Math.abs(Math.sqrt(dx*dx + dy*dy) - radius); + this._circle(ctx, x, y, radius); + point = this._pointOnCircle(x, y, radius, 0.5); + this._label(ctx, this.label, point.x, point.y); } }; - - /** - * This allows the zoom level of the network to influence the rendering - * - * @param scale + * Get the line width of the edge. Depends on width and whether one of the + * connected nodes is selected. + * @return {Number} width + * @private */ - Edge.prototype.setScale = function(scale) { - this.networkScaleInv = 1.0/scale; + Edge.prototype._getLineWidth = function() { + if (this.selected == true) { + return Math.min(this.widthSelected, this.widthMax)*this.networkScaleInv; + } + else { + if (this.hover == true) { + return Math.min(this.hoverWidth, this.widthMax)*this.networkScaleInv; + } + else { + return this.width*this.networkScaleInv; + } + } }; + Edge.prototype._getViaCoordinates = function () { + var xVia = null; + var yVia = null; + var factor = this.smoothCurves.roundness; + var type = this.smoothCurves.type; + if (factor == 0) { + return {x:null,y:null}; + } - Edge.prototype.select = function() { - this.selected = true; - }; + var dx = Math.abs(this.from.x - this.to.x); + var dy = Math.abs(this.from.y - this.to.y); + if (type == 'discrete' || type == 'diagonalCross') { + if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dy; + yVia = this.from.y - factor * dy; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dy; + yVia = this.from.y - factor * dy; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dy; + yVia = this.from.y + factor * dy; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dy; + yVia = this.from.y + factor * dy; + } + } + if (type == "discrete") { + xVia = dx < factor * dy ? this.from.x : xVia; + } + } + else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dx; + yVia = this.from.y - factor * dx; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dx; + yVia = this.from.y - factor * dx; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + xVia = this.from.x + factor * dx; + yVia = this.from.y + factor * dx; + } + else if (this.from.x > this.to.x) { + xVia = this.from.x - factor * dx; + yVia = this.from.y + factor * dx; + } + } + if (type == "discrete") { + yVia = dy < factor * dx ? this.from.y : yVia; + } + } + } + else if (type == "straightCross") { + if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { + xVia = this.from.x; + yVia = this.to.y + } + else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { + xVia = this.to.x; + yVia = this.from.y; + } + } + else if (type == 'horizontal') { + xVia = this.to.x; + yVia = this.from.y; + } + else if (type == 'vertical') { + xVia = this.from.x; + yVia = this.to.y; + } + else { // continuous + if (Math.abs(this.from.x - this.to.x) < Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + // console.log(1) + xVia = this.from.x + factor * dy; + yVia = this.from.y - factor * dy; + xVia = this.to.x < xVia ? this.to.x : xVia; + } + else if (this.from.x > this.to.x) { + // console.log(2) + xVia = this.from.x - factor * dy; + yVia = this.from.y - factor * dy; + xVia = this.to.x > xVia ? this.to.x :xVia; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + // console.log(3) + xVia = this.from.x + factor * dy; + yVia = this.from.y + factor * dy; + xVia = this.to.x < xVia ? this.to.x : xVia; + } + else if (this.from.x > this.to.x) { + // console.log(4, this.from.x, this.to.x) + xVia = this.from.x - factor * dy; + yVia = this.from.y + factor * dy; + xVia = this.to.x > xVia ? this.to.x : xVia; + } + } + } + else if (Math.abs(this.from.x - this.to.x) > Math.abs(this.from.y - this.to.y)) { + if (this.from.y > this.to.y) { + if (this.from.x < this.to.x) { + // console.log(5) + xVia = this.from.x + factor * dx; + yVia = this.from.y - factor * dx; + yVia = this.to.y > yVia ? this.to.y : yVia; + } + else if (this.from.x > this.to.x) { + // console.log(6) + xVia = this.from.x - factor * dx; + yVia = this.from.y - factor * dx; + yVia = this.to.y > yVia ? this.to.y : yVia; + } + } + else if (this.from.y < this.to.y) { + if (this.from.x < this.to.x) { + // console.log(7) + xVia = this.from.x + factor * dx; + yVia = this.from.y + factor * dx; + yVia = this.to.y < yVia ? this.to.y : yVia; + } + else if (this.from.x > this.to.x) { + // console.log(8) + xVia = this.from.x - factor * dx; + yVia = this.from.y + factor * dx; + yVia = this.to.y < yVia ? this.to.y : yVia; + } + } + } + } - Edge.prototype.unselect = function() { - this.selected = false; - }; - Edge.prototype.positionBezierNode = function() { - if (this.via !== null) { - this.via.x = 0.5 * (this.from.x + this.to.x); - this.via.y = 0.5 * (this.from.y + this.to.y); - } - }; + return {x:xVia, y:yVia}; + } /** - * This function draws the control nodes for the manipulator. In order to enable this, only set the this.controlNodesEnabled to true. - * @param ctx + * Draw a line between two nodes + * @param {CanvasRenderingContext2D} ctx + * @private */ - Edge.prototype._drawControlNodes = function(ctx) { - if (this.controlNodesEnabled == true) { - if (this.controlNodes.from === null && this.controlNodes.to === null) { - var nodeIdFrom = "edgeIdFrom:".concat(this.id); - var nodeIdTo = "edgeIdTo:".concat(this.id); - var constants = { - nodes:{group:'', radius:8}, - physics:{damping:0}, - clustering: {maxNodeSizeIncrements: 0 ,nodeScaling: {width:0, height: 0, radius:0}} - }; - this.controlNodes.from = new Node( - {id:nodeIdFrom, - shape:'dot', - color:{background:'#ff4e00', border:'#3c3c3c', highlight: {background:'#07f968'}} - },{},{},constants); - this.controlNodes.to = new Node( - {id:nodeIdTo, - shape:'dot', - color:{background:'#ff4e00', border:'#3c3c3c', highlight: {background:'#07f968'}} - },{},{},constants); + Edge.prototype._line = function (ctx) { + // draw a straight line + ctx.beginPath(); + ctx.moveTo(this.from.x, this.from.y); + if (this.smoothCurves.enabled == true) { + if (this.smoothCurves.dynamic == false) { + var via = this._getViaCoordinates(); + if (via.x == null) { + ctx.lineTo(this.to.x, this.to.y); + ctx.stroke(); + return null; + } + else { + // this.via.x = via.x; + // this.via.y = via.y; + ctx.quadraticCurveTo(via.x,via.y,this.to.x, this.to.y); + ctx.stroke(); + return via; + } } - - if (this.controlNodes.from.selected == false && this.controlNodes.to.selected == false) { - this.controlNodes.positions = this.getControlNodePositions(ctx); - this.controlNodes.from.x = this.controlNodes.positions.from.x; - this.controlNodes.from.y = this.controlNodes.positions.from.y; - this.controlNodes.to.x = this.controlNodes.positions.to.x; - this.controlNodes.to.y = this.controlNodes.positions.to.y; + else { + ctx.quadraticCurveTo(this.via.x,this.via.y,this.to.x, this.to.y); + ctx.stroke(); + return this.via; } - - this.controlNodes.from.draw(ctx); - this.controlNodes.to.draw(ctx); } else { - this.controlNodes = {from:null, to:null, positions:{}}; + ctx.lineTo(this.to.x, this.to.y); + ctx.stroke(); + return null; } }; /** - * Enable control nodes. + * Draw a line from a node to itself, a circle + * @param {CanvasRenderingContext2D} ctx + * @param {Number} x + * @param {Number} y + * @param {Number} radius * @private */ - Edge.prototype._enableControlNodes = function() { - this.controlNodesEnabled = true; + Edge.prototype._circle = function (ctx, x, y, radius) { + // draw a circle + ctx.beginPath(); + ctx.arc(x, y, radius, 0, 2 * Math.PI, false); + ctx.stroke(); }; /** - * disable control nodes + * Draw label with white background and with the middle at (x, y) + * @param {CanvasRenderingContext2D} ctx + * @param {String} text + * @param {Number} x + * @param {Number} y * @private */ - Edge.prototype._disableControlNodes = function() { - this.controlNodesEnabled = false; - }; + Edge.prototype._label = function (ctx, text, x, y) { + if (text) { + // TODO: cache the calculated size + ctx.font = ((this.from.selected || this.to.selected) ? "bold " : "") + + this.fontSize + "px " + this.fontFace; + ctx.fillStyle = this.fontFill; + var width = ctx.measureText(text).width; + var height = this.fontSize; + var left = x - width / 2; + var top = y - height / 2; - /** - * This checks if one of the control nodes is selected and if so, returns the control node object. Else it returns null. - * @param x - * @param y - * @returns {null} - * @private - */ - Edge.prototype._getSelectedControlNode = function(x,y) { - var positions = this.controlNodes.positions; - var fromDistance = Math.sqrt(Math.pow(x - positions.from.x,2) + Math.pow(y - positions.from.y,2)); - var toDistance = Math.sqrt(Math.pow(x - positions.to.x ,2) + Math.pow(y - positions.to.y ,2)); + ctx.fillRect(left, top, width, height); - if (fromDistance < 15) { - this.connectedNode = this.from; - this.from = this.controlNodes.from; - return this.controlNodes.from; - } - else if (toDistance < 15) { - this.connectedNode = this.to; - this.to = this.controlNodes.to; - return this.controlNodes.to; - } - else { - return null; + // draw text + ctx.fillStyle = this.fontColor || "black"; + ctx.textAlign = "left"; + ctx.textBaseline = "top"; + ctx.fillText(text, left, top); } }; - /** - * this resets the control nodes to their original position. + * Redraw a edge as a dashed line + * Draw this edge in the given canvas + * @author David Jordan + * @date 2012-08-08 + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx * @private */ - Edge.prototype._restoreControlNodes = function() { - if (this.controlNodes.from.selected == true) { - this.from = this.connectedNode; - this.connectedNode = null; - this.controlNodes.from.unselect(); - } - if (this.controlNodes.to.selected == true) { - this.to = this.connectedNode; - this.connectedNode = null; - this.controlNodes.to.unselect(); - } - }; - - /** - * this calculates the position of the control nodes on the edges of the parent nodes. - * - * @param ctx - * @returns {{from: {x: number, y: number}, to: {x: *, y: *}}} - */ - Edge.prototype.getControlNodePositions = function(ctx) { - var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); - var dx = (this.to.x - this.from.x); - var dy = (this.to.y - this.from.y); - var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); - var fromBorderDist = this.from.distanceToBorder(ctx, angle + Math.PI); - var fromBorderPoint = (edgeSegmentLength - fromBorderDist) / edgeSegmentLength; - var xFrom = (fromBorderPoint) * this.from.x + (1 - fromBorderPoint) * this.to.x; - var yFrom = (fromBorderPoint) * this.from.y + (1 - fromBorderPoint) * this.to.y; - - var via; - if (this.smoothCurves.dynamic == true && this.smoothCurves.enabled == true) { - via = this.via; - } - else if (this.smoothCurves.enabled == true) { - via = this._getViaCoordinates(); - } - - if (this.smoothCurves.enabled == true && via.x != null) { - angle = Math.atan2((this.to.y - via.y), (this.to.x - via.x)); - dx = (this.to.x - via.x); - dy = (this.to.y - via.y); - edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); - } - var toBorderDist = this.to.distanceToBorder(ctx, angle); - var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; - - var xTo,yTo; - if (this.smoothCurves.enabled == true && via.x != null) { - xTo = (1 - toBorderPoint) * via.x + toBorderPoint * this.to.x; - yTo = (1 - toBorderPoint) * via.y + toBorderPoint * this.to.y; - } - else { - xTo = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; - yTo = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; - } - - return {from:{x:xFrom,y:yFrom},to:{x:xTo,y:yTo}}; - }; - - module.exports = Edge; - -/***/ }, -/* 28 */ -/***/ function(module, exports, __webpack_require__) { + Edge.prototype._drawDashLine = function(ctx) { + // set style + if (this.selected == true) {ctx.strokeStyle = this.color.highlight;} + else if (this.hover == true) {ctx.strokeStyle = this.color.hover;} + else {ctx.strokeStyle = this.color.color;} - var util = __webpack_require__(1); + ctx.lineWidth = this._getLineWidth(); - /** - * @class Groups - * This class can store groups and properties specific for groups. - */ - function Groups() { - this.clear(); - this.defaultIndex = 0; - } + var via = null; + // only firefox and chrome support this method, else we use the legacy one. + if (ctx.mozDash !== undefined || ctx.setLineDash !== undefined) { + // configure the dash pattern + var pattern = [0]; + if (this.dash.length !== undefined && this.dash.gap !== undefined) { + pattern = [this.dash.length,this.dash.gap]; + } + else { + pattern = [5,5]; + } + // set dash settings for chrome or firefox + if (typeof ctx.setLineDash !== 'undefined') { //Chrome + ctx.setLineDash(pattern); + ctx.lineDashOffset = 0; - /** - * default constants for group colors - */ - Groups.DEFAULT = [ - {border: "#2B7CE9", background: "#97C2FC", highlight: {border: "#2B7CE9", background: "#D2E5FF"}, hover: {border: "#2B7CE9", background: "#D2E5FF"}}, // blue - {border: "#FFA500", background: "#FFFF00", highlight: {border: "#FFA500", background: "#FFFFA3"}, hover: {border: "#FFA500", background: "#FFFFA3"}}, // yellow - {border: "#FA0A10", background: "#FB7E81", highlight: {border: "#FA0A10", background: "#FFAFB1"}, hover: {border: "#FA0A10", background: "#FFAFB1"}}, // red - {border: "#41A906", background: "#7BE141", highlight: {border: "#41A906", background: "#A1EC76"}, hover: {border: "#41A906", background: "#A1EC76"}}, // green - {border: "#E129F0", background: "#EB7DF4", highlight: {border: "#E129F0", background: "#F0B3F5"}, hover: {border: "#E129F0", background: "#F0B3F5"}}, // magenta - {border: "#7C29F0", background: "#AD85E4", highlight: {border: "#7C29F0", background: "#D3BDF0"}, hover: {border: "#7C29F0", background: "#D3BDF0"}}, // purple - {border: "#C37F00", background: "#FFA807", highlight: {border: "#C37F00", background: "#FFCA66"}, hover: {border: "#C37F00", background: "#FFCA66"}}, // orange - {border: "#4220FB", background: "#6E6EFD", highlight: {border: "#4220FB", background: "#9B9BFD"}, hover: {border: "#4220FB", background: "#9B9BFD"}}, // darkblue - {border: "#FD5A77", background: "#FFC0CB", highlight: {border: "#FD5A77", background: "#FFD1D9"}, hover: {border: "#FD5A77", background: "#FFD1D9"}}, // pink - {border: "#4AD63A", background: "#C2FABC", highlight: {border: "#4AD63A", background: "#E6FFE3"}, hover: {border: "#4AD63A", background: "#E6FFE3"}} // mint - ]; + } else { //Firefox + ctx.mozDash = pattern; + ctx.mozDashOffset = 0; + } + // draw the line + via = this._line(ctx); - /** - * Clear all groups - */ - Groups.prototype.clear = function () { - this.groups = {}; - this.groups.length = function() - { - var i = 0; - for ( var p in this ) { - if (this.hasOwnProperty(p)) { - i++; - } + // restore the dash settings. + if (typeof ctx.setLineDash !== 'undefined') { //Chrome + ctx.setLineDash([0]); + ctx.lineDashOffset = 0; + + } else { //Firefox + ctx.mozDash = [0]; + ctx.mozDashOffset = 0; } - return i; } - }; + else { // unsupporting smooth lines + // draw dashed line + ctx.beginPath(); + ctx.lineCap = 'round'; + if (this.dash.altLength !== undefined) //If an alt dash value has been set add to the array this value + { + ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, + [this.dash.length,this.dash.gap,this.dash.altLength,this.dash.gap]); + } + else if (this.dash.length !== undefined && this.dash.gap !== undefined) //If a dash and gap value has been set add to the array this value + { + ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y, + [this.dash.length,this.dash.gap]); + } + else //If all else fails draw a line + { + ctx.moveTo(this.from.x, this.from.y); + ctx.lineTo(this.to.x, this.to.y); + } + ctx.stroke(); + } + // draw label + if (this.label) { + var point; + if (this.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); + } + this._label(ctx, this.label, point.x, point.y); + } + }; /** - * get group properties of a groupname. If groupname is not found, a new group - * is added. - * @param {*} groupname Can be a number, string, Date, etc. - * @return {Object} group The created group, containing all group properties + * Get a point on a line + * @param {Number} percentage. Value between 0 (line start) and 1 (line end) + * @return {Object} point + * @private */ - Groups.prototype.get = function (groupname) { - var group = this.groups[groupname]; - - if (group == undefined) { - // create new group - var index = this.defaultIndex % Groups.DEFAULT.length; - this.defaultIndex++; - group = {}; - group.color = Groups.DEFAULT[index]; - this.groups[groupname] = group; + Edge.prototype._pointOnLine = function (percentage) { + return { + x: (1 - percentage) * this.from.x + percentage * this.to.x, + y: (1 - percentage) * this.from.y + percentage * this.to.y } - - return group; }; /** - * Add a custom group style - * @param {String} groupname - * @param {Object} style An object containing borderColor, - * backgroundColor, etc. - * @return {Object} group The created group object + * Get a point on a circle + * @param {Number} x + * @param {Number} y + * @param {Number} radius + * @param {Number} percentage. Value between 0 (line start) and 1 (line end) + * @return {Object} point + * @private */ - Groups.prototype.add = function (groupname, style) { - this.groups[groupname] = style; - if (style.color) { - style.color = util.parseColor(style.color); + Edge.prototype._pointOnCircle = function (x, y, radius, percentage) { + var angle = (percentage - 3/8) * 2 * Math.PI; + return { + x: x + radius * Math.cos(angle), + y: y - radius * Math.sin(angle) } - return style; }; - module.exports = Groups; - - -/***/ }, -/* 29 */ -/***/ function(module, exports, __webpack_require__) { - /** - * @class Images - * This class loads images and keeps them stored. + * Redraw a edge as a line with an arrow halfway the line + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private */ - function Images() { - this.images = {}; + Edge.prototype._drawArrowCenter = function(ctx) { + var point; + // set style + if (this.selected == true) {ctx.strokeStyle = this.color.highlight; ctx.fillStyle = this.color.highlight;} + else if (this.hover == true) {ctx.strokeStyle = this.color.hover; ctx.fillStyle = this.color.hover;} + else {ctx.strokeStyle = this.color.color; ctx.fillStyle = this.color.color;} + ctx.lineWidth = this._getLineWidth(); - this.callback = undefined; - } + if (this.from != this.to) { + // draw line + var via = this._line(ctx); - /** - * Set an onload callback function. This will be called each time an image - * is loaded - * @param {function} callback - */ - Images.prototype.setOnloadCallback = function(callback) { - this.callback = callback; - }; + var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); + var length = (10 + 5 * this.width) * this.arrowScaleFactor; + // draw an arrow halfway the line + if (this.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); + } - /** - * - * @param {string} url Url of the image - * @return {Image} img The image object - */ - Images.prototype.load = function(url) { - var img = this.images[url]; - if (img == undefined) { - // create the image - var images = this; - img = new Image(); - this.images[url] = img; - img.onload = function() { - if (images.callback) { - images.callback(this); - } - }; - img.src = url; - } + ctx.arrow(point.x, point.y, angle, length); + ctx.fill(); + ctx.stroke(); - return img; - }; + // draw label + if (this.label) { + this._label(ctx, this.label, point.x, point.y); + } + } + else { + // draw circle + var x, y; + var radius = 0.25 * Math.max(100,this.length); + var node = this.from; + if (!node.width) { + node.resize(ctx); + } + if (node.width > node.height) { + x = node.x + node.width * 0.5; + y = node.y - radius; + } + else { + x = node.x + radius; + y = node.y - node.height * 0.5; + } + this._circle(ctx, x, y, radius); - module.exports = Images; + // draw all arrows + var angle = 0.2 * Math.PI; + var length = (10 + 5 * this.width) * this.arrowScaleFactor; + point = this._pointOnCircle(x, y, radius, 0.5); + ctx.arrow(point.x, point.y, angle, length); + ctx.fill(); + ctx.stroke(); + // draw label + if (this.label) { + point = this._pointOnCircle(x, y, radius, 0.5); + this._label(ctx, this.label, point.x, point.y); + } + } + }; -/***/ }, -/* 30 */ -/***/ function(module, exports, __webpack_require__) { - var util = __webpack_require__(1); /** - * @class Node - * A node. A node can be connected to other nodes via one or multiple edges. - * @param {object} properties An object containing properties for the node. All - * properties are optional, except for the id. - * {number} id Id of the node. Required - * {string} label Text label for the node - * {number} x Horizontal position of the node - * {number} y Vertical position of the node - * {string} shape Node shape, available: - * "database", "circle", "ellipse", - * "box", "image", "text", "dot", - * "star", "triangle", "triangleDown", - * "square" - * {string} image An image url - * {string} title An title text, can be HTML - * {anytype} group A group name or number - * @param {Network.Images} imagelist A list with images. Only needed - * when the node has an image - * @param {Network.Groups} grouplist A list with groups. Needed for - * retrieving group properties - * @param {Object} constants An object with default values for - * example for the color - * - */ - function Node(properties, imagelist, grouplist, constants) { - this.selected = false; - this.hover = false; - - this.edges = []; // all edges connected to this node - this.dynamicEdges = []; - this.reroutedEdges = {}; + * Redraw a edge as a line with an arrow + * Draw this edge in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + * @private + */ + Edge.prototype._drawArrow = function(ctx) { + // set style + if (this.selected == true) {ctx.strokeStyle = this.color.highlight; ctx.fillStyle = this.color.highlight;} + else if (this.hover == true) {ctx.strokeStyle = this.color.hover; ctx.fillStyle = this.color.hover;} + else {ctx.strokeStyle = this.color.color; ctx.fillStyle = this.color.color;} - this.group = constants.nodes.group; - this.fontSize = Number(constants.nodes.fontSize); - this.fontFace = constants.nodes.fontFace; - this.fontColor = constants.nodes.fontColor; - this.fontDrawThreshold = 3; + ctx.lineWidth = this._getLineWidth(); - this.color = constants.nodes.color; + var angle, length; + //draw a line + if (this.from != this.to) { + angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); + var dx = (this.to.x - this.from.x); + var dy = (this.to.y - this.from.y); + var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); - // set defaults for the properties - this.id = undefined; - this.shape = constants.nodes.shape; - this.image = constants.nodes.image; - this.x = null; - this.y = null; - this.xFixed = false; - this.yFixed = false; - this.horizontalAlignLeft = true; // these are for the navigation controls - this.verticalAlignTop = true; // these are for the navigation controls - this.radius = constants.nodes.radius; - this.baseRadiusValue = constants.nodes.radius; - this.radiusFixed = false; - this.radiusMin = constants.nodes.radiusMin; - this.radiusMax = constants.nodes.radiusMax; - this.level = -1; - this.preassignedLevel = false; + var fromBorderDist = this.from.distanceToBorder(ctx, angle + Math.PI); + var fromBorderPoint = (edgeSegmentLength - fromBorderDist) / edgeSegmentLength; + var xFrom = (fromBorderPoint) * this.from.x + (1 - fromBorderPoint) * this.to.x; + var yFrom = (fromBorderPoint) * this.from.y + (1 - fromBorderPoint) * this.to.y; + var via; + if (this.smoothCurves.dynamic == true && this.smoothCurves.enabled == true ) { + via = this.via; + } + else if (this.smoothCurves.enabled == true) { + via = this._getViaCoordinates(); + } - this.imagelist = imagelist; - this.grouplist = grouplist; + if (this.smoothCurves.enabled == true && via.x != null) { + angle = Math.atan2((this.to.y - via.y), (this.to.x - via.x)); + dx = (this.to.x - via.x); + dy = (this.to.y - via.y); + edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + } + var toBorderDist = this.to.distanceToBorder(ctx, angle); + var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; - // physics properties - this.fx = 0.0; // external force x - this.fy = 0.0; // external force y - this.vx = 0.0; // velocity x - this.vy = 0.0; // velocity y - this.minForce = constants.minForce; - this.damping = constants.physics.damping; - this.mass = 1; // kg - this.fixedData = {x:null,y:null}; + var xTo,yTo; + if (this.smoothCurves.enabled == true && via.x != null) { + xTo = (1 - toBorderPoint) * via.x + toBorderPoint * this.to.x; + yTo = (1 - toBorderPoint) * via.y + toBorderPoint * this.to.y; + } + else { + xTo = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; + yTo = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; + } - this.setProperties(properties, constants); + ctx.beginPath(); + ctx.moveTo(xFrom,yFrom); + if (this.smoothCurves.enabled == true && via.x != null) { + ctx.quadraticCurveTo(via.x,via.y,xTo, yTo); + } + else { + ctx.lineTo(xTo, yTo); + } + ctx.stroke(); - // creating the variables for clustering - this.resetCluster(); - this.dynamicEdgesLength = 0; - this.clusterSession = 0; - this.clusterSizeWidthFactor = constants.clustering.nodeScaling.width; - this.clusterSizeHeightFactor = constants.clustering.nodeScaling.height; - this.clusterSizeRadiusFactor = constants.clustering.nodeScaling.radius; - this.maxNodeSizeIncrements = constants.clustering.maxNodeSizeIncrements; - this.growthIndicator = 0; + // draw arrow at the end of the line + length = (10 + 5 * this.width) * this.arrowScaleFactor; + ctx.arrow(xTo, yTo, angle, length); + ctx.fill(); + ctx.stroke(); - // variables to tell the node about the network. - this.networkScaleInv = 1; - this.networkScale = 1; - this.canvasTopLeft = {"x": -300, "y": -300}; - this.canvasBottomRight = {"x": 300, "y": 300}; - this.parentEdgeId = null; - } + // draw label + if (this.label) { + var point; + if (this.smoothCurves.enabled == true && via != null) { + var midpointX = 0.5*(0.5*(this.from.x + via.x) + 0.5*(this.to.x + via.x)); + var midpointY = 0.5*(0.5*(this.from.y + via.y) + 0.5*(this.to.y + via.y)); + point = {x:midpointX, y:midpointY}; + } + else { + point = this._pointOnLine(0.5); + } + this._label(ctx, this.label, point.x, point.y); + } + } + else { + // draw circle + var node = this.from; + var x, y, arrow; + var radius = 0.25 * Math.max(100,this.length); + if (!node.width) { + node.resize(ctx); + } + if (node.width > node.height) { + x = node.x + node.width * 0.5; + y = node.y - radius; + arrow = { + x: x, + y: node.y, + angle: 0.9 * Math.PI + }; + } + else { + x = node.x + radius; + y = node.y - node.height * 0.5; + arrow = { + x: node.x, + y: y, + angle: 0.6 * Math.PI + }; + } + ctx.beginPath(); + // TODO: similarly, for a line without arrows, draw to the border of the nodes instead of the center + ctx.arc(x, y, radius, 0, 2 * Math.PI, false); + ctx.stroke(); - /** - * (re)setting the clustering variables and objects - */ - Node.prototype.resetCluster = function() { - // clustering variables - this.formationScale = undefined; // this is used to determine when to open the cluster - this.clusterSize = 1; // this signifies the total amount of nodes in this cluster - this.containedNodes = {}; - this.containedEdges = {}; - this.clusterSessions = []; - }; + // draw all arrows + var length = (10 + 5 * this.width) * this.arrowScaleFactor; + ctx.arrow(arrow.x, arrow.y, arrow.angle, length); + ctx.fill(); + ctx.stroke(); - /** - * Attach a edge to the node - * @param {Edge} edge - */ - Node.prototype.attachEdge = function(edge) { - if (this.edges.indexOf(edge) == -1) { - this.edges.push(edge); - } - if (this.dynamicEdges.indexOf(edge) == -1) { - this.dynamicEdges.push(edge); + // draw label + if (this.label) { + point = this._pointOnCircle(x, y, radius, 0.5); + this._label(ctx, this.label, point.x, point.y); + } } - this.dynamicEdgesLength = this.dynamicEdges.length; }; - /** - * Detach a edge from the node - * @param {Edge} edge - */ - Node.prototype.detachEdge = function(edge) { - var index = this.edges.indexOf(edge); - if (index != -1) { - this.edges.splice(index, 1); - this.dynamicEdges.splice(index, 1); - } - this.dynamicEdgesLength = this.dynamicEdges.length; - }; /** - * Set or overwrite properties for the node - * @param {Object} properties an object with properties - * @param {Object} constants and object with default, global properties + * Calculate the distance between a point (x3,y3) and a line segment from + * (x1,y1) to (x2,y2). + * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @private */ - Node.prototype.setProperties = function(properties, constants) { - if (!properties) { - return; - } - this.originalLabel = undefined; - // basic properties - if (properties.id !== undefined) {this.id = properties.id;} - if (properties.label !== undefined) {this.label = properties.label; this.originalLabel = properties.label;} - if (properties.title !== undefined) {this.title = properties.title;} - if (properties.group !== undefined) {this.group = properties.group;} - if (properties.x !== undefined) {this.x = properties.x;} - if (properties.y !== undefined) {this.y = properties.y;} - if (properties.value !== undefined) {this.value = properties.value;} - if (properties.level !== undefined) {this.level = properties.level; this.preassignedLevel = true;} - - - // physics - if (properties.mass !== undefined) {this.mass = properties.mass;} - - // navigation controls properties - if (properties.horizontalAlignLeft !== undefined) {this.horizontalAlignLeft = properties.horizontalAlignLeft;} - if (properties.verticalAlignTop !== undefined) {this.verticalAlignTop = properties.verticalAlignTop;} - if (properties.triggerFunction !== undefined) {this.triggerFunction = properties.triggerFunction;} - - if (this.id === undefined) { - throw "Node must have an id"; - } - - // copy group properties - if (this.group) { - var groupObj = this.grouplist.get(this.group); - for (var prop in groupObj) { - if (groupObj.hasOwnProperty(prop)) { - this[prop] = groupObj[prop]; + Edge.prototype._getDistanceToEdge = function (x1,y1, x2,y2, x3,y3) { // x3,y3 is the point + if (this.from != this.to) { + if (this.smoothCurves.enabled == true) { + var xVia, yVia; + if (this.smoothCurves.enabled == true && this.smoothCurves.dynamic == true) { + xVia = this.via.x; + yVia = this.via.y; + } + else { + var via = this._getViaCoordinates(); + xVia = via.x; + yVia = via.y; + } + var minDistance = 1e9; + var i,t,x,y,dx,dy; + for (i = 0; i < 10; i++) { + t = 0.1*i; + x = Math.pow(1-t,2)*x1 + (2*t*(1 - t))*xVia + Math.pow(t,2)*x2; + y = Math.pow(1-t,2)*y1 + (2*t*(1 - t))*yVia + Math.pow(t,2)*y2; + dx = Math.abs(x3-x); + dy = Math.abs(y3-y); + minDistance = Math.min(minDistance,Math.sqrt(dx*dx + dy*dy)); } + return minDistance } - } + else { + var px = x2-x1, + py = y2-y1, + something = px*px + py*py, + u = ((x3 - x1) * px + (y3 - y1) * py) / something; - // individual shape properties - if (properties.shape !== undefined) {this.shape = properties.shape;} - if (properties.image !== undefined) {this.image = properties.image;} - if (properties.radius !== undefined) {this.radius = properties.radius;} - if (properties.color !== undefined) {this.color = util.parseColor(properties.color);} + if (u > 1) { + u = 1; + } + else if (u < 0) { + u = 0; + } - if (properties.fontColor !== undefined) {this.fontColor = properties.fontColor;} - if (properties.fontSize !== undefined) {this.fontSize = properties.fontSize;} - if (properties.fontFace !== undefined) {this.fontFace = properties.fontFace;} + var x = x1 + u * px, + y = y1 + u * py, + dx = x - x3, + dy = y - y3; - if (this.image !== undefined && this.image != "") { - if (this.imagelist) { - this.imageObj = this.imagelist.load(this.image); + //# Note: If the actual distance does not matter, + //# if you only want to compare what this function + //# returns to other results of this function, you + //# can just return the squared distance instead + //# (i.e. remove the sqrt) to gain a little performance + + return Math.sqrt(dx*dx + dy*dy); + } + } + else { + var x, y, dx, dy; + var radius = this.length / 4; + var node = this.from; + if (!node.width) { + node.resize(ctx); + } + if (node.width > node.height) { + x = node.x + node.width / 2; + y = node.y - radius; } else { - throw "No imagelist provided"; + x = node.x + radius; + y = node.y - node.height / 2; } + dx = x - x3; + dy = y - y3; + return Math.abs(Math.sqrt(dx*dx + dy*dy) - radius); } - - this.xFixed = this.xFixed || (properties.x !== undefined && !properties.allowedToMoveX); - this.yFixed = this.yFixed || (properties.y !== undefined && !properties.allowedToMoveY); - this.radiusFixed = this.radiusFixed || (properties.radius !== undefined); - - if (this.shape == 'image') { - this.radiusMin = constants.nodes.widthMin; - this.radiusMax = constants.nodes.widthMax; - } - - // choose draw method depending on the shape - switch (this.shape) { - case 'database': this.draw = this._drawDatabase; this.resize = this._resizeDatabase; break; - case 'box': this.draw = this._drawBox; this.resize = this._resizeBox; break; - case 'circle': this.draw = this._drawCircle; this.resize = this._resizeCircle; break; - case 'ellipse': this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; - // TODO: add diamond shape - case 'image': this.draw = this._drawImage; this.resize = this._resizeImage; break; - case 'text': this.draw = this._drawText; this.resize = this._resizeText; break; - case 'dot': this.draw = this._drawDot; this.resize = this._resizeShape; break; - case 'square': this.draw = this._drawSquare; this.resize = this._resizeShape; break; - case 'triangle': this.draw = this._drawTriangle; this.resize = this._resizeShape; break; - case 'triangleDown': this.draw = this._drawTriangleDown; this.resize = this._resizeShape; break; - case 'star': this.draw = this._drawStar; this.resize = this._resizeShape; break; - default: this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; - } - // reset the size of the node, this can be changed - this._reset(); }; - /** - * select this node - */ - Node.prototype.select = function() { - this.selected = true; - this._reset(); - }; + /** - * unselect this node + * This allows the zoom level of the network to influence the rendering + * + * @param scale */ - Node.prototype.unselect = function() { - this.selected = false; - this._reset(); + Edge.prototype.setScale = function(scale) { + this.networkScaleInv = 1.0/scale; }; - /** - * Reset the calculated size of the node, forces it to recalculate its size - */ - Node.prototype.clearSizeCache = function() { - this._reset(); + Edge.prototype.select = function() { + this.selected = true; }; - /** - * Reset the calculated size of the node, forces it to recalculate its size - * @private - */ - Node.prototype._reset = function() { - this.width = undefined; - this.height = undefined; + Edge.prototype.unselect = function() { + this.selected = false; }; - /** - * get the title of this node. - * @return {string} title The title of the node, or undefined when no title - * has been set. - */ - Node.prototype.getTitle = function() { - return typeof this.title === "function" ? this.title() : this.title; + Edge.prototype.positionBezierNode = function() { + if (this.via !== null) { + this.via.x = 0.5 * (this.from.x + this.to.x); + this.via.y = 0.5 * (this.from.y + this.to.y); + } }; /** - * Calculate the distance to the border of the Node - * @param {CanvasRenderingContext2D} ctx - * @param {Number} angle Angle in radians - * @returns {number} distance Distance to the border in pixels + * This function draws the control nodes for the manipulator. In order to enable this, only set the this.controlNodesEnabled to true. + * @param ctx */ - Node.prototype.distanceToBorder = function (ctx, angle) { - var borderWidth = 1; - - if (!this.width) { - this.resize(ctx); - } - - switch (this.shape) { - case 'circle': - case 'dot': - return this.radius + borderWidth; - - case 'ellipse': - var a = this.width / 2; - var b = this.height / 2; - var w = (Math.sin(angle) * a); - var h = (Math.cos(angle) * b); - return a * b / Math.sqrt(w * w + h * h); - - // TODO: implement distanceToBorder for database - // TODO: implement distanceToBorder for triangle - // TODO: implement distanceToBorder for triangleDown + Edge.prototype._drawControlNodes = function(ctx) { + if (this.controlNodesEnabled == true) { + if (this.controlNodes.from === null && this.controlNodes.to === null) { + var nodeIdFrom = "edgeIdFrom:".concat(this.id); + var nodeIdTo = "edgeIdTo:".concat(this.id); + var constants = { + nodes:{group:'', radius:8}, + physics:{damping:0}, + clustering: {maxNodeSizeIncrements: 0 ,nodeScaling: {width:0, height: 0, radius:0}} + }; + this.controlNodes.from = new Node( + {id:nodeIdFrom, + shape:'dot', + color:{background:'#ff4e00', border:'#3c3c3c', highlight: {background:'#07f968'}} + },{},{},constants); + this.controlNodes.to = new Node( + {id:nodeIdTo, + shape:'dot', + color:{background:'#ff4e00', border:'#3c3c3c', highlight: {background:'#07f968'}} + },{},{},constants); + } - case 'box': - case 'image': - case 'text': - default: - if (this.width) { - return Math.min( - Math.abs(this.width / 2 / Math.cos(angle)), - Math.abs(this.height / 2 / Math.sin(angle))) + borderWidth; - // TODO: reckon with border radius too in case of box - } - else { - return 0; - } + if (this.controlNodes.from.selected == false && this.controlNodes.to.selected == false) { + this.controlNodes.positions = this.getControlNodePositions(ctx); + this.controlNodes.from.x = this.controlNodes.positions.from.x; + this.controlNodes.from.y = this.controlNodes.positions.from.y; + this.controlNodes.to.x = this.controlNodes.positions.to.x; + this.controlNodes.to.y = this.controlNodes.positions.to.y; + } + this.controlNodes.from.draw(ctx); + this.controlNodes.to.draw(ctx); + } + else { + this.controlNodes = {from:null, to:null, positions:{}}; } - // TODO: implement calculation of distance to border for all shapes }; /** - * Set forces acting on the node - * @param {number} fx Force in horizontal direction - * @param {number} fy Force in vertical direction + * Enable control nodes. + * @private */ - Node.prototype._setForce = function(fx, fy) { - this.fx = fx; - this.fy = fy; + Edge.prototype._enableControlNodes = function() { + this.controlNodesEnabled = true; }; /** - * Add forces acting on the node - * @param {number} fx Force in horizontal direction - * @param {number} fy Force in vertical direction + * disable control nodes * @private */ - Node.prototype._addForce = function(fx, fy) { - this.fx += fx; - this.fy += fy; + Edge.prototype._disableControlNodes = function() { + this.controlNodesEnabled = false; }; /** - * Perform one discrete step for the node - * @param {number} interval Time interval in seconds + * This checks if one of the control nodes is selected and if so, returns the control node object. Else it returns null. + * @param x + * @param y + * @returns {null} + * @private */ - Node.prototype.discreteStep = function(interval) { - if (!this.xFixed) { - var dx = this.damping * this.vx; // damping force - var ax = (this.fx - dx) / this.mass; // acceleration - this.vx += ax * interval; // velocity - this.x += this.vx * interval; // position - } + Edge.prototype._getSelectedControlNode = function(x,y) { + var positions = this.controlNodes.positions; + var fromDistance = Math.sqrt(Math.pow(x - positions.from.x,2) + Math.pow(y - positions.from.y,2)); + var toDistance = Math.sqrt(Math.pow(x - positions.to.x ,2) + Math.pow(y - positions.to.y ,2)); - if (!this.yFixed) { - var dy = this.damping * this.vy; // damping force - var ay = (this.fy - dy) / this.mass; // acceleration - this.vy += ay * interval; // velocity - this.y += this.vy * interval; // position + if (fromDistance < 15) { + this.connectedNode = this.from; + this.from = this.controlNodes.from; + return this.controlNodes.from; + } + else if (toDistance < 15) { + this.connectedNode = this.to; + this.to = this.controlNodes.to; + return this.controlNodes.to; + } + else { + return null; } }; + /** + * this resets the control nodes to their original position. + * @private + */ + Edge.prototype._restoreControlNodes = function() { + if (this.controlNodes.from.selected == true) { + this.from = this.connectedNode; + this.connectedNode = null; + this.controlNodes.from.unselect(); + } + if (this.controlNodes.to.selected == true) { + this.to = this.connectedNode; + this.connectedNode = null; + this.controlNodes.to.unselect(); + } + }; /** - * Perform one discrete step for the node - * @param {number} interval Time interval in seconds - * @param {number} maxVelocity The speed limit imposed on the velocity + * this calculates the position of the control nodes on the edges of the parent nodes. + * + * @param ctx + * @returns {{from: {x: number, y: number}, to: {x: *, y: *}}} */ - Node.prototype.discreteStepLimited = function(interval, maxVelocity) { - if (!this.xFixed) { - var dx = this.damping * this.vx; // damping force - var ax = (this.fx - dx) / this.mass; // acceleration - this.vx += ax * interval; // velocity - this.vx = (Math.abs(this.vx) > maxVelocity) ? ((this.vx > 0) ? maxVelocity : -maxVelocity) : this.vx; - this.x += this.vx * interval; // position + Edge.prototype.getControlNodePositions = function(ctx) { + var angle = Math.atan2((this.to.y - this.from.y), (this.to.x - this.from.x)); + var dx = (this.to.x - this.from.x); + var dy = (this.to.y - this.from.y); + var edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + var fromBorderDist = this.from.distanceToBorder(ctx, angle + Math.PI); + var fromBorderPoint = (edgeSegmentLength - fromBorderDist) / edgeSegmentLength; + var xFrom = (fromBorderPoint) * this.from.x + (1 - fromBorderPoint) * this.to.x; + var yFrom = (fromBorderPoint) * this.from.y + (1 - fromBorderPoint) * this.to.y; + + var via; + if (this.smoothCurves.dynamic == true && this.smoothCurves.enabled == true) { + via = this.via; } - else { - this.fx = 0; + else if (this.smoothCurves.enabled == true) { + via = this._getViaCoordinates(); } - if (!this.yFixed) { - var dy = this.damping * this.vy; // damping force - var ay = (this.fy - dy) / this.mass; // acceleration - this.vy += ay * interval; // velocity - this.vy = (Math.abs(this.vy) > maxVelocity) ? ((this.vy > 0) ? maxVelocity : -maxVelocity) : this.vy; - this.y += this.vy * interval; // position + if (this.smoothCurves.enabled == true && via.x != null) { + angle = Math.atan2((this.to.y - via.y), (this.to.x - via.x)); + dx = (this.to.x - via.x); + dy = (this.to.y - via.y); + edgeSegmentLength = Math.sqrt(dx * dx + dy * dy); + } + var toBorderDist = this.to.distanceToBorder(ctx, angle); + var toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength; + + var xTo,yTo; + if (this.smoothCurves.enabled == true && via.x != null) { + xTo = (1 - toBorderPoint) * via.x + toBorderPoint * this.to.x; + yTo = (1 - toBorderPoint) * via.y + toBorderPoint * this.to.y; } else { - this.fy = 0; + xTo = (1 - toBorderPoint) * this.from.x + toBorderPoint * this.to.x; + yTo = (1 - toBorderPoint) * this.from.y + toBorderPoint * this.to.y; } - }; - /** - * Check if this node has a fixed x and y position - * @return {boolean} true if fixed, false if not - */ - Node.prototype.isFixed = function() { - return (this.xFixed && this.yFixed); + return {from:{x:xFrom,y:yFrom},to:{x:xTo,y:yTo}}; }; - /** - * Check if this node is moving - * @param {number} vmin the minimum velocity considered as "moving" - * @return {boolean} true if moving, false if it has no velocity - */ - // TODO: replace this method with calculating the kinetic energy - Node.prototype.isMoving = function(vmin) { - return (Math.abs(this.vx) > vmin || Math.abs(this.vy) > vmin); - }; + module.exports = Edge; - /** - * check if this node is selecte - * @return {boolean} selected True if node is selected, else false - */ - Node.prototype.isSelected = function() { - return this.selected; - }; +/***/ }, +/* 28 */ +/***/ function(module, exports, __webpack_require__) { + + var util = __webpack_require__(1); /** - * Retrieve the value of the node. Can be undefined - * @return {Number} value + * @class Groups + * This class can store groups and properties specific for groups. */ - Node.prototype.getValue = function() { - return this.value; - }; + function Groups() { + this.clear(); + this.defaultIndex = 0; + } + /** - * Calculate the distance from the nodes location to the given location (x,y) - * @param {Number} x - * @param {Number} y - * @return {Number} value + * default constants for group colors */ - Node.prototype.getDistance = function(x, y) { - var dx = this.x - x, - dy = this.y - y; - return Math.sqrt(dx * dx + dy * dy); - }; + Groups.DEFAULT = [ + {border: "#2B7CE9", background: "#97C2FC", highlight: {border: "#2B7CE9", background: "#D2E5FF"}, hover: {border: "#2B7CE9", background: "#D2E5FF"}}, // blue + {border: "#FFA500", background: "#FFFF00", highlight: {border: "#FFA500", background: "#FFFFA3"}, hover: {border: "#FFA500", background: "#FFFFA3"}}, // yellow + {border: "#FA0A10", background: "#FB7E81", highlight: {border: "#FA0A10", background: "#FFAFB1"}, hover: {border: "#FA0A10", background: "#FFAFB1"}}, // red + {border: "#41A906", background: "#7BE141", highlight: {border: "#41A906", background: "#A1EC76"}, hover: {border: "#41A906", background: "#A1EC76"}}, // green + {border: "#E129F0", background: "#EB7DF4", highlight: {border: "#E129F0", background: "#F0B3F5"}, hover: {border: "#E129F0", background: "#F0B3F5"}}, // magenta + {border: "#7C29F0", background: "#AD85E4", highlight: {border: "#7C29F0", background: "#D3BDF0"}, hover: {border: "#7C29F0", background: "#D3BDF0"}}, // purple + {border: "#C37F00", background: "#FFA807", highlight: {border: "#C37F00", background: "#FFCA66"}, hover: {border: "#C37F00", background: "#FFCA66"}}, // orange + {border: "#4220FB", background: "#6E6EFD", highlight: {border: "#4220FB", background: "#9B9BFD"}, hover: {border: "#4220FB", background: "#9B9BFD"}}, // darkblue + {border: "#FD5A77", background: "#FFC0CB", highlight: {border: "#FD5A77", background: "#FFD1D9"}, hover: {border: "#FD5A77", background: "#FFD1D9"}}, // pink + {border: "#4AD63A", background: "#C2FABC", highlight: {border: "#4AD63A", background: "#E6FFE3"}, hover: {border: "#4AD63A", background: "#E6FFE3"}} // mint + ]; /** - * Adjust the value range of the node. The node will adjust it's radius - * based on its value. - * @param {Number} min - * @param {Number} max + * Clear all groups */ - Node.prototype.setValueRange = function(min, max) { - if (!this.radiusFixed && this.value !== undefined) { - if (max == min) { - this.radius = (this.radiusMin + this.radiusMax) / 2; - } - else { - var scale = (this.radiusMax - this.radiusMin) / (max - min); - this.radius = (this.value - min) * scale + this.radiusMin; + Groups.prototype.clear = function () { + this.groups = {}; + this.groups.length = function() + { + var i = 0; + for ( var p in this ) { + if (this.hasOwnProperty(p)) { + i++; + } } + return i; } - this.baseRadiusValue = this.radius; }; - /** - * Draw this node in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx - */ - Node.prototype.draw = function(ctx) { - throw "Draw method not initialized for node"; - }; /** - * Recalculate the size of this node in the given canvas - * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); - * @param {CanvasRenderingContext2D} ctx + * get group properties of a groupname. If groupname is not found, a new group + * is added. + * @param {*} groupname Can be a number, string, Date, etc. + * @return {Object} group The created group, containing all group properties */ - Node.prototype.resize = function(ctx) { - throw "Resize method not initialized for node"; + Groups.prototype.get = function (groupname) { + var group = this.groups[groupname]; + + if (group == undefined) { + // create new group + var index = this.defaultIndex % Groups.DEFAULT.length; + this.defaultIndex++; + group = {}; + group.color = Groups.DEFAULT[index]; + this.groups[groupname] = group; + } + + return group; }; /** - * Check if this object is overlapping with the provided object - * @param {Object} obj an object with parameters left, top, right, bottom - * @return {boolean} True if location is located on node + * Add a custom group style + * @param {String} groupname + * @param {Object} style An object containing borderColor, + * backgroundColor, etc. + * @return {Object} group The created group object */ - Node.prototype.isOverlappingWith = function(obj) { - return (this.left < obj.right && - this.left + this.width > obj.left && - this.top < obj.bottom && - this.top + this.height > obj.top); + Groups.prototype.add = function (groupname, style) { + this.groups[groupname] = style; + if (style.color) { + style.color = util.parseColor(style.color); + } + return style; }; - Node.prototype._resizeImage = function (ctx) { - // TODO: pre calculate the image size - - if (!this.width || !this.height) { // undefined or 0 - var width, height; - if (this.value) { - this.radius = this.baseRadiusValue; - var scale = this.imageObj.height / this.imageObj.width; - if (scale !== undefined) { - width = this.radius || this.imageObj.width; - height = this.radius * scale || this.imageObj.height; - } - else { - width = 0; - height = 0; - } - } - else { - width = this.imageObj.width; - height = this.imageObj.height; - } - this.width = width; - this.height = height; - - this.growthIndicator = 0; - if (this.width > 0 && this.height > 0) { - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - width; - } - } + module.exports = Groups; - }; - Node.prototype._drawImage = function (ctx) { - this._resizeImage(ctx); +/***/ }, +/* 29 */ +/***/ function(module, exports, __webpack_require__) { - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + /** + * @class Images + * This class loads images and keeps them stored. + */ + function Images() { + this.images = {}; - var yLabel; - if (this.imageObj.width != 0 ) { - // draw the shade - if (this.clusterSize > 1) { - var lineWidth = ((this.clusterSize > 1) ? 10 : 0.0); - lineWidth *= this.networkScaleInv; - lineWidth = Math.min(0.2 * this.width,lineWidth); + this.callback = undefined; + } - ctx.globalAlpha = 0.5; - ctx.drawImage(this.imageObj, this.left - lineWidth, this.top - lineWidth, this.width + 2*lineWidth, this.height + 2*lineWidth); - } + /** + * Set an onload callback function. This will be called each time an image + * is loaded + * @param {function} callback + */ + Images.prototype.setOnloadCallback = function(callback) { + this.callback = callback; + }; - // draw the image - ctx.globalAlpha = 1.0; - ctx.drawImage(this.imageObj, this.left, this.top, this.width, this.height); - yLabel = this.y + this.height / 2; - } - else { - // image still loading... just draw the label for now - yLabel = this.y; + /** + * + * @param {string} url Url of the image + * @return {Image} img The image object + */ + Images.prototype.load = function(url) { + var img = this.images[url]; + if (img == undefined) { + // create the image + var images = this; + img = new Image(); + this.images[url] = img; + img.onload = function() { + if (images.callback) { + images.callback(this); + } + }; + img.src = url; } - this._label(ctx, this.label, this.x, yLabel, undefined, "top"); + return img; }; + module.exports = Images; - Node.prototype._resizeBox = function (ctx) { - if (!this.width) { - var margin = 5; - var textSize = this.getTextSize(ctx); - this.width = textSize.width + 2 * margin; - this.height = textSize.height + 2 * margin; - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; - this.growthIndicator = this.width - (textSize.width + 2 * margin); - // this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; +/***/ }, +/* 30 */ +/***/ function(module, exports, __webpack_require__) { - } - }; + var util = __webpack_require__(1); - Node.prototype._drawBox = function (ctx) { - this._resizeBox(ctx); + /** + * @class Node + * A node. A node can be connected to other nodes via one or multiple edges. + * @param {object} properties An object containing properties for the node. All + * properties are optional, except for the id. + * {number} id Id of the node. Required + * {string} label Text label for the node + * {number} x Horizontal position of the node + * {number} y Vertical position of the node + * {string} shape Node shape, available: + * "database", "circle", "ellipse", + * "box", "image", "text", "dot", + * "star", "triangle", "triangleDown", + * "square" + * {string} image An image url + * {string} title An title text, can be HTML + * {anytype} group A group name or number + * @param {Network.Images} imagelist A list with images. Only needed + * when the node has an image + * @param {Network.Groups} grouplist A list with groups. Needed for + * retrieving group properties + * @param {Object} constants An object with default values for + * example for the color + * + */ + function Node(properties, imagelist, grouplist, constants) { + this.selected = false; + this.hover = false; - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + this.edges = []; // all edges connected to this node + this.dynamicEdges = []; + this.reroutedEdges = {}; - var clusterLineWidth = 2.5; - var selectionLineWidth = 2; + this.group = constants.nodes.group; + this.fontSize = Number(constants.nodes.fontSize); + this.fontFace = constants.nodes.fontFace; + this.fontColor = constants.nodes.fontColor; + this.fontDrawThreshold = 3; - ctx.strokeStyle = this.selected ? this.color.highlight.border : this.hover ? this.color.hover.border : this.color.border; + this.color = constants.nodes.color; - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + // set defaults for the properties + this.id = undefined; + this.shape = constants.nodes.shape; + this.image = constants.nodes.image; + this.x = null; + this.y = null; + this.xFixed = false; + this.yFixed = false; + this.horizontalAlignLeft = true; // these are for the navigation controls + this.verticalAlignTop = true; // these are for the navigation controls + this.radius = constants.nodes.radius; + this.baseRadiusValue = constants.nodes.radius; + this.radiusFixed = false; + this.radiusMin = constants.nodes.radiusMin; + this.radiusMax = constants.nodes.radiusMax; + this.level = -1; + this.preassignedLevel = false; - ctx.roundRect(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth, this.radius); - ctx.stroke(); - } - ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); - ctx.fillStyle = this.selected ? this.color.highlight.background : this.color.background; + this.imagelist = imagelist; + this.grouplist = grouplist; - ctx.roundRect(this.left, this.top, this.width, this.height, this.radius); - ctx.fill(); - ctx.stroke(); + // physics properties + this.fx = 0.0; // external force x + this.fy = 0.0; // external force y + this.vx = 0.0; // velocity x + this.vy = 0.0; // velocity y + this.minForce = constants.minForce; + this.damping = constants.physics.damping; + this.mass = 1; // kg + this.fixedData = {x:null,y:null}; - this._label(ctx, this.label, this.x, this.y); - }; + this.setProperties(properties, constants); + // creating the variables for clustering + this.resetCluster(); + this.dynamicEdgesLength = 0; + this.clusterSession = 0; + this.clusterSizeWidthFactor = constants.clustering.nodeScaling.width; + this.clusterSizeHeightFactor = constants.clustering.nodeScaling.height; + this.clusterSizeRadiusFactor = constants.clustering.nodeScaling.radius; + this.maxNodeSizeIncrements = constants.clustering.maxNodeSizeIncrements; + this.growthIndicator = 0; - Node.prototype._resizeDatabase = function (ctx) { - if (!this.width) { - var margin = 5; - var textSize = this.getTextSize(ctx); - var size = textSize.width + 2 * margin; - this.width = size; - this.height = size; + // variables to tell the node about the network. + this.networkScaleInv = 1; + this.networkScale = 1; + this.canvasTopLeft = {"x": -300, "y": -300}; + this.canvasBottomRight = {"x": 300, "y": 300}; + this.parentEdgeId = null; + } - // scaling used for clustering - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - size; - } + /** + * (re)setting the clustering variables and objects + */ + Node.prototype.resetCluster = function() { + // clustering variables + this.formationScale = undefined; // this is used to determine when to open the cluster + this.clusterSize = 1; // this signifies the total amount of nodes in this cluster + this.containedNodes = {}; + this.containedEdges = {}; + this.clusterSessions = []; }; - Node.prototype._drawDatabase = function (ctx) { - this._resizeDatabase(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; - - var clusterLineWidth = 2.5; - var selectionLineWidth = 2; + /** + * Attach a edge to the node + * @param {Edge} edge + */ + Node.prototype.attachEdge = function(edge) { + if (this.edges.indexOf(edge) == -1) { + this.edges.push(edge); + } + if (this.dynamicEdges.indexOf(edge) == -1) { + this.dynamicEdges.push(edge); + } + this.dynamicEdgesLength = this.dynamicEdges.length; + }; - ctx.strokeStyle = this.selected ? this.color.highlight.border : this.hover ? this.color.hover.border : this.color.border; + /** + * Detach a edge from the node + * @param {Edge} edge + */ + Node.prototype.detachEdge = function(edge) { + var index = this.edges.indexOf(edge); + if (index != -1) { + this.edges.splice(index, 1); + this.dynamicEdges.splice(index, 1); + } + this.dynamicEdgesLength = this.dynamicEdges.length; + }; - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); - ctx.database(this.x - this.width/2 - 2*ctx.lineWidth, this.y - this.height*0.5 - 2*ctx.lineWidth, this.width + 4*ctx.lineWidth, this.height + 4*ctx.lineWidth); - ctx.stroke(); + /** + * Set or overwrite properties for the node + * @param {Object} properties an object with properties + * @param {Object} constants and object with default, global properties + */ + Node.prototype.setProperties = function(properties, constants) { + if (!properties) { + return; } - ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); - - ctx.fillStyle = this.selected ? this.color.highlight.background : this.hover ? this.color.hover.background : this.color.background; - ctx.database(this.x - this.width/2, this.y - this.height*0.5, this.width, this.height); - ctx.fill(); - ctx.stroke(); + this.originalLabel = undefined; + // basic properties + if (properties.id !== undefined) {this.id = properties.id;} + if (properties.label !== undefined) {this.label = properties.label; this.originalLabel = properties.label;} + if (properties.title !== undefined) {this.title = properties.title;} + if (properties.group !== undefined) {this.group = properties.group;} + if (properties.x !== undefined) {this.x = properties.x;} + if (properties.y !== undefined) {this.y = properties.y;} + if (properties.value !== undefined) {this.value = properties.value;} + if (properties.level !== undefined) {this.level = properties.level; this.preassignedLevel = true;} - this._label(ctx, this.label, this.x, this.y); - }; + // physics + if (properties.mass !== undefined) {this.mass = properties.mass;} - Node.prototype._resizeCircle = function (ctx) { - if (!this.width) { - var margin = 5; - var textSize = this.getTextSize(ctx); - var diameter = Math.max(textSize.width, textSize.height) + 2 * margin; - this.radius = diameter / 2; + // navigation controls properties + if (properties.horizontalAlignLeft !== undefined) {this.horizontalAlignLeft = properties.horizontalAlignLeft;} + if (properties.verticalAlignTop !== undefined) {this.verticalAlignTop = properties.verticalAlignTop;} + if (properties.triggerFunction !== undefined) {this.triggerFunction = properties.triggerFunction;} - this.width = diameter; - this.height = diameter; + if (this.id === undefined) { + throw "Node must have an id"; + } - // scaling used for clustering - // this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; - // this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; - this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; - this.growthIndicator = this.radius - 0.5*diameter; + // copy group properties + if (this.group) { + var groupObj = this.grouplist.get(this.group); + for (var prop in groupObj) { + if (groupObj.hasOwnProperty(prop)) { + this[prop] = groupObj[prop]; + } + } } - }; - Node.prototype._drawCircle = function (ctx) { - this._resizeCircle(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + // individual shape properties + if (properties.shape !== undefined) {this.shape = properties.shape;} + if (properties.image !== undefined) {this.image = properties.image;} + if (properties.radius !== undefined) {this.radius = properties.radius;} + if (properties.color !== undefined) {this.color = util.parseColor(properties.color);} - var clusterLineWidth = 2.5; - var selectionLineWidth = 2; + if (properties.fontColor !== undefined) {this.fontColor = properties.fontColor;} + if (properties.fontSize !== undefined) {this.fontSize = properties.fontSize;} + if (properties.fontFace !== undefined) {this.fontFace = properties.fontFace;} - ctx.strokeStyle = this.selected ? this.color.highlight.border : this.hover ? this.color.hover.border : this.color.border; + if (this.image !== undefined && this.image != "") { + if (this.imagelist) { + this.imageObj = this.imagelist.load(this.image); + } + else { + throw "No imagelist provided"; + } + } - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + this.xFixed = this.xFixed || (properties.x !== undefined && !properties.allowedToMoveX); + this.yFixed = this.yFixed || (properties.y !== undefined && !properties.allowedToMoveY); + this.radiusFixed = this.radiusFixed || (properties.radius !== undefined); - ctx.circle(this.x, this.y, this.radius+2*ctx.lineWidth); - ctx.stroke(); + if (this.shape == 'image') { + this.radiusMin = constants.nodes.widthMin; + this.radiusMax = constants.nodes.widthMax; } - ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); - ctx.fillStyle = this.selected ? this.color.highlight.background : this.hover ? this.color.hover.background : this.color.background; - ctx.circle(this.x, this.y, this.radius); - ctx.fill(); - ctx.stroke(); + // choose draw method depending on the shape + switch (this.shape) { + case 'database': this.draw = this._drawDatabase; this.resize = this._resizeDatabase; break; + case 'box': this.draw = this._drawBox; this.resize = this._resizeBox; break; + case 'circle': this.draw = this._drawCircle; this.resize = this._resizeCircle; break; + case 'ellipse': this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; + // TODO: add diamond shape + case 'image': this.draw = this._drawImage; this.resize = this._resizeImage; break; + case 'text': this.draw = this._drawText; this.resize = this._resizeText; break; + case 'dot': this.draw = this._drawDot; this.resize = this._resizeShape; break; + case 'square': this.draw = this._drawSquare; this.resize = this._resizeShape; break; + case 'triangle': this.draw = this._drawTriangle; this.resize = this._resizeShape; break; + case 'triangleDown': this.draw = this._drawTriangleDown; this.resize = this._resizeShape; break; + case 'star': this.draw = this._drawStar; this.resize = this._resizeShape; break; + default: this.draw = this._drawEllipse; this.resize = this._resizeEllipse; break; + } + // reset the size of the node, this can be changed + this._reset(); + }; - this._label(ctx, this.label, this.x, this.y); + /** + * select this node + */ + Node.prototype.select = function() { + this.selected = true; + this._reset(); }; - Node.prototype._resizeEllipse = function (ctx) { - if (!this.width) { - var textSize = this.getTextSize(ctx); + /** + * unselect this node + */ + Node.prototype.unselect = function() { + this.selected = false; + this._reset(); + }; - this.width = textSize.width * 1.5; - this.height = textSize.height * 2; - if (this.width < this.height) { - this.width = this.height; - } - var defaultSize = this.width; - // scaling used for clustering - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - defaultSize; - } + /** + * Reset the calculated size of the node, forces it to recalculate its size + */ + Node.prototype.clearSizeCache = function() { + this._reset(); }; - Node.prototype._drawEllipse = function (ctx) { - this._resizeEllipse(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; - - var clusterLineWidth = 2.5; - var selectionLineWidth = 2; + /** + * Reset the calculated size of the node, forces it to recalculate its size + * @private + */ + Node.prototype._reset = function() { + this.width = undefined; + this.height = undefined; + }; - ctx.strokeStyle = this.selected ? this.color.highlight.border : this.hover ? this.color.hover.border : this.color.border; + /** + * get the title of this node. + * @return {string} title The title of the node, or undefined when no title + * has been set. + */ + Node.prototype.getTitle = function() { + return typeof this.title === "function" ? this.title() : this.title; + }; - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + /** + * Calculate the distance to the border of the Node + * @param {CanvasRenderingContext2D} ctx + * @param {Number} angle Angle in radians + * @returns {number} distance Distance to the border in pixels + */ + Node.prototype.distanceToBorder = function (ctx, angle) { + var borderWidth = 1; - ctx.ellipse(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth); - ctx.stroke(); + if (!this.width) { + this.resize(ctx); } - ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); - ctx.fillStyle = this.selected ? this.color.highlight.background : this.hover ? this.color.hover.background : this.color.background; + switch (this.shape) { + case 'circle': + case 'dot': + return this.radius + borderWidth; - ctx.ellipse(this.left, this.top, this.width, this.height); - ctx.fill(); - ctx.stroke(); - this._label(ctx, this.label, this.x, this.y); - }; + case 'ellipse': + var a = this.width / 2; + var b = this.height / 2; + var w = (Math.sin(angle) * a); + var h = (Math.cos(angle) * b); + return a * b / Math.sqrt(w * w + h * h); - Node.prototype._drawDot = function (ctx) { - this._drawShape(ctx, 'circle'); - }; + // TODO: implement distanceToBorder for database + // TODO: implement distanceToBorder for triangle + // TODO: implement distanceToBorder for triangleDown - Node.prototype._drawTriangle = function (ctx) { - this._drawShape(ctx, 'triangle'); - }; + case 'box': + case 'image': + case 'text': + default: + if (this.width) { + return Math.min( + Math.abs(this.width / 2 / Math.cos(angle)), + Math.abs(this.height / 2 / Math.sin(angle))) + borderWidth; + // TODO: reckon with border radius too in case of box + } + else { + return 0; + } - Node.prototype._drawTriangleDown = function (ctx) { - this._drawShape(ctx, 'triangleDown'); + } + // TODO: implement calculation of distance to border for all shapes }; - Node.prototype._drawSquare = function (ctx) { - this._drawShape(ctx, 'square'); + /** + * Set forces acting on the node + * @param {number} fx Force in horizontal direction + * @param {number} fy Force in vertical direction + */ + Node.prototype._setForce = function(fx, fy) { + this.fx = fx; + this.fy = fy; }; - Node.prototype._drawStar = function (ctx) { - this._drawShape(ctx, 'star'); + /** + * Add forces acting on the node + * @param {number} fx Force in horizontal direction + * @param {number} fy Force in vertical direction + * @private + */ + Node.prototype._addForce = function(fx, fy) { + this.fx += fx; + this.fy += fy; }; - Node.prototype._resizeShape = function (ctx) { - if (!this.width) { - this.radius = this.baseRadiusValue; - var size = 2 * this.radius; - this.width = size; - this.height = size; + /** + * Perform one discrete step for the node + * @param {number} interval Time interval in seconds + */ + Node.prototype.discreteStep = function(interval) { + if (!this.xFixed) { + var dx = this.damping * this.vx; // damping force + var ax = (this.fx - dx) / this.mass; // acceleration + this.vx += ax * interval; // velocity + this.x += this.vx * interval; // position + } - // scaling used for clustering - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - size; + if (!this.yFixed) { + var dy = this.damping * this.vy; // damping force + var ay = (this.fy - dy) / this.mass; // acceleration + this.vy += ay * interval; // velocity + this.y += this.vy * interval; // position } }; - Node.prototype._drawShape = function (ctx, shape) { - this._resizeShape(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; - var clusterLineWidth = 2.5; - var selectionLineWidth = 2; - var radiusMultiplier = 2; + /** + * Perform one discrete step for the node + * @param {number} interval Time interval in seconds + * @param {number} maxVelocity The speed limit imposed on the velocity + */ + Node.prototype.discreteStepLimited = function(interval, maxVelocity) { + if (!this.xFixed) { + var dx = this.damping * this.vx; // damping force + var ax = (this.fx - dx) / this.mass; // acceleration + this.vx += ax * interval; // velocity + this.vx = (Math.abs(this.vx) > maxVelocity) ? ((this.vx > 0) ? maxVelocity : -maxVelocity) : this.vx; + this.x += this.vx * interval; // position + } + else { + this.fx = 0; + } - // choose draw method depending on the shape - switch (shape) { - case 'dot': radiusMultiplier = 2; break; - case 'square': radiusMultiplier = 2; break; - case 'triangle': radiusMultiplier = 3; break; - case 'triangleDown': radiusMultiplier = 3; break; - case 'star': radiusMultiplier = 4; break; + if (!this.yFixed) { + var dy = this.damping * this.vy; // damping force + var ay = (this.fy - dy) / this.mass; // acceleration + this.vy += ay * interval; // velocity + this.vy = (Math.abs(this.vy) > maxVelocity) ? ((this.vy > 0) ? maxVelocity : -maxVelocity) : this.vy; + this.y += this.vy * interval; // position + } + else { + this.fy = 0; } + }; - ctx.strokeStyle = this.selected ? this.color.highlight.border : this.hover ? this.color.hover.border : this.color.border; + /** + * Check if this node has a fixed x and y position + * @return {boolean} true if fixed, false if not + */ + Node.prototype.isFixed = function() { + return (this.xFixed && this.yFixed); + }; - // draw the outer border - if (this.clusterSize > 1) { - ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + /** + * Check if this node is moving + * @param {number} vmin the minimum velocity considered as "moving" + * @return {boolean} true if moving, false if it has no velocity + */ + // TODO: replace this method with calculating the kinetic energy + Node.prototype.isMoving = function(vmin) { + return (Math.abs(this.vx) > vmin || Math.abs(this.vy) > vmin); + }; - ctx[shape](this.x, this.y, this.radius + radiusMultiplier * ctx.lineWidth); - ctx.stroke(); - } - ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); - ctx.lineWidth *= this.networkScaleInv; - ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + /** + * check if this node is selecte + * @return {boolean} selected True if node is selected, else false + */ + Node.prototype.isSelected = function() { + return this.selected; + }; - ctx.fillStyle = this.selected ? this.color.highlight.background : this.hover ? this.color.hover.background : this.color.background; - ctx[shape](this.x, this.y, this.radius); - ctx.fill(); - ctx.stroke(); + /** + * Retrieve the value of the node. Can be undefined + * @return {Number} value + */ + Node.prototype.getValue = function() { + return this.value; + }; - if (this.label) { - this._label(ctx, this.label, this.x, this.y + this.height / 2, undefined, 'top',true); - } + /** + * Calculate the distance from the nodes location to the given location (x,y) + * @param {Number} x + * @param {Number} y + * @return {Number} value + */ + Node.prototype.getDistance = function(x, y) { + var dx = this.x - x, + dy = this.y - y; + return Math.sqrt(dx * dx + dy * dy); }; - Node.prototype._resizeText = function (ctx) { - if (!this.width) { - var margin = 5; - var textSize = this.getTextSize(ctx); - this.width = textSize.width + 2 * margin; - this.height = textSize.height + 2 * margin; - // scaling used for clustering - this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; - this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; - this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; - this.growthIndicator = this.width - (textSize.width + 2 * margin); + /** + * Adjust the value range of the node. The node will adjust it's radius + * based on its value. + * @param {Number} min + * @param {Number} max + */ + Node.prototype.setValueRange = function(min, max) { + if (!this.radiusFixed && this.value !== undefined) { + if (max == min) { + this.radius = (this.radiusMin + this.radiusMax) / 2; + } + else { + var scale = (this.radiusMax - this.radiusMin) / (max - min); + this.radius = (this.value - min) * scale + this.radiusMin; + } } + this.baseRadiusValue = this.radius; }; - Node.prototype._drawText = function (ctx) { - this._resizeText(ctx); - this.left = this.x - this.width / 2; - this.top = this.y - this.height / 2; + /** + * Draw this node in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + */ + Node.prototype.draw = function(ctx) { + throw "Draw method not initialized for node"; + }; - this._label(ctx, this.label, this.x, this.y); + /** + * Recalculate the size of this node in the given canvas + * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d"); + * @param {CanvasRenderingContext2D} ctx + */ + Node.prototype.resize = function(ctx) { + throw "Resize method not initialized for node"; }; + /** + * Check if this object is overlapping with the provided object + * @param {Object} obj an object with parameters left, top, right, bottom + * @return {boolean} True if location is located on node + */ + Node.prototype.isOverlappingWith = function(obj) { + return (this.left < obj.right && + this.left + this.width > obj.left && + this.top < obj.bottom && + this.top + this.height > obj.top); + }; - Node.prototype._label = function (ctx, text, x, y, align, baseline, labelUnderNode) { - if (text && this.fontSize * this.networkScale > this.fontDrawThreshold) { - ctx.font = (this.selected ? "bold " : "") + this.fontSize + "px " + this.fontFace; - ctx.fillStyle = this.fontColor || "black"; - ctx.textAlign = align || "center"; - ctx.textBaseline = baseline || "middle"; + Node.prototype._resizeImage = function (ctx) { + // TODO: pre calculate the image size - var lines = text.split('\n'); - var lineCount = lines.length; - var fontSize = (this.fontSize + 4); - var yLine = y + (1 - lineCount) / 2 * fontSize; - if (labelUnderNode == true) { - yLine = y + (1 - lineCount) / (2 * fontSize); + if (!this.width || !this.height) { // undefined or 0 + var width, height; + if (this.value) { + this.radius = this.baseRadiusValue; + var scale = this.imageObj.height / this.imageObj.width; + if (scale !== undefined) { + width = this.radius || this.imageObj.width; + height = this.radius * scale || this.imageObj.height; + } + else { + width = 0; + height = 0; + } + } + else { + width = this.imageObj.width; + height = this.imageObj.height; } + this.width = width; + this.height = height; - for (var i = 0; i < lineCount; i++) { - ctx.fillText(lines[i], x, yLine); - yLine += fontSize; + this.growthIndicator = 0; + if (this.width > 0 && this.height > 0) { + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - width; } } + }; + Node.prototype._drawImage = function (ctx) { + this._resizeImage(ctx); - Node.prototype.getTextSize = function(ctx) { - if (this.label !== undefined) { - ctx.font = (this.selected ? "bold " : "") + this.fontSize + "px " + this.fontFace; + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - var lines = this.label.split('\n'), - height = (this.fontSize + 4) * lines.length, - width = 0; + var yLabel; + if (this.imageObj.width != 0 ) { + // draw the shade + if (this.clusterSize > 1) { + var lineWidth = ((this.clusterSize > 1) ? 10 : 0.0); + lineWidth *= this.networkScaleInv; + lineWidth = Math.min(0.2 * this.width,lineWidth); - for (var i = 0, iMax = lines.length; i < iMax; i++) { - width = Math.max(width, ctx.measureText(lines[i]).width); + ctx.globalAlpha = 0.5; + ctx.drawImage(this.imageObj, this.left - lineWidth, this.top - lineWidth, this.width + 2*lineWidth, this.height + 2*lineWidth); } - return {"width": width, "height": height}; - } - else { - return {"width": 0, "height": 0}; - } - }; - - /** - * this is used to determine if a node is visible at all. this is used to determine when it needs to be drawn. - * there is a safety margin of 0.3 * width; - * - * @returns {boolean} - */ - Node.prototype.inArea = function() { - if (this.width !== undefined) { - return (this.x + this.width *this.networkScaleInv >= this.canvasTopLeft.x && - this.x - this.width *this.networkScaleInv < this.canvasBottomRight.x && - this.y + this.height*this.networkScaleInv >= this.canvasTopLeft.y && - this.y - this.height*this.networkScaleInv < this.canvasBottomRight.y); + // draw the image + ctx.globalAlpha = 1.0; + ctx.drawImage(this.imageObj, this.left, this.top, this.width, this.height); + yLabel = this.y + this.height / 2; } else { - return true; + // image still loading... just draw the label for now + yLabel = this.y; } - }; - /** - * checks if the core of the node is in the display area, this is used for opening clusters around zoom - * @returns {boolean} - */ - Node.prototype.inView = function() { - return (this.x >= this.canvasTopLeft.x && - this.x < this.canvasBottomRight.x && - this.y >= this.canvasTopLeft.y && - this.y < this.canvasBottomRight.y); + this._label(ctx, this.label, this.x, yLabel, undefined, "top"); }; - /** - * This allows the zoom level of the network to influence the rendering - * We store the inverted scale and the coordinates of the top left, and bottom right points of the canvas - * - * @param scale - * @param canvasTopLeft - * @param canvasBottomRight - */ - Node.prototype.setScaleAndPos = function(scale,canvasTopLeft,canvasBottomRight) { - this.networkScaleInv = 1.0/scale; - this.networkScale = scale; - this.canvasTopLeft = canvasTopLeft; - this.canvasBottomRight = canvasBottomRight; - }; + Node.prototype._resizeBox = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + this.width = textSize.width + 2 * margin; + this.height = textSize.height + 2 * margin; + + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; + this.growthIndicator = this.width - (textSize.width + 2 * margin); + // this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; - /** - * This allows the zoom level of the network to influence the rendering - * - * @param scale - */ - Node.prototype.setScale = function(scale) { - this.networkScaleInv = 1.0/scale; - this.networkScale = scale; + } }; + Node.prototype._drawBox = function (ctx) { + this._resizeBox(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - /** - * set the velocity at 0. Is called when this node is contained in another during clustering - */ - Node.prototype.clearVelocity = function() { - this.vx = 0; - this.vy = 0; - }; + var clusterLineWidth = 2.5; + var selectionLineWidth = 2; + ctx.strokeStyle = this.selected ? this.color.highlight.border : this.hover ? this.color.hover.border : this.color.border; - /** - * Basic preservation of (kinectic) energy - * - * @param massBeforeClustering - */ - Node.prototype.updateVelocity = function(massBeforeClustering) { - var energyBefore = this.vx * this.vx * massBeforeClustering; - //this.vx = (this.vx < 0) ? -Math.sqrt(energyBefore/this.mass) : Math.sqrt(energyBefore/this.mass); - this.vx = Math.sqrt(energyBefore/this.mass); - energyBefore = this.vy * this.vy * massBeforeClustering; - //this.vy = (this.vy < 0) ? -Math.sqrt(energyBefore/this.mass) : Math.sqrt(energyBefore/this.mass); - this.vy = Math.sqrt(energyBefore/this.mass); - }; + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); - module.exports = Node; + ctx.roundRect(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth, this.radius); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + ctx.fillStyle = this.selected ? this.color.highlight.background : this.color.background; -/***/ }, -/* 31 */ -/***/ function(module, exports, __webpack_require__) { + ctx.roundRect(this.left, this.top, this.width, this.height, this.radius); + ctx.fill(); + ctx.stroke(); - /** - * Popup is a class to create a popup window with some text - * @param {Element} container The container object. - * @param {Number} [x] - * @param {Number} [y] - * @param {String} [text] - * @param {Object} [style] An object containing borderColor, - * backgroundColor, etc. - */ - function Popup(container, x, y, text, style) { - if (container) { - this.container = container; - } - else { - this.container = document.body; - } + this._label(ctx, this.label, this.x, this.y); + }; - // x, y and text are optional, see if a style object was passed in their place - if (style === undefined) { - if (typeof x === "object") { - style = x; - x = undefined; - } else if (typeof text === "object") { - style = text; - text = undefined; - } else { - // for backwards compatibility, in case clients other than Network are creating Popup directly - style = { - fontColor: 'black', - fontSize: 14, // px - fontFace: 'verdana', - color: { - border: '#666', - background: '#FFFFC6' - } - } - } - } - this.x = 0; - this.y = 0; - this.padding = 5; + Node.prototype._resizeDatabase = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + var size = textSize.width + 2 * margin; + this.width = size; + this.height = size; - if (x !== undefined && y !== undefined ) { - this.setPosition(x, y); - } - if (text !== undefined) { - this.setText(text); + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - size; } + }; - // create the frame - this.frame = document.createElement("div"); - var styleAttr = this.frame.style; - styleAttr.position = "absolute"; - styleAttr.visibility = "hidden"; - styleAttr.border = "1px solid " + style.color.border; - styleAttr.color = style.fontColor; - styleAttr.fontSize = style.fontSize + "px"; - styleAttr.fontFamily = style.fontFace; - styleAttr.padding = this.padding + "px"; - styleAttr.backgroundColor = style.color.background; - styleAttr.borderRadius = "3px"; - styleAttr.MozBorderRadius = "3px"; - styleAttr.WebkitBorderRadius = "3px"; - styleAttr.boxShadow = "3px 3px 10px rgba(128, 128, 128, 0.5)"; - styleAttr.whiteSpace = "nowrap"; - this.container.appendChild(this.frame); - } + Node.prototype._drawDatabase = function (ctx) { + this._resizeDatabase(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - /** - * @param {number} x Horizontal position of the popup window - * @param {number} y Vertical position of the popup window - */ - Popup.prototype.setPosition = function(x, y) { - this.x = parseInt(x); - this.y = parseInt(y); - }; + var clusterLineWidth = 2.5; + var selectionLineWidth = 2; - /** - * Set the text for the popup window. This can be HTML code - * @param {string} text - */ - Popup.prototype.setText = function(text) { - this.frame.innerHTML = text; - }; + ctx.strokeStyle = this.selected ? this.color.highlight.border : this.hover ? this.color.hover.border : this.color.border; - /** - * Show the popup window - * @param {boolean} show Optional. Show or hide the window - */ - Popup.prototype.show = function (show) { - if (show === undefined) { - show = true; + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + + ctx.database(this.x - this.width/2 - 2*ctx.lineWidth, this.y - this.height*0.5 - 2*ctx.lineWidth, this.width + 4*ctx.lineWidth, this.height + 4*ctx.lineWidth); + ctx.stroke(); } + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); - if (show) { - var height = this.frame.clientHeight; - var width = this.frame.clientWidth; - var maxHeight = this.frame.parentNode.clientHeight; - var maxWidth = this.frame.parentNode.clientWidth; + ctx.fillStyle = this.selected ? this.color.highlight.background : this.hover ? this.color.hover.background : this.color.background; + ctx.database(this.x - this.width/2, this.y - this.height*0.5, this.width, this.height); + ctx.fill(); + ctx.stroke(); - var top = (this.y - height); - if (top + height + this.padding > maxHeight) { - top = maxHeight - height - this.padding; - } - if (top < this.padding) { - top = this.padding; - } + this._label(ctx, this.label, this.x, this.y); + }; - var left = this.x; - if (left + width + this.padding > maxWidth) { - left = maxWidth - width - this.padding; - } - if (left < this.padding) { - left = this.padding; - } - this.frame.style.left = left + "px"; - this.frame.style.top = top + "px"; - this.frame.style.visibility = "visible"; - } - else { - this.hide(); + Node.prototype._resizeCircle = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + var diameter = Math.max(textSize.width, textSize.height) + 2 * margin; + this.radius = diameter / 2; + + this.width = diameter; + this.height = diameter; + + // scaling used for clustering + // this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeWidthFactor; + // this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeHeightFactor; + this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; + this.growthIndicator = this.radius - 0.5*diameter; } }; - /** - * Hide the popup window - */ - Popup.prototype.hide = function () { - this.frame.style.visibility = "hidden"; - }; + Node.prototype._drawCircle = function (ctx) { + this._resizeCircle(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - module.exports = Popup; + var clusterLineWidth = 2.5; + var selectionLineWidth = 2; + ctx.strokeStyle = this.selected ? this.color.highlight.border : this.hover ? this.color.hover.border : this.color.border; -/***/ }, -/* 32 */ -/***/ function(module, exports, __webpack_require__) { + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); - /** - * Parse a text source containing data in DOT language into a JSON object. - * The object contains two lists: one with nodes and one with edges. - * - * DOT language reference: http://www.graphviz.org/doc/info/lang.html - * - * @param {String} data Text containing a graph in DOT-notation - * @return {Object} graph An object containing two parameters: - * {Object[]} nodes - * {Object[]} edges - */ - function parseDOT (data) { - dot = data; - return parseGraph(); - } + ctx.circle(this.x, this.y, this.radius+2*ctx.lineWidth); + ctx.stroke(); + } + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); - // token types enumeration - var TOKENTYPE = { - NULL : 0, - DELIMITER : 1, - IDENTIFIER: 2, - UNKNOWN : 3 + ctx.fillStyle = this.selected ? this.color.highlight.background : this.hover ? this.color.hover.background : this.color.background; + ctx.circle(this.x, this.y, this.radius); + ctx.fill(); + ctx.stroke(); + + this._label(ctx, this.label, this.x, this.y); }; - // map with all delimiters - var DELIMITERS = { - '{': true, - '}': true, - '[': true, - ']': true, - ';': true, - '=': true, - ',': true, + Node.prototype._resizeEllipse = function (ctx) { + if (!this.width) { + var textSize = this.getTextSize(ctx); - '->': true, - '--': true - }; + this.width = textSize.width * 1.5; + this.height = textSize.height * 2; + if (this.width < this.height) { + this.width = this.height; + } + var defaultSize = this.width; - var dot = ''; // current dot file - var index = 0; // current index in dot file - var c = ''; // current token character in expr - var token = ''; // current token - var tokenType = TOKENTYPE.NULL; // type of the token + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - defaultSize; + } + }; - /** - * Get the first character from the dot file. - * The character is stored into the char c. If the end of the dot file is - * reached, the function puts an empty string in c. - */ - function first() { - index = 0; - c = dot.charAt(0); - } + Node.prototype._drawEllipse = function (ctx) { + this._resizeEllipse(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - /** - * Get the next character from the dot file. - * The character is stored into the char c. If the end of the dot file is - * reached, the function puts an empty string in c. - */ - function next() { - index++; - c = dot.charAt(index); - } + var clusterLineWidth = 2.5; + var selectionLineWidth = 2; - /** - * Preview the next character from the dot file. - * @return {String} cNext - */ - function nextPreview() { - return dot.charAt(index + 1); - } + ctx.strokeStyle = this.selected ? this.color.highlight.border : this.hover ? this.color.hover.border : this.color.border; - /** - * Test whether given character is alphabetic or numeric - * @param {String} c - * @return {Boolean} isAlphaNumeric - */ - var regexAlphaNumeric = /[a-zA-Z_0-9.:#]/; - function isAlphaNumeric(c) { - return regexAlphaNumeric.test(c); - } + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); - /** - * Merge all properties of object b into object b - * @param {Object} a - * @param {Object} b - * @return {Object} a - */ - function merge (a, b) { - if (!a) { - a = {}; + ctx.ellipse(this.left-2*ctx.lineWidth, this.top-2*ctx.lineWidth, this.width+4*ctx.lineWidth, this.height+4*ctx.lineWidth); + ctx.stroke(); } + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); - if (b) { - for (var name in b) { - if (b.hasOwnProperty(name)) { - a[name] = b[name]; - } - } - } - return a; - } + ctx.fillStyle = this.selected ? this.color.highlight.background : this.hover ? this.color.hover.background : this.color.background; - /** - * Set a value in an object, where the provided parameter name can be a - * path with nested parameters. For example: - * - * var obj = {a: 2}; - * setValue(obj, 'b.c', 3); // obj = {a: 2, b: {c: 3}} - * - * @param {Object} obj - * @param {String} path A parameter name or dot-separated parameter path, - * like "color.highlight.border". - * @param {*} value - */ - function setValue(obj, path, value) { - var keys = path.split('.'); - var o = obj; - while (keys.length) { - var key = keys.shift(); - if (keys.length) { - // this isn't the end point - if (!o[key]) { - o[key] = {}; - } - o = o[key]; - } - else { - // this is the end point - o[key] = value; - } - } - } + ctx.ellipse(this.left, this.top, this.width, this.height); + ctx.fill(); + ctx.stroke(); + this._label(ctx, this.label, this.x, this.y); + }; - /** - * Add a node to a graph object. If there is already a node with - * the same id, their attributes will be merged. - * @param {Object} graph - * @param {Object} node - */ - function addNode(graph, node) { - var i, len; - var current = null; + Node.prototype._drawDot = function (ctx) { + this._drawShape(ctx, 'circle'); + }; - // find root graph (in case of subgraph) - var graphs = [graph]; // list with all graphs from current graph to root graph - var root = graph; - while (root.parent) { - graphs.push(root.parent); - root = root.parent; - } + Node.prototype._drawTriangle = function (ctx) { + this._drawShape(ctx, 'triangle'); + }; - // find existing node (at root level) by its id - if (root.nodes) { - for (i = 0, len = root.nodes.length; i < len; i++) { - if (node.id === root.nodes[i].id) { - current = root.nodes[i]; - break; - } - } - } + Node.prototype._drawTriangleDown = function (ctx) { + this._drawShape(ctx, 'triangleDown'); + }; - if (!current) { - // this is a new node - current = { - id: node.id - }; - if (graph.node) { - // clone default attributes - current.attr = merge(current.attr, graph.node); - } + Node.prototype._drawSquare = function (ctx) { + this._drawShape(ctx, 'square'); + }; + + Node.prototype._drawStar = function (ctx) { + this._drawShape(ctx, 'star'); + }; + + Node.prototype._resizeShape = function (ctx) { + if (!this.width) { + this.radius = this.baseRadiusValue; + var size = 2 * this.radius; + this.width = size; + this.height = size; + + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * 0.5 * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - size; } + }; - // add node to this (sub)graph and all its parent graphs - for (i = graphs.length - 1; i >= 0; i--) { - var g = graphs[i]; + Node.prototype._drawShape = function (ctx, shape) { + this._resizeShape(ctx); - if (!g.nodes) { - g.nodes = []; - } - if (g.nodes.indexOf(current) == -1) { - g.nodes.push(current); - } - } + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - // merge attributes - if (node.attr) { - current.attr = merge(current.attr, node.attr); + var clusterLineWidth = 2.5; + var selectionLineWidth = 2; + var radiusMultiplier = 2; + + // choose draw method depending on the shape + switch (shape) { + case 'dot': radiusMultiplier = 2; break; + case 'square': radiusMultiplier = 2; break; + case 'triangle': radiusMultiplier = 3; break; + case 'triangleDown': radiusMultiplier = 3; break; + case 'star': radiusMultiplier = 4; break; } - } - /** - * Add an edge to a graph object - * @param {Object} graph - * @param {Object} edge - */ - function addEdge(graph, edge) { - if (!graph.edges) { - graph.edges = []; + ctx.strokeStyle = this.selected ? this.color.highlight.border : this.hover ? this.color.hover.border : this.color.border; + + // draw the outer border + if (this.clusterSize > 1) { + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + + ctx[shape](this.x, this.y, this.radius + radiusMultiplier * ctx.lineWidth); + ctx.stroke(); } - graph.edges.push(edge); - if (graph.edge) { - var attr = merge({}, graph.edge); // clone default attributes - edge.attr = merge(attr, edge.attr); // merge attributes + ctx.lineWidth = (this.selected ? selectionLineWidth : 1.0) + ((this.clusterSize > 1) ? clusterLineWidth : 0.0); + ctx.lineWidth *= this.networkScaleInv; + ctx.lineWidth = Math.min(0.1 * this.width,ctx.lineWidth); + + ctx.fillStyle = this.selected ? this.color.highlight.background : this.hover ? this.color.hover.background : this.color.background; + ctx[shape](this.x, this.y, this.radius); + ctx.fill(); + ctx.stroke(); + + if (this.label) { + this._label(ctx, this.label, this.x, this.y + this.height / 2, undefined, 'top',true); } - } + }; - /** - * Create an edge to a graph object - * @param {Object} graph - * @param {String | Number | Object} from - * @param {String | Number | Object} to - * @param {String} type - * @param {Object | null} attr - * @return {Object} edge - */ - function createEdge(graph, from, to, type, attr) { - var edge = { - from: from, - to: to, - type: type - }; + Node.prototype._resizeText = function (ctx) { + if (!this.width) { + var margin = 5; + var textSize = this.getTextSize(ctx); + this.width = textSize.width + 2 * margin; + this.height = textSize.height + 2 * margin; - if (graph.edge) { - edge.attr = merge({}, graph.edge); // clone default attributes + // scaling used for clustering + this.width += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeWidthFactor; + this.height += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeHeightFactor; + this.radius += Math.min(this.clusterSize - 1, this.maxNodeSizeIncrements) * this.clusterSizeRadiusFactor; + this.growthIndicator = this.width - (textSize.width + 2 * margin); } - edge.attr = merge(edge.attr || {}, attr); // merge attributes + }; - return edge; - } + Node.prototype._drawText = function (ctx) { + this._resizeText(ctx); + this.left = this.x - this.width / 2; + this.top = this.y - this.height / 2; - /** - * Get next token in the current dot file. - * The token and token type are available as token and tokenType - */ - function getToken() { - tokenType = TOKENTYPE.NULL; - token = ''; + this._label(ctx, this.label, this.x, this.y); + }; - // skip over whitespaces - while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter - next(); - } - do { - var isComment = false; + Node.prototype._label = function (ctx, text, x, y, align, baseline, labelUnderNode) { + if (text && this.fontSize * this.networkScale > this.fontDrawThreshold) { + ctx.font = (this.selected ? "bold " : "") + this.fontSize + "px " + this.fontFace; + ctx.fillStyle = this.fontColor || "black"; + ctx.textAlign = align || "center"; + ctx.textBaseline = baseline || "middle"; - // skip comment - if (c == '#') { - // find the previous non-space character - var i = index - 1; - while (dot.charAt(i) == ' ' || dot.charAt(i) == '\t') { - i--; - } - if (dot.charAt(i) == '\n' || dot.charAt(i) == '') { - // the # is at the start of a line, this is indeed a line comment - while (c != '' && c != '\n') { - next(); - } - isComment = true; - } - } - if (c == '/' && nextPreview() == '/') { - // skip line comment - while (c != '' && c != '\n') { - next(); - } - isComment = true; - } - if (c == '/' && nextPreview() == '*') { - // skip block comment - while (c != '') { - if (c == '*' && nextPreview() == '/') { - // end of block comment found. skip these last two characters - next(); - next(); - break; - } - else { - next(); - } - } - isComment = true; + var lines = text.split('\n'); + var lineCount = lines.length; + var fontSize = (this.fontSize + 4); + var yLine = y + (1 - lineCount) / 2 * fontSize; + if (labelUnderNode == true) { + yLine = y + (1 - lineCount) / (2 * fontSize); } - // skip over whitespaces - while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter - next(); + for (var i = 0; i < lineCount; i++) { + ctx.fillText(lines[i], x, yLine); + yLine += fontSize; } } - while (isComment); + }; - // check for end of dot file - if (c == '') { - // token is still empty - tokenType = TOKENTYPE.DELIMITER; - return; - } - // check for delimiters consisting of 2 characters - var c2 = c + nextPreview(); - if (DELIMITERS[c2]) { - tokenType = TOKENTYPE.DELIMITER; - token = c2; - next(); - next(); - return; + Node.prototype.getTextSize = function(ctx) { + if (this.label !== undefined) { + ctx.font = (this.selected ? "bold " : "") + this.fontSize + "px " + this.fontFace; + + var lines = this.label.split('\n'), + height = (this.fontSize + 4) * lines.length, + width = 0; + + for (var i = 0, iMax = lines.length; i < iMax; i++) { + width = Math.max(width, ctx.measureText(lines[i]).width); + } + + return {"width": width, "height": height}; } + else { + return {"width": 0, "height": 0}; + } + }; - // check for delimiters consisting of 1 character - if (DELIMITERS[c]) { - tokenType = TOKENTYPE.DELIMITER; - token = c; - next(); - return; + /** + * this is used to determine if a node is visible at all. this is used to determine when it needs to be drawn. + * there is a safety margin of 0.3 * width; + * + * @returns {boolean} + */ + Node.prototype.inArea = function() { + if (this.width !== undefined) { + return (this.x + this.width *this.networkScaleInv >= this.canvasTopLeft.x && + this.x - this.width *this.networkScaleInv < this.canvasBottomRight.x && + this.y + this.height*this.networkScaleInv >= this.canvasTopLeft.y && + this.y - this.height*this.networkScaleInv < this.canvasBottomRight.y); + } + else { + return true; } + }; + + /** + * checks if the core of the node is in the display area, this is used for opening clusters around zoom + * @returns {boolean} + */ + Node.prototype.inView = function() { + return (this.x >= this.canvasTopLeft.x && + this.x < this.canvasBottomRight.x && + this.y >= this.canvasTopLeft.y && + this.y < this.canvasBottomRight.y); + }; + + /** + * This allows the zoom level of the network to influence the rendering + * We store the inverted scale and the coordinates of the top left, and bottom right points of the canvas + * + * @param scale + * @param canvasTopLeft + * @param canvasBottomRight + */ + Node.prototype.setScaleAndPos = function(scale,canvasTopLeft,canvasBottomRight) { + this.networkScaleInv = 1.0/scale; + this.networkScale = scale; + this.canvasTopLeft = canvasTopLeft; + this.canvasBottomRight = canvasBottomRight; + }; - // check for an identifier (number or string) - // TODO: more precise parsing of numbers/strings (and the port separator ':') - if (isAlphaNumeric(c) || c == '-') { - token += c; - next(); - while (isAlphaNumeric(c)) { - token += c; - next(); - } - if (token == 'false') { - token = false; // convert to boolean - } - else if (token == 'true') { - token = true; // convert to boolean - } - else if (!isNaN(Number(token))) { - token = Number(token); // convert to number - } - tokenType = TOKENTYPE.IDENTIFIER; - return; - } + /** + * This allows the zoom level of the network to influence the rendering + * + * @param scale + */ + Node.prototype.setScale = function(scale) { + this.networkScaleInv = 1.0/scale; + this.networkScale = scale; + }; - // check for a string enclosed by double quotes - if (c == '"') { - next(); - while (c != '' && (c != '"' || (c == '"' && nextPreview() == '"'))) { - token += c; - if (c == '"') { // skip the escape character - next(); - } - next(); - } - if (c != '"') { - throw newSyntaxError('End of string " expected'); - } - next(); - tokenType = TOKENTYPE.IDENTIFIER; - return; - } - // something unknown is found, wrong characters, a syntax error - tokenType = TOKENTYPE.UNKNOWN; - while (c != '') { - token += c; - next(); - } - throw new SyntaxError('Syntax error in part "' + chop(token, 30) + '"'); - } /** - * Parse a graph. - * @returns {Object} graph + * set the velocity at 0. Is called when this node is contained in another during clustering */ - function parseGraph() { - var graph = {}; + Node.prototype.clearVelocity = function() { + this.vx = 0; + this.vy = 0; + }; - first(); - getToken(); - // optional strict keyword - if (token == 'strict') { - graph.strict = true; - getToken(); - } + /** + * Basic preservation of (kinectic) energy + * + * @param massBeforeClustering + */ + Node.prototype.updateVelocity = function(massBeforeClustering) { + var energyBefore = this.vx * this.vx * massBeforeClustering; + //this.vx = (this.vx < 0) ? -Math.sqrt(energyBefore/this.mass) : Math.sqrt(energyBefore/this.mass); + this.vx = Math.sqrt(energyBefore/this.mass); + energyBefore = this.vy * this.vy * massBeforeClustering; + //this.vy = (this.vy < 0) ? -Math.sqrt(energyBefore/this.mass) : Math.sqrt(energyBefore/this.mass); + this.vy = Math.sqrt(energyBefore/this.mass); + }; - // graph or digraph keyword - if (token == 'graph' || token == 'digraph') { - graph.type = token; - getToken(); - } + module.exports = Node; - // optional graph id - if (tokenType == TOKENTYPE.IDENTIFIER) { - graph.id = token; - getToken(); + +/***/ }, +/* 31 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Popup is a class to create a popup window with some text + * @param {Element} container The container object. + * @param {Number} [x] + * @param {Number} [y] + * @param {String} [text] + * @param {Object} [style] An object containing borderColor, + * backgroundColor, etc. + */ + function Popup(container, x, y, text, style) { + if (container) { + this.container = container; + } + else { + this.container = document.body; } - // open angle bracket - if (token != '{') { - throw newSyntaxError('Angle bracket { expected'); + // x, y and text are optional, see if a style object was passed in their place + if (style === undefined) { + if (typeof x === "object") { + style = x; + x = undefined; + } else if (typeof text === "object") { + style = text; + text = undefined; + } else { + // for backwards compatibility, in case clients other than Network are creating Popup directly + style = { + fontColor: 'black', + fontSize: 14, // px + fontFace: 'verdana', + color: { + border: '#666', + background: '#FFFFC6' + } + } + } } - getToken(); - // statements - parseStatements(graph); + this.x = 0; + this.y = 0; + this.padding = 5; - // close angle bracket - if (token != '}') { - throw newSyntaxError('Angle bracket } expected'); + if (x !== undefined && y !== undefined ) { + this.setPosition(x, y); } - getToken(); - - // end of file - if (token !== '') { - throw newSyntaxError('End of file expected'); + if (text !== undefined) { + this.setText(text); } - getToken(); - - // remove temporary default properties - delete graph.node; - delete graph.edge; - delete graph.graph; - return graph; + // create the frame + this.frame = document.createElement("div"); + var styleAttr = this.frame.style; + styleAttr.position = "absolute"; + styleAttr.visibility = "hidden"; + styleAttr.border = "1px solid " + style.color.border; + styleAttr.color = style.fontColor; + styleAttr.fontSize = style.fontSize + "px"; + styleAttr.fontFamily = style.fontFace; + styleAttr.padding = this.padding + "px"; + styleAttr.backgroundColor = style.color.background; + styleAttr.borderRadius = "3px"; + styleAttr.MozBorderRadius = "3px"; + styleAttr.WebkitBorderRadius = "3px"; + styleAttr.boxShadow = "3px 3px 10px rgba(128, 128, 128, 0.5)"; + styleAttr.whiteSpace = "nowrap"; + this.container.appendChild(this.frame); } /** - * Parse a list with statements. - * @param {Object} graph + * @param {number} x Horizontal position of the popup window + * @param {number} y Vertical position of the popup window */ - function parseStatements (graph) { - while (token !== '' && token != '}') { - parseStatement(graph); - if (token == ';') { - getToken(); - } - } - } + Popup.prototype.setPosition = function(x, y) { + this.x = parseInt(x); + this.y = parseInt(y); + }; /** - * Parse a single statement. Can be a an attribute statement, node - * statement, a series of node statements and edge statements, or a - * parameter. - * @param {Object} graph + * Set the text for the popup window. This can be HTML code + * @param {string} text */ - function parseStatement(graph) { - // parse subgraph - var subgraph = parseSubgraph(graph); - if (subgraph) { - // edge statements - parseEdge(graph, subgraph); + Popup.prototype.setText = function(text) { + this.frame.innerHTML = text; + }; - return; + /** + * Show the popup window + * @param {boolean} show Optional. Show or hide the window + */ + Popup.prototype.show = function (show) { + if (show === undefined) { + show = true; } - // parse an attribute statement - var attr = parseAttributeStatement(graph); - if (attr) { - return; - } + if (show) { + var height = this.frame.clientHeight; + var width = this.frame.clientWidth; + var maxHeight = this.frame.parentNode.clientHeight; + var maxWidth = this.frame.parentNode.clientWidth; - // parse node - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Identifier expected'); - } - var id = token; // id can be a string or a number - getToken(); + var top = (this.y - height); + if (top + height + this.padding > maxHeight) { + top = maxHeight - height - this.padding; + } + if (top < this.padding) { + top = this.padding; + } - if (token == '=') { - // id statement - getToken(); - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Identifier expected'); + var left = this.x; + if (left + width + this.padding > maxWidth) { + left = maxWidth - width - this.padding; } - graph[id] = token; - getToken(); - // TODO: implement comma separated list with "a_list: ID=ID [','] [a_list] " + if (left < this.padding) { + left = this.padding; + } + + this.frame.style.left = left + "px"; + this.frame.style.top = top + "px"; + this.frame.style.visibility = "visible"; } else { - parseNodeStatement(graph, id); + this.hide(); } - } + }; /** - * Parse a subgraph - * @param {Object} graph parent graph object - * @return {Object | null} subgraph + * Hide the popup window */ - function parseSubgraph (graph) { - var subgraph = null; + Popup.prototype.hide = function () { + this.frame.style.visibility = "hidden"; + }; - // optional subgraph keyword - if (token == 'subgraph') { - subgraph = {}; - subgraph.type = 'subgraph'; - getToken(); + module.exports = Popup; - // optional graph id - if (tokenType == TOKENTYPE.IDENTIFIER) { - subgraph.id = token; - getToken(); - } - } - // open angle bracket - if (token == '{') { - getToken(); +/***/ }, +/* 32 */ +/***/ function(module, exports, __webpack_require__) { - if (!subgraph) { - subgraph = {}; - } - subgraph.parent = graph; - subgraph.node = graph.node; - subgraph.edge = graph.edge; - subgraph.graph = graph.graph; + /** + * Parse a text source containing data in DOT language into a JSON object. + * The object contains two lists: one with nodes and one with edges. + * + * DOT language reference: http://www.graphviz.org/doc/info/lang.html + * + * @param {String} data Text containing a graph in DOT-notation + * @return {Object} graph An object containing two parameters: + * {Object[]} nodes + * {Object[]} edges + */ + function parseDOT (data) { + dot = data; + return parseGraph(); + } - // statements - parseStatements(subgraph); + // token types enumeration + var TOKENTYPE = { + NULL : 0, + DELIMITER : 1, + IDENTIFIER: 2, + UNKNOWN : 3 + }; - // close angle bracket - if (token != '}') { - throw newSyntaxError('Angle bracket } expected'); - } - getToken(); + // map with all delimiters + var DELIMITERS = { + '{': true, + '}': true, + '[': true, + ']': true, + ';': true, + '=': true, + ',': true, - // remove temporary default properties - delete subgraph.node; - delete subgraph.edge; - delete subgraph.graph; - delete subgraph.parent; + '->': true, + '--': true + }; - // register at the parent graph - if (!graph.subgraphs) { - graph.subgraphs = []; - } - graph.subgraphs.push(subgraph); - } + var dot = ''; // current dot file + var index = 0; // current index in dot file + var c = ''; // current token character in expr + var token = ''; // current token + var tokenType = TOKENTYPE.NULL; // type of the token - return subgraph; + /** + * Get the first character from the dot file. + * The character is stored into the char c. If the end of the dot file is + * reached, the function puts an empty string in c. + */ + function first() { + index = 0; + c = dot.charAt(0); } /** - * parse an attribute statement like "node [shape=circle fontSize=16]". - * Available keywords are 'node', 'edge', 'graph'. - * The previous list with default attributes will be replaced - * @param {Object} graph - * @returns {String | null} keyword Returns the name of the parsed attribute - * (node, edge, graph), or null if nothing - * is parsed. + * Get the next character from the dot file. + * The character is stored into the char c. If the end of the dot file is + * reached, the function puts an empty string in c. */ - function parseAttributeStatement (graph) { - // attribute statements - if (token == 'node') { - getToken(); - - // node attributes - graph.node = parseAttributeList(); - return 'node'; - } - else if (token == 'edge') { - getToken(); - - // edge attributes - graph.edge = parseAttributeList(); - return 'edge'; - } - else if (token == 'graph') { - getToken(); + function next() { + index++; + c = dot.charAt(index); + } - // graph attributes - graph.graph = parseAttributeList(); - return 'graph'; - } + /** + * Preview the next character from the dot file. + * @return {String} cNext + */ + function nextPreview() { + return dot.charAt(index + 1); + } - return null; + /** + * Test whether given character is alphabetic or numeric + * @param {String} c + * @return {Boolean} isAlphaNumeric + */ + var regexAlphaNumeric = /[a-zA-Z_0-9.:#]/; + function isAlphaNumeric(c) { + return regexAlphaNumeric.test(c); } /** - * parse a node statement - * @param {Object} graph - * @param {String | Number} id + * Merge all properties of object b into object b + * @param {Object} a + * @param {Object} b + * @return {Object} a */ - function parseNodeStatement(graph, id) { - // node statement - var node = { - id: id - }; - var attr = parseAttributeList(); - if (attr) { - node.attr = attr; + function merge (a, b) { + if (!a) { + a = {}; } - addNode(graph, node); - // edge statements - parseEdge(graph, id); + if (b) { + for (var name in b) { + if (b.hasOwnProperty(name)) { + a[name] = b[name]; + } + } + } + return a; } /** - * Parse an edge or a series of edges - * @param {Object} graph - * @param {String | Number} from Id of the from node + * Set a value in an object, where the provided parameter name can be a + * path with nested parameters. For example: + * + * var obj = {a: 2}; + * setValue(obj, 'b.c', 3); // obj = {a: 2, b: {c: 3}} + * + * @param {Object} obj + * @param {String} path A parameter name or dot-separated parameter path, + * like "color.highlight.border". + * @param {*} value */ - function parseEdge(graph, from) { - while (token == '->' || token == '--') { - var to; - var type = token; - getToken(); - - var subgraph = parseSubgraph(graph); - if (subgraph) { - to = subgraph; + function setValue(obj, path, value) { + var keys = path.split('.'); + var o = obj; + while (keys.length) { + var key = keys.shift(); + if (keys.length) { + // this isn't the end point + if (!o[key]) { + o[key] = {}; + } + o = o[key]; } else { - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Identifier or subgraph expected'); - } - to = token; - addNode(graph, { - id: to - }); - getToken(); + // this is the end point + o[key] = value; } - - // parse edge attributes - var attr = parseAttributeList(); - - // create edge - var edge = createEdge(graph, from, to, type, attr); - addEdge(graph, edge); - - from = to; } } /** - * Parse a set with attributes, - * for example [label="1.000", shape=solid] - * @return {Object | null} attr - */ - function parseAttributeList() { - var attr = null; - - while (token == '[') { - getToken(); - attr = {}; - while (token !== '' && token != ']') { - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Attribute name expected'); - } - var name = token; + * Add a node to a graph object. If there is already a node with + * the same id, their attributes will be merged. + * @param {Object} graph + * @param {Object} node + */ + function addNode(graph, node) { + var i, len; + var current = null; - getToken(); - if (token != '=') { - throw newSyntaxError('Equal sign = expected'); - } - getToken(); + // find root graph (in case of subgraph) + var graphs = [graph]; // list with all graphs from current graph to root graph + var root = graph; + while (root.parent) { + graphs.push(root.parent); + root = root.parent; + } - if (tokenType != TOKENTYPE.IDENTIFIER) { - throw newSyntaxError('Attribute value expected'); + // find existing node (at root level) by its id + if (root.nodes) { + for (i = 0, len = root.nodes.length; i < len; i++) { + if (node.id === root.nodes[i].id) { + current = root.nodes[i]; + break; } - var value = token; - setValue(attr, name, value); // name can be a path + } + } - getToken(); - if (token ==',') { - getToken(); - } + if (!current) { + // this is a new node + current = { + id: node.id + }; + if (graph.node) { + // clone default attributes + current.attr = merge(current.attr, graph.node); } + } - if (token != ']') { - throw newSyntaxError('Bracket ] expected'); + // add node to this (sub)graph and all its parent graphs + for (i = graphs.length - 1; i >= 0; i--) { + var g = graphs[i]; + + if (!g.nodes) { + g.nodes = []; + } + if (g.nodes.indexOf(current) == -1) { + g.nodes.push(current); } - getToken(); } - return attr; + // merge attributes + if (node.attr) { + current.attr = merge(current.attr, node.attr); + } } /** - * Create a syntax error with extra information on current token and index. - * @param {String} message - * @returns {SyntaxError} err + * Add an edge to a graph object + * @param {Object} graph + * @param {Object} edge */ - function newSyntaxError(message) { - return new SyntaxError(message + ', got "' + chop(token, 30) + '" (char ' + index + ')'); + function addEdge(graph, edge) { + if (!graph.edges) { + graph.edges = []; + } + graph.edges.push(edge); + if (graph.edge) { + var attr = merge({}, graph.edge); // clone default attributes + edge.attr = merge(attr, edge.attr); // merge attributes + } } /** - * Chop off text after a maximum length - * @param {String} text - * @param {Number} maxLength - * @returns {String} + * Create an edge to a graph object + * @param {Object} graph + * @param {String | Number | Object} from + * @param {String | Number | Object} to + * @param {String} type + * @param {Object | null} attr + * @return {Object} edge */ - function chop (text, maxLength) { - return (text.length <= maxLength) ? text : (text.substr(0, 27) + '...'); - } + function createEdge(graph, from, to, type, attr) { + var edge = { + from: from, + to: to, + type: type + }; - /** - * Execute a function fn for each pair of elements in two arrays - * @param {Array | *} array1 - * @param {Array | *} array2 - * @param {function} fn - */ - function forEach2(array1, array2, fn) { - if (array1 instanceof Array) { - array1.forEach(function (elem1) { - if (array2 instanceof Array) { - array2.forEach(function (elem2) { - fn(elem1, elem2); - }); - } - else { - fn(elem1, array2); - } - }); - } - else { - if (array2 instanceof Array) { - array2.forEach(function (elem2) { - fn(array1, elem2); - }); - } - else { - fn(array1, array2); - } + if (graph.edge) { + edge.attr = merge({}, graph.edge); // clone default attributes } + edge.attr = merge(edge.attr || {}, attr); // merge attributes + + return edge; } /** - * Convert a string containing a graph in DOT language into a map containing - * with nodes and edges in the format of graph. - * @param {String} data Text containing a graph in DOT-notation - * @return {Object} graphData + * Get next token in the current dot file. + * The token and token type are available as token and tokenType */ - function DOTToGraph (data) { - // parse the DOT file - var dotData = parseDOT(data); - var graphData = { - nodes: [], - edges: [], - options: {} - }; + function getToken() { + tokenType = TOKENTYPE.NULL; + token = ''; - // copy the nodes - if (dotData.nodes) { - dotData.nodes.forEach(function (dotNode) { - var graphNode = { - id: dotNode.id, - label: String(dotNode.label || dotNode.id) - }; - merge(graphNode, dotNode.attr); - if (graphNode.image) { - graphNode.shape = 'image'; - } - graphData.nodes.push(graphNode); - }); + // skip over whitespaces + while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter + next(); } - // copy the edges - if (dotData.edges) { - /** - * Convert an edge in DOT format to an edge with VisGraph format - * @param {Object} dotEdge - * @returns {Object} graphEdge - */ - function convertEdge(dotEdge) { - var graphEdge = { - from: dotEdge.from, - to: dotEdge.to - }; - merge(graphEdge, dotEdge.attr); - graphEdge.style = (dotEdge.type == '->') ? 'arrow' : 'line'; - return graphEdge; - } + do { + var isComment = false; - dotData.edges.forEach(function (dotEdge) { - var from, to; - if (dotEdge.from instanceof Object) { - from = dotEdge.from.nodes; + // skip comment + if (c == '#') { + // find the previous non-space character + var i = index - 1; + while (dot.charAt(i) == ' ' || dot.charAt(i) == '\t') { + i--; } - else { - from = { - id: dotEdge.from + if (dot.charAt(i) == '\n' || dot.charAt(i) == '') { + // the # is at the start of a line, this is indeed a line comment + while (c != '' && c != '\n') { + next(); } + isComment = true; } - - if (dotEdge.to instanceof Object) { - to = dotEdge.to.nodes; + } + if (c == '/' && nextPreview() == '/') { + // skip line comment + while (c != '' && c != '\n') { + next(); } - else { - to = { - id: dotEdge.to + isComment = true; + } + if (c == '/' && nextPreview() == '*') { + // skip block comment + while (c != '') { + if (c == '*' && nextPreview() == '/') { + // end of block comment found. skip these last two characters + next(); + next(); + break; + } + else { + next(); } } + isComment = true; + } + + // skip over whitespaces + while (c == ' ' || c == '\t' || c == '\n' || c == '\r') { // space, tab, enter + next(); + } + } + while (isComment); + + // check for end of dot file + if (c == '') { + // token is still empty + tokenType = TOKENTYPE.DELIMITER; + return; + } + + // check for delimiters consisting of 2 characters + var c2 = c + nextPreview(); + if (DELIMITERS[c2]) { + tokenType = TOKENTYPE.DELIMITER; + token = c2; + next(); + next(); + return; + } + + // check for delimiters consisting of 1 character + if (DELIMITERS[c]) { + tokenType = TOKENTYPE.DELIMITER; + token = c; + next(); + return; + } - if (dotEdge.from instanceof Object && dotEdge.from.edges) { - dotEdge.from.edges.forEach(function (subEdge) { - var graphEdge = convertEdge(subEdge); - graphData.edges.push(graphEdge); - }); - } + // check for an identifier (number or string) + // TODO: more precise parsing of numbers/strings (and the port separator ':') + if (isAlphaNumeric(c) || c == '-') { + token += c; + next(); - forEach2(from, to, function (from, to) { - var subEdge = createEdge(graphData, from.id, to.id, dotEdge.type, dotEdge.attr); - var graphEdge = convertEdge(subEdge); - graphData.edges.push(graphEdge); - }); + while (isAlphaNumeric(c)) { + token += c; + next(); + } + if (token == 'false') { + token = false; // convert to boolean + } + else if (token == 'true') { + token = true; // convert to boolean + } + else if (!isNaN(Number(token))) { + token = Number(token); // convert to number + } + tokenType = TOKENTYPE.IDENTIFIER; + return; + } - if (dotEdge.to instanceof Object && dotEdge.to.edges) { - dotEdge.to.edges.forEach(function (subEdge) { - var graphEdge = convertEdge(subEdge); - graphData.edges.push(graphEdge); - }); + // check for a string enclosed by double quotes + if (c == '"') { + next(); + while (c != '' && (c != '"' || (c == '"' && nextPreview() == '"'))) { + token += c; + if (c == '"') { // skip the escape character + next(); } - }); + next(); + } + if (c != '"') { + throw newSyntaxError('End of string " expected'); + } + next(); + tokenType = TOKENTYPE.IDENTIFIER; + return; } - // copy the options - if (dotData.attr) { - graphData.options = dotData.attr; + // something unknown is found, wrong characters, a syntax error + tokenType = TOKENTYPE.UNKNOWN; + while (c != '') { + token += c; + next(); } - - return graphData; + throw new SyntaxError('Syntax error in part "' + chop(token, 30) + '"'); } - // exports - exports.parseDOT = parseDOT; - exports.DOTToGraph = DOTToGraph; - - -/***/ }, -/* 33 */ -/***/ function(module, exports, __webpack_require__) { - /** - * @prototype Point3d - * @param {Number} [x] - * @param {Number} [y] - * @param {Number} [z] + * Parse a graph. + * @returns {Object} graph */ - function Point3d(x, y, z) { - this.x = x !== undefined ? x : 0; - this.y = y !== undefined ? y : 0; - this.z = z !== undefined ? z : 0; - }; + function parseGraph() { + var graph = {}; - /** - * Subtract the two provided points, returns a-b - * @param {Point3d} a - * @param {Point3d} b - * @return {Point3d} a-b - */ - Point3d.subtract = function(a, b) { - var sub = new Point3d(); - sub.x = a.x - b.x; - sub.y = a.y - b.y; - sub.z = a.z - b.z; - return sub; - }; + first(); + getToken(); - /** - * Add the two provided points, returns a+b - * @param {Point3d} a - * @param {Point3d} b - * @return {Point3d} a+b - */ - Point3d.add = function(a, b) { - var sum = new Point3d(); - sum.x = a.x + b.x; - sum.y = a.y + b.y; - sum.z = a.z + b.z; - return sum; - }; + // optional strict keyword + if (token == 'strict') { + graph.strict = true; + getToken(); + } - /** - * Calculate the average of two 3d points - * @param {Point3d} a - * @param {Point3d} b - * @return {Point3d} The average, (a+b)/2 - */ - Point3d.avg = function(a, b) { - return new Point3d( - (a.x + b.x) / 2, - (a.y + b.y) / 2, - (a.z + b.z) / 2 - ); - }; + // graph or digraph keyword + if (token == 'graph' || token == 'digraph') { + graph.type = token; + getToken(); + } - /** - * Calculate the cross product of the two provided points, returns axb - * Documentation: http://en.wikipedia.org/wiki/Cross_product - * @param {Point3d} a - * @param {Point3d} b - * @return {Point3d} cross product axb - */ - Point3d.crossProduct = function(a, b) { - var crossproduct = new Point3d(); + // optional graph id + if (tokenType == TOKENTYPE.IDENTIFIER) { + graph.id = token; + getToken(); + } - crossproduct.x = a.y * b.z - a.z * b.y; - crossproduct.y = a.z * b.x - a.x * b.z; - crossproduct.z = a.x * b.y - a.y * b.x; + // open angle bracket + if (token != '{') { + throw newSyntaxError('Angle bracket { expected'); + } + getToken(); - return crossproduct; - }; + // statements + parseStatements(graph); + // close angle bracket + if (token != '}') { + throw newSyntaxError('Angle bracket } expected'); + } + getToken(); - /** - * Rtrieve the length of the vector (or the distance from this point to the origin - * @return {Number} length - */ - Point3d.prototype.length = function() { - return Math.sqrt( - this.x * this.x + - this.y * this.y + - this.z * this.z - ); - }; + // end of file + if (token !== '') { + throw newSyntaxError('End of file expected'); + } + getToken(); - module.exports = Point3d; + // remove temporary default properties + delete graph.node; + delete graph.edge; + delete graph.graph; + return graph; + } -/***/ }, -/* 34 */ -/***/ function(module, exports, __webpack_require__) { + /** + * Parse a list with statements. + * @param {Object} graph + */ + function parseStatements (graph) { + while (token !== '' && token != '}') { + parseStatement(graph); + if (token == ';') { + getToken(); + } + } + } /** - * @prototype Point2d - * @param {Number} [x] - * @param {Number} [y] + * Parse a single statement. Can be a an attribute statement, node + * statement, a series of node statements and edge statements, or a + * parameter. + * @param {Object} graph */ - Point2d = function (x, y) { - this.x = x !== undefined ? x : 0; - this.y = y !== undefined ? y : 0; - }; + function parseStatement(graph) { + // parse subgraph + var subgraph = parseSubgraph(graph); + if (subgraph) { + // edge statements + parseEdge(graph, subgraph); - module.exports = Point2d; + return; + } + // parse an attribute statement + var attr = parseAttributeStatement(graph); + if (attr) { + return; + } -/***/ }, -/* 35 */ -/***/ function(module, exports, __webpack_require__) { + // parse node + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Identifier expected'); + } + var id = token; // id can be a string or a number + getToken(); - var DataView = __webpack_require__(4); + if (token == '=') { + // id statement + getToken(); + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Identifier expected'); + } + graph[id] = token; + getToken(); + // TODO: implement comma separated list with "a_list: ID=ID [','] [a_list] " + } + else { + parseNodeStatement(graph, id); + } + } /** - * @class Filter - * - * @param {DataSet} data The google data table - * @param {Number} column The index of the column to be filtered - * @param {Graph} graph The graph + * Parse a subgraph + * @param {Object} graph parent graph object + * @return {Object | null} subgraph */ - function Filter (data, column, graph) { - this.data = data; - this.column = column; - this.graph = graph; // the parent graph + function parseSubgraph (graph) { + var subgraph = null; - this.index = undefined; - this.value = undefined; + // optional subgraph keyword + if (token == 'subgraph') { + subgraph = {}; + subgraph.type = 'subgraph'; + getToken(); - // read all distinct values and select the first one - this.values = graph.getDistinctValues(data.get(), this.column); + // optional graph id + if (tokenType == TOKENTYPE.IDENTIFIER) { + subgraph.id = token; + getToken(); + } + } - // sort both numeric and string values correctly - this.values.sort(function (a, b) { - return a > b ? 1 : a < b ? -1 : 0; - }); + // open angle bracket + if (token == '{') { + getToken(); - if (this.values.length > 0) { - this.selectValue(0); - } + if (!subgraph) { + subgraph = {}; + } + subgraph.parent = graph; + subgraph.node = graph.node; + subgraph.edge = graph.edge; + subgraph.graph = graph.graph; - // create an array with the filtered datapoints. this will be loaded afterwards - this.dataPoints = []; + // statements + parseStatements(subgraph); - this.loaded = false; - this.onLoadCallback = undefined; + // close angle bracket + if (token != '}') { + throw newSyntaxError('Angle bracket } expected'); + } + getToken(); - if (graph.animationPreload) { - this.loaded = false; - this.loadInBackground(); - } - else { - this.loaded = true; + // remove temporary default properties + delete subgraph.node; + delete subgraph.edge; + delete subgraph.graph; + delete subgraph.parent; + + // register at the parent graph + if (!graph.subgraphs) { + graph.subgraphs = []; + } + graph.subgraphs.push(subgraph); } - }; + return subgraph; + } /** - * Return the label - * @return {string} label + * parse an attribute statement like "node [shape=circle fontSize=16]". + * Available keywords are 'node', 'edge', 'graph'. + * The previous list with default attributes will be replaced + * @param {Object} graph + * @returns {String | null} keyword Returns the name of the parsed attribute + * (node, edge, graph), or null if nothing + * is parsed. */ - Filter.prototype.isLoaded = function() { - return this.loaded; - }; - + function parseAttributeStatement (graph) { + // attribute statements + if (token == 'node') { + getToken(); - /** - * Return the loaded progress - * @return {Number} percentage between 0 and 100 - */ - Filter.prototype.getLoadedProgress = function() { - var len = this.values.length; + // node attributes + graph.node = parseAttributeList(); + return 'node'; + } + else if (token == 'edge') { + getToken(); - var i = 0; - while (this.dataPoints[i]) { - i++; + // edge attributes + graph.edge = parseAttributeList(); + return 'edge'; } + else if (token == 'graph') { + getToken(); - return Math.round(i / len * 100); - }; + // graph attributes + graph.graph = parseAttributeList(); + return 'graph'; + } + return null; + } /** - * Return the label - * @return {string} label + * parse a node statement + * @param {Object} graph + * @param {String | Number} id */ - Filter.prototype.getLabel = function() { - return this.graph.filterLabel; - }; - + function parseNodeStatement(graph, id) { + // node statement + var node = { + id: id + }; + var attr = parseAttributeList(); + if (attr) { + node.attr = attr; + } + addNode(graph, node); - /** - * Return the columnIndex of the filter - * @return {Number} columnIndex - */ - Filter.prototype.getColumn = function() { - return this.column; - }; + // edge statements + parseEdge(graph, id); + } /** - * Return the currently selected value. Returns undefined if there is no selection - * @return {*} value + * Parse an edge or a series of edges + * @param {Object} graph + * @param {String | Number} from Id of the from node */ - Filter.prototype.getSelectedValue = function() { - if (this.index === undefined) - return undefined; - - return this.values[this.index]; - }; + function parseEdge(graph, from) { + while (token == '->' || token == '--') { + var to; + var type = token; + getToken(); - /** - * Retrieve all values of the filter - * @return {Array} values - */ - Filter.prototype.getValues = function() { - return this.values; - }; + var subgraph = parseSubgraph(graph); + if (subgraph) { + to = subgraph; + } + else { + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Identifier or subgraph expected'); + } + to = token; + addNode(graph, { + id: to + }); + getToken(); + } - /** - * Retrieve one value of the filter - * @param {Number} index - * @return {*} value - */ - Filter.prototype.getValue = function(index) { - if (index >= this.values.length) - throw 'Error: index out of range'; + // parse edge attributes + var attr = parseAttributeList(); - return this.values[index]; - }; + // create edge + var edge = createEdge(graph, from, to, type, attr); + addEdge(graph, edge); + from = to; + } + } /** - * Retrieve the (filtered) dataPoints for the currently selected filter index - * @param {Number} [index] (optional) - * @return {Array} dataPoints + * Parse a set with attributes, + * for example [label="1.000", shape=solid] + * @return {Object | null} attr */ - Filter.prototype._getDataPoints = function(index) { - if (index === undefined) - index = this.index; - - if (index === undefined) - return []; + function parseAttributeList() { + var attr = null; - var dataPoints; - if (this.dataPoints[index]) { - dataPoints = this.dataPoints[index]; - } - else { - var f = {}; - f.column = this.column; - f.value = this.values[index]; + while (token == '[') { + getToken(); + attr = {}; + while (token !== '' && token != ']') { + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Attribute name expected'); + } + var name = token; - var dataView = new DataView(this.data,{filter: function (item) {return (item[f.column] == f.value);}}).get(); - dataPoints = this.graph._getDataPoints(dataView); + getToken(); + if (token != '=') { + throw newSyntaxError('Equal sign = expected'); + } + getToken(); - this.dataPoints[index] = dataPoints; - } + if (tokenType != TOKENTYPE.IDENTIFIER) { + throw newSyntaxError('Attribute value expected'); + } + var value = token; + setValue(attr, name, value); // name can be a path - return dataPoints; - }; + getToken(); + if (token ==',') { + getToken(); + } + } + if (token != ']') { + throw newSyntaxError('Bracket ] expected'); + } + getToken(); + } + return attr; + } /** - * Set a callback function when the filter is fully loaded. + * Create a syntax error with extra information on current token and index. + * @param {String} message + * @returns {SyntaxError} err */ - Filter.prototype.setOnLoadCallback = function(callback) { - this.onLoadCallback = callback; - }; - + function newSyntaxError(message) { + return new SyntaxError(message + ', got "' + chop(token, 30) + '" (char ' + index + ')'); + } /** - * Add a value to the list with available values for this filter - * No double entries will be created. - * @param {Number} index + * Chop off text after a maximum length + * @param {String} text + * @param {Number} maxLength + * @returns {String} */ - Filter.prototype.selectValue = function(index) { - if (index >= this.values.length) - throw 'Error: index out of range'; - - this.index = index; - this.value = this.values[index]; - }; + function chop (text, maxLength) { + return (text.length <= maxLength) ? text : (text.substr(0, 27) + '...'); + } /** - * Load all filtered rows in the background one by one - * Start this method without providing an index! + * Execute a function fn for each pair of elements in two arrays + * @param {Array | *} array1 + * @param {Array | *} array2 + * @param {function} fn */ - Filter.prototype.loadInBackground = function(index) { - if (index === undefined) - index = 0; - - var frame = this.graph.frame; - - if (index < this.values.length) { - var dataPointsTemp = this._getDataPoints(index); - //this.graph.redrawInfo(); // TODO: not neat - - // create a progress box - if (frame.progress === undefined) { - frame.progress = document.createElement('DIV'); - frame.progress.style.position = 'absolute'; - frame.progress.style.color = 'gray'; - frame.appendChild(frame.progress); - } - var progress = this.getLoadedProgress(); - frame.progress.innerHTML = 'Loading animation... ' + progress + '%'; - // TODO: this is no nice solution... - frame.progress.style.bottom = 60 + 'px'; // TODO: use height of slider - frame.progress.style.left = 10 + 'px'; - - var me = this; - setTimeout(function() {me.loadInBackground(index+1);}, 10); - this.loaded = false; + function forEach2(array1, array2, fn) { + if (array1 instanceof Array) { + array1.forEach(function (elem1) { + if (array2 instanceof Array) { + array2.forEach(function (elem2) { + fn(elem1, elem2); + }); + } + else { + fn(elem1, array2); + } + }); } else { - this.loaded = true; - - // remove the progress box - if (frame.progress !== undefined) { - frame.removeChild(frame.progress); - frame.progress = undefined; + if (array2 instanceof Array) { + array2.forEach(function (elem2) { + fn(array1, elem2); + }); + } + else { + fn(array1, array2); } - - if (this.onLoadCallback) - this.onLoadCallback(); } - }; - - module.exports = Filter; - - -/***/ }, -/* 36 */ -/***/ function(module, exports, __webpack_require__) { + } /** - * @prototype StepNumber - * The class StepNumber is an iterator for Numbers. You provide a start and end - * value, and a best step size. StepNumber itself rounds to fixed values and - * a finds the step that best fits the provided step. - * - * If prettyStep is true, the step size is chosen as close as possible to the - * provided step, but being a round value like 1, 2, 5, 10, 20, 50, .... - * - * Example usage: - * var step = new StepNumber(0, 10, 2.5, true); - * step.start(); - * while (!step.end()) { - * alert(step.getCurrent()); - * step.next(); - * } - * - * Version: 1.0 - * - * @param {Number} start The start value - * @param {Number} end The end value - * @param {Number} step Optional. Step size. Must be a positive value. - * @param {boolean} prettyStep Optional. If true, the step size is rounded - * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) + * Convert a string containing a graph in DOT language into a map containing + * with nodes and edges in the format of graph. + * @param {String} data Text containing a graph in DOT-notation + * @return {Object} graphData */ - function StepNumber(start, end, step, prettyStep) { - // set default values - this._start = 0; - this._end = 0; - this._step = 1; - this.prettyStep = true; - this.precision = 5; + function DOTToGraph (data) { + // parse the DOT file + var dotData = parseDOT(data); + var graphData = { + nodes: [], + edges: [], + options: {} + }; - this._current = 0; - this.setRange(start, end, step, prettyStep); - }; + // copy the nodes + if (dotData.nodes) { + dotData.nodes.forEach(function (dotNode) { + var graphNode = { + id: dotNode.id, + label: String(dotNode.label || dotNode.id) + }; + merge(graphNode, dotNode.attr); + if (graphNode.image) { + graphNode.shape = 'image'; + } + graphData.nodes.push(graphNode); + }); + } - /** - * Set a new range: start, end and step. - * - * @param {Number} start The start value - * @param {Number} end The end value - * @param {Number} step Optional. Step size. Must be a positive value. - * @param {boolean} prettyStep Optional. If true, the step size is rounded - * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) - */ - StepNumber.prototype.setRange = function(start, end, step, prettyStep) { - this._start = start ? start : 0; - this._end = end ? end : 0; + // copy the edges + if (dotData.edges) { + /** + * Convert an edge in DOT format to an edge with VisGraph format + * @param {Object} dotEdge + * @returns {Object} graphEdge + */ + function convertEdge(dotEdge) { + var graphEdge = { + from: dotEdge.from, + to: dotEdge.to + }; + merge(graphEdge, dotEdge.attr); + graphEdge.style = (dotEdge.type == '->') ? 'arrow' : 'line'; + return graphEdge; + } - this.setStep(step, prettyStep); - }; + dotData.edges.forEach(function (dotEdge) { + var from, to; + if (dotEdge.from instanceof Object) { + from = dotEdge.from.nodes; + } + else { + from = { + id: dotEdge.from + } + } - /** - * Set a new step size - * @param {Number} step New step size. Must be a positive value - * @param {boolean} prettyStep Optional. If true, the provided step is rounded - * to a pretty step size (like 1, 2, 5, 10, 20, 50, ...) - */ - StepNumber.prototype.setStep = function(step, prettyStep) { - if (step === undefined || step <= 0) - return; + if (dotEdge.to instanceof Object) { + to = dotEdge.to.nodes; + } + else { + to = { + id: dotEdge.to + } + } - if (prettyStep !== undefined) - this.prettyStep = prettyStep; + if (dotEdge.from instanceof Object && dotEdge.from.edges) { + dotEdge.from.edges.forEach(function (subEdge) { + var graphEdge = convertEdge(subEdge); + graphData.edges.push(graphEdge); + }); + } - if (this.prettyStep === true) - this._step = StepNumber.calculatePrettyStep(step); - else - this._step = step; - }; + forEach2(from, to, function (from, to) { + var subEdge = createEdge(graphData, from.id, to.id, dotEdge.type, dotEdge.attr); + var graphEdge = convertEdge(subEdge); + graphData.edges.push(graphEdge); + }); - /** - * Calculate a nice step size, closest to the desired step size. - * Returns a value in one of the ranges 1*10^n, 2*10^n, or 5*10^n, where n is an - * integer Number. For example 1, 2, 5, 10, 20, 50, etc... - * @param {Number} step Desired step size - * @return {Number} Nice step size - */ - StepNumber.calculatePrettyStep = function (step) { - var log10 = function (x) {return Math.log(x) / Math.LN10;}; + if (dotEdge.to instanceof Object && dotEdge.to.edges) { + dotEdge.to.edges.forEach(function (subEdge) { + var graphEdge = convertEdge(subEdge); + graphData.edges.push(graphEdge); + }); + } + }); + } - // try three steps (multiple of 1, 2, or 5 - var step1 = Math.pow(10, Math.round(log10(step))), - step2 = 2 * Math.pow(10, Math.round(log10(step / 2))), - step5 = 5 * Math.pow(10, Math.round(log10(step / 5))); + // copy the options + if (dotData.attr) { + graphData.options = dotData.attr; + } - // choose the best step (closest to minimum step) - var prettyStep = step1; - if (Math.abs(step2 - step) <= Math.abs(prettyStep - step)) prettyStep = step2; - if (Math.abs(step5 - step) <= Math.abs(prettyStep - step)) prettyStep = step5; + return graphData; + } - // for safety - if (prettyStep <= 0) { - prettyStep = 1; - } + // exports + exports.parseDOT = parseDOT; + exports.DOTToGraph = DOTToGraph; - return prettyStep; - }; + +/***/ }, +/* 33 */ +/***/ function(module, exports, __webpack_require__) { /** - * returns the current value of the step - * @return {Number} current value + * @prototype Point3d + * @param {Number} [x] + * @param {Number} [y] + * @param {Number} [z] */ - StepNumber.prototype.getCurrent = function () { - return parseFloat(this._current.toPrecision(this.precision)); + function Point3d(x, y, z) { + this.x = x !== undefined ? x : 0; + this.y = y !== undefined ? y : 0; + this.z = z !== undefined ? z : 0; }; /** - * returns the current step size - * @return {Number} current step size + * Subtract the two provided points, returns a-b + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} a-b */ - StepNumber.prototype.getStep = function () { - return this._step; + Point3d.subtract = function(a, b) { + var sub = new Point3d(); + sub.x = a.x - b.x; + sub.y = a.y - b.y; + sub.z = a.z - b.z; + return sub; }; /** - * Set the current value to the largest value smaller than start, which - * is a multiple of the step size + * Add the two provided points, returns a+b + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} a+b */ - StepNumber.prototype.start = function() { - this._current = this._start - this._start % this._step; + Point3d.add = function(a, b) { + var sum = new Point3d(); + sum.x = a.x + b.x; + sum.y = a.y + b.y; + sum.z = a.z + b.z; + return sum; }; /** - * Do a step, add the step size to the current value + * Calculate the average of two 3d points + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} The average, (a+b)/2 */ - StepNumber.prototype.next = function () { - this._current += this._step; + Point3d.avg = function(a, b) { + return new Point3d( + (a.x + b.x) / 2, + (a.y + b.y) / 2, + (a.z + b.z) / 2 + ); }; /** - * Returns true whether the end is reached - * @return {boolean} True if the current value has passed the end value. + * Calculate the cross product of the two provided points, returns axb + * Documentation: http://en.wikipedia.org/wiki/Cross_product + * @param {Point3d} a + * @param {Point3d} b + * @return {Point3d} cross product axb */ - StepNumber.prototype.end = function () { - return (this._current > this._end); - }; + Point3d.crossProduct = function(a, b) { + var crossproduct = new Point3d(); - module.exports = StepNumber; + crossproduct.x = a.y * b.z - a.z * b.y; + crossproduct.y = a.z * b.x - a.x * b.z; + crossproduct.z = a.x * b.y - a.y * b.x; + return crossproduct; + }; -/***/ }, -/* 37 */ -/***/ function(module, exports, __webpack_require__) { /** - * Canvas shapes used by Network + * Rtrieve the length of the vector (or the distance from this point to the origin + * @return {Number} length */ - if (typeof CanvasRenderingContext2D !== 'undefined') { - - /** - * Draw a circle shape - */ - CanvasRenderingContext2D.prototype.circle = function(x, y, r) { - this.beginPath(); - this.arc(x, y, r, 0, 2*Math.PI, false); - }; - - /** - * Draw a square shape - * @param {Number} x horizontal center - * @param {Number} y vertical center - * @param {Number} r size, width and height of the square - */ - CanvasRenderingContext2D.prototype.square = function(x, y, r) { - this.beginPath(); - this.rect(x - r, y - r, r * 2, r * 2); - }; - - /** - * Draw a triangle shape - * @param {Number} x horizontal center - * @param {Number} y vertical center - * @param {Number} r radius, half the length of the sides of the triangle - */ - CanvasRenderingContext2D.prototype.triangle = function(x, y, r) { - // http://en.wikipedia.org/wiki/Equilateral_triangle - this.beginPath(); - - var s = r * 2; - var s2 = s / 2; - var ir = Math.sqrt(3) / 6 * s; // radius of inner circle - var h = Math.sqrt(s * s - s2 * s2); // height - - this.moveTo(x, y - (h - ir)); - this.lineTo(x + s2, y + ir); - this.lineTo(x - s2, y + ir); - this.lineTo(x, y - (h - ir)); - this.closePath(); - }; - - /** - * Draw a triangle shape in downward orientation - * @param {Number} x horizontal center - * @param {Number} y vertical center - * @param {Number} r radius - */ - CanvasRenderingContext2D.prototype.triangleDown = function(x, y, r) { - // http://en.wikipedia.org/wiki/Equilateral_triangle - this.beginPath(); - - var s = r * 2; - var s2 = s / 2; - var ir = Math.sqrt(3) / 6 * s; // radius of inner circle - var h = Math.sqrt(s * s - s2 * s2); // height - - this.moveTo(x, y + (h - ir)); - this.lineTo(x + s2, y - ir); - this.lineTo(x - s2, y - ir); - this.lineTo(x, y + (h - ir)); - this.closePath(); - }; - - /** - * Draw a star shape, a star with 5 points - * @param {Number} x horizontal center - * @param {Number} y vertical center - * @param {Number} r radius, half the length of the sides of the triangle - */ - CanvasRenderingContext2D.prototype.star = function(x, y, r) { - // http://www.html5canvastutorials.com/labs/html5-canvas-star-spinner/ - this.beginPath(); - - for (var n = 0; n < 10; n++) { - var radius = (n % 2 === 0) ? r * 1.3 : r * 0.5; - this.lineTo( - x + radius * Math.sin(n * 2 * Math.PI / 10), - y - radius * Math.cos(n * 2 * Math.PI / 10) - ); - } - - this.closePath(); - }; - - /** - * http://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-on-html-canvas - */ - CanvasRenderingContext2D.prototype.roundRect = function(x, y, w, h, r) { - var r2d = Math.PI/180; - if( w - ( 2 * r ) < 0 ) { r = ( w / 2 ); } //ensure that the radius isn't too large for x - if( h - ( 2 * r ) < 0 ) { r = ( h / 2 ); } //ensure that the radius isn't too large for y - this.beginPath(); - this.moveTo(x+r,y); - this.lineTo(x+w-r,y); - this.arc(x+w-r,y+r,r,r2d*270,r2d*360,false); - this.lineTo(x+w,y+h-r); - this.arc(x+w-r,y+h-r,r,0,r2d*90,false); - this.lineTo(x+r,y+h); - this.arc(x+r,y+h-r,r,r2d*90,r2d*180,false); - this.lineTo(x,y+r); - this.arc(x+r,y+r,r,r2d*180,r2d*270,false); - }; - - /** - * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas - */ - CanvasRenderingContext2D.prototype.ellipse = function(x, y, w, h) { - var kappa = .5522848, - ox = (w / 2) * kappa, // control point offset horizontal - oy = (h / 2) * kappa, // control point offset vertical - xe = x + w, // x-end - ye = y + h, // y-end - xm = x + w / 2, // x-middle - ym = y + h / 2; // y-middle - - this.beginPath(); - this.moveTo(x, ym); - this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); - this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); - this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); - this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); - }; - - - - /** - * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas - */ - CanvasRenderingContext2D.prototype.database = function(x, y, w, h) { - var f = 1/3; - var wEllipse = w; - var hEllipse = h * f; - - var kappa = .5522848, - ox = (wEllipse / 2) * kappa, // control point offset horizontal - oy = (hEllipse / 2) * kappa, // control point offset vertical - xe = x + wEllipse, // x-end - ye = y + hEllipse, // y-end - xm = x + wEllipse / 2, // x-middle - ym = y + hEllipse / 2, // y-middle - ymb = y + (h - hEllipse/2), // y-midlle, bottom ellipse - yeb = y + h; // y-end, bottom ellipse - - this.beginPath(); - this.moveTo(xe, ym); + Point3d.prototype.length = function() { + return Math.sqrt( + this.x * this.x + + this.y * this.y + + this.z * this.z + ); + }; - this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); - this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + module.exports = Point3d; - this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); - this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); - this.lineTo(xe, ymb); +/***/ }, +/* 34 */ +/***/ function(module, exports, __webpack_require__) { - this.bezierCurveTo(xe, ymb + oy, xm + ox, yeb, xm, yeb); - this.bezierCurveTo(xm - ox, yeb, x, ymb + oy, x, ymb); + /** + * @prototype Point2d + * @param {Number} [x] + * @param {Number} [y] + */ + Point2d = function (x, y) { + this.x = x !== undefined ? x : 0; + this.y = y !== undefined ? y : 0; + }; - this.lineTo(x, ym); - }; + module.exports = Point2d; - /** - * Draw an arrow point (no line) - */ - CanvasRenderingContext2D.prototype.arrow = function(x, y, angle, length) { - // tail - var xt = x - length * Math.cos(angle); - var yt = y - length * Math.sin(angle); +/***/ }, +/* 35 */ +/***/ function(module, exports, __webpack_require__) { - // inner tail - // TODO: allow to customize different shapes - var xi = x - length * 0.9 * Math.cos(angle); - var yi = y - length * 0.9 * Math.sin(angle); + var DataView = __webpack_require__(4); - // left - var xl = xt + length / 3 * Math.cos(angle + 0.5 * Math.PI); - var yl = yt + length / 3 * Math.sin(angle + 0.5 * Math.PI); + /** + * @class Filter + * + * @param {DataSet} data The google data table + * @param {Number} column The index of the column to be filtered + * @param {Graph} graph The graph + */ + function Filter (data, column, graph) { + this.data = data; + this.column = column; + this.graph = graph; // the parent graph - // right - var xr = xt + length / 3 * Math.cos(angle - 0.5 * Math.PI); - var yr = yt + length / 3 * Math.sin(angle - 0.5 * Math.PI); + this.index = undefined; + this.value = undefined; - this.beginPath(); - this.moveTo(x, y); - this.lineTo(xl, yl); - this.lineTo(xi, yi); - this.lineTo(xr, yr); - this.closePath(); - }; + // read all distinct values and select the first one + this.values = graph.getDistinctValues(data.get(), this.column); - /** - * Sets up the dashedLine functionality for drawing - * Original code came from http://stackoverflow.com/questions/4576724/dotted-stroke-in-canvas - * @author David Jordan - * @date 2012-08-08 - */ - CanvasRenderingContext2D.prototype.dashedLine = function(x,y,x2,y2,dashArray){ - if (!dashArray) dashArray=[10,5]; - if (dashLength==0) dashLength = 0.001; // Hack for Safari - var dashCount = dashArray.length; - this.moveTo(x, y); - var dx = (x2-x), dy = (y2-y); - var slope = dy/dx; - var distRemaining = Math.sqrt( dx*dx + dy*dy ); - var dashIndex=0, draw=true; - while (distRemaining>=0.1){ - var dashLength = dashArray[dashIndex++%dashCount]; - if (dashLength > distRemaining) dashLength = distRemaining; - var xStep = Math.sqrt( dashLength*dashLength / (1 + slope*slope) ); - if (dx<0) xStep = -xStep; - x += xStep; - y += slope*xStep; - this[draw ? 'lineTo' : 'moveTo'](x,y); - distRemaining -= dashLength; - draw = !draw; - } - }; + // sort both numeric and string values correctly + this.values.sort(function (a, b) { + return a > b ? 1 : a < b ? -1 : 0; + }); - // TODO: add diamond shape - } + if (this.values.length > 0) { + this.selectValue(0); + } + // create an array with the filtered datapoints. this will be loaded afterwards + this.dataPoints = []; -/***/ }, -/* 38 */ -/***/ function(module, exports, __webpack_require__) { + this.loaded = false; + this.onLoadCallback = undefined; - // Only load hammer.js when in a browser environment - // (loading hammer.js in a node.js environment gives errors) - if (typeof window !== 'undefined') { - module.exports = window['Hammer'] || __webpack_require__(50); - // TODO: throw an error when hammerjs is not available? - } - else { - module.exports = function () { - throw Error('hammer.js is only available in a browser, not in node.js.'); + if (graph.animationPreload) { + this.loaded = false; + this.loadInBackground(); } - } + else { + this.loaded = true; + } + }; -/***/ }, -/* 39 */ -/***/ function(module, exports, __webpack_require__) { + /** + * Return the label + * @return {string} label + */ + Filter.prototype.isLoaded = function() { + return this.loaded; + }; - // first check if moment.js is already loaded in the browser window, if so, - // use this instance. Else, load via commonjs. - module.exports = (typeof window !== 'undefined') && window['moment'] || __webpack_require__(51); + /** + * Return the loaded progress + * @return {Number} percentage between 0 and 100 + */ + Filter.prototype.getLoadedProgress = function() { + var len = this.values.length; + + var i = 0; + while (this.dataPoints[i]) { + i++; + } -/***/ }, -/* 40 */ -/***/ function(module, exports, __webpack_require__) { + return Math.round(i / len * 100); + }; - var PhysicsMixin = __webpack_require__(49); - var ClusterMixin = __webpack_require__(42); - var SectorsMixin = __webpack_require__(43); - var SelectionMixin = __webpack_require__(44); - var ManipulationMixin = __webpack_require__(45); - var NavigationMixin = __webpack_require__(46); - var HierarchicalLayoutMixin = __webpack_require__(47); /** - * Load a mixin into the network object - * - * @param {Object} sourceVariable | this object has to contain functions. - * @private + * Return the label + * @return {string} label */ - exports._loadMixin = function (sourceVariable) { - for (var mixinFunction in sourceVariable) { - if (sourceVariable.hasOwnProperty(mixinFunction)) { - this[mixinFunction] = sourceVariable[mixinFunction]; - } - } + Filter.prototype.getLabel = function() { + return this.graph.filterLabel; }; /** - * removes a mixin from the network object. - * - * @param {Object} sourceVariable | this object has to contain functions. - * @private + * Return the columnIndex of the filter + * @return {Number} columnIndex */ - exports._clearMixin = function (sourceVariable) { - for (var mixinFunction in sourceVariable) { - if (sourceVariable.hasOwnProperty(mixinFunction)) { - this[mixinFunction] = undefined; - } - } + Filter.prototype.getColumn = function() { + return this.column; }; - /** - * Mixin the physics system and initialize the parameters required. - * - * @private + * Return the currently selected value. Returns undefined if there is no selection + * @return {*} value */ - exports._loadPhysicsSystem = function () { - this._loadMixin(PhysicsMixin); - this._loadSelectedForceSolver(); - if (this.constants.configurePhysics == true) { - this._loadPhysicsConfiguration(); - } + Filter.prototype.getSelectedValue = function() { + if (this.index === undefined) + return undefined; + + return this.values[this.index]; }; + /** + * Retrieve all values of the filter + * @return {Array} values + */ + Filter.prototype.getValues = function() { + return this.values; + }; /** - * Mixin the cluster system and initialize the parameters required. - * - * @private + * Retrieve one value of the filter + * @param {Number} index + * @return {*} value */ - exports._loadClusterSystem = function () { - this.clusterSession = 0; - this.hubThreshold = 5; - this._loadMixin(ClusterMixin); + Filter.prototype.getValue = function(index) { + if (index >= this.values.length) + throw 'Error: index out of range'; + + return this.values[index]; }; /** - * Mixin the sector system and initialize the parameters required - * - * @private + * Retrieve the (filtered) dataPoints for the currently selected filter index + * @param {Number} [index] (optional) + * @return {Array} dataPoints */ - exports._loadSectorSystem = function () { - this.sectors = {}; - this.activeSector = ["default"]; - this.sectors["active"] = {}; - this.sectors["active"]["default"] = {"nodes": {}, - "edges": {}, - "nodeIndices": [], - "formationScale": 1.0, - "drawingNode": undefined }; - this.sectors["frozen"] = {}; - this.sectors["support"] = {"nodes": {}, - "edges": {}, - "nodeIndices": [], - "formationScale": 1.0, - "drawingNode": undefined }; + Filter.prototype._getDataPoints = function(index) { + if (index === undefined) + index = this.index; + + if (index === undefined) + return []; + + var dataPoints; + if (this.dataPoints[index]) { + dataPoints = this.dataPoints[index]; + } + else { + var f = {}; + f.column = this.column; + f.value = this.values[index]; - this.nodeIndices = this.sectors["active"]["default"]["nodeIndices"]; // the node indices list is used to speed up the computation of the repulsion fields + var dataView = new DataView(this.data,{filter: function (item) {return (item[f.column] == f.value);}}).get(); + dataPoints = this.graph._getDataPoints(dataView); - this._loadMixin(SectorsMixin); + this.dataPoints[index] = dataPoints; + } + + return dataPoints; }; + /** - * Mixin the selection system and initialize the parameters required - * - * @private + * Set a callback function when the filter is fully loaded. */ - exports._loadSelectionSystem = function () { - this.selectionObj = {nodes: {}, edges: {}}; - - this._loadMixin(SelectionMixin); + Filter.prototype.setOnLoadCallback = function(callback) { + this.onLoadCallback = callback; }; /** - * Mixin the navigationUI (User Interface) system and initialize the parameters required - * - * @private + * Add a value to the list with available values for this filter + * No double entries will be created. + * @param {Number} index */ - exports._loadManipulationSystem = function () { - // reset global variables -- these are used by the selection of nodes and edges. - this.blockConnectingEdgeSelection = false; - this.forceAppendSelection = false; + Filter.prototype.selectValue = function(index) { + if (index >= this.values.length) + throw 'Error: index out of range'; - if (this.constants.dataManipulation.enabled == true) { - // load the manipulator HTML elements. All styling done in css. - if (this.manipulationDiv === undefined) { - this.manipulationDiv = document.createElement('div'); - this.manipulationDiv.className = 'network-manipulationDiv'; - this.manipulationDiv.id = 'network-manipulationDiv'; - if (this.editMode == true) { - this.manipulationDiv.style.display = "block"; - } - else { - this.manipulationDiv.style.display = "none"; - } - this.containerElement.insertBefore(this.manipulationDiv, this.frame); - } + this.index = index; + this.value = this.values[index]; + }; - if (this.editModeDiv === undefined) { - this.editModeDiv = document.createElement('div'); - this.editModeDiv.className = 'network-manipulation-editMode'; - this.editModeDiv.id = 'network-manipulation-editMode'; - if (this.editMode == true) { - this.editModeDiv.style.display = "none"; - } - else { - this.editModeDiv.style.display = "block"; - } - this.containerElement.insertBefore(this.editModeDiv, this.frame); - } + /** + * Load all filtered rows in the background one by one + * Start this method without providing an index! + */ + Filter.prototype.loadInBackground = function(index) { + if (index === undefined) + index = 0; - if (this.closeDiv === undefined) { - this.closeDiv = document.createElement('div'); - this.closeDiv.className = 'network-manipulation-closeDiv'; - this.closeDiv.id = 'network-manipulation-closeDiv'; - this.closeDiv.style.display = this.manipulationDiv.style.display; - this.containerElement.insertBefore(this.closeDiv, this.frame); - } + var frame = this.graph.frame; - // load the manipulation functions - this._loadMixin(ManipulationMixin); + if (index < this.values.length) { + var dataPointsTemp = this._getDataPoints(index); + //this.graph.redrawInfo(); // TODO: not neat - // create the manipulator toolbar - this._createManipulatorBar(); + // create a progress box + if (frame.progress === undefined) { + frame.progress = document.createElement('DIV'); + frame.progress.style.position = 'absolute'; + frame.progress.style.color = 'gray'; + frame.appendChild(frame.progress); + } + var progress = this.getLoadedProgress(); + frame.progress.innerHTML = 'Loading animation... ' + progress + '%'; + // TODO: this is no nice solution... + frame.progress.style.bottom = 60 + 'px'; // TODO: use height of slider + frame.progress.style.left = 10 + 'px'; + + var me = this; + setTimeout(function() {me.loadInBackground(index+1);}, 10); + this.loaded = false; } else { - if (this.manipulationDiv !== undefined) { - // removes all the bindings and overloads - this._createManipulatorBar(); - // remove the manipulation divs - this.containerElement.removeChild(this.manipulationDiv); - this.containerElement.removeChild(this.editModeDiv); - this.containerElement.removeChild(this.closeDiv); + this.loaded = true; - this.manipulationDiv = undefined; - this.editModeDiv = undefined; - this.closeDiv = undefined; - // remove the mixin functions - this._clearMixin(ManipulationMixin); + // remove the progress box + if (frame.progress !== undefined) { + frame.removeChild(frame.progress); + frame.progress = undefined; } - } - }; - - - /** - * Mixin the navigation (User Interface) system and initialize the parameters required - * - * @private - */ - exports._loadNavigationControls = function () { - this._loadMixin(NavigationMixin); - // the clean function removes the button divs, this is done to remove the bindings. - this._cleanNavigation(); - if (this.constants.navigation.enabled == true) { - this._loadNavigationElements(); + if (this.onLoadCallback) + this.onLoadCallback(); } }; - - /** - * Mixin the hierarchical layout system. - * - * @private - */ - exports._loadHierarchySystem = function () { - this._loadMixin(HierarchicalLayoutMixin); - }; + module.exports = Filter; /***/ }, -/* 41 */ +/* 36 */ /***/ function(module, exports, __webpack_require__) { - - /** - * Expose `Emitter`. - */ - - module.exports = Emitter; - /** - * Initialize a new `Emitter`. + * @prototype StepNumber + * The class StepNumber is an iterator for Numbers. You provide a start and end + * value, and a best step size. StepNumber itself rounds to fixed values and + * a finds the step that best fits the provided step. * - * @api public - */ - - function Emitter(obj) { - if (obj) return mixin(obj); - }; - - /** - * Mixin the emitter properties. + * If prettyStep is true, the step size is chosen as close as possible to the + * provided step, but being a round value like 1, 2, 5, 10, 20, 50, .... * - * @param {Object} obj - * @return {Object} - * @api private + * Example usage: + * var step = new StepNumber(0, 10, 2.5, true); + * step.start(); + * while (!step.end()) { + * alert(step.getCurrent()); + * step.next(); + * } + * + * Version: 1.0 + * + * @param {Number} start The start value + * @param {Number} end The end value + * @param {Number} step Optional. Step size. Must be a positive value. + * @param {boolean} prettyStep Optional. If true, the step size is rounded + * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) */ + function StepNumber(start, end, step, prettyStep) { + // set default values + this._start = 0; + this._end = 0; + this._step = 1; + this.prettyStep = true; + this.precision = 5; - function mixin(obj) { - for (var key in Emitter.prototype) { - obj[key] = Emitter.prototype[key]; - } - return obj; - } + this._current = 0; + this.setRange(start, end, step, prettyStep); + }; /** - * Listen on the given `event` with `fn`. + * Set a new range: start, end and step. * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public + * @param {Number} start The start value + * @param {Number} end The end value + * @param {Number} step Optional. Step size. Must be a positive value. + * @param {boolean} prettyStep Optional. If true, the step size is rounded + * To a pretty step size (like 1, 2, 5, 10, 20, 50, ...) */ + StepNumber.prototype.setRange = function(start, end, step, prettyStep) { + this._start = start ? start : 0; + this._end = end ? end : 0; - Emitter.prototype.on = - Emitter.prototype.addEventListener = function(event, fn){ - this._callbacks = this._callbacks || {}; - (this._callbacks[event] = this._callbacks[event] || []) - .push(fn); - return this; + this.setStep(step, prettyStep); }; /** - * Adds an `event` listener that will be invoked a single - * time then automatically removed. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public + * Set a new step size + * @param {Number} step New step size. Must be a positive value + * @param {boolean} prettyStep Optional. If true, the provided step is rounded + * to a pretty step size (like 1, 2, 5, 10, 20, 50, ...) */ + StepNumber.prototype.setStep = function(step, prettyStep) { + if (step === undefined || step <= 0) + return; - Emitter.prototype.once = function(event, fn){ - var self = this; - this._callbacks = this._callbacks || {}; - - function on() { - self.off(event, on); - fn.apply(this, arguments); - } + if (prettyStep !== undefined) + this.prettyStep = prettyStep; - on.fn = fn; - this.on(event, on); - return this; + if (this.prettyStep === true) + this._step = StepNumber.calculatePrettyStep(step); + else + this._step = step; }; /** - * Remove the given callback for `event` or all - * registered callbacks. - * - * @param {String} event - * @param {Function} fn - * @return {Emitter} - * @api public + * Calculate a nice step size, closest to the desired step size. + * Returns a value in one of the ranges 1*10^n, 2*10^n, or 5*10^n, where n is an + * integer Number. For example 1, 2, 5, 10, 20, 50, etc... + * @param {Number} step Desired step size + * @return {Number} Nice step size */ + StepNumber.calculatePrettyStep = function (step) { + var log10 = function (x) {return Math.log(x) / Math.LN10;}; - Emitter.prototype.off = - Emitter.prototype.removeListener = - Emitter.prototype.removeAllListeners = - Emitter.prototype.removeEventListener = function(event, fn){ - this._callbacks = this._callbacks || {}; - - // all - if (0 == arguments.length) { - this._callbacks = {}; - return this; - } + // try three steps (multiple of 1, 2, or 5 + var step1 = Math.pow(10, Math.round(log10(step))), + step2 = 2 * Math.pow(10, Math.round(log10(step / 2))), + step5 = 5 * Math.pow(10, Math.round(log10(step / 5))); - // specific event - var callbacks = this._callbacks[event]; - if (!callbacks) return this; + // choose the best step (closest to minimum step) + var prettyStep = step1; + if (Math.abs(step2 - step) <= Math.abs(prettyStep - step)) prettyStep = step2; + if (Math.abs(step5 - step) <= Math.abs(prettyStep - step)) prettyStep = step5; - // remove all handlers - if (1 == arguments.length) { - delete this._callbacks[event]; - return this; + // for safety + if (prettyStep <= 0) { + prettyStep = 1; } - // remove specific handler - var cb; - for (var i = 0; i < callbacks.length; i++) { - cb = callbacks[i]; - if (cb === fn || cb.fn === fn) { - callbacks.splice(i, 1); - break; - } - } - return this; + return prettyStep; }; /** - * Emit `event` with the given args. - * - * @param {String} event - * @param {Mixed} ... - * @return {Emitter} + * returns the current value of the step + * @return {Number} current value */ - - Emitter.prototype.emit = function(event){ - this._callbacks = this._callbacks || {}; - var args = [].slice.call(arguments, 1) - , callbacks = this._callbacks[event]; - - if (callbacks) { - callbacks = callbacks.slice(0); - for (var i = 0, len = callbacks.length; i < len; ++i) { - callbacks[i].apply(this, args); - } - } - - return this; + StepNumber.prototype.getCurrent = function () { + return parseFloat(this._current.toPrecision(this.precision)); }; /** - * Return array of callbacks for `event`. - * - * @param {String} event - * @return {Array} - * @api public + * returns the current step size + * @return {Number} current step size */ + StepNumber.prototype.getStep = function () { + return this._step; + }; - Emitter.prototype.listeners = function(event){ - this._callbacks = this._callbacks || {}; - return this._callbacks[event] || []; + /** + * Set the current value to the largest value smaller than start, which + * is a multiple of the step size + */ + StepNumber.prototype.start = function() { + this._current = this._start - this._start % this._step; }; /** - * Check if this emitter has `event` handlers. - * - * @param {String} event - * @return {Boolean} - * @api public + * Do a step, add the step size to the current value */ + StepNumber.prototype.next = function () { + this._current += this._step; + }; - Emitter.prototype.hasListeners = function(event){ - return !! this.listeners(event).length; + /** + * Returns true whether the end is reached + * @return {boolean} True if the current value has passed the end value. + */ + StepNumber.prototype.end = function () { + return (this._current > this._end); }; + module.exports = StepNumber; + /***/ }, -/* 42 */ +/* 37 */ /***/ function(module, exports, __webpack_require__) { /** - * Creation of the ClusterMixin var. - * - * This contains all the functions the Network object can use to employ clustering + * Canvas shapes used by Network */ + if (typeof CanvasRenderingContext2D !== 'undefined') { - /** - * This is only called in the constructor of the network object - * - */ - exports.startWithClustering = function() { - // cluster if the data set is big - this.clusterToFit(this.constants.clustering.initialMaxNodes, true); + /** + * Draw a circle shape + */ + CanvasRenderingContext2D.prototype.circle = function(x, y, r) { + this.beginPath(); + this.arc(x, y, r, 0, 2*Math.PI, false); + }; - // updates the lables after clustering - this.updateLabels(); + /** + * Draw a square shape + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r size, width and height of the square + */ + CanvasRenderingContext2D.prototype.square = function(x, y, r) { + this.beginPath(); + this.rect(x - r, y - r, r * 2, r * 2); + }; - // this is called here because if clusterin is disabled, the start and stabilize are called in - // the setData function. - if (this.stabilize) { - this._stabilize(); - } - this.start(); - }; + /** + * Draw a triangle shape + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r radius, half the length of the sides of the triangle + */ + CanvasRenderingContext2D.prototype.triangle = function(x, y, r) { + // http://en.wikipedia.org/wiki/Equilateral_triangle + this.beginPath(); - /** - * This function clusters until the initialMaxNodes has been reached - * - * @param {Number} maxNumberOfNodes - * @param {Boolean} reposition - */ - exports.clusterToFit = function(maxNumberOfNodes, reposition) { - var numberOfNodes = this.nodeIndices.length; + var s = r * 2; + var s2 = s / 2; + var ir = Math.sqrt(3) / 6 * s; // radius of inner circle + var h = Math.sqrt(s * s - s2 * s2); // height - var maxLevels = 50; - var level = 0; + this.moveTo(x, y - (h - ir)); + this.lineTo(x + s2, y + ir); + this.lineTo(x - s2, y + ir); + this.lineTo(x, y - (h - ir)); + this.closePath(); + }; + + /** + * Draw a triangle shape in downward orientation + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r radius + */ + CanvasRenderingContext2D.prototype.triangleDown = function(x, y, r) { + // http://en.wikipedia.org/wiki/Equilateral_triangle + this.beginPath(); + + var s = r * 2; + var s2 = s / 2; + var ir = Math.sqrt(3) / 6 * s; // radius of inner circle + var h = Math.sqrt(s * s - s2 * s2); // height + + this.moveTo(x, y + (h - ir)); + this.lineTo(x + s2, y - ir); + this.lineTo(x - s2, y - ir); + this.lineTo(x, y + (h - ir)); + this.closePath(); + }; + + /** + * Draw a star shape, a star with 5 points + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r radius, half the length of the sides of the triangle + */ + CanvasRenderingContext2D.prototype.star = function(x, y, r) { + // http://www.html5canvastutorials.com/labs/html5-canvas-star-spinner/ + this.beginPath(); + + for (var n = 0; n < 10; n++) { + var radius = (n % 2 === 0) ? r * 1.3 : r * 0.5; + this.lineTo( + x + radius * Math.sin(n * 2 * Math.PI / 10), + y - radius * Math.cos(n * 2 * Math.PI / 10) + ); + } + + this.closePath(); + }; + + /** + * http://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-on-html-canvas + */ + CanvasRenderingContext2D.prototype.roundRect = function(x, y, w, h, r) { + var r2d = Math.PI/180; + if( w - ( 2 * r ) < 0 ) { r = ( w / 2 ); } //ensure that the radius isn't too large for x + if( h - ( 2 * r ) < 0 ) { r = ( h / 2 ); } //ensure that the radius isn't too large for y + this.beginPath(); + this.moveTo(x+r,y); + this.lineTo(x+w-r,y); + this.arc(x+w-r,y+r,r,r2d*270,r2d*360,false); + this.lineTo(x+w,y+h-r); + this.arc(x+w-r,y+h-r,r,0,r2d*90,false); + this.lineTo(x+r,y+h); + this.arc(x+r,y+h-r,r,r2d*90,r2d*180,false); + this.lineTo(x,y+r); + this.arc(x+r,y+r,r,r2d*180,r2d*270,false); + }; + + /** + * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + */ + CanvasRenderingContext2D.prototype.ellipse = function(x, y, w, h) { + var kappa = .5522848, + ox = (w / 2) * kappa, // control point offset horizontal + oy = (h / 2) * kappa, // control point offset vertical + xe = x + w, // x-end + ye = y + h, // y-end + xm = x + w / 2, // x-middle + ym = y + h / 2; // y-middle - // we first cluster the hubs, then we pull in the outliers, repeat - while (numberOfNodes > maxNumberOfNodes && level < maxLevels) { - if (level % 3 == 0) { - this.forceAggregateHubs(true); - this.normalizeClusterLevels(); - } - else { - this.increaseClusterLevel(); // this also includes a cluster normalization - } + this.beginPath(); + this.moveTo(x, ym); + this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + }; - numberOfNodes = this.nodeIndices.length; - level += 1; - } - // after the clustering we reposition the nodes to reduce the initial chaos - if (level > 0 && reposition == true) { - this.repositionNodes(); - } - this._updateCalculationNodes(); - }; - /** - * This function can be called to open up a specific cluster. It is only called by - * It will unpack the cluster back one level. - * - * @param node | Node object: cluster to open. - */ - exports.openCluster = function(node) { - var isMovingBeforeClustering = this.moving; - if (node.clusterSize > this.constants.clustering.sectorThreshold && this._nodeInActiveArea(node) && - !(this._sector() == "default" && this.nodeIndices.length == 1)) { - // this loads a new sector, loads the nodes and edges and nodeIndices of it. - this._addSector(node); - var level = 0; + /** + * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas + */ + CanvasRenderingContext2D.prototype.database = function(x, y, w, h) { + var f = 1/3; + var wEllipse = w; + var hEllipse = h * f; - // we decluster until we reach a decent number of nodes - while ((this.nodeIndices.length < this.constants.clustering.initialMaxNodes) && (level < 10)) { - this.decreaseClusterLevel(); - level += 1; - } + var kappa = .5522848, + ox = (wEllipse / 2) * kappa, // control point offset horizontal + oy = (hEllipse / 2) * kappa, // control point offset vertical + xe = x + wEllipse, // x-end + ye = y + hEllipse, // y-end + xm = x + wEllipse / 2, // x-middle + ym = y + hEllipse / 2, // y-middle + ymb = y + (h - hEllipse/2), // y-midlle, bottom ellipse + yeb = y + h; // y-end, bottom ellipse - } - else { - this._expandClusterNode(node,false,true); + this.beginPath(); + this.moveTo(xe, ym); - // update the index list, dynamic edges and labels - this._updateNodeIndexList(); - this._updateDynamicEdges(); - this._updateCalculationNodes(); - this.updateLabels(); - } + this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); - // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded - if (this.moving != isMovingBeforeClustering) { - this.start(); - } - }; + this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + this.lineTo(xe, ymb); - /** - * This calls the updateClustes with default arguments - */ - exports.updateClustersDefault = function() { - if (this.constants.clustering.enabled == true) { - this.updateClusters(0,false,false); - } - }; + this.bezierCurveTo(xe, ymb + oy, xm + ox, yeb, xm, yeb); + this.bezierCurveTo(xm - ox, yeb, x, ymb + oy, x, ymb); + this.lineTo(x, ym); + }; - /** - * This function can be called to increase the cluster level. This means that the nodes with only one edge connection will - * be clustered with their connected node. This can be repeated as many times as needed. - * This can be called externally (by a keybind for instance) to reduce the complexity of big datasets. - */ - exports.increaseClusterLevel = function() { - this.updateClusters(-1,false,true); - }; + /** + * Draw an arrow point (no line) + */ + CanvasRenderingContext2D.prototype.arrow = function(x, y, angle, length) { + // tail + var xt = x - length * Math.cos(angle); + var yt = y - length * Math.sin(angle); - /** - * This function can be called to decrease the cluster level. This means that the nodes with only one edge connection will - * be unpacked if they are a cluster. This can be repeated as many times as needed. - * This can be called externally (by a key-bind for instance) to look into clusters without zooming. - */ - exports.decreaseClusterLevel = function() { - this.updateClusters(1,false,true); - }; + // inner tail + // TODO: allow to customize different shapes + var xi = x - length * 0.9 * Math.cos(angle); + var yi = y - length * 0.9 * Math.sin(angle); + // left + var xl = xt + length / 3 * Math.cos(angle + 0.5 * Math.PI); + var yl = yt + length / 3 * Math.sin(angle + 0.5 * Math.PI); - /** - * This is the main clustering function. It clusters and declusters on zoom or forced - * This function clusters on zoom, it can be called with a predefined zoom direction - * If out, check if we can form clusters, if in, check if we can open clusters. - * This function is only called from _zoom() - * - * @param {Number} zoomDirection | -1 / 0 / +1 for zoomOut / determineByZoom / zoomIn - * @param {Boolean} recursive | enabled or disable recursive calling of the opening of clusters - * @param {Boolean} force | enabled or disable forcing - * @param {Boolean} doNotStart | if true do not call start - * - */ - exports.updateClusters = function(zoomDirection,recursive,force,doNotStart) { - var isMovingBeforeClustering = this.moving; - var amountOfNodes = this.nodeIndices.length; + // right + var xr = xt + length / 3 * Math.cos(angle - 0.5 * Math.PI); + var yr = yt + length / 3 * Math.sin(angle - 0.5 * Math.PI); - // on zoom out collapse the sector if the scale is at the level the sector was made - if (this.previousScale > this.scale && zoomDirection == 0) { - this._collapseSector(); - } + this.beginPath(); + this.moveTo(x, y); + this.lineTo(xl, yl); + this.lineTo(xi, yi); + this.lineTo(xr, yr); + this.closePath(); + }; - // check if we zoom in or out - if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out - // forming clusters when forced pulls outliers in. When not forced, the edge length of the - // outer nodes determines if it is being clustered - this._formClusters(force); - } - else if (this.previousScale < this.scale || zoomDirection == 1) { // zoom in - if (force == true) { - // _openClusters checks for each node if the formationScale of the cluster is smaller than - // the current scale and if so, declusters. When forced, all clusters are reduced by one step - this._openClusters(recursive,force); - } - else { - // if a cluster takes up a set percentage of the active window - this._openClustersBySize(); + /** + * Sets up the dashedLine functionality for drawing + * Original code came from http://stackoverflow.com/questions/4576724/dotted-stroke-in-canvas + * @author David Jordan + * @date 2012-08-08 + */ + CanvasRenderingContext2D.prototype.dashedLine = function(x,y,x2,y2,dashArray){ + if (!dashArray) dashArray=[10,5]; + if (dashLength==0) dashLength = 0.001; // Hack for Safari + var dashCount = dashArray.length; + this.moveTo(x, y); + var dx = (x2-x), dy = (y2-y); + var slope = dy/dx; + var distRemaining = Math.sqrt( dx*dx + dy*dy ); + var dashIndex=0, draw=true; + while (distRemaining>=0.1){ + var dashLength = dashArray[dashIndex++%dashCount]; + if (dashLength > distRemaining) dashLength = distRemaining; + var xStep = Math.sqrt( dashLength*dashLength / (1 + slope*slope) ); + if (dx<0) xStep = -xStep; + x += xStep; + y += slope*xStep; + this[draw ? 'lineTo' : 'moveTo'](x,y); + distRemaining -= dashLength; + draw = !draw; } - } - this._updateNodeIndexList(); - - // if a cluster was NOT formed and the user zoomed out, we try clustering by hubs - if (this.nodeIndices.length == amountOfNodes && (this.previousScale > this.scale || zoomDirection == -1)) { - this._aggregateHubs(force); - this._updateNodeIndexList(); - } + }; - // we now reduce chains. - if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out - this.handleChains(); - this._updateNodeIndexList(); - } + // TODO: add diamond shape + } - this.previousScale = this.scale; - // rest of the update the index list, dynamic edges and labels - this._updateDynamicEdges(); - this.updateLabels(); +/***/ }, +/* 38 */ +/***/ function(module, exports, __webpack_require__) { - // if a cluster was formed, we increase the clusterSession - if (this.nodeIndices.length < amountOfNodes) { // this means a clustering operation has taken place - this.clusterSession += 1; - // if clusters have been made, we normalize the cluster level - this.normalizeClusterLevels(); + // Only load hammer.js when in a browser environment + // (loading hammer.js in a node.js environment gives errors) + if (typeof window !== 'undefined') { + module.exports = window['Hammer'] || __webpack_require__(49); + // TODO: throw an error when hammerjs is not available? + } + else { + module.exports = function () { + throw Error('hammer.js is only available in a browser, not in node.js.'); } + } - if (doNotStart == false || doNotStart === undefined) { - // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded - if (this.moving != isMovingBeforeClustering) { - this.start(); - } - } - this._updateCalculationNodes(); - }; +/***/ }, +/* 39 */ +/***/ function(module, exports, __webpack_require__) { - /** - * This function handles the chains. It is called on every updateClusters(). - */ - exports.handleChains = function() { - // after clustering we check how many chains there are - var chainPercentage = this._getChainFraction(); - if (chainPercentage > this.constants.clustering.chainThreshold) { - this._reduceAmountOfChains(1 - this.constants.clustering.chainThreshold / chainPercentage) + // first check if moment.js is already loaded in the browser window, if so, + // use this instance. Else, load via commonjs. + module.exports = (typeof window !== 'undefined') && window['moment'] || __webpack_require__(51); + + +/***/ }, +/* 40 */ +/***/ function(module, exports, __webpack_require__) { - } - }; + var PhysicsMixin = __webpack_require__(50); + var ClusterMixin = __webpack_require__(43); + var SectorsMixin = __webpack_require__(44); + var SelectionMixin = __webpack_require__(45); + var ManipulationMixin = __webpack_require__(46); + var NavigationMixin = __webpack_require__(47); + var HierarchicalLayoutMixin = __webpack_require__(48); /** - * this functions starts clustering by hubs - * The minimum hub threshold is set globally + * Load a mixin into the network object * + * @param {Object} sourceVariable | this object has to contain functions. * @private */ - exports._aggregateHubs = function(force) { - this._getHubSize(); - this._formClustersByHub(force,false); + exports._loadMixin = function (sourceVariable) { + for (var mixinFunction in sourceVariable) { + if (sourceVariable.hasOwnProperty(mixinFunction)) { + this[mixinFunction] = sourceVariable[mixinFunction]; + } + } }; /** - * This function is fired by keypress. It forces hubs to form. + * removes a mixin from the network object. * + * @param {Object} sourceVariable | this object has to contain functions. + * @private */ - exports.forceAggregateHubs = function(doNotStart) { - var isMovingBeforeClustering = this.moving; - var amountOfNodes = this.nodeIndices.length; - - this._aggregateHubs(true); - - // update the index list, dynamic edges and labels - this._updateNodeIndexList(); - this._updateDynamicEdges(); - this.updateLabels(); - - // if a cluster was formed, we increase the clusterSession - if (this.nodeIndices.length != amountOfNodes) { - this.clusterSession += 1; - } - - if (doNotStart == false || doNotStart === undefined) { - // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded - if (this.moving != isMovingBeforeClustering) { - this.start(); + exports._clearMixin = function (sourceVariable) { + for (var mixinFunction in sourceVariable) { + if (sourceVariable.hasOwnProperty(mixinFunction)) { + this[mixinFunction] = undefined; } } }; + /** - * If a cluster takes up more than a set percentage of the screen, open the cluster + * Mixin the physics system and initialize the parameters required. * * @private */ - exports._openClustersBySize = function() { - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - var node = this.nodes[nodeId]; - if (node.inView() == true) { - if ((node.width*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || - (node.height*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { - this.openCluster(node); - } - } - } + exports._loadPhysicsSystem = function () { + this._loadMixin(PhysicsMixin); + this._loadSelectedForceSolver(); + if (this.constants.configurePhysics == true) { + this._loadPhysicsConfiguration(); } }; /** - * This function loops over all nodes in the nodeIndices list. For each node it checks if it is a cluster and if it - * has to be opened based on the current zoom level. + * Mixin the cluster system and initialize the parameters required. * * @private */ - exports._openClusters = function(recursive,force) { - for (var i = 0; i < this.nodeIndices.length; i++) { - var node = this.nodes[this.nodeIndices[i]]; - this._expandClusterNode(node,recursive,force); - this._updateCalculationNodes(); - } + exports._loadClusterSystem = function () { + this.clusterSession = 0; + this.hubThreshold = 5; + this._loadMixin(ClusterMixin); }; + /** - * This function checks if a node has to be opened. This is done by checking the zoom level. - * If the node contains child nodes, this function is recursively called on the child nodes as well. - * This recursive behaviour is optional and can be set by the recursive argument. + * Mixin the sector system and initialize the parameters required * - * @param {Node} parentNode | to check for cluster and expand - * @param {Boolean} recursive | enabled or disable recursive calling - * @param {Boolean} force | enabled or disable forcing - * @param {Boolean} [openAll] | This will recursively force all nodes in the parent to be released * @private */ - exports._expandClusterNode = function(parentNode, recursive, force, openAll) { - // first check if node is a cluster - if (parentNode.clusterSize > 1) { - // this means that on a double tap event or a zoom event, the cluster fully unpacks if it is smaller than 20 - if (parentNode.clusterSize < this.constants.clustering.sectorThreshold) { - openAll = true; - } - recursive = openAll ? true : recursive; + exports._loadSectorSystem = function () { + this.sectors = {}; + this.activeSector = ["default"]; + this.sectors["active"] = {}; + this.sectors["active"]["default"] = {"nodes": {}, + "edges": {}, + "nodeIndices": [], + "formationScale": 1.0, + "drawingNode": undefined }; + this.sectors["frozen"] = {}; + this.sectors["support"] = {"nodes": {}, + "edges": {}, + "nodeIndices": [], + "formationScale": 1.0, + "drawingNode": undefined }; - // if the last child has been added on a smaller scale than current scale decluster - if (parentNode.formationScale < this.scale || force == true) { - // we will check if any of the contained child nodes should be removed from the cluster - for (var containedNodeId in parentNode.containedNodes) { - if (parentNode.containedNodes.hasOwnProperty(containedNodeId)) { - var childNode = parentNode.containedNodes[containedNodeId]; + this.nodeIndices = this.sectors["active"]["default"]["nodeIndices"]; // the node indices list is used to speed up the computation of the repulsion fields - // force expand will expand the largest cluster size clusters. Since we cluster from outside in, we assume that - // the largest cluster is the one that comes from outside - if (force == true) { - if (childNode.clusterSession == parentNode.clusterSessions[parentNode.clusterSessions.length-1] - || openAll) { - this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); - } - } - else { - if (this._nodeInActiveArea(parentNode)) { - this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); - } - } - } - } - } - } + this._loadMixin(SectorsMixin); }; + /** - * ONLY CALLED FROM _expandClusterNode - * - * This function will expel a child_node from a parent_node. This is to de-cluster the node. This function will remove - * the child node from the parent contained_node object and put it back into the global nodes object. - * The same holds for the edge that was connected to the child node. It is moved back into the global edges object. + * Mixin the selection system and initialize the parameters required * - * @param {Node} parentNode | the parent node - * @param {String} containedNodeId | child_node id as it is contained in the containedNodes object of the parent node - * @param {Boolean} recursive | This will also check if the child needs to be expanded. - * With force and recursive both true, the entire cluster is unpacked - * @param {Boolean} force | This will disregard the zoom level and will expel this child from the parent - * @param {Boolean} openAll | This will recursively force all nodes in the parent to be released * @private */ - exports._expelChildFromParent = function(parentNode, containedNodeId, recursive, force, openAll) { - var childNode = parentNode.containedNodes[containedNodeId]; - - // if child node has been added on smaller scale than current, kick out - if (childNode.formationScale < this.scale || force == true) { - // unselect all selected items - this._unselectAll(); - - // put the child node back in the global nodes object - this.nodes[containedNodeId] = childNode; - - // release the contained edges from this childNode back into the global edges - this._releaseContainedEdges(parentNode,childNode); - - // reconnect rerouted edges to the childNode - this._connectEdgeBackToChild(parentNode,childNode); - - // validate all edges in dynamicEdges - this._validateEdges(parentNode); + exports._loadSelectionSystem = function () { + this.selectionObj = {nodes: {}, edges: {}}; - // undo the changes from the clustering operation on the parent node - parentNode.mass -= childNode.mass; - parentNode.clusterSize -= childNode.clusterSize; - parentNode.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*parentNode.clusterSize); - parentNode.dynamicEdgesLength = parentNode.dynamicEdges.length; + this._loadMixin(SelectionMixin); + }; - // place the child node near the parent, not at the exact same location to avoid chaos in the system - childNode.x = parentNode.x + parentNode.growthIndicator * (0.5 - Math.random()); - childNode.y = parentNode.y + parentNode.growthIndicator * (0.5 - Math.random()); - // remove node from the list - delete parentNode.containedNodes[containedNodeId]; + /** + * Mixin the navigationUI (User Interface) system and initialize the parameters required + * + * @private + */ + exports._loadManipulationSystem = function () { + // reset global variables -- these are used by the selection of nodes and edges. + this.blockConnectingEdgeSelection = false; + this.forceAppendSelection = false; - // check if there are other childs with this clusterSession in the parent. - var othersPresent = false; - for (var childNodeId in parentNode.containedNodes) { - if (parentNode.containedNodes.hasOwnProperty(childNodeId)) { - if (parentNode.containedNodes[childNodeId].clusterSession == childNode.clusterSession) { - othersPresent = true; - break; - } + if (this.constants.dataManipulation.enabled == true) { + // load the manipulator HTML elements. All styling done in css. + if (this.manipulationDiv === undefined) { + this.manipulationDiv = document.createElement('div'); + this.manipulationDiv.className = 'network-manipulationDiv'; + this.manipulationDiv.id = 'network-manipulationDiv'; + if (this.editMode == true) { + this.manipulationDiv.style.display = "block"; } - } - // if there are no others, remove the cluster session from the list - if (othersPresent == false) { - parentNode.clusterSessions.pop(); + else { + this.manipulationDiv.style.display = "none"; + } + this.containerElement.insertBefore(this.manipulationDiv, this.frame); } - this._repositionBezierNodes(childNode); - // this._repositionBezierNodes(parentNode); + if (this.editModeDiv === undefined) { + this.editModeDiv = document.createElement('div'); + this.editModeDiv.className = 'network-manipulation-editMode'; + this.editModeDiv.id = 'network-manipulation-editMode'; + if (this.editMode == true) { + this.editModeDiv.style.display = "none"; + } + else { + this.editModeDiv.style.display = "block"; + } + this.containerElement.insertBefore(this.editModeDiv, this.frame); + } - // remove the clusterSession from the child node - childNode.clusterSession = 0; + if (this.closeDiv === undefined) { + this.closeDiv = document.createElement('div'); + this.closeDiv.className = 'network-manipulation-closeDiv'; + this.closeDiv.id = 'network-manipulation-closeDiv'; + this.closeDiv.style.display = this.manipulationDiv.style.display; + this.containerElement.insertBefore(this.closeDiv, this.frame); + } - // recalculate the size of the node on the next time the node is rendered - parentNode.clearSizeCache(); + // load the manipulation functions + this._loadMixin(ManipulationMixin); - // restart the simulation to reorganise all nodes - this.moving = true; + // create the manipulator toolbar + this._createManipulatorBar(); } + else { + if (this.manipulationDiv !== undefined) { + // removes all the bindings and overloads + this._createManipulatorBar(); + // remove the manipulation divs + this.containerElement.removeChild(this.manipulationDiv); + this.containerElement.removeChild(this.editModeDiv); + this.containerElement.removeChild(this.closeDiv); - // check if a further expansion step is possible if recursivity is enabled - if (recursive == true) { - this._expandClusterNode(childNode,recursive,force,openAll); + this.manipulationDiv = undefined; + this.editModeDiv = undefined; + this.closeDiv = undefined; + // remove the mixin functions + this._clearMixin(ManipulationMixin); + } } }; /** - * position the bezier nodes at the center of the edges + * Mixin the navigation (User Interface) system and initialize the parameters required * - * @param node * @private */ - exports._repositionBezierNodes = function(node) { - for (var i = 0; i < node.dynamicEdges.length; i++) { - node.dynamicEdges[i].positionBezierNode(); + exports._loadNavigationControls = function () { + this._loadMixin(NavigationMixin); + + // the clean function removes the button divs, this is done to remove the bindings. + this._cleanNavigation(); + if (this.constants.navigation.enabled == true) { + this._loadNavigationElements(); } }; /** - * This function checks if any nodes at the end of their trees have edges below a threshold length - * This function is called only from updateClusters() - * forceLevelCollapse ignores the length of the edge and collapses one level - * This means that a node with only one edge will be clustered with its connected node + * Mixin the hierarchical layout system. * * @private - * @param {Boolean} force */ - exports._formClusters = function(force) { - if (force == false) { - this._formClustersByZoom(); - } - else { - this._forceClustersByZoom(); - } + exports._loadHierarchySystem = function () { + this._loadMixin(HierarchicalLayoutMixin); }; +/***/ }, +/* 41 */ +/***/ function(module, exports, __webpack_require__) { + + /** - * This function handles the clustering by zooming out, this is based on a minimum edge distance - * - * @private + * Expose `Emitter`. */ - exports._formClustersByZoom = function() { - var dx,dy,length, - minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; - - // check if any edges are shorter than minLength and start the clustering - // the clustering favours the node with the larger mass - for (var edgeId in this.edges) { - if (this.edges.hasOwnProperty(edgeId)) { - var edge = this.edges[edgeId]; - if (edge.connected) { - if (edge.toId != edge.fromId) { - dx = (edge.to.x - edge.from.x); - dy = (edge.to.y - edge.from.y); - length = Math.sqrt(dx * dx + dy * dy); + module.exports = Emitter; - if (length < minLength) { - // first check which node is larger - var parentNode = edge.from; - var childNode = edge.to; - if (edge.to.mass > edge.from.mass) { - parentNode = edge.to; - childNode = edge.from; - } + /** + * Initialize a new `Emitter`. + * + * @api public + */ - if (childNode.dynamicEdgesLength == 1) { - this._addToCluster(parentNode,childNode,false); - } - else if (parentNode.dynamicEdgesLength == 1) { - this._addToCluster(childNode,parentNode,false); - } - } - } - } - } - } + function Emitter(obj) { + if (obj) return mixin(obj); }; /** - * This function forces the network to cluster all nodes with only one connecting edge to their - * connected node. + * Mixin the emitter properties. * - * @private + * @param {Object} obj + * @return {Object} + * @api private */ - exports._forceClustersByZoom = function() { - for (var nodeId in this.nodes) { - // another node could have absorbed this child. - if (this.nodes.hasOwnProperty(nodeId)) { - var childNode = this.nodes[nodeId]; - // the edges can be swallowed by another decrease - if (childNode.dynamicEdgesLength == 1 && childNode.dynamicEdges.length != 0) { - var edge = childNode.dynamicEdges[0]; - var parentNode = (edge.toId == childNode.id) ? this.nodes[edge.fromId] : this.nodes[edge.toId]; - - // group to the largest node - if (childNode.id != parentNode.id) { - if (parentNode.mass > childNode.mass) { - this._addToCluster(parentNode,childNode,true); - } - else { - this._addToCluster(childNode,parentNode,true); - } - } - } - } + function mixin(obj) { + for (var key in Emitter.prototype) { + obj[key] = Emitter.prototype[key]; } - }; - + return obj; + } /** - * To keep the nodes of roughly equal size we normalize the cluster levels. - * This function clusters a node to its smallest connected neighbour. + * Listen on the given `event` with `fn`. * - * @param node - * @private + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public */ - exports._clusterToSmallestNeighbour = function(node) { - var smallestNeighbour = -1; - var smallestNeighbourNode = null; - for (var i = 0; i < node.dynamicEdges.length; i++) { - if (node.dynamicEdges[i] !== undefined) { - var neighbour = null; - if (node.dynamicEdges[i].fromId != node.id) { - neighbour = node.dynamicEdges[i].from; - } - else if (node.dynamicEdges[i].toId != node.id) { - neighbour = node.dynamicEdges[i].to; - } - - - if (neighbour != null && smallestNeighbour > neighbour.clusterSessions.length) { - smallestNeighbour = neighbour.clusterSessions.length; - smallestNeighbourNode = neighbour; - } - } - } - if (neighbour != null && this.nodes[neighbour.id] !== undefined) { - this._addToCluster(neighbour, node, true); - } + Emitter.prototype.on = + Emitter.prototype.addEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + (this._callbacks[event] = this._callbacks[event] || []) + .push(fn); + return this; }; - /** - * This function forms clusters from hubs, it loops over all nodes + * Adds an `event` listener that will be invoked a single + * time then automatically removed. * - * @param {Boolean} force | Disregard zoom level - * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges - * @private + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public */ - exports._formClustersByHub = function(force, onlyEqual) { - // we loop over all nodes in the list - for (var nodeId in this.nodes) { - // we check if it is still available since it can be used by the clustering in this loop - if (this.nodes.hasOwnProperty(nodeId)) { - this._formClusterFromHub(this.nodes[nodeId],force,onlyEqual); - } + + Emitter.prototype.once = function(event, fn){ + var self = this; + this._callbacks = this._callbacks || {}; + + function on() { + self.off(event, on); + fn.apply(this, arguments); } + + on.fn = fn; + this.on(event, on); + return this; }; /** - * This function forms a cluster from a specific preselected hub node + * Remove the given callback for `event` or all + * registered callbacks. * - * @param {Node} hubNode | the node we will cluster as a hub - * @param {Boolean} force | Disregard zoom level - * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges - * @param {Number} [absorptionSizeOffset] | - * @private + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public */ - exports._formClusterFromHub = function(hubNode, force, onlyEqual, absorptionSizeOffset) { - if (absorptionSizeOffset === undefined) { - absorptionSizeOffset = 0; + + Emitter.prototype.off = + Emitter.prototype.removeListener = + Emitter.prototype.removeAllListeners = + Emitter.prototype.removeEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + + // all + if (0 == arguments.length) { + this._callbacks = {}; + return this; } - // we decide if the node is a hub - if ((hubNode.dynamicEdgesLength >= this.hubThreshold && onlyEqual == false) || - (hubNode.dynamicEdgesLength == this.hubThreshold && onlyEqual == true)) { - // initialize variables - var dx,dy,length; - var minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; - var allowCluster = false; - // we create a list of edges because the dynamicEdges change over the course of this loop - var edgesIdarray = []; - var amountOfInitialEdges = hubNode.dynamicEdges.length; - for (var j = 0; j < amountOfInitialEdges; j++) { - edgesIdarray.push(hubNode.dynamicEdges[j].id); - } + // specific event + var callbacks = this._callbacks[event]; + if (!callbacks) return this; - // if the hub clustering is not forces, we check if one of the edges connected - // to a cluster is small enough based on the constants.clustering.clusterEdgeThreshold - if (force == false) { - allowCluster = false; - for (j = 0; j < amountOfInitialEdges; j++) { - var edge = this.edges[edgesIdarray[j]]; - if (edge !== undefined) { - if (edge.connected) { - if (edge.toId != edge.fromId) { - dx = (edge.to.x - edge.from.x); - dy = (edge.to.y - edge.from.y); - length = Math.sqrt(dx * dx + dy * dy); + // remove all handlers + if (1 == arguments.length) { + delete this._callbacks[event]; + return this; + } - if (length < minLength) { - allowCluster = true; - break; - } - } - } - } - } + // remove specific handler + var cb; + for (var i = 0; i < callbacks.length; i++) { + cb = callbacks[i]; + if (cb === fn || cb.fn === fn) { + callbacks.splice(i, 1); + break; } + } + return this; + }; - // start the clustering if allowed - if ((!force && allowCluster) || force) { - // we loop over all edges INITIALLY connected to this hub - for (j = 0; j < amountOfInitialEdges; j++) { - edge = this.edges[edgesIdarray[j]]; - // the edge can be clustered by this function in a previous loop - if (edge !== undefined) { - var childNode = this.nodes[(edge.fromId == hubNode.id) ? edge.toId : edge.fromId]; - // we do not want hubs to merge with other hubs nor do we want to cluster itself. - if ((childNode.dynamicEdges.length <= (this.hubThreshold + absorptionSizeOffset)) && - (childNode.id != hubNode.id)) { - this._addToCluster(hubNode,childNode,force); - } - } - } + /** + * Emit `event` with the given args. + * + * @param {String} event + * @param {Mixed} ... + * @return {Emitter} + */ + + Emitter.prototype.emit = function(event){ + this._callbacks = this._callbacks || {}; + var args = [].slice.call(arguments, 1) + , callbacks = this._callbacks[event]; + + if (callbacks) { + callbacks = callbacks.slice(0); + for (var i = 0, len = callbacks.length; i < len; ++i) { + callbacks[i].apply(this, args); } } + + return this; }; + /** + * Return array of callbacks for `event`. + * + * @param {String} event + * @return {Array} + * @api public + */ + Emitter.prototype.listeners = function(event){ + this._callbacks = this._callbacks || {}; + return this._callbacks[event] || []; + }; /** - * This function adds the child node to the parent node, creating a cluster if it is not already. + * Check if this emitter has `event` handlers. * - * @param {Node} parentNode | this is the node that will house the child node - * @param {Node} childNode | this node will be deleted from the global this.nodes and stored in the parent node - * @param {Boolean} force | true will only update the remainingEdges at the very end of the clustering, ensuring single level collapse - * @private + * @param {String} event + * @return {Boolean} + * @api public */ - exports._addToCluster = function(parentNode, childNode, force) { - // join child node in the parent node - parentNode.containedNodes[childNode.id] = childNode; - // manage all the edges connected to the child and parent nodes - for (var i = 0; i < childNode.dynamicEdges.length; i++) { - var edge = childNode.dynamicEdges[i]; - if (edge.toId == parentNode.id || edge.fromId == parentNode.id) { // edge connected to parentNode - this._addToContainedEdges(parentNode,childNode,edge); - } - else { - this._connectEdgeToCluster(parentNode,childNode,edge); - } - } - // a contained node has no dynamic edges. - childNode.dynamicEdges = []; + Emitter.prototype.hasListeners = function(event){ + return !! this.listeners(event).length; + }; - // remove circular edges from clusters - this._containCircularEdgesFromNode(parentNode,childNode); +/***/ }, +/* 42 */ +/***/ function(module, exports, __webpack_require__) { - // remove the childNode from the global nodes object - delete this.nodes[childNode.id]; + /** + * Copyright 2012 Craig Campbell + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Mousetrap is a simple keyboard shortcut library for Javascript with + * no external dependencies + * + * @version 1.1.2 + * @url craig.is/killing/mice + */ - // update the properties of the child and parent - var massBefore = parentNode.mass; - childNode.clusterSession = this.clusterSession; - parentNode.mass += childNode.mass; - parentNode.clusterSize += childNode.clusterSize; - parentNode.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*parentNode.clusterSize); + /** + * mapping of special keycodes to their corresponding keys + * + * everything in this dictionary cannot use keypress events + * so it has to be here to map to the correct keycodes for + * keyup/keydown events + * + * @type {Object} + */ + var _MAP = { + 8: 'backspace', + 9: 'tab', + 13: 'enter', + 16: 'shift', + 17: 'ctrl', + 18: 'alt', + 20: 'capslock', + 27: 'esc', + 32: 'space', + 33: 'pageup', + 34: 'pagedown', + 35: 'end', + 36: 'home', + 37: 'left', + 38: 'up', + 39: 'right', + 40: 'down', + 45: 'ins', + 46: 'del', + 91: 'meta', + 93: 'meta', + 224: 'meta' + }, - // keep track of the clustersessions so we can open the cluster up as it has been formed. - if (parentNode.clusterSessions[parentNode.clusterSessions.length - 1] != this.clusterSession) { - parentNode.clusterSessions.push(this.clusterSession); - } + /** + * mapping for special characters so they can support + * + * this dictionary is only used incase you want to bind a + * keyup or keydown event to one of these keys + * + * @type {Object} + */ + _KEYCODE_MAP = { + 106: '*', + 107: '+', + 109: '-', + 110: '.', + 111 : '/', + 186: ';', + 187: '=', + 188: ',', + 189: '-', + 190: '.', + 191: '/', + 192: '`', + 219: '[', + 220: '\\', + 221: ']', + 222: '\'' + }, - // forced clusters only open from screen size and double tap - if (force == true) { - // parentNode.formationScale = Math.pow(1 - (1.0/11.0),this.clusterSession+3); - parentNode.formationScale = 0; - } - else { - parentNode.formationScale = this.scale; // The latest child has been added on this scale - } + /** + * this is a mapping of keys that require shift on a US keypad + * back to the non shift equivelents + * + * this is so you can use keyup events with these keys + * + * note that this will only work reliably on US keyboards + * + * @type {Object} + */ + _SHIFT_MAP = { + '~': '`', + '!': '1', + '@': '2', + '#': '3', + '$': '4', + '%': '5', + '^': '6', + '&': '7', + '*': '8', + '(': '9', + ')': '0', + '_': '-', + '+': '=', + ':': ';', + '\"': '\'', + '<': ',', + '>': '.', + '?': '/', + '|': '\\' + }, - // recalculate the size of the node on the next time the node is rendered - parentNode.clearSizeCache(); + /** + * this is a list of special strings you can use to map + * to modifier keys when you specify your keyboard shortcuts + * + * @type {Object} + */ + _SPECIAL_ALIASES = { + 'option': 'alt', + 'command': 'meta', + 'return': 'enter', + 'escape': 'esc' + }, - // set the pop-out scale for the childnode - parentNode.containedNodes[childNode.id].formationScale = parentNode.formationScale; + /** + * variable to store the flipped version of _MAP from above + * needed to check if we should use keypress or not when no action + * is specified + * + * @type {Object|undefined} + */ + _REVERSE_MAP, - // nullify the movement velocity of the child, this is to avoid hectic behaviour - childNode.clearVelocity(); + /** + * a list of all the callbacks setup via Mousetrap.bind() + * + * @type {Object} + */ + _callbacks = {}, - // the mass has altered, preservation of energy dictates the velocity to be updated - parentNode.updateVelocity(massBefore); + /** + * direct map of string combinations to callbacks used for trigger() + * + * @type {Object} + */ + _direct_map = {}, - // restart the simulation to reorganise all nodes - this.moving = true; - }; + /** + * keeps track of what level each sequence is at since multiple + * sequences can start out with the same sequence + * + * @type {Object} + */ + _sequence_levels = {}, + /** + * variable to store the setTimeout call + * + * @type {null|number} + */ + _reset_timer, - /** - * This function will apply the changes made to the remainingEdges during the formation of the clusters. - * This is a seperate function to allow for level-wise collapsing of the node barnesHutTree. - * It has to be called if a level is collapsed. It is called by _formClusters(). - * @private - */ - exports._updateDynamicEdges = function() { - for (var i = 0; i < this.nodeIndices.length; i++) { - var node = this.nodes[this.nodeIndices[i]]; - node.dynamicEdgesLength = node.dynamicEdges.length; + /** + * temporary state where we will ignore the next keyup + * + * @type {boolean|string} + */ + _ignore_next_keyup = false, - // this corrects for multiple edges pointing at the same other node - var correction = 0; - if (node.dynamicEdgesLength > 1) { - for (var j = 0; j < node.dynamicEdgesLength - 1; j++) { - var edgeToId = node.dynamicEdges[j].toId; - var edgeFromId = node.dynamicEdges[j].fromId; - for (var k = j+1; k < node.dynamicEdgesLength; k++) { - if ((node.dynamicEdges[k].toId == edgeToId && node.dynamicEdges[k].fromId == edgeFromId) || - (node.dynamicEdges[k].fromId == edgeToId && node.dynamicEdges[k].toId == edgeFromId)) { - correction += 1; - } - } - } - } - node.dynamicEdgesLength -= correction; - } - }; + /** + * are we currently inside of a sequence? + * type of action ("keyup" or "keydown" or "keypress") or false + * + * @type {boolean|string} + */ + _inside_sequence = false; + /** + * loop through the f keys, f1 to f19 and add them to the map + * programatically + */ + for (var i = 1; i < 20; ++i) { + _MAP[111 + i] = 'f' + i; + } - /** - * This adds an edge from the childNode to the contained edges of the parent node - * - * @param parentNode | Node object - * @param childNode | Node object - * @param edge | Edge object - * @private - */ - exports._addToContainedEdges = function(parentNode, childNode, edge) { - // create an array object if it does not yet exist for this childNode - if (!(parentNode.containedEdges.hasOwnProperty(childNode.id))) { - parentNode.containedEdges[childNode.id] = [] + /** + * loop through to map numbers on the numeric keypad + */ + for (i = 0; i <= 9; ++i) { + _MAP[i + 96] = i; } - // add this edge to the list - parentNode.containedEdges[childNode.id].push(edge); - // remove the edge from the global edges object - delete this.edges[edge.id]; + /** + * cross browser add event method + * + * @param {Element|HTMLDocument} object + * @param {string} type + * @param {Function} callback + * @returns void + */ + function _addEvent(object, type, callback) { + if (object.addEventListener) { + return object.addEventListener(type, callback, false); + } - // remove the edge from the parent object - for (var i = 0; i < parentNode.dynamicEdges.length; i++) { - if (parentNode.dynamicEdges[i].id == edge.id) { - parentNode.dynamicEdges.splice(i,1); - break; - } + object.attachEvent('on' + type, callback); } - }; - /** - * This function connects an edge that was connected to a child node to the parent node. - * It keeps track of which nodes it has been connected to with the originalId array. - * - * @param {Node} parentNode | Node object - * @param {Node} childNode | Node object - * @param {Edge} edge | Edge object - * @private - */ - exports._connectEdgeToCluster = function(parentNode, childNode, edge) { - // handle circular edges - if (edge.toId == edge.fromId) { - this._addToContainedEdges(parentNode, childNode, edge); - } - else { - if (edge.toId == childNode.id) { // edge connected to other node on the "to" side - edge.originalToId.push(childNode.id); - edge.to = parentNode; - edge.toId = parentNode.id; - } - else { // edge connected to other node with the "from" side + /** + * takes the event and returns the key character + * + * @param {Event} e + * @return {string} + */ + function _characterFromEvent(e) { - edge.originalFromId.push(childNode.id); - edge.from = parentNode; - edge.fromId = parentNode.id; - } + // for keypress events we should return the character as is + if (e.type == 'keypress') { + return String.fromCharCode(e.which); + } - this._addToReroutedEdges(parentNode,childNode,edge); - } - }; + // for non keypress events the special maps are needed + if (_MAP[e.which]) { + return _MAP[e.which]; + } + if (_KEYCODE_MAP[e.which]) { + return _KEYCODE_MAP[e.which]; + } - /** - * If a node is connected to itself, a circular edge is drawn. When clustering we want to contain - * these edges inside of the cluster. - * - * @param parentNode - * @param childNode - * @private - */ - exports._containCircularEdgesFromNode = function(parentNode, childNode) { - // manage all the edges connected to the child and parent nodes - for (var i = 0; i < parentNode.dynamicEdges.length; i++) { - var edge = parentNode.dynamicEdges[i]; - // handle circular edges - if (edge.toId == edge.fromId) { - this._addToContainedEdges(parentNode, childNode, edge); - } + // if it is not in the special map + return String.fromCharCode(e.which).toLowerCase(); } - }; - - /** - * This adds an edge from the childNode to the rerouted edges of the parent node - * - * @param parentNode | Node object - * @param childNode | Node object - * @param edge | Edge object - * @private - */ - exports._addToReroutedEdges = function(parentNode, childNode, edge) { - // create an array object if it does not yet exist for this childNode - // we store the edge in the rerouted edges so we can restore it when the cluster pops open - if (!(parentNode.reroutedEdges.hasOwnProperty(childNode.id))) { - parentNode.reroutedEdges[childNode.id] = []; - } - parentNode.reroutedEdges[childNode.id].push(edge); + /** + * should we stop this event before firing off callbacks + * + * @param {Event} e + * @return {boolean} + */ + function _stop(e) { + var element = e.target || e.srcElement, + tag_name = element.tagName; - // this edge becomes part of the dynamicEdges of the cluster node - parentNode.dynamicEdges.push(edge); - }; + // if the element has the class "mousetrap" then no need to stop + if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) { + return false; + } + // stop for input, select, and textarea + return tag_name == 'INPUT' || tag_name == 'SELECT' || tag_name == 'TEXTAREA' || (element.contentEditable && element.contentEditable == 'true'); + } + /** + * checks if two arrays are equal + * + * @param {Array} modifiers1 + * @param {Array} modifiers2 + * @returns {boolean} + */ + function _modifiersMatch(modifiers1, modifiers2) { + return modifiers1.sort().join(',') === modifiers2.sort().join(','); + } - /** - * This function connects an edge that was connected to a cluster node back to the child node. - * - * @param parentNode | Node object - * @param childNode | Node object - * @private - */ - exports._connectEdgeBackToChild = function(parentNode, childNode) { - if (parentNode.reroutedEdges.hasOwnProperty(childNode.id)) { - for (var i = 0; i < parentNode.reroutedEdges[childNode.id].length; i++) { - var edge = parentNode.reroutedEdges[childNode.id][i]; - if (edge.originalFromId[edge.originalFromId.length-1] == childNode.id) { - edge.originalFromId.pop(); - edge.fromId = childNode.id; - edge.from = childNode; - } - else { - edge.originalToId.pop(); - edge.toId = childNode.id; - edge.to = childNode; - } + /** + * resets all sequence counters except for the ones passed in + * + * @param {Object} do_not_reset + * @returns void + */ + function _resetSequences(do_not_reset) { + do_not_reset = do_not_reset || {}; - // append this edge to the list of edges connecting to the childnode - childNode.dynamicEdges.push(edge); + var active_sequences = false, + key; - // remove the edge from the parent object - for (var j = 0; j < parentNode.dynamicEdges.length; j++) { - if (parentNode.dynamicEdges[j].id == edge.id) { - parentNode.dynamicEdges.splice(j,1); - break; - } + for (key in _sequence_levels) { + if (do_not_reset[key]) { + active_sequences = true; + continue; + } + _sequence_levels[key] = 0; + } + + if (!active_sequences) { + _inside_sequence = false; } - } - // remove the entry from the rerouted edges - delete parentNode.reroutedEdges[childNode.id]; } - }; + /** + * finds all callbacks that match based on the keycode, modifiers, + * and action + * + * @param {string} character + * @param {Array} modifiers + * @param {string} action + * @param {boolean=} remove - should we remove any matches + * @param {string=} combination + * @returns {Array} + */ + function _getMatches(character, modifiers, action, remove, combination) { + var i, + callback, + matches = []; - /** - * When loops are clustered, an edge can be both in the rerouted array and the contained array. - * This function is called last to verify that all edges in dynamicEdges are in fact connected to the - * parentNode - * - * @param parentNode | Node object - * @private - */ - exports._validateEdges = function(parentNode) { - for (var i = 0; i < parentNode.dynamicEdges.length; i++) { - var edge = parentNode.dynamicEdges[i]; - if (parentNode.id != edge.toId && parentNode.id != edge.fromId) { - parentNode.dynamicEdges.splice(i,1); - } - } - }; + // if there are no events related to this keycode + if (!_callbacks[character]) { + return []; + } + // if a modifier key is coming up on its own we should allow it + if (action == 'keyup' && _isModifier(character)) { + modifiers = [character]; + } - /** - * This function released the contained edges back into the global domain and puts them back into the - * dynamic edges of both parent and child. - * - * @param {Node} parentNode | - * @param {Node} childNode | - * @private - */ - exports._releaseContainedEdges = function(parentNode, childNode) { - for (var i = 0; i < parentNode.containedEdges[childNode.id].length; i++) { - var edge = parentNode.containedEdges[childNode.id][i]; + // loop through all callbacks for the key that was pressed + // and see if any of them match + for (i = 0; i < _callbacks[character].length; ++i) { + callback = _callbacks[character][i]; - // put the edge back in the global edges object - this.edges[edge.id] = edge; + // if this is a sequence but it is not at the right level + // then move onto the next match + if (callback.seq && _sequence_levels[callback.seq] != callback.level) { + continue; + } - // put the edge back in the dynamic edges of the child and parent - childNode.dynamicEdges.push(edge); - parentNode.dynamicEdges.push(edge); - } - // remove the entry from the contained edges - delete parentNode.containedEdges[childNode.id]; + // if the action we are looking for doesn't match the action we got + // then we should keep going + if (action != callback.action) { + continue; + } - }; + // if this is a keypress event that means that we need to only + // look at the character, otherwise check the modifiers as + // well + if (action == 'keypress' || _modifiersMatch(modifiers, callback.modifiers)) { + // remove is used so if you change your mind and call bind a + // second time with a new function the first one is overwritten + if (remove && callback.combo == combination) { + _callbacks[character].splice(i, 1); + } + matches.push(callback); + } + } + return matches; + } - // ------------------- UTILITY FUNCTIONS ---------------------------- // + /** + * takes a key event and figures out what the modifiers are + * + * @param {Event} e + * @returns {Array} + */ + function _eventModifiers(e) { + var modifiers = []; + if (e.shiftKey) { + modifiers.push('shift'); + } - /** - * This updates the node labels for all nodes (for debugging purposes) - */ - exports.updateLabels = function() { - var nodeId; - // update node labels - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - var node = this.nodes[nodeId]; - if (node.clusterSize > 1) { - node.label = "[".concat(String(node.clusterSize),"]"); + if (e.altKey) { + modifiers.push('alt'); } - } - } - // update node labels - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (node.clusterSize == 1) { - if (node.originalLabel !== undefined) { - node.label = node.originalLabel; - } - else { - node.label = String(node.id); - } + if (e.ctrlKey) { + modifiers.push('ctrl'); } - } - } - // /* Debug Override */ - // for (nodeId in this.nodes) { - // if (this.nodes.hasOwnProperty(nodeId)) { - // node = this.nodes[nodeId]; - // node.label = String(node.level); - // } - // } + if (e.metaKey) { + modifiers.push('meta'); + } - }; + return modifiers; + } + /** + * actually calls the callback function + * + * if your callback function returns false this will use the jquery + * convention - prevent default and stop propogation on the event + * + * @param {Function} callback + * @param {Event} e + * @returns void + */ + function _fireCallback(callback, e) { + if (callback(e) === false) { + if (e.preventDefault) { + e.preventDefault(); + } - /** - * We want to keep the cluster level distribution rather small. This means we do not want unclustered nodes - * if the rest of the nodes are already a few cluster levels in. - * To fix this we use this function. It determines the min and max cluster level and sends nodes that have not - * clustered enough to the clusterToSmallestNeighbours function. - */ - exports.normalizeClusterLevels = function() { - var maxLevel = 0; - var minLevel = 1e9; - var clusterLevel = 0; - var nodeId; + if (e.stopPropagation) { + e.stopPropagation(); + } - // we loop over all nodes in the list - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - clusterLevel = this.nodes[nodeId].clusterSessions.length; - if (maxLevel < clusterLevel) {maxLevel = clusterLevel;} - if (minLevel > clusterLevel) {minLevel = clusterLevel;} - } + e.returnValue = false; + e.cancelBubble = true; + } } - if (maxLevel - minLevel > this.constants.clustering.clusterLevelDifference) { - var amountOfNodes = this.nodeIndices.length; - var targetLevel = maxLevel - this.constants.clustering.clusterLevelDifference; - // we loop over all nodes in the list - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - if (this.nodes[nodeId].clusterSessions.length < targetLevel) { - this._clusterToSmallestNeighbour(this.nodes[nodeId]); - } + /** + * handles a character key event + * + * @param {string} character + * @param {Event} e + * @returns void + */ + function _handleCharacter(character, e) { + + // if this event should not happen stop here + if (_stop(e)) { + return; } - } - this._updateNodeIndexList(); - this._updateDynamicEdges(); - // if a cluster was formed, we increase the clusterSession - if (this.nodeIndices.length != amountOfNodes) { - this.clusterSession += 1; - } - } - }; + var callbacks = _getMatches(character, _eventModifiers(e), e.type), + i, + do_not_reset = {}, + processed_sequence_callback = false; + + // loop through matching callbacks for this key event + for (i = 0; i < callbacks.length; ++i) { + // fire for all sequence callbacks + // this is because if for example you have multiple sequences + // bound such as "g i" and "g t" they both need to fire the + // callback for matching g cause otherwise you can only ever + // match the first one + if (callbacks[i].seq) { + processed_sequence_callback = true; - /** - * This function determines if the cluster we want to decluster is in the active area - * this means around the zoom center - * - * @param {Node} node - * @returns {boolean} - * @private - */ - exports._nodeInActiveArea = function(node) { - return ( - Math.abs(node.x - this.areaCenter.x) <= this.constants.clustering.activeAreaBoxSize/this.scale - && - Math.abs(node.y - this.areaCenter.y) <= this.constants.clustering.activeAreaBoxSize/this.scale - ) - }; + // keep a list of which sequences were matches for later + do_not_reset[callbacks[i].seq] = 1; + _fireCallback(callbacks[i].callback, e); + continue; + } + // if there were no sequence matches but we are still here + // that means this is a regular match so we should fire that + if (!processed_sequence_callback && !_inside_sequence) { + _fireCallback(callbacks[i].callback, e); + } + } - /** - * This is an adaptation of the original repositioning function. This is called if the system is clustered initially - * It puts large clusters away from the center and randomizes the order. - * - */ - exports.repositionNodes = function() { - for (var i = 0; i < this.nodeIndices.length; i++) { - var node = this.nodes[this.nodeIndices[i]]; - if ((node.xFixed == false || node.yFixed == false)) { - var radius = 10 * 0.1*this.nodeIndices.length * Math.min(100,node.mass); - var angle = 2 * Math.PI * Math.random(); - if (node.xFixed == false) {node.x = radius * Math.cos(angle);} - if (node.yFixed == false) {node.y = radius * Math.sin(angle);} - this._repositionBezierNodes(node); - } + // if you are inside of a sequence and the key you are pressing + // is not a modifier key then we should reset all sequences + // that were not matched by this key event + if (e.type == _inside_sequence && !_isModifier(character)) { + _resetSequences(do_not_reset); + } } - }; + /** + * handles a keydown event + * + * @param {Event} e + * @returns void + */ + function _handleKey(e) { - /** - * We determine how many connections denote an important hub. - * We take the mean + 2*std as the important hub size. (Assuming a normal distribution of data, ~2.2%) - * - * @private - */ - exports._getHubSize = function() { - var average = 0; - var averageSquared = 0; - var hubCounter = 0; - var largestHub = 0; + // normalize e.which for key events + // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion + e.which = typeof e.which == "number" ? e.which : e.keyCode; - for (var i = 0; i < this.nodeIndices.length; i++) { + var character = _characterFromEvent(e); - var node = this.nodes[this.nodeIndices[i]]; - if (node.dynamicEdgesLength > largestHub) { - largestHub = node.dynamicEdgesLength; - } - average += node.dynamicEdgesLength; - averageSquared += Math.pow(node.dynamicEdgesLength,2); - hubCounter += 1; - } - average = average / hubCounter; - averageSquared = averageSquared / hubCounter; + // no character found then stop + if (!character) { + return; + } - var variance = averageSquared - Math.pow(average,2); + if (e.type == 'keyup' && _ignore_next_keyup == character) { + _ignore_next_keyup = false; + return; + } - var standardDeviation = Math.sqrt(variance); + _handleCharacter(character, e); + } - this.hubThreshold = Math.floor(average + 2*standardDeviation); + /** + * determines if the keycode specified is a modifier key or not + * + * @param {string} key + * @returns {boolean} + */ + function _isModifier(key) { + return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta'; + } - // always have at least one to cluster - if (this.hubThreshold > largestHub) { - this.hubThreshold = largestHub; + /** + * called to set a 1 second timeout on the specified sequence + * + * this is so after each key press in the sequence you have 1 second + * to press the next key before you have to start over + * + * @returns void + */ + function _resetSequenceTimer() { + clearTimeout(_reset_timer); + _reset_timer = setTimeout(_resetSequences, 1000); } - // console.log("average",average,"averageSQ",averageSquared,"var",variance,"std",standardDeviation); - // console.log("hubThreshold:",this.hubThreshold); - }; + /** + * reverses the map lookup so that we can look for specific keys + * to see what can and can't use keypress + * + * @return {Object} + */ + function _getReverseMap() { + if (!_REVERSE_MAP) { + _REVERSE_MAP = {}; + for (var key in _MAP) { + // pull out the numeric keypad from here cause keypress should + // be able to detect the keys from the character + if (key > 95 && key < 112) { + continue; + } - /** - * We reduce the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods - * with this amount we can cluster specifically on these chains. - * - * @param {Number} fraction | between 0 and 1, the percentage of chains to reduce - * @private - */ - exports._reduceAmountOfChains = function(fraction) { - this.hubThreshold = 2; - var reduceAmount = Math.floor(this.nodeIndices.length * fraction); - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { - if (reduceAmount > 0) { - this._formClusterFromHub(this.nodes[nodeId],true,true,1); - reduceAmount -= 1; - } + if (_MAP.hasOwnProperty(key)) { + _REVERSE_MAP[_MAP[key]] = key; + } + } } - } + return _REVERSE_MAP; } - }; - /** - * We get the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods - * with this amount we can cluster specifically on these chains. - * - * @private - */ - exports._getChainFraction = function() { - var chains = 0; - var total = 0; - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { - chains += 1; + /** + * picks the best action based on the key combination + * + * @param {string} key - character for key + * @param {Array} modifiers + * @param {string=} action passed in + */ + function _pickBestAction(key, modifiers, action) { + + // if no action was picked in we should try to pick the one + // that we think would work best for this key + if (!action) { + action = _getReverseMap()[key] ? 'keydown' : 'keypress'; } - total += 1; - } - } - return chains/total; - }; + // modifier keys don't work as expected with keypress, + // switch to keydown + if (action == 'keypress' && modifiers.length) { + action = 'keydown'; + } -/***/ }, -/* 43 */ -/***/ function(module, exports, __webpack_require__) { + return action; + } - var util = __webpack_require__(1); + /** + * binds a key sequence to an event + * + * @param {string} combo - combo specified in bind call + * @param {Array} keys + * @param {Function} callback + * @param {string=} action + * @returns void + */ + function _bindSequence(combo, keys, callback, action) { - /** - * Creation of the SectorMixin var. - * - * This contains all the functions the Network object can use to employ the sector system. - * The sector system is always used by Network, though the benefits only apply to the use of clustering. - * If clustering is not used, there is no overhead except for a duplicate object with references to nodes and edges. - */ + // start off by adding a sequence level record for this combination + // and setting the level to 0 + _sequence_levels[combo] = 0; - /** - * This function is only called by the setData function of the Network object. - * This loads the global references into the active sector. This initializes the sector. - * - * @private - */ - exports._putDataInSector = function() { - this.sectors["active"][this._sector()].nodes = this.nodes; - this.sectors["active"][this._sector()].edges = this.edges; - this.sectors["active"][this._sector()].nodeIndices = this.nodeIndices; - }; + // if there is no action pick the best one for the first key + // in the sequence + if (!action) { + action = _pickBestAction(keys[0], []); + } + + /** + * callback to increase the sequence level for this sequence and reset + * all other sequences that were active + * + * @param {Event} e + * @returns void + */ + var _increaseSequence = function(e) { + _inside_sequence = action; + ++_sequence_levels[combo]; + _resetSequenceTimer(); + }, + /** + * wraps the specified callback inside of another function in order + * to reset all sequence counters as soon as this sequence is done + * + * @param {Event} e + * @returns void + */ + _callbackAndReset = function(e) { + _fireCallback(callback, e); - /** - * /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the supplied (active) sector. If a type is defined, do the specific type - * - * @param {String} sectorId - * @param {String} [sectorType] | "active" or "frozen" - * @private - */ - exports._switchToSector = function(sectorId, sectorType) { - if (sectorType === undefined || sectorType == "active") { - this._switchToActiveSector(sectorId); - } - else { - this._switchToFrozenSector(sectorId); + // we should ignore the next key up if the action is key down + // or keypress. this is so if you finish a sequence and + // release the key the final key will not trigger a keyup + if (action !== 'keyup') { + _ignore_next_keyup = _characterFromEvent(e); + } + + // weird race condition if a sequence ends with the key + // another sequence begins with + setTimeout(_resetSequences, 10); + }, + i; + + // loop through keys one at a time and bind the appropriate callback + // function. for any key leading up to the final one it should + // increase the sequence. after the final, it should reset all sequences + for (i = 0; i < keys.length; ++i) { + _bindSingle(keys[i], i < keys.length - 1 ? _increaseSequence : _callbackAndReset, action, combo, i); + } } - }; + /** + * binds a single keyboard combination + * + * @param {string} combination + * @param {Function} callback + * @param {string=} action + * @param {string=} sequence_name - name of sequence if part of sequence + * @param {number=} level - what part of the sequence the command is + * @returns void + */ + function _bindSingle(combination, callback, action, sequence_name, level) { - /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the supplied active sector. - * - * @param sectorId - * @private - */ - exports._switchToActiveSector = function(sectorId) { - this.nodeIndices = this.sectors["active"][sectorId]["nodeIndices"]; - this.nodes = this.sectors["active"][sectorId]["nodes"]; - this.edges = this.sectors["active"][sectorId]["edges"]; - }; + // make sure multiple spaces in a row become a single space + combination = combination.replace(/\s+/g, ' '); + var sequence = combination.split(' '), + i, + key, + keys, + modifiers = []; - /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the supplied active sector. - * - * @private - */ - exports._switchToSupportSector = function() { - this.nodeIndices = this.sectors["support"]["nodeIndices"]; - this.nodes = this.sectors["support"]["nodes"]; - this.edges = this.sectors["support"]["edges"]; - }; + // if this pattern is a sequence of keys then run through this method + // to reprocess each pattern one key at a time + if (sequence.length > 1) { + return _bindSequence(combination, sequence, callback, action); + } + // take the keys from this pattern and figure out what the actual + // pattern is all about + keys = combination === '+' ? ['+'] : combination.split('+'); - /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the supplied frozen sector. - * - * @param sectorId - * @private - */ - exports._switchToFrozenSector = function(sectorId) { - this.nodeIndices = this.sectors["frozen"][sectorId]["nodeIndices"]; - this.nodes = this.sectors["frozen"][sectorId]["nodes"]; - this.edges = this.sectors["frozen"][sectorId]["edges"]; - }; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + // normalize key names + if (_SPECIAL_ALIASES[key]) { + key = _SPECIAL_ALIASES[key]; + } - /** - * This function sets the global references to nodes, edges and nodeIndices back to - * those of the currently active sector. - * - * @private - */ - exports._loadLatestSector = function() { - this._switchToSector(this._sector()); - }; + // if this is not a keypress event then we should + // be smart about using shift keys + // this will only work for US keyboards however + if (action && action != 'keypress' && _SHIFT_MAP[key]) { + key = _SHIFT_MAP[key]; + modifiers.push('shift'); + } + // if this key is a modifier then add it to the list of modifiers + if (_isModifier(key)) { + modifiers.push(key); + } + } - /** - * This function returns the currently active sector Id - * - * @returns {String} - * @private - */ - exports._sector = function() { - return this.activeSector[this.activeSector.length-1]; - }; + // depending on what the key combination is + // we will try to pick the best event for it + action = _pickBestAction(key, modifiers, action); + // make sure to initialize array if this is the first time + // a callback is added for this key + if (!_callbacks[key]) { + _callbacks[key] = []; + } - /** - * This function returns the previously active sector Id - * - * @returns {String} - * @private - */ - exports._previousSector = function() { - if (this.activeSector.length > 1) { - return this.activeSector[this.activeSector.length-2]; + // remove an existing match if there is one + _getMatches(key, modifiers, action, !sequence_name, combination); + + // add this call back to the array + // if it is a sequence put it at the beginning + // if not put it at the end + // + // this is important because the way these are processed expects + // the sequence ones to come first + _callbacks[key][sequence_name ? 'unshift' : 'push']({ + callback: callback, + modifiers: modifiers, + action: action, + seq: sequence_name, + level: level, + combo: combination + }); } - else { - throw new TypeError('there are not enough sectors in the this.activeSector array.'); + + /** + * binds multiple combinations to the same callback + * + * @param {Array} combinations + * @param {Function} callback + * @param {string|undefined} action + * @returns void + */ + function _bindMultiple(combinations, callback, action) { + for (var i = 0; i < combinations.length; ++i) { + _bindSingle(combinations[i], callback, action); + } } - }; + // start! + _addEvent(document, 'keypress', _handleKey); + _addEvent(document, 'keydown', _handleKey); + _addEvent(document, 'keyup', _handleKey); - /** - * We add the active sector at the end of the this.activeSector array - * This ensures it is the currently active sector returned by _sector() and it reaches the top - * of the activeSector stack. When we reverse our steps we move from the end to the beginning of this stack. - * - * @param newId - * @private - */ - exports._setActiveSector = function(newId) { - this.activeSector.push(newId); - }; + var mousetrap = { + + /** + * binds an event to mousetrap + * + * can be a single key, a combination of keys separated with +, + * a comma separated list of keys, an array of keys, or + * a sequence of keys separated by spaces + * + * be sure to list the modifier keys first to make sure that the + * correct key ends up getting bound (the last key in the pattern) + * + * @param {string|Array} keys + * @param {Function} callback + * @param {string=} action - 'keypress', 'keydown', or 'keyup' + * @returns void + */ + bind: function(keys, callback, action) { + _bindMultiple(keys instanceof Array ? keys : [keys], callback, action); + _direct_map[keys + ':' + action] = callback; + return this; + }, + + /** + * unbinds an event to mousetrap + * + * the unbinding sets the callback function of the specified key combo + * to an empty function and deletes the corresponding key in the + * _direct_map dict. + * + * the keycombo+action has to be exactly the same as + * it was defined in the bind method + * + * TODO: actually remove this from the _callbacks dictionary instead + * of binding an empty function + * + * @param {string|Array} keys + * @param {string} action + * @returns void + */ + unbind: function(keys, action) { + if (_direct_map[keys + ':' + action]) { + delete _direct_map[keys + ':' + action]; + this.bind(keys, function() {}, action); + } + return this; + }, + /** + * triggers an event that has already been bound + * + * @param {string} keys + * @param {string=} action + * @returns void + */ + trigger: function(keys, action) { + _direct_map[keys + ':' + action](); + return this; + }, - /** - * We remove the currently active sector id from the active sector stack. This happens when - * we reactivate the previously active sector - * - * @private - */ - exports._forgetLastSector = function() { - this.activeSector.pop(); - }; + /** + * resets the library back to its initial state. this is useful + * if you want to clear out the current keyboard shortcuts and bind + * new ones - for example if you switch to another page + * + * @returns void + */ + reset: function() { + _callbacks = {}; + _direct_map = {}; + return this; + } + }; + module.exports = mousetrap; - /** - * This function creates a new active sector with the supplied newId. This newId - * is the expanding node id. - * - * @param {String} newId | Id of the new active sector - * @private - */ - exports._createNewSector = function(newId) { - // create the new sector - this.sectors["active"][newId] = {"nodes":{}, - "edges":{}, - "nodeIndices":[], - "formationScale": this.scale, - "drawingNode": undefined}; - // create the new sector render node. This gives visual feedback that you are in a new sector. - this.sectors["active"][newId]['drawingNode'] = new Node( - {id:newId, - color: { - background: "#eaefef", - border: "495c5e" - } - },{},{},this.constants); - this.sectors["active"][newId]['drawingNode'].clusterSize = 2; - }; +/***/ }, +/* 43 */ +/***/ function(module, exports, __webpack_require__) { /** - * This function removes the currently active sector. This is called when we create a new - * active sector. + * Creation of the ClusterMixin var. * - * @param {String} sectorId | Id of the active sector that will be removed - * @private + * This contains all the functions the Network object can use to employ clustering */ - exports._deleteActiveSector = function(sectorId) { - delete this.sectors["active"][sectorId]; - }; - /** - * This function removes the currently active sector. This is called when we reactivate - * the previously active sector. - * - * @param {String} sectorId | Id of the active sector that will be removed - * @private - */ - exports._deleteFrozenSector = function(sectorId) { - delete this.sectors["frozen"][sectorId]; - }; - + * This is only called in the constructor of the network object + * + */ + exports.startWithClustering = function() { + // cluster if the data set is big + this.clusterToFit(this.constants.clustering.initialMaxNodes, true); - /** - * Freezing an active sector means moving it from the "active" object to the "frozen" object. - * We copy the references, then delete the active entree. - * - * @param sectorId - * @private - */ - exports._freezeSector = function(sectorId) { - // we move the set references from the active to the frozen stack. - this.sectors["frozen"][sectorId] = this.sectors["active"][sectorId]; + // updates the lables after clustering + this.updateLabels(); - // we have moved the sector data into the frozen set, we now remove it from the active set - this._deleteActiveSector(sectorId); + // this is called here because if clusterin is disabled, the start and stabilize are called in + // the setData function. + if (this.stabilize) { + this._stabilize(); + } + this.start(); }; - /** - * This is the reverse operation of _freezeSector. Activating means moving the sector from the "frozen" - * object to the "active" object. + * This function clusters until the initialMaxNodes has been reached * - * @param sectorId - * @private + * @param {Number} maxNumberOfNodes + * @param {Boolean} reposition */ - exports._activateSector = function(sectorId) { - // we move the set references from the frozen to the active stack. - this.sectors["active"][sectorId] = this.sectors["frozen"][sectorId]; - - // we have moved the sector data into the active set, we now remove it from the frozen stack - this._deleteFrozenSector(sectorId); - }; + exports.clusterToFit = function(maxNumberOfNodes, reposition) { + var numberOfNodes = this.nodeIndices.length; + var maxLevels = 50; + var level = 0; - /** - * This function merges the data from the currently active sector with a frozen sector. This is used - * in the process of reverting back to the previously active sector. - * The data that is placed in the frozen (the previously active) sector is the node that has been removed from it - * upon the creation of a new active sector. - * - * @param sectorId - * @private - */ - exports._mergeThisWithFrozen = function(sectorId) { - // copy all nodes - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - this.sectors["frozen"][sectorId]["nodes"][nodeId] = this.nodes[nodeId]; + // we first cluster the hubs, then we pull in the outliers, repeat + while (numberOfNodes > maxNumberOfNodes && level < maxLevels) { + if (level % 3 == 0) { + this.forceAggregateHubs(true); + this.normalizeClusterLevels(); } - } - - // copy all edges (if not fully clustered, else there are no edges) - for (var edgeId in this.edges) { - if (this.edges.hasOwnProperty(edgeId)) { - this.sectors["frozen"][sectorId]["edges"][edgeId] = this.edges[edgeId]; + else { + this.increaseClusterLevel(); // this also includes a cluster normalization } - } - // merge the nodeIndices - for (var i = 0; i < this.nodeIndices.length; i++) { - this.sectors["frozen"][sectorId]["nodeIndices"].push(this.nodeIndices[i]); + numberOfNodes = this.nodeIndices.length; + level += 1; } - }; - - /** - * This clusters the sector to one cluster. It was a single cluster before this process started so - * we revert to that state. The clusterToFit function with a maximum size of 1 node does this. - * - * @private - */ - exports._collapseThisToSingleCluster = function() { - this.clusterToFit(1,false); + // after the clustering we reposition the nodes to reduce the initial chaos + if (level > 0 && reposition == true) { + this.repositionNodes(); + } + this._updateCalculationNodes(); }; - /** - * We create a new active sector from the node that we want to open. + * This function can be called to open up a specific cluster. It is only called by + * It will unpack the cluster back one level. * - * @param node - * @private + * @param node | Node object: cluster to open. */ - exports._addSector = function(node) { - // this is the currently active sector - var sector = this._sector(); - - // // this should allow me to select nodes from a frozen set. - // if (this.sectors['active'][sector]["nodes"].hasOwnProperty(node.id)) { - // console.log("the node is part of the active sector"); - // } - // else { - // console.log("I dont know what the fuck happened!!"); - // } - - // when we switch to a new sector, we remove the node that will be expanded from the current nodes list. - delete this.nodes[node.id]; - - var unqiueIdentifier = util.randomUUID(); - - // we fully freeze the currently active sector - this._freezeSector(sector); + exports.openCluster = function(node) { + var isMovingBeforeClustering = this.moving; + if (node.clusterSize > this.constants.clustering.sectorThreshold && this._nodeInActiveArea(node) && + !(this._sector() == "default" && this.nodeIndices.length == 1)) { + // this loads a new sector, loads the nodes and edges and nodeIndices of it. + this._addSector(node); + var level = 0; - // we create a new active sector. This sector has the Id of the node to ensure uniqueness - this._createNewSector(unqiueIdentifier); + // we decluster until we reach a decent number of nodes + while ((this.nodeIndices.length < this.constants.clustering.initialMaxNodes) && (level < 10)) { + this.decreaseClusterLevel(); + level += 1; + } - // we add the active sector to the sectors array to be able to revert these steps later on - this._setActiveSector(unqiueIdentifier); + } + else { + this._expandClusterNode(node,false,true); - // we redirect the global references to the new sector's references. this._sector() now returns unqiueIdentifier - this._switchToSector(this._sector()); + // update the index list, dynamic edges and labels + this._updateNodeIndexList(); + this._updateDynamicEdges(); + this._updateCalculationNodes(); + this.updateLabels(); + } - // finally we add the node we removed from our previous active sector to the new active sector - this.nodes[node.id] = node; + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); + } }; /** - * We close the sector that is currently open and revert back to the one before. - * If the active sector is the "default" sector, nothing happens. - * - * @private + * This calls the updateClustes with default arguments */ - exports._collapseSector = function() { - // the currently active sector - var sector = this._sector(); - - // we cannot collapse the default sector - if (sector != "default") { - if ((this.nodeIndices.length == 1) || - (this.sectors["active"][sector]["drawingNode"].width*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || - (this.sectors["active"][sector]["drawingNode"].height*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { - var previousSector = this._previousSector(); - - // we collapse the sector back to a single cluster - this._collapseThisToSingleCluster(); - - // we move the remaining nodes, edges and nodeIndices to the previous sector. - // This previous sector is the one we will reactivate - this._mergeThisWithFrozen(previousSector); - - // the previously active (frozen) sector now has all the data from the currently active sector. - // we can now delete the active sector. - this._deleteActiveSector(sector); - - // we activate the previously active (and currently frozen) sector. - this._activateSector(previousSector); - - // we load the references from the newly active sector into the global references - this._switchToSector(previousSector); - - // we forget the previously active sector because we reverted to the one before - this._forgetLastSector(); + exports.updateClustersDefault = function() { + if (this.constants.clustering.enabled == true) { + this.updateClusters(0,false,false); + } + }; - // finally, we update the node index list. - this._updateNodeIndexList(); - // we refresh the list with calulation nodes and calculation node indices. - this._updateCalculationNodes(); - } - } + /** + * This function can be called to increase the cluster level. This means that the nodes with only one edge connection will + * be clustered with their connected node. This can be repeated as many times as needed. + * This can be called externally (by a keybind for instance) to reduce the complexity of big datasets. + */ + exports.increaseClusterLevel = function() { + this.updateClusters(-1,false,true); }; /** - * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). - * - * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors - * | we dont pass the function itself because then the "this" is the window object - * | instead of the Network object - * @param {*} [argument] | Optional: arguments to pass to the runFunction - * @private + * This function can be called to decrease the cluster level. This means that the nodes with only one edge connection will + * be unpacked if they are a cluster. This can be repeated as many times as needed. + * This can be called externally (by a key-bind for instance) to look into clusters without zooming. */ - exports._doInAllActiveSectors = function(runFunction,argument) { - if (argument === undefined) { - for (var sector in this.sectors["active"]) { - if (this.sectors["active"].hasOwnProperty(sector)) { - // switch the global references to those of this sector - this._switchToActiveSector(sector); - this[runFunction](); - } - } - } - else { - for (var sector in this.sectors["active"]) { - if (this.sectors["active"].hasOwnProperty(sector)) { - // switch the global references to those of this sector - this._switchToActiveSector(sector); - var args = Array.prototype.splice.call(arguments, 1); - if (args.length > 1) { - this[runFunction](args[0],args[1]); - } - else { - this[runFunction](argument); - } - } - } - } - // we revert the global references back to our active sector - this._loadLatestSector(); + exports.decreaseClusterLevel = function() { + this.updateClusters(1,false,true); }; /** - * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). + * This is the main clustering function. It clusters and declusters on zoom or forced + * This function clusters on zoom, it can be called with a predefined zoom direction + * If out, check if we can form clusters, if in, check if we can open clusters. + * This function is only called from _zoom() + * + * @param {Number} zoomDirection | -1 / 0 / +1 for zoomOut / determineByZoom / zoomIn + * @param {Boolean} recursive | enabled or disable recursive calling of the opening of clusters + * @param {Boolean} force | enabled or disable forcing + * @param {Boolean} doNotStart | if true do not call start * - * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors - * | we dont pass the function itself because then the "this" is the window object - * | instead of the Network object - * @param {*} [argument] | Optional: arguments to pass to the runFunction - * @private */ - exports._doInSupportSector = function(runFunction,argument) { - if (argument === undefined) { - this._switchToSupportSector(); - this[runFunction](); + exports.updateClusters = function(zoomDirection,recursive,force,doNotStart) { + var isMovingBeforeClustering = this.moving; + var amountOfNodes = this.nodeIndices.length; + + // on zoom out collapse the sector if the scale is at the level the sector was made + if (this.previousScale > this.scale && zoomDirection == 0) { + this._collapseSector(); } - else { - this._switchToSupportSector(); - var args = Array.prototype.splice.call(arguments, 1); - if (args.length > 1) { - this[runFunction](args[0],args[1]); + + // check if we zoom in or out + if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out + // forming clusters when forced pulls outliers in. When not forced, the edge length of the + // outer nodes determines if it is being clustered + this._formClusters(force); + } + else if (this.previousScale < this.scale || zoomDirection == 1) { // zoom in + if (force == true) { + // _openClusters checks for each node if the formationScale of the cluster is smaller than + // the current scale and if so, declusters. When forced, all clusters are reduced by one step + this._openClusters(recursive,force); } else { - this[runFunction](argument); + // if a cluster takes up a set percentage of the active window + this._openClustersBySize(); } } - // we revert the global references back to our active sector - this._loadLatestSector(); - }; + this._updateNodeIndexList(); + // if a cluster was NOT formed and the user zoomed out, we try clustering by hubs + if (this.nodeIndices.length == amountOfNodes && (this.previousScale > this.scale || zoomDirection == -1)) { + this._aggregateHubs(force); + this._updateNodeIndexList(); + } - /** - * This runs a function in all frozen sectors. This is used in the _redraw(). - * - * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors - * | we don't pass the function itself because then the "this" is the window object - * | instead of the Network object - * @param {*} [argument] | Optional: arguments to pass to the runFunction - * @private - */ - exports._doInAllFrozenSectors = function(runFunction,argument) { - if (argument === undefined) { - for (var sector in this.sectors["frozen"]) { - if (this.sectors["frozen"].hasOwnProperty(sector)) { - // switch the global references to those of this sector - this._switchToFrozenSector(sector); - this[runFunction](); - } - } + // we now reduce chains. + if (this.previousScale > this.scale || zoomDirection == -1) { // zoom out + this.handleChains(); + this._updateNodeIndexList(); } - else { - for (var sector in this.sectors["frozen"]) { - if (this.sectors["frozen"].hasOwnProperty(sector)) { - // switch the global references to those of this sector - this._switchToFrozenSector(sector); - var args = Array.prototype.splice.call(arguments, 1); - if (args.length > 1) { - this[runFunction](args[0],args[1]); - } - else { - this[runFunction](argument); - } - } + + this.previousScale = this.scale; + + // rest of the update the index list, dynamic edges and labels + this._updateDynamicEdges(); + this.updateLabels(); + + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length < amountOfNodes) { // this means a clustering operation has taken place + this.clusterSession += 1; + // if clusters have been made, we normalize the cluster level + this.normalizeClusterLevels(); + } + + if (doNotStart == false || doNotStart === undefined) { + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); } } - this._loadLatestSector(); - }; + this._updateCalculationNodes(); + }; /** - * This runs a function in all sectors. This is used in the _redraw(). - * - * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors - * | we don't pass the function itself because then the "this" is the window object - * | instead of the Network object - * @param {*} [argument] | Optional: arguments to pass to the runFunction - * @private + * This function handles the chains. It is called on every updateClusters(). */ - exports._doInAllSectors = function(runFunction,argument) { - var args = Array.prototype.splice.call(arguments, 1); - if (argument === undefined) { - this._doInAllActiveSectors(runFunction); - this._doInAllFrozenSectors(runFunction); - } - else { - if (args.length > 1) { - this._doInAllActiveSectors(runFunction,args[0],args[1]); - this._doInAllFrozenSectors(runFunction,args[0],args[1]); - } - else { - this._doInAllActiveSectors(runFunction,argument); - this._doInAllFrozenSectors(runFunction,argument); - } + exports.handleChains = function() { + // after clustering we check how many chains there are + var chainPercentage = this._getChainFraction(); + if (chainPercentage > this.constants.clustering.chainThreshold) { + this._reduceAmountOfChains(1 - this.constants.clustering.chainThreshold / chainPercentage) + } }; - /** - * This clears the nodeIndices list. We cannot use this.nodeIndices = [] because we would break the link with the - * active sector. Thus we clear the nodeIndices in the active sector, then reconnect the this.nodeIndices to it. + * this functions starts clustering by hubs + * The minimum hub threshold is set globally * * @private */ - exports._clearNodeIndexList = function() { - var sector = this._sector(); - this.sectors["active"][sector]["nodeIndices"] = []; - this.nodeIndices = this.sectors["active"][sector]["nodeIndices"]; + exports._aggregateHubs = function(force) { + this._getHubSize(); + this._formClustersByHub(force,false); }; /** - * Draw the encompassing sector node + * This function is fired by keypress. It forces hubs to form. * - * @param ctx - * @param sectorType - * @private */ - exports._drawSectorNodes = function(ctx,sectorType) { - var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; - for (var sector in this.sectors[sectorType]) { - if (this.sectors[sectorType].hasOwnProperty(sector)) { - if (this.sectors[sectorType][sector]["drawingNode"] !== undefined) { - - this._switchToSector(sector,sectorType); - - minY = 1e9; maxY = -1e9; minX = 1e9; maxX = -1e9; - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - node.resize(ctx); - if (minX > node.x - 0.5 * node.width) {minX = node.x - 0.5 * node.width;} - if (maxX < node.x + 0.5 * node.width) {maxX = node.x + 0.5 * node.width;} - if (minY > node.y - 0.5 * node.height) {minY = node.y - 0.5 * node.height;} - if (maxY < node.y + 0.5 * node.height) {maxY = node.y + 0.5 * node.height;} - } - } - node = this.sectors[sectorType][sector]["drawingNode"]; - node.x = 0.5 * (maxX + minX); - node.y = 0.5 * (maxY + minY); - node.width = 2 * (node.x - minX); - node.height = 2 * (node.y - minY); - node.radius = Math.sqrt(Math.pow(0.5*node.width,2) + Math.pow(0.5*node.height,2)); - node.setScale(this.scale); - node._drawCircle(ctx); - } - } - } - }; + exports.forceAggregateHubs = function(doNotStart) { + var isMovingBeforeClustering = this.moving; + var amountOfNodes = this.nodeIndices.length; - exports._drawAllSectorNodes = function(ctx) { - this._drawSectorNodes(ctx,"frozen"); - this._drawSectorNodes(ctx,"active"); - this._loadLatestSector(); - }; + this._aggregateHubs(true); + // update the index list, dynamic edges and labels + this._updateNodeIndexList(); + this._updateDynamicEdges(); + this.updateLabels(); -/***/ }, -/* 44 */ -/***/ function(module, exports, __webpack_require__) { + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length != amountOfNodes) { + this.clusterSession += 1; + } - var Node = __webpack_require__(30); + if (doNotStart == false || doNotStart === undefined) { + // if the simulation was settled, we restart the simulation if a cluster has been formed or expanded + if (this.moving != isMovingBeforeClustering) { + this.start(); + } + } + }; /** - * This function can be called from the _doInAllSectors function + * If a cluster takes up more than a set percentage of the screen, open the cluster * - * @param object - * @param overlappingNodes * @private */ - exports._getNodesOverlappingWith = function(object, overlappingNodes) { - var nodes = this.nodes; - for (var nodeId in nodes) { - if (nodes.hasOwnProperty(nodeId)) { - if (nodes[nodeId].isOverlappingWith(object)) { - overlappingNodes.push(nodeId); + exports._openClustersBySize = function() { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.inView() == true) { + if ((node.width*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || + (node.height*this.scale > this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { + this.openCluster(node); + } } } } }; + /** - * retrieve all nodes overlapping with given object - * @param {Object} object An object with parameters left, top, right, bottom - * @return {Number[]} An array with id's of the overlapping nodes + * This function loops over all nodes in the nodeIndices list. For each node it checks if it is a cluster and if it + * has to be opened based on the current zoom level. + * * @private */ - exports._getAllNodesOverlappingWith = function (object) { - var overlappingNodes = []; - this._doInAllActiveSectors("_getNodesOverlappingWith",object,overlappingNodes); - return overlappingNodes; + exports._openClusters = function(recursive,force) { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + this._expandClusterNode(node,recursive,force); + this._updateCalculationNodes(); + } }; - /** - * Return a position object in canvasspace from a single point in screenspace + * This function checks if a node has to be opened. This is done by checking the zoom level. + * If the node contains child nodes, this function is recursively called on the child nodes as well. + * This recursive behaviour is optional and can be set by the recursive argument. * - * @param pointer - * @returns {{left: number, top: number, right: number, bottom: number}} + * @param {Node} parentNode | to check for cluster and expand + * @param {Boolean} recursive | enabled or disable recursive calling + * @param {Boolean} force | enabled or disable forcing + * @param {Boolean} [openAll] | This will recursively force all nodes in the parent to be released * @private */ - exports._pointerToPositionObject = function(pointer) { - var x = this._XconvertDOMtoCanvas(pointer.x); - var y = this._YconvertDOMtoCanvas(pointer.y); + exports._expandClusterNode = function(parentNode, recursive, force, openAll) { + // first check if node is a cluster + if (parentNode.clusterSize > 1) { + // this means that on a double tap event or a zoom event, the cluster fully unpacks if it is smaller than 20 + if (parentNode.clusterSize < this.constants.clustering.sectorThreshold) { + openAll = true; + } + recursive = openAll ? true : recursive; - return { - left: x, - top: y, - right: x, - bottom: y - }; - }; + // if the last child has been added on a smaller scale than current scale decluster + if (parentNode.formationScale < this.scale || force == true) { + // we will check if any of the contained child nodes should be removed from the cluster + for (var containedNodeId in parentNode.containedNodes) { + if (parentNode.containedNodes.hasOwnProperty(containedNodeId)) { + var childNode = parentNode.containedNodes[containedNodeId]; + // force expand will expand the largest cluster size clusters. Since we cluster from outside in, we assume that + // the largest cluster is the one that comes from outside + if (force == true) { + if (childNode.clusterSession == parentNode.clusterSessions[parentNode.clusterSessions.length-1] + || openAll) { + this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); + } + } + else { + if (this._nodeInActiveArea(parentNode)) { + this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll); + } + } + } + } + } + } + }; /** - * Get the top node at the a specific point (like a click) + * ONLY CALLED FROM _expandClusterNode * - * @param {{x: Number, y: Number}} pointer - * @return {Node | null} node + * This function will expel a child_node from a parent_node. This is to de-cluster the node. This function will remove + * the child node from the parent contained_node object and put it back into the global nodes object. + * The same holds for the edge that was connected to the child node. It is moved back into the global edges object. + * + * @param {Node} parentNode | the parent node + * @param {String} containedNodeId | child_node id as it is contained in the containedNodes object of the parent node + * @param {Boolean} recursive | This will also check if the child needs to be expanded. + * With force and recursive both true, the entire cluster is unpacked + * @param {Boolean} force | This will disregard the zoom level and will expel this child from the parent + * @param {Boolean} openAll | This will recursively force all nodes in the parent to be released * @private */ - exports._getNodeAt = function (pointer) { - // we first check if this is an navigation controls element - var positionObject = this._pointerToPositionObject(pointer); - var overlappingNodes = this._getAllNodesOverlappingWith(positionObject); + exports._expelChildFromParent = function(parentNode, containedNodeId, recursive, force, openAll) { + var childNode = parentNode.containedNodes[containedNodeId]; - // if there are overlapping nodes, select the last one, this is the - // one which is drawn on top of the others - if (overlappingNodes.length > 0) { - return this.nodes[overlappingNodes[overlappingNodes.length - 1]]; - } - else { - return null; - } - }; + // if child node has been added on smaller scale than current, kick out + if (childNode.formationScale < this.scale || force == true) { + // unselect all selected items + this._unselectAll(); + // put the child node back in the global nodes object + this.nodes[containedNodeId] = childNode; - /** - * retrieve all edges overlapping with given object, selector is around center - * @param {Object} object An object with parameters left, top, right, bottom - * @return {Number[]} An array with id's of the overlapping nodes - * @private - */ - exports._getEdgesOverlappingWith = function (object, overlappingEdges) { - var edges = this.edges; - for (var edgeId in edges) { - if (edges.hasOwnProperty(edgeId)) { - if (edges[edgeId].isOverlappingWith(object)) { - overlappingEdges.push(edgeId); + // release the contained edges from this childNode back into the global edges + this._releaseContainedEdges(parentNode,childNode); + + // reconnect rerouted edges to the childNode + this._connectEdgeBackToChild(parentNode,childNode); + + // validate all edges in dynamicEdges + this._validateEdges(parentNode); + + // undo the changes from the clustering operation on the parent node + parentNode.mass -= childNode.mass; + parentNode.clusterSize -= childNode.clusterSize; + parentNode.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*parentNode.clusterSize); + parentNode.dynamicEdgesLength = parentNode.dynamicEdges.length; + + // place the child node near the parent, not at the exact same location to avoid chaos in the system + childNode.x = parentNode.x + parentNode.growthIndicator * (0.5 - Math.random()); + childNode.y = parentNode.y + parentNode.growthIndicator * (0.5 - Math.random()); + + // remove node from the list + delete parentNode.containedNodes[containedNodeId]; + + // check if there are other childs with this clusterSession in the parent. + var othersPresent = false; + for (var childNodeId in parentNode.containedNodes) { + if (parentNode.containedNodes.hasOwnProperty(childNodeId)) { + if (parentNode.containedNodes[childNodeId].clusterSession == childNode.clusterSession) { + othersPresent = true; + break; + } } } - } - }; + // if there are no others, remove the cluster session from the list + if (othersPresent == false) { + parentNode.clusterSessions.pop(); + } + this._repositionBezierNodes(childNode); + // this._repositionBezierNodes(parentNode); - /** - * retrieve all nodes overlapping with given object - * @param {Object} object An object with parameters left, top, right, bottom - * @return {Number[]} An array with id's of the overlapping nodes - * @private - */ - exports._getAllEdgesOverlappingWith = function (object) { - var overlappingEdges = []; - this._doInAllActiveSectors("_getEdgesOverlappingWith",object,overlappingEdges); - return overlappingEdges; + // remove the clusterSession from the child node + childNode.clusterSession = 0; + + // recalculate the size of the node on the next time the node is rendered + parentNode.clearSizeCache(); + + // restart the simulation to reorganise all nodes + this.moving = true; + } + + // check if a further expansion step is possible if recursivity is enabled + if (recursive == true) { + this._expandClusterNode(childNode,recursive,force,openAll); + } }; + /** - * Place holder. To implement change the _getNodeAt to a _getObjectAt. Have the _getObjectAt call - * _getNodeAt and _getEdgesAt, then priortize the selection to user preferences. + * position the bezier nodes at the center of the edges * - * @param pointer - * @returns {null} + * @param node * @private */ - exports._getEdgeAt = function(pointer) { - var positionObject = this._pointerToPositionObject(pointer); - var overlappingEdges = this._getAllEdgesOverlappingWith(positionObject); - - if (overlappingEdges.length > 0) { - return this.edges[overlappingEdges[overlappingEdges.length - 1]]; - } - else { - return null; + exports._repositionBezierNodes = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + node.dynamicEdges[i].positionBezierNode(); } }; /** - * Add object to the selection array. + * This function checks if any nodes at the end of their trees have edges below a threshold length + * This function is called only from updateClusters() + * forceLevelCollapse ignores the length of the edge and collapses one level + * This means that a node with only one edge will be clustered with its connected node * - * @param obj * @private + * @param {Boolean} force */ - exports._addToSelection = function(obj) { - if (obj instanceof Node) { - this.selectionObj.nodes[obj.id] = obj; + exports._formClusters = function(force) { + if (force == false) { + this._formClustersByZoom(); } else { - this.selectionObj.edges[obj.id] = obj; + this._forceClustersByZoom(); } }; + /** - * Add object to the selection array. + * This function handles the clustering by zooming out, this is based on a minimum edge distance * - * @param obj * @private */ - exports._addToHover = function(obj) { - if (obj instanceof Node) { - this.hoverObj.nodes[obj.id] = obj; - } - else { - this.hoverObj.edges[obj.id] = obj; - } - }; + exports._formClustersByZoom = function() { + var dx,dy,length, + minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; + + // check if any edges are shorter than minLength and start the clustering + // the clustering favours the node with the larger mass + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + var edge = this.edges[edgeId]; + if (edge.connected) { + if (edge.toId != edge.fromId) { + dx = (edge.to.x - edge.from.x); + dy = (edge.to.y - edge.from.y); + length = Math.sqrt(dx * dx + dy * dy); - /** - * Remove a single option from selection. - * - * @param {Object} obj - * @private - */ - exports._removeFromSelection = function(obj) { - if (obj instanceof Node) { - delete this.selectionObj.nodes[obj.id]; - } - else { - delete this.selectionObj.edges[obj.id]; + if (length < minLength) { + // first check which node is larger + var parentNode = edge.from; + var childNode = edge.to; + if (edge.to.mass > edge.from.mass) { + parentNode = edge.to; + childNode = edge.from; + } + + if (childNode.dynamicEdgesLength == 1) { + this._addToCluster(parentNode,childNode,false); + } + else if (parentNode.dynamicEdgesLength == 1) { + this._addToCluster(childNode,parentNode,false); + } + } + } + } + } } }; /** - * Unselect all. The selectionObj is useful for this. + * This function forces the network to cluster all nodes with only one connecting edge to their + * connected node. * - * @param {Boolean} [doNotTrigger] | ignore trigger * @private */ - exports._unselectAll = function(doNotTrigger) { - if (doNotTrigger === undefined) { - doNotTrigger = false; - } - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - this.selectionObj.nodes[nodeId].unselect(); - } - } - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - this.selectionObj.edges[edgeId].unselect(); - } - } + exports._forceClustersByZoom = function() { + for (var nodeId in this.nodes) { + // another node could have absorbed this child. + if (this.nodes.hasOwnProperty(nodeId)) { + var childNode = this.nodes[nodeId]; - this.selectionObj = {nodes:{},edges:{}}; + // the edges can be swallowed by another decrease + if (childNode.dynamicEdgesLength == 1 && childNode.dynamicEdges.length != 0) { + var edge = childNode.dynamicEdges[0]; + var parentNode = (edge.toId == childNode.id) ? this.nodes[edge.fromId] : this.nodes[edge.toId]; - if (doNotTrigger == false) { - this.emit('select', this.getSelection()); + // group to the largest node + if (childNode.id != parentNode.id) { + if (parentNode.mass > childNode.mass) { + this._addToCluster(parentNode,childNode,true); + } + else { + this._addToCluster(childNode,parentNode,true); + } + } + } + } } }; + /** - * Unselect all clusters. The selectionObj is useful for this. + * To keep the nodes of roughly equal size we normalize the cluster levels. + * This function clusters a node to its smallest connected neighbour. * - * @param {Boolean} [doNotTrigger] | ignore trigger + * @param node * @private */ - exports._unselectClusters = function(doNotTrigger) { - if (doNotTrigger === undefined) { - doNotTrigger = false; - } + exports._clusterToSmallestNeighbour = function(node) { + var smallestNeighbour = -1; + var smallestNeighbourNode = null; + for (var i = 0; i < node.dynamicEdges.length; i++) { + if (node.dynamicEdges[i] !== undefined) { + var neighbour = null; + if (node.dynamicEdges[i].fromId != node.id) { + neighbour = node.dynamicEdges[i].from; + } + else if (node.dynamicEdges[i].toId != node.id) { + neighbour = node.dynamicEdges[i].to; + } - for (var nodeId in this.selectionObj.nodes) { - if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { - if (this.selectionObj.nodes[nodeId].clusterSize > 1) { - this.selectionObj.nodes[nodeId].unselect(); - this._removeFromSelection(this.selectionObj.nodes[nodeId]); + + if (neighbour != null && smallestNeighbour > neighbour.clusterSessions.length) { + smallestNeighbour = neighbour.clusterSessions.length; + smallestNeighbourNode = neighbour; } } } - if (doNotTrigger == false) { - this.emit('select', this.getSelection()); + if (neighbour != null && this.nodes[neighbour.id] !== undefined) { + this._addToCluster(neighbour, node, true); } }; /** - * return the number of selected nodes + * This function forms clusters from hubs, it loops over all nodes * - * @returns {number} + * @param {Boolean} force | Disregard zoom level + * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges * @private */ - exports._getSelectedNodeCount = function() { - var count = 0; - for (var nodeId in this.selectionObj.nodes) { - if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { - count += 1; + exports._formClustersByHub = function(force, onlyEqual) { + // we loop over all nodes in the list + for (var nodeId in this.nodes) { + // we check if it is still available since it can be used by the clustering in this loop + if (this.nodes.hasOwnProperty(nodeId)) { + this._formClusterFromHub(this.nodes[nodeId],force,onlyEqual); } } - return count; }; /** - * return the selected node + * This function forms a cluster from a specific preselected hub node * - * @returns {number} + * @param {Node} hubNode | the node we will cluster as a hub + * @param {Boolean} force | Disregard zoom level + * @param {Boolean} onlyEqual | This only clusters a hub with a specific number of edges + * @param {Number} [absorptionSizeOffset] | * @private */ - exports._getSelectedNode = function() { - for (var nodeId in this.selectionObj.nodes) { - if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { - return this.selectionObj.nodes[nodeId]; - } + exports._formClusterFromHub = function(hubNode, force, onlyEqual, absorptionSizeOffset) { + if (absorptionSizeOffset === undefined) { + absorptionSizeOffset = 0; } - return null; - }; + // we decide if the node is a hub + if ((hubNode.dynamicEdgesLength >= this.hubThreshold && onlyEqual == false) || + (hubNode.dynamicEdgesLength == this.hubThreshold && onlyEqual == true)) { + // initialize variables + var dx,dy,length; + var minLength = this.constants.clustering.clusterEdgeThreshold/this.scale; + var allowCluster = false; - /** - * return the selected edge - * - * @returns {number} - * @private - */ - exports._getSelectedEdge = function() { - for (var edgeId in this.selectionObj.edges) { - if (this.selectionObj.edges.hasOwnProperty(edgeId)) { - return this.selectionObj.edges[edgeId]; + // we create a list of edges because the dynamicEdges change over the course of this loop + var edgesIdarray = []; + var amountOfInitialEdges = hubNode.dynamicEdges.length; + for (var j = 0; j < amountOfInitialEdges; j++) { + edgesIdarray.push(hubNode.dynamicEdges[j].id); } - } - return null; - }; + // if the hub clustering is not forces, we check if one of the edges connected + // to a cluster is small enough based on the constants.clustering.clusterEdgeThreshold + if (force == false) { + allowCluster = false; + for (j = 0; j < amountOfInitialEdges; j++) { + var edge = this.edges[edgesIdarray[j]]; + if (edge !== undefined) { + if (edge.connected) { + if (edge.toId != edge.fromId) { + dx = (edge.to.x - edge.from.x); + dy = (edge.to.y - edge.from.y); + length = Math.sqrt(dx * dx + dy * dy); - /** - * return the number of selected edges - * - * @returns {number} - * @private - */ - exports._getSelectedEdgeCount = function() { - var count = 0; - for (var edgeId in this.selectionObj.edges) { - if (this.selectionObj.edges.hasOwnProperty(edgeId)) { - count += 1; + if (length < minLength) { + allowCluster = true; + break; + } + } + } + } + } + } + + // start the clustering if allowed + if ((!force && allowCluster) || force) { + // we loop over all edges INITIALLY connected to this hub + for (j = 0; j < amountOfInitialEdges; j++) { + edge = this.edges[edgesIdarray[j]]; + // the edge can be clustered by this function in a previous loop + if (edge !== undefined) { + var childNode = this.nodes[(edge.fromId == hubNode.id) ? edge.toId : edge.fromId]; + // we do not want hubs to merge with other hubs nor do we want to cluster itself. + if ((childNode.dynamicEdges.length <= (this.hubThreshold + absorptionSizeOffset)) && + (childNode.id != hubNode.id)) { + this._addToCluster(hubNode,childNode,force); + } + } + } } } - return count; }; + /** - * return the number of selected objects. + * This function adds the child node to the parent node, creating a cluster if it is not already. * - * @returns {number} + * @param {Node} parentNode | this is the node that will house the child node + * @param {Node} childNode | this node will be deleted from the global this.nodes and stored in the parent node + * @param {Boolean} force | true will only update the remainingEdges at the very end of the clustering, ensuring single level collapse * @private */ - exports._getSelectedObjectCount = function() { - var count = 0; - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - count += 1; + exports._addToCluster = function(parentNode, childNode, force) { + // join child node in the parent node + parentNode.containedNodes[childNode.id] = childNode; + + // manage all the edges connected to the child and parent nodes + for (var i = 0; i < childNode.dynamicEdges.length; i++) { + var edge = childNode.dynamicEdges[i]; + if (edge.toId == parentNode.id || edge.fromId == parentNode.id) { // edge connected to parentNode + this._addToContainedEdges(parentNode,childNode,edge); } - } - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - count += 1; + else { + this._connectEdgeToCluster(parentNode,childNode,edge); } } - return count; - }; + // a contained node has no dynamic edges. + childNode.dynamicEdges = []; + + // remove circular edges from clusters + this._containCircularEdgesFromNode(parentNode,childNode); + + + // remove the childNode from the global nodes object + delete this.nodes[childNode.id]; + + // update the properties of the child and parent + var massBefore = parentNode.mass; + childNode.clusterSession = this.clusterSession; + parentNode.mass += childNode.mass; + parentNode.clusterSize += childNode.clusterSize; + parentNode.fontSize = Math.min(this.constants.clustering.maxFontSize, this.constants.nodes.fontSize + this.constants.clustering.fontSizeMultiplier*parentNode.clusterSize); + + // keep track of the clustersessions so we can open the cluster up as it has been formed. + if (parentNode.clusterSessions[parentNode.clusterSessions.length - 1] != this.clusterSession) { + parentNode.clusterSessions.push(this.clusterSession); + } - /** - * Check if anything is selected - * - * @returns {boolean} - * @private - */ - exports._selectionIsEmpty = function() { - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - return false; - } + // forced clusters only open from screen size and double tap + if (force == true) { + // parentNode.formationScale = Math.pow(1 - (1.0/11.0),this.clusterSession+3); + parentNode.formationScale = 0; } - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - return false; - } + else { + parentNode.formationScale = this.scale; // The latest child has been added on this scale } - return true; + + // recalculate the size of the node on the next time the node is rendered + parentNode.clearSizeCache(); + + // set the pop-out scale for the childnode + parentNode.containedNodes[childNode.id].formationScale = parentNode.formationScale; + + // nullify the movement velocity of the child, this is to avoid hectic behaviour + childNode.clearVelocity(); + + // the mass has altered, preservation of energy dictates the velocity to be updated + parentNode.updateVelocity(massBefore); + + // restart the simulation to reorganise all nodes + this.moving = true; }; /** - * check if one of the selected nodes is a cluster. - * - * @returns {boolean} + * This function will apply the changes made to the remainingEdges during the formation of the clusters. + * This is a seperate function to allow for level-wise collapsing of the node barnesHutTree. + * It has to be called if a level is collapsed. It is called by _formClusters(). * @private */ - exports._clusterInSelection = function() { - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - if (this.selectionObj.nodes[nodeId].clusterSize > 1) { - return true; + exports._updateDynamicEdges = function() { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + node.dynamicEdgesLength = node.dynamicEdges.length; + + // this corrects for multiple edges pointing at the same other node + var correction = 0; + if (node.dynamicEdgesLength > 1) { + for (var j = 0; j < node.dynamicEdgesLength - 1; j++) { + var edgeToId = node.dynamicEdges[j].toId; + var edgeFromId = node.dynamicEdges[j].fromId; + for (var k = j+1; k < node.dynamicEdgesLength; k++) { + if ((node.dynamicEdges[k].toId == edgeToId && node.dynamicEdges[k].fromId == edgeFromId) || + (node.dynamicEdges[k].fromId == edgeToId && node.dynamicEdges[k].toId == edgeFromId)) { + correction += 1; + } + } } } + node.dynamicEdgesLength -= correction; } - return false; }; - /** - * select the edges connected to the node that is being selected - * - * @param {Node} node - * @private - */ - exports._selectConnectedEdges = function(node) { - for (var i = 0; i < node.dynamicEdges.length; i++) { - var edge = node.dynamicEdges[i]; - edge.select(); - this._addToSelection(edge); - } - }; /** - * select the edges connected to the node that is being selected + * This adds an edge from the childNode to the contained edges of the parent node * - * @param {Node} node + * @param parentNode | Node object + * @param childNode | Node object + * @param edge | Edge object * @private */ - exports._hoverConnectedEdges = function(node) { - for (var i = 0; i < node.dynamicEdges.length; i++) { - var edge = node.dynamicEdges[i]; - edge.hover = true; - this._addToHover(edge); + exports._addToContainedEdges = function(parentNode, childNode, edge) { + // create an array object if it does not yet exist for this childNode + if (!(parentNode.containedEdges.hasOwnProperty(childNode.id))) { + parentNode.containedEdges[childNode.id] = [] } - }; + // add this edge to the list + parentNode.containedEdges[childNode.id].push(edge); + // remove the edge from the global edges object + delete this.edges[edge.id]; - /** - * unselect the edges connected to the node that is being selected - * - * @param {Node} node - * @private - */ - exports._unselectConnectedEdges = function(node) { - for (var i = 0; i < node.dynamicEdges.length; i++) { - var edge = node.dynamicEdges[i]; - edge.unselect(); - this._removeFromSelection(edge); + // remove the edge from the parent object + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + if (parentNode.dynamicEdges[i].id == edge.id) { + parentNode.dynamicEdges.splice(i,1); + break; + } } }; - - - /** - * This is called when someone clicks on a node. either select or deselect it. - * If there is an existing selection and we don't want to append to it, clear the existing selection + * This function connects an edge that was connected to a child node to the parent node. + * It keeps track of which nodes it has been connected to with the originalId array. * - * @param {Node || Edge} object - * @param {Boolean} append - * @param {Boolean} [doNotTrigger] | ignore trigger + * @param {Node} parentNode | Node object + * @param {Node} childNode | Node object + * @param {Edge} edge | Edge object * @private */ - exports._selectObject = function(object, append, doNotTrigger, highlightEdges) { - if (doNotTrigger === undefined) { - doNotTrigger = false; - } - if (highlightEdges === undefined) { - highlightEdges = true; - } - - if (this._selectionIsEmpty() == false && append == false && this.forceAppendSelection == false) { - this._unselectAll(true); + exports._connectEdgeToCluster = function(parentNode, childNode, edge) { + // handle circular edges + if (edge.toId == edge.fromId) { + this._addToContainedEdges(parentNode, childNode, edge); } + else { + if (edge.toId == childNode.id) { // edge connected to other node on the "to" side + edge.originalToId.push(childNode.id); + edge.to = parentNode; + edge.toId = parentNode.id; + } + else { // edge connected to other node with the "from" side - if (object.selected == false) { - object.select(); - this._addToSelection(object); - if (object instanceof Node && this.blockConnectingEdgeSelection == false && highlightEdges == true) { - this._selectConnectedEdges(object); + edge.originalFromId.push(childNode.id); + edge.from = parentNode; + edge.fromId = parentNode.id; } - } - else { - object.unselect(); - this._removeFromSelection(object); - } - if (doNotTrigger == false) { - this.emit('select', this.getSelection()); + this._addToReroutedEdges(parentNode,childNode,edge); } }; /** - * This is called when someone clicks on a node. either select or deselect it. - * If there is an existing selection and we don't want to append to it, clear the existing selection + * If a node is connected to itself, a circular edge is drawn. When clustering we want to contain + * these edges inside of the cluster. * - * @param {Node || Edge} object + * @param parentNode + * @param childNode * @private */ - exports._blurObject = function(object) { - if (object.hover == true) { - object.hover = false; - this.emit("blurNode",{node:object.id}); + exports._containCircularEdgesFromNode = function(parentNode, childNode) { + // manage all the edges connected to the child and parent nodes + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + var edge = parentNode.dynamicEdges[i]; + // handle circular edges + if (edge.toId == edge.fromId) { + this._addToContainedEdges(parentNode, childNode, edge); + } } }; + /** - * This is called when someone clicks on a node. either select or deselect it. - * If there is an existing selection and we don't want to append to it, clear the existing selection + * This adds an edge from the childNode to the rerouted edges of the parent node * - * @param {Node || Edge} object + * @param parentNode | Node object + * @param childNode | Node object + * @param edge | Edge object * @private */ - exports._hoverObject = function(object) { - if (object.hover == false) { - object.hover = true; - this._addToHover(object); - if (object instanceof Node) { - this.emit("hoverNode",{node:object.id}); - } - } - if (object instanceof Node) { - this._hoverConnectedEdges(object); + exports._addToReroutedEdges = function(parentNode, childNode, edge) { + // create an array object if it does not yet exist for this childNode + // we store the edge in the rerouted edges so we can restore it when the cluster pops open + if (!(parentNode.reroutedEdges.hasOwnProperty(childNode.id))) { + parentNode.reroutedEdges[childNode.id] = []; } - }; + parentNode.reroutedEdges[childNode.id].push(edge); + + // this edge becomes part of the dynamicEdges of the cluster node + parentNode.dynamicEdges.push(edge); + }; + /** - * handles the selection part of the touch, only for navigation controls elements; - * Touch is triggered before tap, also before hold. Hold triggers after a while. - * This is the most responsive solution + * This function connects an edge that was connected to a cluster node back to the child node. * - * @param {Object} pointer + * @param parentNode | Node object + * @param childNode | Node object * @private */ - exports._handleTouch = function(pointer) { + exports._connectEdgeBackToChild = function(parentNode, childNode) { + if (parentNode.reroutedEdges.hasOwnProperty(childNode.id)) { + for (var i = 0; i < parentNode.reroutedEdges[childNode.id].length; i++) { + var edge = parentNode.reroutedEdges[childNode.id][i]; + if (edge.originalFromId[edge.originalFromId.length-1] == childNode.id) { + edge.originalFromId.pop(); + edge.fromId = childNode.id; + edge.from = childNode; + } + else { + edge.originalToId.pop(); + edge.toId = childNode.id; + edge.to = childNode; + } + + // append this edge to the list of edges connecting to the childnode + childNode.dynamicEdges.push(edge); + + // remove the edge from the parent object + for (var j = 0; j < parentNode.dynamicEdges.length; j++) { + if (parentNode.dynamicEdges[j].id == edge.id) { + parentNode.dynamicEdges.splice(j,1); + break; + } + } + } + // remove the entry from the rerouted edges + delete parentNode.reroutedEdges[childNode.id]; + } }; /** - * handles the selection part of the tap; + * When loops are clustered, an edge can be both in the rerouted array and the contained array. + * This function is called last to verify that all edges in dynamicEdges are in fact connected to the + * parentNode * - * @param {Object} pointer + * @param parentNode | Node object * @private */ - exports._handleTap = function(pointer) { - var node = this._getNodeAt(pointer); - if (node != null) { - this._selectObject(node,false); - } - else { - var edge = this._getEdgeAt(pointer); - if (edge != null) { - this._selectObject(edge,false); - } - else { - this._unselectAll(); + exports._validateEdges = function(parentNode) { + for (var i = 0; i < parentNode.dynamicEdges.length; i++) { + var edge = parentNode.dynamicEdges[i]; + if (parentNode.id != edge.toId && parentNode.id != edge.fromId) { + parentNode.dynamicEdges.splice(i,1); } } - this.emit("click", this.getSelection()); - this._redraw(); }; /** - * handles the selection part of the double tap and opens a cluster if needed + * This function released the contained edges back into the global domain and puts them back into the + * dynamic edges of both parent and child. * - * @param {Object} pointer + * @param {Node} parentNode | + * @param {Node} childNode | * @private */ - exports._handleDoubleTap = function(pointer) { - var node = this._getNodeAt(pointer); - if (node != null && node !== undefined) { - // we reset the areaCenter here so the opening of the node will occur - this.areaCenter = {"x" : this._XconvertDOMtoCanvas(pointer.x), - "y" : this._YconvertDOMtoCanvas(pointer.y)}; - this.openCluster(node); + exports._releaseContainedEdges = function(parentNode, childNode) { + for (var i = 0; i < parentNode.containedEdges[childNode.id].length; i++) { + var edge = parentNode.containedEdges[childNode.id][i]; + + // put the edge back in the global edges object + this.edges[edge.id] = edge; + + // put the edge back in the dynamic edges of the child and parent + childNode.dynamicEdges.push(edge); + parentNode.dynamicEdges.push(edge); } - this.emit("doubleClick", this.getSelection()); + // remove the entry from the contained edges + delete parentNode.containedEdges[childNode.id]; + }; + + + // ------------------- UTILITY FUNCTIONS ---------------------------- // + + /** - * Handle the onHold selection part - * - * @param pointer - * @private + * This updates the node labels for all nodes (for debugging purposes) */ - exports._handleOnHold = function(pointer) { - var node = this._getNodeAt(pointer); - if (node != null) { - this._selectObject(node,true); + exports.updateLabels = function() { + var nodeId; + // update node labels + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.clusterSize > 1) { + node.label = "[".concat(String(node.clusterSize),"]"); + } + } } - else { - var edge = this._getEdgeAt(pointer); - if (edge != null) { - this._selectObject(edge,true); + + // update node labels + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.clusterSize == 1) { + if (node.originalLabel !== undefined) { + node.label = node.originalLabel; + } + else { + node.label = String(node.id); + } + } } } - this._redraw(); + + // /* Debug Override */ + // for (nodeId in this.nodes) { + // if (this.nodes.hasOwnProperty(nodeId)) { + // node = this.nodes[nodeId]; + // node.label = String(node.level); + // } + // } + }; /** - * handle the onRelease event. These functions are here for the navigation controls module. - * - * @private + * We want to keep the cluster level distribution rather small. This means we do not want unclustered nodes + * if the rest of the nodes are already a few cluster levels in. + * To fix this we use this function. It determines the min and max cluster level and sends nodes that have not + * clustered enough to the clusterToSmallestNeighbours function. */ - exports._handleOnRelease = function(pointer) { + exports.normalizeClusterLevels = function() { + var maxLevel = 0; + var minLevel = 1e9; + var clusterLevel = 0; + var nodeId; + + // we loop over all nodes in the list + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + clusterLevel = this.nodes[nodeId].clusterSessions.length; + if (maxLevel < clusterLevel) {maxLevel = clusterLevel;} + if (minLevel > clusterLevel) {minLevel = clusterLevel;} + } + } + if (maxLevel - minLevel > this.constants.clustering.clusterLevelDifference) { + var amountOfNodes = this.nodeIndices.length; + var targetLevel = maxLevel - this.constants.clustering.clusterLevelDifference; + // we loop over all nodes in the list + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].clusterSessions.length < targetLevel) { + this._clusterToSmallestNeighbour(this.nodes[nodeId]); + } + } + } + this._updateNodeIndexList(); + this._updateDynamicEdges(); + // if a cluster was formed, we increase the clusterSession + if (this.nodeIndices.length != amountOfNodes) { + this.clusterSession += 1; + } + } }; /** + * This function determines if the cluster we want to decluster is in the active area + * this means around the zoom center * - * retrieve the currently selected objects - * @return {{nodes: Array., edges: Array.}} selection + * @param {Node} node + * @returns {boolean} + * @private */ - exports.getSelection = function() { - var nodeIds = this.getSelectedNodes(); - var edgeIds = this.getSelectedEdges(); - return {nodes:nodeIds, edges:edgeIds}; + exports._nodeInActiveArea = function(node) { + return ( + Math.abs(node.x - this.areaCenter.x) <= this.constants.clustering.activeAreaBoxSize/this.scale + && + Math.abs(node.y - this.areaCenter.y) <= this.constants.clustering.activeAreaBoxSize/this.scale + ) }; - /** - * - * retrieve the currently selected nodes - * @return {String[]} selection An array with the ids of the - * selected nodes. - */ - exports.getSelectedNodes = function() { - var idArray = []; - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - idArray.push(nodeId); - } - } - return idArray - }; /** + * This is an adaptation of the original repositioning function. This is called if the system is clustered initially + * It puts large clusters away from the center and randomizes the order. * - * retrieve the currently selected edges - * @return {Array} selection An array with the ids of the - * selected nodes. */ - exports.getSelectedEdges = function() { - var idArray = []; - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - idArray.push(edgeId); + exports.repositionNodes = function() { + for (var i = 0; i < this.nodeIndices.length; i++) { + var node = this.nodes[this.nodeIndices[i]]; + if ((node.xFixed == false || node.yFixed == false)) { + var radius = 10 * 0.1*this.nodeIndices.length * Math.min(100,node.mass); + var angle = 2 * Math.PI * Math.random(); + if (node.xFixed == false) {node.x = radius * Math.cos(angle);} + if (node.yFixed == false) {node.y = radius * Math.sin(angle);} + this._repositionBezierNodes(node); } } - return idArray; }; /** - * select zero or more nodes - * @param {Number[] | String[]} selection An array with the ids of the - * selected nodes. + * We determine how many connections denote an important hub. + * We take the mean + 2*std as the important hub size. (Assuming a normal distribution of data, ~2.2%) + * + * @private */ - exports.setSelection = function(selection) { - var i, iMax, id; - - if (!selection || (selection.length == undefined)) - throw 'Selection must be an array with ids'; - - // first unselect any selected node - this._unselectAll(true); + exports._getHubSize = function() { + var average = 0; + var averageSquared = 0; + var hubCounter = 0; + var largestHub = 0; - for (i = 0, iMax = selection.length; i < iMax; i++) { - id = selection[i]; + for (var i = 0; i < this.nodeIndices.length; i++) { - var node = this.nodes[id]; - if (!node) { - throw new RangeError('Node with id "' + id + '" not found'); + var node = this.nodes[this.nodeIndices[i]]; + if (node.dynamicEdgesLength > largestHub) { + largestHub = node.dynamicEdgesLength; } - this._selectObject(node,true,true); + average += node.dynamicEdgesLength; + averageSquared += Math.pow(node.dynamicEdgesLength,2); + hubCounter += 1; } + average = average / hubCounter; + averageSquared = averageSquared / hubCounter; - console.log("setSelection is deprecated. Please use selectNodes instead.") - - this.redraw(); - }; - - - /** - * select zero or more nodes with the option to highlight edges - * @param {Number[] | String[]} selection An array with the ids of the - * selected nodes. - * @param {boolean} [highlightEdges] - */ - exports.selectNodes = function(selection, highlightEdges) { - var i, iMax, id; - - if (!selection || (selection.length == undefined)) - throw 'Selection must be an array with ids'; + var variance = averageSquared - Math.pow(average,2); - // first unselect any selected node - this._unselectAll(true); + var standardDeviation = Math.sqrt(variance); - for (i = 0, iMax = selection.length; i < iMax; i++) { - id = selection[i]; + this.hubThreshold = Math.floor(average + 2*standardDeviation); - var node = this.nodes[id]; - if (!node) { - throw new RangeError('Node with id "' + id + '" not found'); - } - this._selectObject(node,true,true,highlightEdges); + // always have at least one to cluster + if (this.hubThreshold > largestHub) { + this.hubThreshold = largestHub; } - this.redraw(); + + // console.log("average",average,"averageSQ",averageSquared,"var",variance,"std",standardDeviation); + // console.log("hubThreshold:",this.hubThreshold); }; /** - * select zero or more edges - * @param {Number[] | String[]} selection An array with the ids of the - * selected nodes. + * We reduce the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods + * with this amount we can cluster specifically on these chains. + * + * @param {Number} fraction | between 0 and 1, the percentage of chains to reduce + * @private */ - exports.selectEdges = function(selection) { - var i, iMax, id; - - if (!selection || (selection.length == undefined)) - throw 'Selection must be an array with ids'; - - // first unselect any selected node - this._unselectAll(true); - - for (i = 0, iMax = selection.length; i < iMax; i++) { - id = selection[i]; - - var edge = this.edges[id]; - if (!edge) { - throw new RangeError('Edge with id "' + id + '" not found'); + exports._reduceAmountOfChains = function(fraction) { + this.hubThreshold = 2; + var reduceAmount = Math.floor(this.nodeIndices.length * fraction); + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { + if (reduceAmount > 0) { + this._formClusterFromHub(this.nodes[nodeId],true,true,1); + reduceAmount -= 1; + } + } } - this._selectObject(edge,true,true,highlightEdges); } - this.redraw(); }; /** - * Validate the selection: remove ids of nodes which no longer exist + * We get the amount of "extension nodes" or chains. These are not quickly clustered with the outliers and hubs methods + * with this amount we can cluster specifically on these chains. + * * @private */ - exports._updateSelection = function () { - for(var nodeId in this.selectionObj.nodes) { - if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { - if (!this.nodes.hasOwnProperty(nodeId)) { - delete this.selectionObj.nodes[nodeId]; - } - } - } - for(var edgeId in this.selectionObj.edges) { - if(this.selectionObj.edges.hasOwnProperty(edgeId)) { - if (!this.edges.hasOwnProperty(edgeId)) { - delete this.selectionObj.edges[edgeId]; + exports._getChainFraction = function() { + var chains = 0; + var total = 0; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + if (this.nodes[nodeId].dynamicEdgesLength == 2 && this.nodes[nodeId].dynamicEdges.length >= 2) { + chains += 1; } + total += 1; } } + return chains/total; }; /***/ }, -/* 45 */ +/* 44 */ /***/ function(module, exports, __webpack_require__) { var util = __webpack_require__(1); - var Node = __webpack_require__(30); - var Edge = __webpack_require__(27); /** - * clears the toolbar div element of children + * Creation of the SectorMixin var. * - * @private + * This contains all the functions the Network object can use to employ the sector system. + * The sector system is always used by Network, though the benefits only apply to the use of clustering. + * If clustering is not used, there is no overhead except for a duplicate object with references to nodes and edges. */ - exports._clearManipulatorBar = function() { - while (this.manipulationDiv.hasChildNodes()) { - this.manipulationDiv.removeChild(this.manipulationDiv.firstChild); - } - }; /** - * Manipulation UI temporarily overloads certain functions to extend or replace them. To be able to restore - * these functions to their original functionality, we saved them in this.cachedFunctions. - * This function restores these functions to their original function. + * This function is only called by the setData function of the Network object. + * This loads the global references into the active sector. This initializes the sector. * * @private */ - exports._restoreOverloadedFunctions = function() { - for (var functionName in this.cachedFunctions) { - if (this.cachedFunctions.hasOwnProperty(functionName)) { - this[functionName] = this.cachedFunctions[functionName]; - } - } + exports._putDataInSector = function() { + this.sectors["active"][this._sector()].nodes = this.nodes; + this.sectors["active"][this._sector()].edges = this.edges; + this.sectors["active"][this._sector()].nodeIndices = this.nodeIndices; }; + /** - * Enable or disable edit-mode. + * /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied (active) sector. If a type is defined, do the specific type * + * @param {String} sectorId + * @param {String} [sectorType] | "active" or "frozen" * @private */ - exports._toggleEditMode = function() { - this.editMode = !this.editMode; - var toolbar = document.getElementById("network-manipulationDiv"); - var closeDiv = document.getElementById("network-manipulation-closeDiv"); - var editModeDiv = document.getElementById("network-manipulation-editMode"); - if (this.editMode == true) { - toolbar.style.display="block"; - closeDiv.style.display="block"; - editModeDiv.style.display="none"; - closeDiv.onclick = this._toggleEditMode.bind(this); + exports._switchToSector = function(sectorId, sectorType) { + if (sectorType === undefined || sectorType == "active") { + this._switchToActiveSector(sectorId); } else { - toolbar.style.display="none"; - closeDiv.style.display="none"; - editModeDiv.style.display="block"; - closeDiv.onclick = null; + this._switchToFrozenSector(sectorId); } - this._createManipulatorBar() }; + /** - * main function, creates the main toolbar. Removes functions bound to the select event. Binds all the buttons of the toolbar. + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied active sector. * + * @param sectorId * @private */ - exports._createManipulatorBar = function() { - // remove bound functions - if (this.boundFunction) { - this.off('select', this.boundFunction); - } + exports._switchToActiveSector = function(sectorId) { + this.nodeIndices = this.sectors["active"][sectorId]["nodeIndices"]; + this.nodes = this.sectors["active"][sectorId]["nodes"]; + this.edges = this.sectors["active"][sectorId]["edges"]; + }; - if (this.edgeBeingEdited !== undefined) { - this.edgeBeingEdited._disableControlNodes(); - this.edgeBeingEdited = undefined; - this.selectedControlNode = null; - this.controlNodesActive = false; - } - // restore overloaded functions - this._restoreOverloadedFunctions(); + /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied active sector. + * + * @private + */ + exports._switchToSupportSector = function() { + this.nodeIndices = this.sectors["support"]["nodeIndices"]; + this.nodes = this.sectors["support"]["nodes"]; + this.edges = this.sectors["support"]["edges"]; + }; - // resume calculation - this.freezeSimulation = false; - // reset global variables - this.blockConnectingEdgeSelection = false; - this.forceAppendSelection = false; + /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the supplied frozen sector. + * + * @param sectorId + * @private + */ + exports._switchToFrozenSector = function(sectorId) { + this.nodeIndices = this.sectors["frozen"][sectorId]["nodeIndices"]; + this.nodes = this.sectors["frozen"][sectorId]["nodes"]; + this.edges = this.sectors["frozen"][sectorId]["edges"]; + }; - if (this.editMode == true) { - while (this.manipulationDiv.hasChildNodes()) { - this.manipulationDiv.removeChild(this.manipulationDiv.firstChild); - } - // add the icons to the manipulator div - this.manipulationDiv.innerHTML = "" + - "" + - ""+this.constants.labels['add'] +"" + - "
" + - "" + - ""+this.constants.labels['link'] +""; - if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { - this.manipulationDiv.innerHTML += "" + - "
" + - "" + - ""+this.constants.labels['editNode'] +""; - } - else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { - this.manipulationDiv.innerHTML += "" + - "
" + - "" + - ""+this.constants.labels['editEdge'] +""; - } - if (this._selectionIsEmpty() == false) { - this.manipulationDiv.innerHTML += "" + - "
" + - "" + - ""+this.constants.labels['del'] +""; - } + + /** + * This function sets the global references to nodes, edges and nodeIndices back to + * those of the currently active sector. + * + * @private + */ + exports._loadLatestSector = function() { + this._switchToSector(this._sector()); + }; - // bind the icons - var addNodeButton = document.getElementById("network-manipulate-addNode"); - addNodeButton.onclick = this._createAddNodeToolbar.bind(this); - var addEdgeButton = document.getElementById("network-manipulate-connectNode"); - addEdgeButton.onclick = this._createAddEdgeToolbar.bind(this); - if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { - var editButton = document.getElementById("network-manipulate-editNode"); - editButton.onclick = this._editNode.bind(this); - } - else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { - var editButton = document.getElementById("network-manipulate-editEdge"); - editButton.onclick = this._createEditEdgeToolbar.bind(this); - } - if (this._selectionIsEmpty() == false) { - var deleteButton = document.getElementById("network-manipulate-delete"); - deleteButton.onclick = this._deleteSelected.bind(this); - } - var closeDiv = document.getElementById("network-manipulation-closeDiv"); - closeDiv.onclick = this._toggleEditMode.bind(this); + /** + * This function returns the currently active sector Id + * + * @returns {String} + * @private + */ + exports._sector = function() { + return this.activeSector[this.activeSector.length-1]; + }; - this.boundFunction = this._createManipulatorBar.bind(this); - this.on('select', this.boundFunction); + + /** + * This function returns the previously active sector Id + * + * @returns {String} + * @private + */ + exports._previousSector = function() { + if (this.activeSector.length > 1) { + return this.activeSector[this.activeSector.length-2]; } else { - this.editModeDiv.innerHTML = "" + - "" + - "" + this.constants.labels['edit'] + ""; - var editModeButton = document.getElementById("network-manipulate-editModeButton"); - editModeButton.onclick = this._toggleEditMode.bind(this); + throw new TypeError('there are not enough sectors in the this.activeSector array.'); } }; - /** - * Create the toolbar for adding Nodes + * We add the active sector at the end of the this.activeSector array + * This ensures it is the currently active sector returned by _sector() and it reaches the top + * of the activeSector stack. When we reverse our steps we move from the end to the beginning of this stack. * + * @param newId * @private */ - exports._createAddNodeToolbar = function() { - // clear the toolbar - this._clearManipulatorBar(); - if (this.boundFunction) { - this.off('select', this.boundFunction); - } - - // create the toolbar contents - this.manipulationDiv.innerHTML = "" + - "" + - "" + this.constants.labels['back'] + " " + - "
" + - "" + - "" + this.constants.labels['addDescription'] + ""; + exports._setActiveSector = function(newId) { + this.activeSector.push(newId); + }; - // bind the icon - var backButton = document.getElementById("network-manipulate-back"); - backButton.onclick = this._createManipulatorBar.bind(this); - // we use the boundFunction so we can reference it when we unbind it from the "select" event. - this.boundFunction = this._addNode.bind(this); - this.on('select', this.boundFunction); + /** + * We remove the currently active sector id from the active sector stack. This happens when + * we reactivate the previously active sector + * + * @private + */ + exports._forgetLastSector = function() { + this.activeSector.pop(); }; /** - * create the toolbar to connect nodes + * This function creates a new active sector with the supplied newId. This newId + * is the expanding node id. * + * @param {String} newId | Id of the new active sector * @private */ - exports._createAddEdgeToolbar = function() { - // clear the toolbar - this._clearManipulatorBar(); - this._unselectAll(true); - this.freezeSimulation = true; + exports._createNewSector = function(newId) { + // create the new sector + this.sectors["active"][newId] = {"nodes":{}, + "edges":{}, + "nodeIndices":[], + "formationScale": this.scale, + "drawingNode": undefined}; - if (this.boundFunction) { - this.off('select', this.boundFunction); - } + // create the new sector render node. This gives visual feedback that you are in a new sector. + this.sectors["active"][newId]['drawingNode'] = new Node( + {id:newId, + color: { + background: "#eaefef", + border: "495c5e" + } + },{},{},this.constants); + this.sectors["active"][newId]['drawingNode'].clusterSize = 2; + }; - this._unselectAll(); - this.forceAppendSelection = false; - this.blockConnectingEdgeSelection = true; - this.manipulationDiv.innerHTML = "" + - "" + - "" + this.constants.labels['back'] + " " + - "
" + - "" + - "" + this.constants.labels['linkDescription'] + ""; + /** + * This function removes the currently active sector. This is called when we create a new + * active sector. + * + * @param {String} sectorId | Id of the active sector that will be removed + * @private + */ + exports._deleteActiveSector = function(sectorId) { + delete this.sectors["active"][sectorId]; + }; - // bind the icon - var backButton = document.getElementById("network-manipulate-back"); - backButton.onclick = this._createManipulatorBar.bind(this); - // we use the boundFunction so we can reference it when we unbind it from the "select" event. - this.boundFunction = this._handleConnect.bind(this); - this.on('select', this.boundFunction); + /** + * This function removes the currently active sector. This is called when we reactivate + * the previously active sector. + * + * @param {String} sectorId | Id of the active sector that will be removed + * @private + */ + exports._deleteFrozenSector = function(sectorId) { + delete this.sectors["frozen"][sectorId]; + }; - // temporarily overload functions - this.cachedFunctions["_handleTouch"] = this._handleTouch; - this.cachedFunctions["_handleOnRelease"] = this._handleOnRelease; - this._handleTouch = this._handleConnect; - this._handleOnRelease = this._finishConnect; - // redraw to show the unselect - this._redraw(); + /** + * Freezing an active sector means moving it from the "active" object to the "frozen" object. + * We copy the references, then delete the active entree. + * + * @param sectorId + * @private + */ + exports._freezeSector = function(sectorId) { + // we move the set references from the active to the frozen stack. + this.sectors["frozen"][sectorId] = this.sectors["active"][sectorId]; + + // we have moved the sector data into the frozen set, we now remove it from the active set + this._deleteActiveSector(sectorId); }; + /** - * create the toolbar to edit edges + * This is the reverse operation of _freezeSector. Activating means moving the sector from the "frozen" + * object to the "active" object. * + * @param sectorId * @private */ - exports._createEditEdgeToolbar = function() { - // clear the toolbar - this._clearManipulatorBar(); - this.controlNodesActive = true; - - if (this.boundFunction) { - this.off('select', this.boundFunction); - } + exports._activateSector = function(sectorId) { + // we move the set references from the frozen to the active stack. + this.sectors["active"][sectorId] = this.sectors["frozen"][sectorId]; - this.edgeBeingEdited = this._getSelectedEdge(); - this.edgeBeingEdited._enableControlNodes(); + // we have moved the sector data into the active set, we now remove it from the frozen stack + this._deleteFrozenSector(sectorId); + }; - this.manipulationDiv.innerHTML = "" + - "" + - "" + this.constants.labels['back'] + " " + - "
" + - "" + - "" + this.constants.labels['editEdgeDescription'] + ""; - // bind the icon - var backButton = document.getElementById("network-manipulate-back"); - backButton.onclick = this._createManipulatorBar.bind(this); + /** + * This function merges the data from the currently active sector with a frozen sector. This is used + * in the process of reverting back to the previously active sector. + * The data that is placed in the frozen (the previously active) sector is the node that has been removed from it + * upon the creation of a new active sector. + * + * @param sectorId + * @private + */ + exports._mergeThisWithFrozen = function(sectorId) { + // copy all nodes + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.sectors["frozen"][sectorId]["nodes"][nodeId] = this.nodes[nodeId]; + } + } - // temporarily overload functions - this.cachedFunctions["_handleTouch"] = this._handleTouch; - this.cachedFunctions["_handleOnRelease"] = this._handleOnRelease; - this.cachedFunctions["_handleTap"] = this._handleTap; - this.cachedFunctions["_handleDragStart"] = this._handleDragStart; - this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; - this._handleTouch = this._selectControlNode; - this._handleTap = function () {}; - this._handleOnDrag = this._controlNodeDrag; - this._handleDragStart = function () {} - this._handleOnRelease = this._releaseControlNode; + // copy all edges (if not fully clustered, else there are no edges) + for (var edgeId in this.edges) { + if (this.edges.hasOwnProperty(edgeId)) { + this.sectors["frozen"][sectorId]["edges"][edgeId] = this.edges[edgeId]; + } + } - // redraw to show the unselect - this._redraw(); + // merge the nodeIndices + for (var i = 0; i < this.nodeIndices.length; i++) { + this.sectors["frozen"][sectorId]["nodeIndices"].push(this.nodeIndices[i]); + } }; - + /** + * This clusters the sector to one cluster. It was a single cluster before this process started so + * we revert to that state. The clusterToFit function with a maximum size of 1 node does this. + * + * @private + */ + exports._collapseThisToSingleCluster = function() { + this.clusterToFit(1,false); + }; /** - * the function bound to the selection event. It checks if you want to connect a cluster and changes the description - * to walk the user through the process. + * We create a new active sector from the node that we want to open. * + * @param node * @private */ - exports._selectControlNode = function(pointer) { - this.edgeBeingEdited.controlNodes.from.unselect(); - this.edgeBeingEdited.controlNodes.to.unselect(); - this.selectedControlNode = this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(pointer.x),this._YconvertDOMtoCanvas(pointer.y)); - if (this.selectedControlNode !== null) { - this.selectedControlNode.select(); - this.freezeSimulation = true; - } - this._redraw(); - }; + exports._addSector = function(node) { + // this is the currently active sector + var sector = this._sector(); + + // // this should allow me to select nodes from a frozen set. + // if (this.sectors['active'][sector]["nodes"].hasOwnProperty(node.id)) { + // console.log("the node is part of the active sector"); + // } + // else { + // console.log("I dont know what the fuck happened!!"); + // } + + // when we switch to a new sector, we remove the node that will be expanded from the current nodes list. + delete this.nodes[node.id]; + + var unqiueIdentifier = util.randomUUID(); + + // we fully freeze the currently active sector + this._freezeSector(sector); + + // we create a new active sector. This sector has the Id of the node to ensure uniqueness + this._createNewSector(unqiueIdentifier); + + // we add the active sector to the sectors array to be able to revert these steps later on + this._setActiveSector(unqiueIdentifier); + + // we redirect the global references to the new sector's references. this._sector() now returns unqiueIdentifier + this._switchToSector(this._sector()); - /** - * the function bound to the selection event. It checks if you want to connect a cluster and changes the description - * to walk the user through the process. - * - * @private - */ - exports._controlNodeDrag = function(event) { - var pointer = this._getPointer(event.gesture.center); - if (this.selectedControlNode !== null && this.selectedControlNode !== undefined) { - this.selectedControlNode.x = this._XconvertDOMtoCanvas(pointer.x); - this.selectedControlNode.y = this._YconvertDOMtoCanvas(pointer.y); - } - this._redraw(); + // finally we add the node we removed from our previous active sector to the new active sector + this.nodes[node.id] = node; }; - exports._releaseControlNode = function(pointer) { - var newNode = this._getNodeAt(pointer); - if (newNode != null) { - if (this.edgeBeingEdited.controlNodes.from.selected == true) { - this._editEdge(newNode.id, this.edgeBeingEdited.to.id); - this.edgeBeingEdited.controlNodes.from.unselect(); - } - if (this.edgeBeingEdited.controlNodes.to.selected == true) { - this._editEdge(this.edgeBeingEdited.from.id, newNode.id); - this.edgeBeingEdited.controlNodes.to.unselect(); - } - } - else { - this.edgeBeingEdited._restoreControlNodes(); - } - this.freezeSimulation = false; - this._redraw(); - }; /** - * the function bound to the selection event. It checks if you want to connect a cluster and changes the description - * to walk the user through the process. + * We close the sector that is currently open and revert back to the one before. + * If the active sector is the "default" sector, nothing happens. * * @private */ - exports._handleConnect = function(pointer) { - if (this._getSelectedNodeCount() == 0) { - var node = this._getNodeAt(pointer); - if (node != null) { - if (node.clusterSize > 1) { - alert("Cannot create edges to a cluster.") - } - else { - this._selectObject(node,false); - // create a node the temporary line can look at - this.sectors['support']['nodes']['targetNode'] = new Node({id:'targetNode'},{},{},this.constants); - this.sectors['support']['nodes']['targetNode'].x = node.x; - this.sectors['support']['nodes']['targetNode'].y = node.y; - this.sectors['support']['nodes']['targetViaNode'] = new Node({id:'targetViaNode'},{},{},this.constants); - this.sectors['support']['nodes']['targetViaNode'].x = node.x; - this.sectors['support']['nodes']['targetViaNode'].y = node.y; - this.sectors['support']['nodes']['targetViaNode'].parentEdgeId = "connectionEdge"; + exports._collapseSector = function() { + // the currently active sector + var sector = this._sector(); - // create a temporary edge - this.edges['connectionEdge'] = new Edge({id:"connectionEdge",from:node.id,to:this.sectors['support']['nodes']['targetNode'].id}, this, this.constants); - this.edges['connectionEdge'].from = node; - this.edges['connectionEdge'].connected = true; - this.edges['connectionEdge'].smooth = true; - this.edges['connectionEdge'].selected = true; - this.edges['connectionEdge'].to = this.sectors['support']['nodes']['targetNode']; - this.edges['connectionEdge'].via = this.sectors['support']['nodes']['targetViaNode']; + // we cannot collapse the default sector + if (sector != "default") { + if ((this.nodeIndices.length == 1) || + (this.sectors["active"][sector]["drawingNode"].width*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientWidth) || + (this.sectors["active"][sector]["drawingNode"].height*this.scale < this.constants.clustering.screenSizeThreshold * this.frame.canvas.clientHeight)) { + var previousSector = this._previousSector(); - this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; - this._handleOnDrag = function(event) { - var pointer = this._getPointer(event.gesture.center); - this.sectors['support']['nodes']['targetNode'].x = this._XconvertDOMtoCanvas(pointer.x); - this.sectors['support']['nodes']['targetNode'].y = this._YconvertDOMtoCanvas(pointer.y); - this.sectors['support']['nodes']['targetViaNode'].x = 0.5 * (this._XconvertDOMtoCanvas(pointer.x) + this.edges['connectionEdge'].from.x); - this.sectors['support']['nodes']['targetViaNode'].y = this._YconvertDOMtoCanvas(pointer.y); - }; + // we collapse the sector back to a single cluster + this._collapseThisToSingleCluster(); - this.moving = true; - this.start(); - } - } - } - }; + // we move the remaining nodes, edges and nodeIndices to the previous sector. + // This previous sector is the one we will reactivate + this._mergeThisWithFrozen(previousSector); - exports._finishConnect = function(pointer) { - if (this._getSelectedNodeCount() == 1) { + // the previously active (frozen) sector now has all the data from the currently active sector. + // we can now delete the active sector. + this._deleteActiveSector(sector); - // restore the drag function - this._handleOnDrag = this.cachedFunctions["_handleOnDrag"]; - delete this.cachedFunctions["_handleOnDrag"]; + // we activate the previously active (and currently frozen) sector. + this._activateSector(previousSector); - // remember the edge id - var connectFromId = this.edges['connectionEdge'].fromId; + // we load the references from the newly active sector into the global references + this._switchToSector(previousSector); - // remove the temporary nodes and edge - delete this.edges['connectionEdge']; - delete this.sectors['support']['nodes']['targetNode']; - delete this.sectors['support']['nodes']['targetViaNode']; + // we forget the previously active sector because we reverted to the one before + this._forgetLastSector(); - var node = this._getNodeAt(pointer); - if (node != null) { - if (node.clusterSize > 1) { - alert("Cannot create edges to a cluster.") - } - else { - this._createEdge(connectFromId,node.id); - this._createManipulatorBar(); - } + // finally, we update the node index list. + this._updateNodeIndexList(); + + // we refresh the list with calulation nodes and calculation node indices. + this._updateCalculationNodes(); } - this._unselectAll(); } }; /** - * Adds a node on the specified location + * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). + * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we dont pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction + * @private */ - exports._addNode = function() { - if (this._selectionIsEmpty() && this.editMode == true) { - var positionObject = this._pointerToPositionObject(this.pointerPosition); - var defaultData = {id:util.randomUUID(),x:positionObject.left,y:positionObject.top,label:"new",allowedToMoveX:true,allowedToMoveY:true}; - if (this.triggerFunctions.add) { - if (this.triggerFunctions.add.length == 2) { - var me = this; - this.triggerFunctions.add(defaultData, function(finalizedData) { - me.nodesData.add(finalizedData); - me._createManipulatorBar(); - me.moving = true; - me.start(); - }); - } - else { - alert(this.constants.labels['addError']); - this._createManipulatorBar(); - this.moving = true; - this.start(); + exports._doInAllActiveSectors = function(runFunction,argument) { + if (argument === undefined) { + for (var sector in this.sectors["active"]) { + if (this.sectors["active"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToActiveSector(sector); + this[runFunction](); } } - else { - this.nodesData.add(defaultData); - this._createManipulatorBar(); - this.moving = true; - this.start(); + } + else { + for (var sector in this.sectors["active"]) { + if (this.sectors["active"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToActiveSector(sector); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + this[runFunction](args[0],args[1]); + } + else { + this[runFunction](argument); + } + } } } + // we revert the global references back to our active sector + this._loadLatestSector(); }; /** - * connect two nodes with a new edge. + * This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we dont pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._createEdge = function(sourceNodeId,targetNodeId) { - if (this.editMode == true) { - var defaultData = {from:sourceNodeId, to:targetNodeId}; - if (this.triggerFunctions.connect) { - if (this.triggerFunctions.connect.length == 2) { - var me = this; - this.triggerFunctions.connect(defaultData, function(finalizedData) { - me.edgesData.add(finalizedData); - me.moving = true; - me.start(); - }); - } - else { - alert(this.constants.labels["linkError"]); - this.moving = true; - this.start(); - } + exports._doInSupportSector = function(runFunction,argument) { + if (argument === undefined) { + this._switchToSupportSector(); + this[runFunction](); + } + else { + this._switchToSupportSector(); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + this[runFunction](args[0],args[1]); } else { - this.edgesData.add(defaultData); - this.moving = true; - this.start(); + this[runFunction](argument); } } + // we revert the global references back to our active sector + this._loadLatestSector(); }; + /** - * connect two nodes with a new edge. + * This runs a function in all frozen sectors. This is used in the _redraw(). * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we don't pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._editEdge = function(sourceNodeId,targetNodeId) { - if (this.editMode == true) { - var defaultData = {id: this.edgeBeingEdited.id, from:sourceNodeId, to:targetNodeId}; - if (this.triggerFunctions.editEdge) { - if (this.triggerFunctions.editEdge.length == 2) { - var me = this; - this.triggerFunctions.editEdge(defaultData, function(finalizedData) { - me.edgesData.update(finalizedData); - me.moving = true; - me.start(); - }); + exports._doInAllFrozenSectors = function(runFunction,argument) { + if (argument === undefined) { + for (var sector in this.sectors["frozen"]) { + if (this.sectors["frozen"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToFrozenSector(sector); + this[runFunction](); } - else { - alert(this.constants.labels["linkError"]); - this.moving = true; - this.start(); + } + } + else { + for (var sector in this.sectors["frozen"]) { + if (this.sectors["frozen"].hasOwnProperty(sector)) { + // switch the global references to those of this sector + this._switchToFrozenSector(sector); + var args = Array.prototype.splice.call(arguments, 1); + if (args.length > 1) { + this[runFunction](args[0],args[1]); + } + else { + this[runFunction](argument); + } } } - else { - this.edgesData.update(defaultData); - this.moving = true; - this.start(); - } } + this._loadLatestSector(); }; + /** - * Create the toolbar to edit the selected node. The label and the color can be changed. Other colors are derived from the chosen color. + * This runs a function in all sectors. This is used in the _redraw(). * + * @param {String} runFunction | This is the NAME of a function we want to call in all active sectors + * | we don't pass the function itself because then the "this" is the window object + * | instead of the Network object + * @param {*} [argument] | Optional: arguments to pass to the runFunction * @private */ - exports._editNode = function() { - if (this.triggerFunctions.edit && this.editMode == true) { - var node = this._getSelectedNode(); - var data = {id:node.id, - label: node.label, - group: node.group, - shape: node.shape, - color: { - background:node.color.background, - border:node.color.border, - highlight: { - background:node.color.highlight.background, - border:node.color.highlight.border - } - }}; - if (this.triggerFunctions.edit.length == 2) { - var me = this; - this.triggerFunctions.edit(data, function (finalizedData) { - me.nodesData.update(finalizedData); - me._createManipulatorBar(); - me.moving = true; - me.start(); - }); + exports._doInAllSectors = function(runFunction,argument) { + var args = Array.prototype.splice.call(arguments, 1); + if (argument === undefined) { + this._doInAllActiveSectors(runFunction); + this._doInAllFrozenSectors(runFunction); + } + else { + if (args.length > 1) { + this._doInAllActiveSectors(runFunction,args[0],args[1]); + this._doInAllFrozenSectors(runFunction,args[0],args[1]); } else { - alert(this.constants.labels["editError"]); + this._doInAllActiveSectors(runFunction,argument); + this._doInAllFrozenSectors(runFunction,argument); } } - else { - alert(this.constants.labels["editBoundError"]); - } }; + /** + * This clears the nodeIndices list. We cannot use this.nodeIndices = [] because we would break the link with the + * active sector. Thus we clear the nodeIndices in the active sector, then reconnect the this.nodeIndices to it. + * + * @private + */ + exports._clearNodeIndexList = function() { + var sector = this._sector(); + this.sectors["active"][sector]["nodeIndices"] = []; + this.nodeIndices = this.sectors["active"][sector]["nodeIndices"]; + }; /** - * delete everything in the selection + * Draw the encompassing sector node * + * @param ctx + * @param sectorType * @private */ - exports._deleteSelected = function() { - if (!this._selectionIsEmpty() && this.editMode == true) { - if (!this._clusterInSelection()) { - var selectedNodes = this.getSelectedNodes(); - var selectedEdges = this.getSelectedEdges(); - if (this.triggerFunctions.del) { - var me = this; - var data = {nodes: selectedNodes, edges: selectedEdges}; - if (this.triggerFunctions.del.length = 2) { - this.triggerFunctions.del(data, function (finalizedData) { - me.edgesData.remove(finalizedData.edges); - me.nodesData.remove(finalizedData.nodes); - me._unselectAll(); - me.moving = true; - me.start(); - }); - } - else { - alert(this.constants.labels["deleteError"]) + exports._drawSectorNodes = function(ctx,sectorType) { + var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; + for (var sector in this.sectors[sectorType]) { + if (this.sectors[sectorType].hasOwnProperty(sector)) { + if (this.sectors[sectorType][sector]["drawingNode"] !== undefined) { + + this._switchToSector(sector,sectorType); + + minY = 1e9; maxY = -1e9; minX = 1e9; maxX = -1e9; + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + node.resize(ctx); + if (minX > node.x - 0.5 * node.width) {minX = node.x - 0.5 * node.width;} + if (maxX < node.x + 0.5 * node.width) {maxX = node.x + 0.5 * node.width;} + if (minY > node.y - 0.5 * node.height) {minY = node.y - 0.5 * node.height;} + if (maxY < node.y + 0.5 * node.height) {maxY = node.y + 0.5 * node.height;} + } } + node = this.sectors[sectorType][sector]["drawingNode"]; + node.x = 0.5 * (maxX + minX); + node.y = 0.5 * (maxY + minY); + node.width = 2 * (node.x - minX); + node.height = 2 * (node.y - minY); + node.radius = Math.sqrt(Math.pow(0.5*node.width,2) + Math.pow(0.5*node.height,2)); + node.setScale(this.scale); + node._drawCircle(ctx); } - else { - this.edgesData.remove(selectedEdges); - this.nodesData.remove(selectedNodes); - this._unselectAll(); - this.moving = true; - this.start(); - } - } - else { - alert(this.constants.labels["deleteClusterError"]); } } }; + exports._drawAllSectorNodes = function(ctx) { + this._drawSectorNodes(ctx,"frozen"); + this._drawSectorNodes(ctx,"active"); + this._loadLatestSector(); + }; + /***/ }, -/* 46 */ +/* 45 */ /***/ function(module, exports, __webpack_require__) { - exports._cleanNavigation = function() { - // clean up previous navigation items - var wrapper = document.getElementById('network-navigation_wrapper'); - if (wrapper != null) { - this.containerElement.removeChild(wrapper); - } - document.onmouseup = null; - }; + var Node = __webpack_require__(30); /** - * Creation of the navigation controls nodes. They are drawn over the rest of the nodes and are not affected by scale and translation - * they have a triggerFunction which is called on click. If the position of the navigation controls is dependent - * on this.frame.canvas.clientWidth or this.frame.canvas.clientHeight, we flag horizontalAlignLeft and verticalAlignTop false. - * This means that the location will be corrected by the _relocateNavigation function on a size change of the canvas. + * This function can be called from the _doInAllSectors function * + * @param object + * @param overlappingNodes * @private */ - exports._loadNavigationElements = function() { - this._cleanNavigation(); - - this.navigationDivs = {}; - var navigationDivs = ['up','down','left','right','zoomIn','zoomOut','zoomExtends']; - var navigationDivActions = ['_moveUp','_moveDown','_moveLeft','_moveRight','_zoomIn','_zoomOut','zoomExtent']; - - this.navigationDivs['wrapper'] = document.createElement('div'); - this.navigationDivs['wrapper'].id = "network-navigation_wrapper"; - this.navigationDivs['wrapper'].style.position = "absolute"; - this.navigationDivs['wrapper'].style.width = this.frame.canvas.clientWidth + "px"; - this.navigationDivs['wrapper'].style.height = this.frame.canvas.clientHeight + "px"; - this.containerElement.insertBefore(this.navigationDivs['wrapper'],this.frame); - - for (var i = 0; i < navigationDivs.length; i++) { - this.navigationDivs[navigationDivs[i]] = document.createElement('div'); - this.navigationDivs[navigationDivs[i]].id = "network-navigation_" + navigationDivs[i]; - this.navigationDivs[navigationDivs[i]].className = "network-navigation " + navigationDivs[i]; - this.navigationDivs['wrapper'].appendChild(this.navigationDivs[navigationDivs[i]]); - this.navigationDivs[navigationDivs[i]].onmousedown = this[navigationDivActions[i]].bind(this); + exports._getNodesOverlappingWith = function(object, overlappingNodes) { + var nodes = this.nodes; + for (var nodeId in nodes) { + if (nodes.hasOwnProperty(nodeId)) { + if (nodes[nodeId].isOverlappingWith(object)) { + overlappingNodes.push(nodeId); + } + } } - - document.onmouseup = this._stopMovement.bind(this); }; /** - * this stops all movement induced by the navigation buttons - * + * retrieve all nodes overlapping with given object + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes * @private */ - exports._stopMovement = function() { - this._xStopMoving(); - this._yStopMoving(); - this._stopZoom(); + exports._getAllNodesOverlappingWith = function (object) { + var overlappingNodes = []; + this._doInAllActiveSectors("_getNodesOverlappingWith",object,overlappingNodes); + return overlappingNodes; }; /** - * stops the actions performed by page up and down etc. + * Return a position object in canvasspace from a single point in screenspace * - * @param event + * @param pointer + * @returns {{left: number, top: number, right: number, bottom: number}} * @private */ - exports._preventDefault = function(event) { - if (event !== undefined) { - if (event.preventDefault) { - event.preventDefault(); - } else { - event.returnValue = false; - } - } + exports._pointerToPositionObject = function(pointer) { + var x = this._XconvertDOMtoCanvas(pointer.x); + var y = this._YconvertDOMtoCanvas(pointer.y); + + return { + left: x, + top: y, + right: x, + bottom: y + }; }; /** - * move the screen up - * By using the increments, instead of adding a fixed number to the translation, we keep fluent and - * instant movement. The onKeypress event triggers immediately, then pauses, then triggers frequently - * To avoid this behaviour, we do the translation in the start loop. + * Get the top node at the a specific point (like a click) * + * @param {{x: Number, y: Number}} pointer + * @return {Node | null} node * @private */ - exports._moveUp = function(event) { - this.yIncrement = this.constants.keyboard.speed.y; - this.start(); // if there is no node movement, the calculation wont be done - this._preventDefault(event); - if (this.navigationDivs) { - this.navigationDivs['up'].className += " active"; - } - }; - + exports._getNodeAt = function (pointer) { + // we first check if this is an navigation controls element + var positionObject = this._pointerToPositionObject(pointer); + var overlappingNodes = this._getAllNodesOverlappingWith(positionObject); - /** - * move the screen down - * @private - */ - exports._moveDown = function(event) { - this.yIncrement = -this.constants.keyboard.speed.y; - this.start(); // if there is no node movement, the calculation wont be done - this._preventDefault(event); - if (this.navigationDivs) { - this.navigationDivs['down'].className += " active"; + // if there are overlapping nodes, select the last one, this is the + // one which is drawn on top of the others + if (overlappingNodes.length > 0) { + return this.nodes[overlappingNodes[overlappingNodes.length - 1]]; + } + else { + return null; } }; /** - * move the screen left + * retrieve all edges overlapping with given object, selector is around center + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes * @private */ - exports._moveLeft = function(event) { - this.xIncrement = this.constants.keyboard.speed.x; - this.start(); // if there is no node movement, the calculation wont be done - this._preventDefault(event); - if (this.navigationDivs) { - this.navigationDivs['left'].className += " active"; + exports._getEdgesOverlappingWith = function (object, overlappingEdges) { + var edges = this.edges; + for (var edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + if (edges[edgeId].isOverlappingWith(object)) { + overlappingEdges.push(edgeId); + } + } } }; /** - * move the screen right + * retrieve all nodes overlapping with given object + * @param {Object} object An object with parameters left, top, right, bottom + * @return {Number[]} An array with id's of the overlapping nodes * @private */ - exports._moveRight = function(event) { - this.xIncrement = -this.constants.keyboard.speed.y; - this.start(); // if there is no node movement, the calculation wont be done - this._preventDefault(event); - if (this.navigationDivs) { - this.navigationDivs['right'].className += " active"; - } + exports._getAllEdgesOverlappingWith = function (object) { + var overlappingEdges = []; + this._doInAllActiveSectors("_getEdgesOverlappingWith",object,overlappingEdges); + return overlappingEdges; }; - /** - * Zoom in, using the same method as the movement. + * Place holder. To implement change the _getNodeAt to a _getObjectAt. Have the _getObjectAt call + * _getNodeAt and _getEdgesAt, then priortize the selection to user preferences. + * + * @param pointer + * @returns {null} * @private */ - exports._zoomIn = function(event) { - this.zoomIncrement = this.constants.keyboard.speed.zoom; - this.start(); // if there is no node movement, the calculation wont be done - this._preventDefault(event); - if (this.navigationDivs) { - this.navigationDivs['zoomIn'].className += " active"; + exports._getEdgeAt = function(pointer) { + var positionObject = this._pointerToPositionObject(pointer); + var overlappingEdges = this._getAllEdgesOverlappingWith(positionObject); + + if (overlappingEdges.length > 0) { + return this.edges[overlappingEdges[overlappingEdges.length - 1]]; + } + else { + return null; } }; /** - * Zoom out + * Add object to the selection array. + * + * @param obj * @private */ - exports._zoomOut = function() { - this.zoomIncrement = -this.constants.keyboard.speed.zoom; - this.start(); // if there is no node movement, the calculation wont be done - this._preventDefault(event); - if (this.navigationDivs) { - this.navigationDivs['zoomOut'].className += " active"; + exports._addToSelection = function(obj) { + if (obj instanceof Node) { + this.selectionObj.nodes[obj.id] = obj; + } + else { + this.selectionObj.edges[obj.id] = obj; } }; - /** - * Stop zooming and unhighlight the zoom controls + * Add object to the selection array. + * + * @param obj * @private */ - exports._stopZoom = function() { - this.zoomIncrement = 0; - if (this.navigationDivs) { - this.navigationDivs['zoomIn'].className = this.navigationDivs['zoomIn'].className.replace(" active",""); - this.navigationDivs['zoomOut'].className = this.navigationDivs['zoomOut'].className.replace(" active",""); + exports._addToHover = function(obj) { + if (obj instanceof Node) { + this.hoverObj.nodes[obj.id] = obj; + } + else { + this.hoverObj.edges[obj.id] = obj; } }; /** - * Stop moving in the Y direction and unHighlight the up and down + * Remove a single option from selection. + * + * @param {Object} obj * @private */ - exports._yStopMoving = function() { - this.yIncrement = 0; - if (this.navigationDivs) { - this.navigationDivs['up'].className = this.navigationDivs['up'].className.replace(" active",""); - this.navigationDivs['down'].className = this.navigationDivs['down'].className.replace(" active",""); + exports._removeFromSelection = function(obj) { + if (obj instanceof Node) { + delete this.selectionObj.nodes[obj.id]; + } + else { + delete this.selectionObj.edges[obj.id]; } }; - /** - * Stop moving in the X direction and unHighlight left and right. + * Unselect all. The selectionObj is useful for this. + * + * @param {Boolean} [doNotTrigger] | ignore trigger * @private */ - exports._xStopMoving = function() { - this.xIncrement = 0; - if (this.navigationDivs) { - this.navigationDivs['left'].className = this.navigationDivs['left'].className.replace(" active",""); - this.navigationDivs['right'].className = this.navigationDivs['right'].className.replace(" active",""); + exports._unselectAll = function(doNotTrigger) { + if (doNotTrigger === undefined) { + doNotTrigger = false; + } + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + this.selectionObj.nodes[nodeId].unselect(); + } + } + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + this.selectionObj.edges[edgeId].unselect(); + } } - }; - -/***/ }, -/* 47 */ -/***/ function(module, exports, __webpack_require__) { + this.selectionObj = {nodes:{},edges:{}}; - exports._resetLevels = function() { - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - var node = this.nodes[nodeId]; - if (node.preassignedLevel == false) { - node.level = -1; - } - } + if (doNotTrigger == false) { + this.emit('select', this.getSelection()); } }; /** - * This is the main function to layout the nodes in a hierarchical way. - * It checks if the node details are supplied correctly + * Unselect all clusters. The selectionObj is useful for this. * + * @param {Boolean} [doNotTrigger] | ignore trigger * @private */ - exports._setupHierarchicalLayout = function() { - if (this.constants.hierarchicalLayout.enabled == true && this.nodeIndices.length > 0) { - if (this.constants.hierarchicalLayout.direction == "RL" || this.constants.hierarchicalLayout.direction == "DU") { - this.constants.hierarchicalLayout.levelSeparation *= -1; - } - else { - this.constants.hierarchicalLayout.levelSeparation = Math.abs(this.constants.hierarchicalLayout.levelSeparation); - } + exports._unselectClusters = function(doNotTrigger) { + if (doNotTrigger === undefined) { + doNotTrigger = false; + } - if (this.constants.hierarchicalLayout.direction == "RL" || this.constants.hierarchicalLayout.direction == "LR") { - if (this.constants.smoothCurves.enabled == true) { - this.constants.smoothCurves.type = "vertical"; - } - } - else { - if (this.constants.smoothCurves.enabled == true) { - this.constants.smoothCurves.type = "horizontal"; + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + if (this.selectionObj.nodes[nodeId].clusterSize > 1) { + this.selectionObj.nodes[nodeId].unselect(); + this._removeFromSelection(this.selectionObj.nodes[nodeId]); } } - // get the size of the largest hubs and check if the user has defined a level for a node. - var hubsize = 0; - var node, nodeId; - var definedLevel = false; - var undefinedLevel = false; + } - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (node.level != -1) { - definedLevel = true; - } - else { - undefinedLevel = true; - } - if (hubsize < node.edges.length) { - hubsize = node.edges.length; - } - } - } + if (doNotTrigger == false) { + this.emit('select', this.getSelection()); + } + }; - // if the user defined some levels but not all, alert and run without hierarchical layout - if (undefinedLevel == true && definedLevel == true) { - alert("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes."); - this.zoomExtent(true,this.constants.clustering.enabled); - if (!this.constants.clustering.enabled) { - this.start(); - } - } - else { - // setup the system to use hierarchical method. - this._changeConstants(); - // define levels if undefined by the users. Based on hubsize - if (undefinedLevel == true) { - this._determineLevels(hubsize); - } - // check the distribution of the nodes per level. - var distribution = this._getDistribution(); + /** + * return the number of selected nodes + * + * @returns {number} + * @private + */ + exports._getSelectedNodeCount = function() { + var count = 0; + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + count += 1; + } + } + return count; + }; - // place the nodes on the canvas. This also stablilizes the system. - this._placeNodesByHierarchy(distribution); + /** + * return the selected node + * + * @returns {number} + * @private + */ + exports._getSelectedNode = function() { + for (var nodeId in this.selectionObj.nodes) { + if (this.selectionObj.nodes.hasOwnProperty(nodeId)) { + return this.selectionObj.nodes[nodeId]; + } + } + return null; + }; - // start the simulation. - this.start(); + /** + * return the selected edge + * + * @returns {number} + * @private + */ + exports._getSelectedEdge = function() { + for (var edgeId in this.selectionObj.edges) { + if (this.selectionObj.edges.hasOwnProperty(edgeId)) { + return this.selectionObj.edges[edgeId]; } } + return null; }; /** - * This function places the nodes on the canvas based on the hierarchial distribution. + * return the number of selected edges * - * @param {Object} distribution | obtained by the function this._getDistribution() + * @returns {number} * @private */ - exports._placeNodesByHierarchy = function(distribution) { - var nodeId, node; - - // start placing all the level 0 nodes first. Then recursively position their branches. - for (nodeId in distribution[0].nodes) { - if (distribution[0].nodes.hasOwnProperty(nodeId)) { - node = distribution[0].nodes[nodeId]; - if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { - if (node.xFixed) { - node.x = distribution[0].minPos; - node.xFixed = false; - - distribution[0].minPos += distribution[0].nodeSpacing; - } - } - else { - if (node.yFixed) { - node.y = distribution[0].minPos; - node.yFixed = false; - - distribution[0].minPos += distribution[0].nodeSpacing; - } - } - this._placeBranchNodes(node.edges,node.id,distribution,node.level); + exports._getSelectedEdgeCount = function() { + var count = 0; + for (var edgeId in this.selectionObj.edges) { + if (this.selectionObj.edges.hasOwnProperty(edgeId)) { + count += 1; } } - - // stabilize the system after positioning. This function calls zoomExtent. - this._stabilize(); + return count; }; /** - * This function get the distribution of levels based on hubsize + * return the number of selected objects. * - * @returns {Object} + * @returns {number} * @private */ - exports._getDistribution = function() { - var distribution = {}; - var nodeId, node, level; - - // we fix Y because the hierarchy is vertical, we fix X so we do not give a node an x position for a second time. - // the fix of X is removed after the x value has been set. - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - node.xFixed = true; - node.yFixed = true; - if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { - node.y = this.constants.hierarchicalLayout.levelSeparation*node.level; - } - else { - node.x = this.constants.hierarchicalLayout.levelSeparation*node.level; - } - if (!distribution.hasOwnProperty(node.level)) { - distribution[node.level] = {amount: 0, nodes: {}, minPos:0, nodeSpacing:0}; - } - distribution[node.level].amount += 1; - distribution[node.level].nodes[node.id] = node; + exports._getSelectedObjectCount = function() { + var count = 0; + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + count += 1; } } - - // determine the largest amount of nodes of all levels - var maxCount = 0; - for (level in distribution) { - if (distribution.hasOwnProperty(level)) { - if (maxCount < distribution[level].amount) { - maxCount = distribution[level].amount; - } + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + count += 1; } } + return count; + }; - // set the initial position and spacing of each nodes accordingly - for (level in distribution) { - if (distribution.hasOwnProperty(level)) { - distribution[level].nodeSpacing = (maxCount + 1) * this.constants.hierarchicalLayout.nodeSpacing; - distribution[level].nodeSpacing /= (distribution[level].amount + 1); - distribution[level].minPos = distribution[level].nodeSpacing - (0.5 * (distribution[level].amount + 1) * distribution[level].nodeSpacing); + /** + * Check if anything is selected + * + * @returns {boolean} + * @private + */ + exports._selectionIsEmpty = function() { + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + return false; } } - - return distribution; + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + return false; + } + } + return true; }; /** - * this function allocates nodes in levels based on the recursive branching from the largest hubs. + * check if one of the selected nodes is a cluster. * - * @param hubsize + * @returns {boolean} * @private */ - exports._determineLevels = function(hubsize) { - var nodeId, node; - - // determine hubs - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (node.edges.length == hubsize) { - node.level = 0; + exports._clusterInSelection = function() { + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + if (this.selectionObj.nodes[nodeId].clusterSize > 1) { + return true; } } } + return false; + }; - // branch from hubs - for (nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - node = this.nodes[nodeId]; - if (node.level == 0) { - this._setLevel(1,node.edges,node.id); - } - } + /** + * select the edges connected to the node that is being selected + * + * @param {Node} node + * @private + */ + exports._selectConnectedEdges = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + var edge = node.dynamicEdges[i]; + edge.select(); + this._addToSelection(edge); } }; - /** - * Since hierarchical layout does not support: - * - smooth curves (based on the physics), - * - clustering (based on dynamic node counts) + * select the edges connected to the node that is being selected * - * We disable both features so there will be no problems. + * @param {Node} node + * @private + */ + exports._hoverConnectedEdges = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + var edge = node.dynamicEdges[i]; + edge.hover = true; + this._addToHover(edge); + } + }; + + + /** + * unselect the edges connected to the node that is being selected * + * @param {Node} node * @private */ - exports._changeConstants = function() { - this.constants.clustering.enabled = false; - this.constants.physics.barnesHut.enabled = false; - this.constants.physics.hierarchicalRepulsion.enabled = true; - this._loadSelectedForceSolver(); - if (this.constants.smoothCurves.enabled == true) { - this.constants.smoothCurves.dynamic = false; + exports._unselectConnectedEdges = function(node) { + for (var i = 0; i < node.dynamicEdges.length; i++) { + var edge = node.dynamicEdges[i]; + edge.unselect(); + this._removeFromSelection(edge); } - this._configureSmoothCurves(); }; + + /** - * This is a recursively called function to enumerate the branches from the largest hubs and place the nodes - * on a X position that ensures there will be no overlap. + * This is called when someone clicks on a node. either select or deselect it. + * If there is an existing selection and we don't want to append to it, clear the existing selection * - * @param edges - * @param parentId - * @param distribution - * @param parentLevel + * @param {Node || Edge} object + * @param {Boolean} append + * @param {Boolean} [doNotTrigger] | ignore trigger * @private */ - exports._placeBranchNodes = function(edges, parentId, distribution, parentLevel) { - for (var i = 0; i < edges.length; i++) { - var childNode = null; - if (edges[i].toId == parentId) { - childNode = edges[i].from; - } - else { - childNode = edges[i].to; - } + exports._selectObject = function(object, append, doNotTrigger, highlightEdges) { + if (doNotTrigger === undefined) { + doNotTrigger = false; + } + if (highlightEdges === undefined) { + highlightEdges = true; + } - // if a node is conneceted to another node on the same level (or higher (means lower level))!, this is not handled here. - var nodeMoved = false; - if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { - if (childNode.xFixed && childNode.level > parentLevel) { - childNode.xFixed = false; - childNode.x = distribution[childNode.level].minPos; - nodeMoved = true; - } - } - else { - if (childNode.yFixed && childNode.level > parentLevel) { - childNode.yFixed = false; - childNode.y = distribution[childNode.level].minPos; - nodeMoved = true; - } + if (this._selectionIsEmpty() == false && append == false && this.forceAppendSelection == false) { + this._unselectAll(true); + } + + if (object.selected == false) { + object.select(); + this._addToSelection(object); + if (object instanceof Node && this.blockConnectingEdgeSelection == false && highlightEdges == true) { + this._selectConnectedEdges(object); } + } + else { + object.unselect(); + this._removeFromSelection(object); + } + + if (doNotTrigger == false) { + this.emit('select', this.getSelection()); + } + }; + + + /** + * This is called when someone clicks on a node. either select or deselect it. + * If there is an existing selection and we don't want to append to it, clear the existing selection + * + * @param {Node || Edge} object + * @private + */ + exports._blurObject = function(object) { + if (object.hover == true) { + object.hover = false; + this.emit("blurNode",{node:object.id}); + } + }; - if (nodeMoved == true) { - distribution[childNode.level].minPos += distribution[childNode.level].nodeSpacing; - if (childNode.edges.length > 1) { - this._placeBranchNodes(childNode.edges,childNode.id,distribution,childNode.level); - } + /** + * This is called when someone clicks on a node. either select or deselect it. + * If there is an existing selection and we don't want to append to it, clear the existing selection + * + * @param {Node || Edge} object + * @private + */ + exports._hoverObject = function(object) { + if (object.hover == false) { + object.hover = true; + this._addToHover(object); + if (object instanceof Node) { + this.emit("hoverNode",{node:object.id}); } } + if (object instanceof Node) { + this._hoverConnectedEdges(object); + } }; /** - * this function is called recursively to enumerate the barnches of the largest hubs and give each node a level. + * handles the selection part of the touch, only for navigation controls elements; + * Touch is triggered before tap, also before hold. Hold triggers after a while. + * This is the most responsive solution * - * @param level - * @param edges - * @param parentId + * @param {Object} pointer * @private */ - exports._setLevel = function(level, edges, parentId) { - for (var i = 0; i < edges.length; i++) { - var childNode = null; - if (edges[i].toId == parentId) { - childNode = edges[i].from; + exports._handleTouch = function(pointer) { + }; + + + /** + * handles the selection part of the tap; + * + * @param {Object} pointer + * @private + */ + exports._handleTap = function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null) { + this._selectObject(node,false); + } + else { + var edge = this._getEdgeAt(pointer); + if (edge != null) { + this._selectObject(edge,false); } else { - childNode = edges[i].to; - } - if (childNode.level == -1 || childNode.level > level) { - childNode.level = level; - if (edges.length > 1) { - this._setLevel(level+1, childNode.edges, childNode.id); - } + this._unselectAll(); } } + this.emit("click", this.getSelection()); + this._redraw(); }; /** - * Unfix nodes + * handles the selection part of the double tap and opens a cluster if needed * + * @param {Object} pointer * @private */ - exports._restoreNodes = function() { - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - this.nodes[nodeId].xFixed = false; - this.nodes[nodeId].yFixed = false; - } + exports._handleDoubleTap = function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null && node !== undefined) { + // we reset the areaCenter here so the opening of the node will occur + this.areaCenter = {"x" : this._XconvertDOMtoCanvas(pointer.x), + "y" : this._YconvertDOMtoCanvas(pointer.y)}; + this.openCluster(node); } + this.emit("doubleClick", this.getSelection()); }; -/***/ }, -/* 48 */ -/***/ function(module, exports, __webpack_require__) { - /** - * Copyright 2012 Craig Campbell - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Mousetrap is a simple keyboard shortcut library for Javascript with - * no external dependencies + * Handle the onHold selection part * - * @version 1.1.2 - * @url craig.is/killing/mice + * @param pointer + * @private */ + exports._handleOnHold = function(pointer) { + var node = this._getNodeAt(pointer); + if (node != null) { + this._selectObject(node,true); + } + else { + var edge = this._getEdgeAt(pointer); + if (edge != null) { + this._selectObject(edge,true); + } + } + this._redraw(); + }; - /** - * mapping of special keycodes to their corresponding keys - * - * everything in this dictionary cannot use keypress events - * so it has to be here to map to the correct keycodes for - * keyup/keydown events - * - * @type {Object} - */ - var _MAP = { - 8: 'backspace', - 9: 'tab', - 13: 'enter', - 16: 'shift', - 17: 'ctrl', - 18: 'alt', - 20: 'capslock', - 27: 'esc', - 32: 'space', - 33: 'pageup', - 34: 'pagedown', - 35: 'end', - 36: 'home', - 37: 'left', - 38: 'up', - 39: 'right', - 40: 'down', - 45: 'ins', - 46: 'del', - 91: 'meta', - 93: 'meta', - 224: 'meta' - }, - - /** - * mapping for special characters so they can support - * - * this dictionary is only used incase you want to bind a - * keyup or keydown event to one of these keys - * - * @type {Object} - */ - _KEYCODE_MAP = { - 106: '*', - 107: '+', - 109: '-', - 110: '.', - 111 : '/', - 186: ';', - 187: '=', - 188: ',', - 189: '-', - 190: '.', - 191: '/', - 192: '`', - 219: '[', - 220: '\\', - 221: ']', - 222: '\'' - }, - - /** - * this is a mapping of keys that require shift on a US keypad - * back to the non shift equivelents - * - * this is so you can use keyup events with these keys - * - * note that this will only work reliably on US keyboards - * - * @type {Object} - */ - _SHIFT_MAP = { - '~': '`', - '!': '1', - '@': '2', - '#': '3', - '$': '4', - '%': '5', - '^': '6', - '&': '7', - '*': '8', - '(': '9', - ')': '0', - '_': '-', - '+': '=', - ':': ';', - '\"': '\'', - '<': ',', - '>': '.', - '?': '/', - '|': '\\' - }, - - /** - * this is a list of special strings you can use to map - * to modifier keys when you specify your keyboard shortcuts - * - * @type {Object} - */ - _SPECIAL_ALIASES = { - 'option': 'alt', - 'command': 'meta', - 'return': 'enter', - 'escape': 'esc' - }, - - /** - * variable to store the flipped version of _MAP from above - * needed to check if we should use keypress or not when no action - * is specified - * - * @type {Object|undefined} - */ - _REVERSE_MAP, - - /** - * a list of all the callbacks setup via Mousetrap.bind() - * - * @type {Object} - */ - _callbacks = {}, - - /** - * direct map of string combinations to callbacks used for trigger() - * - * @type {Object} - */ - _direct_map = {}, - /** - * keeps track of what level each sequence is at since multiple - * sequences can start out with the same sequence - * - * @type {Object} - */ - _sequence_levels = {}, + /** + * handle the onRelease event. These functions are here for the navigation controls module. + * + * @private + */ + exports._handleOnRelease = function(pointer) { - /** - * variable to store the setTimeout call - * - * @type {null|number} - */ - _reset_timer, + }; - /** - * temporary state where we will ignore the next keyup - * - * @type {boolean|string} - */ - _ignore_next_keyup = false, - /** - * are we currently inside of a sequence? - * type of action ("keyup" or "keydown" or "keypress") or false - * - * @type {boolean|string} - */ - _inside_sequence = false; - /** - * loop through the f keys, f1 to f19 and add them to the map - * programatically - */ - for (var i = 1; i < 20; ++i) { - _MAP[111 + i] = 'f' + i; + /** + * + * retrieve the currently selected objects + * @return {{nodes: Array., edges: Array.}} selection + */ + exports.getSelection = function() { + var nodeIds = this.getSelectedNodes(); + var edgeIds = this.getSelectedEdges(); + return {nodes:nodeIds, edges:edgeIds}; + }; + + /** + * + * retrieve the currently selected nodes + * @return {String[]} selection An array with the ids of the + * selected nodes. + */ + exports.getSelectedNodes = function() { + var idArray = []; + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + idArray.push(nodeId); + } } + return idArray + }; - /** - * loop through to map numbers on the numeric keypad - */ - for (i = 0; i <= 9; ++i) { - _MAP[i + 96] = i; + /** + * + * retrieve the currently selected edges + * @return {Array} selection An array with the ids of the + * selected nodes. + */ + exports.getSelectedEdges = function() { + var idArray = []; + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + idArray.push(edgeId); + } } + return idArray; + }; - /** - * cross browser add event method - * - * @param {Element|HTMLDocument} object - * @param {string} type - * @param {Function} callback - * @returns void - */ - function _addEvent(object, type, callback) { - if (object.addEventListener) { - return object.addEventListener(type, callback, false); - } - object.attachEvent('on' + type, callback); + /** + * select zero or more nodes + * @param {Number[] | String[]} selection An array with the ids of the + * selected nodes. + */ + exports.setSelection = function(selection) { + var i, iMax, id; + + if (!selection || (selection.length == undefined)) + throw 'Selection must be an array with ids'; + + // first unselect any selected node + this._unselectAll(true); + + for (i = 0, iMax = selection.length; i < iMax; i++) { + id = selection[i]; + + var node = this.nodes[id]; + if (!node) { + throw new RangeError('Node with id "' + id + '" not found'); + } + this._selectObject(node,true,true); } - /** - * takes the event and returns the key character - * - * @param {Event} e - * @return {string} - */ - function _characterFromEvent(e) { + console.log("setSelection is deprecated. Please use selectNodes instead.") - // for keypress events we should return the character as is - if (e.type == 'keypress') { - return String.fromCharCode(e.which); - } + this.redraw(); + }; - // for non keypress events the special maps are needed - if (_MAP[e.which]) { - return _MAP[e.which]; - } - if (_KEYCODE_MAP[e.which]) { - return _KEYCODE_MAP[e.which]; - } + /** + * select zero or more nodes with the option to highlight edges + * @param {Number[] | String[]} selection An array with the ids of the + * selected nodes. + * @param {boolean} [highlightEdges] + */ + exports.selectNodes = function(selection, highlightEdges) { + var i, iMax, id; - // if it is not in the special map - return String.fromCharCode(e.which).toLowerCase(); - } + if (!selection || (selection.length == undefined)) + throw 'Selection must be an array with ids'; - /** - * should we stop this event before firing off callbacks - * - * @param {Event} e - * @return {boolean} - */ - function _stop(e) { - var element = e.target || e.srcElement, - tag_name = element.tagName; + // first unselect any selected node + this._unselectAll(true); - // if the element has the class "mousetrap" then no need to stop - if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) { - return false; - } + for (i = 0, iMax = selection.length; i < iMax; i++) { + id = selection[i]; - // stop for input, select, and textarea - return tag_name == 'INPUT' || tag_name == 'SELECT' || tag_name == 'TEXTAREA' || (element.contentEditable && element.contentEditable == 'true'); + var node = this.nodes[id]; + if (!node) { + throw new RangeError('Node with id "' + id + '" not found'); + } + this._selectObject(node,true,true,highlightEdges); } + this.redraw(); + }; - /** - * checks if two arrays are equal - * - * @param {Array} modifiers1 - * @param {Array} modifiers2 - * @returns {boolean} - */ - function _modifiersMatch(modifiers1, modifiers2) { - return modifiers1.sort().join(',') === modifiers2.sort().join(','); - } - /** - * resets all sequence counters except for the ones passed in - * - * @param {Object} do_not_reset - * @returns void - */ - function _resetSequences(do_not_reset) { - do_not_reset = do_not_reset || {}; + /** + * select zero or more edges + * @param {Number[] | String[]} selection An array with the ids of the + * selected nodes. + */ + exports.selectEdges = function(selection) { + var i, iMax, id; - var active_sequences = false, - key; + if (!selection || (selection.length == undefined)) + throw 'Selection must be an array with ids'; - for (key in _sequence_levels) { - if (do_not_reset[key]) { - active_sequences = true; - continue; - } - _sequence_levels[key] = 0; - } + // first unselect any selected node + this._unselectAll(true); - if (!active_sequences) { - _inside_sequence = false; - } - } + for (i = 0, iMax = selection.length; i < iMax; i++) { + id = selection[i]; - /** - * finds all callbacks that match based on the keycode, modifiers, - * and action - * - * @param {string} character - * @param {Array} modifiers - * @param {string} action - * @param {boolean=} remove - should we remove any matches - * @param {string=} combination - * @returns {Array} - */ - function _getMatches(character, modifiers, action, remove, combination) { - var i, - callback, - matches = []; + var edge = this.edges[id]; + if (!edge) { + throw new RangeError('Edge with id "' + id + '" not found'); + } + this._selectObject(edge,true,true,highlightEdges); + } + this.redraw(); + }; - // if there are no events related to this keycode - if (!_callbacks[character]) { - return []; + /** + * Validate the selection: remove ids of nodes which no longer exist + * @private + */ + exports._updateSelection = function () { + for(var nodeId in this.selectionObj.nodes) { + if(this.selectionObj.nodes.hasOwnProperty(nodeId)) { + if (!this.nodes.hasOwnProperty(nodeId)) { + delete this.selectionObj.nodes[nodeId]; } - - // if a modifier key is coming up on its own we should allow it - if (action == 'keyup' && _isModifier(character)) { - modifiers = [character]; + } + } + for(var edgeId in this.selectionObj.edges) { + if(this.selectionObj.edges.hasOwnProperty(edgeId)) { + if (!this.edges.hasOwnProperty(edgeId)) { + delete this.selectionObj.edges[edgeId]; } + } + } + }; - // loop through all callbacks for the key that was pressed - // and see if any of them match - for (i = 0; i < _callbacks[character].length; ++i) { - callback = _callbacks[character][i]; - // if this is a sequence but it is not at the right level - // then move onto the next match - if (callback.seq && _sequence_levels[callback.seq] != callback.level) { - continue; - } +/***/ }, +/* 46 */ +/***/ function(module, exports, __webpack_require__) { - // if the action we are looking for doesn't match the action we got - // then we should keep going - if (action != callback.action) { - continue; - } + var util = __webpack_require__(1); + var Node = __webpack_require__(30); + var Edge = __webpack_require__(27); - // if this is a keypress event that means that we need to only - // look at the character, otherwise check the modifiers as - // well - if (action == 'keypress' || _modifiersMatch(modifiers, callback.modifiers)) { + /** + * clears the toolbar div element of children + * + * @private + */ + exports._clearManipulatorBar = function() { + while (this.manipulationDiv.hasChildNodes()) { + this.manipulationDiv.removeChild(this.manipulationDiv.firstChild); + } + }; - // remove is used so if you change your mind and call bind a - // second time with a new function the first one is overwritten - if (remove && callback.combo == combination) { - _callbacks[character].splice(i, 1); - } + /** + * Manipulation UI temporarily overloads certain functions to extend or replace them. To be able to restore + * these functions to their original functionality, we saved them in this.cachedFunctions. + * This function restores these functions to their original function. + * + * @private + */ + exports._restoreOverloadedFunctions = function() { + for (var functionName in this.cachedFunctions) { + if (this.cachedFunctions.hasOwnProperty(functionName)) { + this[functionName] = this.cachedFunctions[functionName]; + } + } + }; - matches.push(callback); - } - } + /** + * Enable or disable edit-mode. + * + * @private + */ + exports._toggleEditMode = function() { + this.editMode = !this.editMode; + var toolbar = document.getElementById("network-manipulationDiv"); + var closeDiv = document.getElementById("network-manipulation-closeDiv"); + var editModeDiv = document.getElementById("network-manipulation-editMode"); + if (this.editMode == true) { + toolbar.style.display="block"; + closeDiv.style.display="block"; + editModeDiv.style.display="none"; + closeDiv.onclick = this._toggleEditMode.bind(this); + } + else { + toolbar.style.display="none"; + closeDiv.style.display="none"; + editModeDiv.style.display="block"; + closeDiv.onclick = null; + } + this._createManipulatorBar() + }; - return matches; + /** + * main function, creates the main toolbar. Removes functions bound to the select event. Binds all the buttons of the toolbar. + * + * @private + */ + exports._createManipulatorBar = function() { + // remove bound functions + if (this.boundFunction) { + this.off('select', this.boundFunction); } - /** - * takes a key event and figures out what the modifiers are - * - * @param {Event} e - * @returns {Array} - */ - function _eventModifiers(e) { - var modifiers = []; + if (this.edgeBeingEdited !== undefined) { + this.edgeBeingEdited._disableControlNodes(); + this.edgeBeingEdited = undefined; + this.selectedControlNode = null; + this.controlNodesActive = false; + } - if (e.shiftKey) { - modifiers.push('shift'); - } + // restore overloaded functions + this._restoreOverloadedFunctions(); - if (e.altKey) { - modifiers.push('alt'); - } + // resume calculation + this.freezeSimulation = false; - if (e.ctrlKey) { - modifiers.push('ctrl'); - } + // reset global variables + this.blockConnectingEdgeSelection = false; + this.forceAppendSelection = false; - if (e.metaKey) { - modifiers.push('meta'); - } + if (this.editMode == true) { + while (this.manipulationDiv.hasChildNodes()) { + this.manipulationDiv.removeChild(this.manipulationDiv.firstChild); + } + // add the icons to the manipulator div + this.manipulationDiv.innerHTML = "" + + "" + + ""+this.constants.labels['add'] +"" + + "
" + + "" + + ""+this.constants.labels['link'] +""; + if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { + this.manipulationDiv.innerHTML += "" + + "
" + + "" + + ""+this.constants.labels['editNode'] +""; + } + else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { + this.manipulationDiv.innerHTML += "" + + "
" + + "" + + ""+this.constants.labels['editEdge'] +""; + } + if (this._selectionIsEmpty() == false) { + this.manipulationDiv.innerHTML += "" + + "
" + + "" + + ""+this.constants.labels['del'] +""; + } - return modifiers; + + // bind the icons + var addNodeButton = document.getElementById("network-manipulate-addNode"); + addNodeButton.onclick = this._createAddNodeToolbar.bind(this); + var addEdgeButton = document.getElementById("network-manipulate-connectNode"); + addEdgeButton.onclick = this._createAddEdgeToolbar.bind(this); + if (this._getSelectedNodeCount() == 1 && this.triggerFunctions.edit) { + var editButton = document.getElementById("network-manipulate-editNode"); + editButton.onclick = this._editNode.bind(this); + } + else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { + var editButton = document.getElementById("network-manipulate-editEdge"); + editButton.onclick = this._createEditEdgeToolbar.bind(this); + } + if (this._selectionIsEmpty() == false) { + var deleteButton = document.getElementById("network-manipulate-delete"); + deleteButton.onclick = this._deleteSelected.bind(this); + } + var closeDiv = document.getElementById("network-manipulation-closeDiv"); + closeDiv.onclick = this._toggleEditMode.bind(this); + + this.boundFunction = this._createManipulatorBar.bind(this); + this.on('select', this.boundFunction); + } + else { + this.editModeDiv.innerHTML = "" + + "" + + "" + this.constants.labels['edit'] + ""; + var editModeButton = document.getElementById("network-manipulate-editModeButton"); + editModeButton.onclick = this._toggleEditMode.bind(this); } + }; - /** - * actually calls the callback function - * - * if your callback function returns false this will use the jquery - * convention - prevent default and stop propogation on the event - * - * @param {Function} callback - * @param {Event} e - * @returns void - */ - function _fireCallback(callback, e) { - if (callback(e) === false) { - if (e.preventDefault) { - e.preventDefault(); - } - if (e.stopPropagation) { - e.stopPropagation(); - } - e.returnValue = false; - e.cancelBubble = true; - } + /** + * Create the toolbar for adding Nodes + * + * @private + */ + exports._createAddNodeToolbar = function() { + // clear the toolbar + this._clearManipulatorBar(); + if (this.boundFunction) { + this.off('select', this.boundFunction); } - /** - * handles a character key event - * - * @param {string} character - * @param {Event} e - * @returns void - */ - function _handleCharacter(character, e) { + // create the toolbar contents + this.manipulationDiv.innerHTML = "" + + "" + + "" + this.constants.labels['back'] + " " + + "
" + + "" + + "" + this.constants.labels['addDescription'] + ""; - // if this event should not happen stop here - if (_stop(e)) { - return; - } + // bind the icon + var backButton = document.getElementById("network-manipulate-back"); + backButton.onclick = this._createManipulatorBar.bind(this); + + // we use the boundFunction so we can reference it when we unbind it from the "select" event. + this.boundFunction = this._addNode.bind(this); + this.on('select', this.boundFunction); + }; + + + /** + * create the toolbar to connect nodes + * + * @private + */ + exports._createAddEdgeToolbar = function() { + // clear the toolbar + this._clearManipulatorBar(); + this._unselectAll(true); + this.freezeSimulation = true; - var callbacks = _getMatches(character, _eventModifiers(e), e.type), - i, - do_not_reset = {}, - processed_sequence_callback = false; + if (this.boundFunction) { + this.off('select', this.boundFunction); + } - // loop through matching callbacks for this key event - for (i = 0; i < callbacks.length; ++i) { + this._unselectAll(); + this.forceAppendSelection = false; + this.blockConnectingEdgeSelection = true; - // fire for all sequence callbacks - // this is because if for example you have multiple sequences - // bound such as "g i" and "g t" they both need to fire the - // callback for matching g cause otherwise you can only ever - // match the first one - if (callbacks[i].seq) { - processed_sequence_callback = true; + this.manipulationDiv.innerHTML = "" + + "" + + "" + this.constants.labels['back'] + " " + + "
" + + "" + + "" + this.constants.labels['linkDescription'] + ""; - // keep a list of which sequences were matches for later - do_not_reset[callbacks[i].seq] = 1; - _fireCallback(callbacks[i].callback, e); - continue; - } + // bind the icon + var backButton = document.getElementById("network-manipulate-back"); + backButton.onclick = this._createManipulatorBar.bind(this); - // if there were no sequence matches but we are still here - // that means this is a regular match so we should fire that - if (!processed_sequence_callback && !_inside_sequence) { - _fireCallback(callbacks[i].callback, e); - } - } + // we use the boundFunction so we can reference it when we unbind it from the "select" event. + this.boundFunction = this._handleConnect.bind(this); + this.on('select', this.boundFunction); - // if you are inside of a sequence and the key you are pressing - // is not a modifier key then we should reset all sequences - // that were not matched by this key event - if (e.type == _inside_sequence && !_isModifier(character)) { - _resetSequences(do_not_reset); - } - } + // temporarily overload functions + this.cachedFunctions["_handleTouch"] = this._handleTouch; + this.cachedFunctions["_handleOnRelease"] = this._handleOnRelease; + this._handleTouch = this._handleConnect; + this._handleOnRelease = this._finishConnect; - /** - * handles a keydown event - * - * @param {Event} e - * @returns void - */ - function _handleKey(e) { + // redraw to show the unselect + this._redraw(); + }; - // normalize e.which for key events - // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion - e.which = typeof e.which == "number" ? e.which : e.keyCode; + /** + * create the toolbar to edit edges + * + * @private + */ + exports._createEditEdgeToolbar = function() { + // clear the toolbar + this._clearManipulatorBar(); + this.controlNodesActive = true; - var character = _characterFromEvent(e); + if (this.boundFunction) { + this.off('select', this.boundFunction); + } - // no character found then stop - if (!character) { - return; - } + this.edgeBeingEdited = this._getSelectedEdge(); + this.edgeBeingEdited._enableControlNodes(); - if (e.type == 'keyup' && _ignore_next_keyup == character) { - _ignore_next_keyup = false; - return; - } + this.manipulationDiv.innerHTML = "" + + "" + + "" + this.constants.labels['back'] + " " + + "
" + + "" + + "" + this.constants.labels['editEdgeDescription'] + ""; - _handleCharacter(character, e); - } + // bind the icon + var backButton = document.getElementById("network-manipulate-back"); + backButton.onclick = this._createManipulatorBar.bind(this); - /** - * determines if the keycode specified is a modifier key or not - * - * @param {string} key - * @returns {boolean} - */ - function _isModifier(key) { - return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta'; - } + // temporarily overload functions + this.cachedFunctions["_handleTouch"] = this._handleTouch; + this.cachedFunctions["_handleOnRelease"] = this._handleOnRelease; + this.cachedFunctions["_handleTap"] = this._handleTap; + this.cachedFunctions["_handleDragStart"] = this._handleDragStart; + this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; + this._handleTouch = this._selectControlNode; + this._handleTap = function () {}; + this._handleOnDrag = this._controlNodeDrag; + this._handleDragStart = function () {} + this._handleOnRelease = this._releaseControlNode; - /** - * called to set a 1 second timeout on the specified sequence - * - * this is so after each key press in the sequence you have 1 second - * to press the next key before you have to start over - * - * @returns void - */ - function _resetSequenceTimer() { - clearTimeout(_reset_timer); - _reset_timer = setTimeout(_resetSequences, 1000); - } + // redraw to show the unselect + this._redraw(); + }; - /** - * reverses the map lookup so that we can look for specific keys - * to see what can and can't use keypress - * - * @return {Object} - */ - function _getReverseMap() { - if (!_REVERSE_MAP) { - _REVERSE_MAP = {}; - for (var key in _MAP) { - // pull out the numeric keypad from here cause keypress should - // be able to detect the keys from the character - if (key > 95 && key < 112) { - continue; - } - if (_MAP.hasOwnProperty(key)) { - _REVERSE_MAP[_MAP[key]] = key; - } - } - } - return _REVERSE_MAP; - } - /** - * picks the best action based on the key combination - * - * @param {string} key - character for key - * @param {Array} modifiers - * @param {string=} action passed in - */ - function _pickBestAction(key, modifiers, action) { - // if no action was picked in we should try to pick the one - // that we think would work best for this key - if (!action) { - action = _getReverseMap()[key] ? 'keydown' : 'keypress'; - } + /** + * the function bound to the selection event. It checks if you want to connect a cluster and changes the description + * to walk the user through the process. + * + * @private + */ + exports._selectControlNode = function(pointer) { + this.edgeBeingEdited.controlNodes.from.unselect(); + this.edgeBeingEdited.controlNodes.to.unselect(); + this.selectedControlNode = this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(pointer.x),this._YconvertDOMtoCanvas(pointer.y)); + if (this.selectedControlNode !== null) { + this.selectedControlNode.select(); + this.freezeSimulation = true; + } + this._redraw(); + }; - // modifier keys don't work as expected with keypress, - // switch to keydown - if (action == 'keypress' && modifiers.length) { - action = 'keydown'; - } + /** + * the function bound to the selection event. It checks if you want to connect a cluster and changes the description + * to walk the user through the process. + * + * @private + */ + exports._controlNodeDrag = function(event) { + var pointer = this._getPointer(event.gesture.center); + if (this.selectedControlNode !== null && this.selectedControlNode !== undefined) { + this.selectedControlNode.x = this._XconvertDOMtoCanvas(pointer.x); + this.selectedControlNode.y = this._YconvertDOMtoCanvas(pointer.y); + } + this._redraw(); + }; - return action; + exports._releaseControlNode = function(pointer) { + var newNode = this._getNodeAt(pointer); + if (newNode != null) { + if (this.edgeBeingEdited.controlNodes.from.selected == true) { + this._editEdge(newNode.id, this.edgeBeingEdited.to.id); + this.edgeBeingEdited.controlNodes.from.unselect(); + } + if (this.edgeBeingEdited.controlNodes.to.selected == true) { + this._editEdge(this.edgeBeingEdited.from.id, newNode.id); + this.edgeBeingEdited.controlNodes.to.unselect(); + } } + else { + this.edgeBeingEdited._restoreControlNodes(); + } + this.freezeSimulation = false; + this._redraw(); + }; - /** - * binds a key sequence to an event - * - * @param {string} combo - combo specified in bind call - * @param {Array} keys - * @param {Function} callback - * @param {string=} action - * @returns void - */ - function _bindSequence(combo, keys, callback, action) { + /** + * the function bound to the selection event. It checks if you want to connect a cluster and changes the description + * to walk the user through the process. + * + * @private + */ + exports._handleConnect = function(pointer) { + if (this._getSelectedNodeCount() == 0) { + var node = this._getNodeAt(pointer); + if (node != null) { + if (node.clusterSize > 1) { + alert("Cannot create edges to a cluster.") + } + else { + this._selectObject(node,false); + // create a node the temporary line can look at + this.sectors['support']['nodes']['targetNode'] = new Node({id:'targetNode'},{},{},this.constants); + this.sectors['support']['nodes']['targetNode'].x = node.x; + this.sectors['support']['nodes']['targetNode'].y = node.y; + this.sectors['support']['nodes']['targetViaNode'] = new Node({id:'targetViaNode'},{},{},this.constants); + this.sectors['support']['nodes']['targetViaNode'].x = node.x; + this.sectors['support']['nodes']['targetViaNode'].y = node.y; + this.sectors['support']['nodes']['targetViaNode'].parentEdgeId = "connectionEdge"; - // start off by adding a sequence level record for this combination - // and setting the level to 0 - _sequence_levels[combo] = 0; + // create a temporary edge + this.edges['connectionEdge'] = new Edge({id:"connectionEdge",from:node.id,to:this.sectors['support']['nodes']['targetNode'].id}, this, this.constants); + this.edges['connectionEdge'].from = node; + this.edges['connectionEdge'].connected = true; + this.edges['connectionEdge'].smooth = true; + this.edges['connectionEdge'].selected = true; + this.edges['connectionEdge'].to = this.sectors['support']['nodes']['targetNode']; + this.edges['connectionEdge'].via = this.sectors['support']['nodes']['targetViaNode']; - // if there is no action pick the best one for the first key - // in the sequence - if (!action) { - action = _pickBestAction(keys[0], []); + this.cachedFunctions["_handleOnDrag"] = this._handleOnDrag; + this._handleOnDrag = function(event) { + var pointer = this._getPointer(event.gesture.center); + this.sectors['support']['nodes']['targetNode'].x = this._XconvertDOMtoCanvas(pointer.x); + this.sectors['support']['nodes']['targetNode'].y = this._YconvertDOMtoCanvas(pointer.y); + this.sectors['support']['nodes']['targetViaNode'].x = 0.5 * (this._XconvertDOMtoCanvas(pointer.x) + this.edges['connectionEdge'].from.x); + this.sectors['support']['nodes']['targetViaNode'].y = this._YconvertDOMtoCanvas(pointer.y); + }; + + this.moving = true; + this.start(); } + } + } + }; - /** - * callback to increase the sequence level for this sequence and reset - * all other sequences that were active - * - * @param {Event} e - * @returns void - */ - var _increaseSequence = function(e) { - _inside_sequence = action; - ++_sequence_levels[combo]; - _resetSequenceTimer(); - }, + exports._finishConnect = function(pointer) { + if (this._getSelectedNodeCount() == 1) { - /** - * wraps the specified callback inside of another function in order - * to reset all sequence counters as soon as this sequence is done - * - * @param {Event} e - * @returns void - */ - _callbackAndReset = function(e) { - _fireCallback(callback, e); + // restore the drag function + this._handleOnDrag = this.cachedFunctions["_handleOnDrag"]; + delete this.cachedFunctions["_handleOnDrag"]; - // we should ignore the next key up if the action is key down - // or keypress. this is so if you finish a sequence and - // release the key the final key will not trigger a keyup - if (action !== 'keyup') { - _ignore_next_keyup = _characterFromEvent(e); - } + // remember the edge id + var connectFromId = this.edges['connectionEdge'].fromId; - // weird race condition if a sequence ends with the key - // another sequence begins with - setTimeout(_resetSequences, 10); - }, - i; + // remove the temporary nodes and edge + delete this.edges['connectionEdge']; + delete this.sectors['support']['nodes']['targetNode']; + delete this.sectors['support']['nodes']['targetViaNode']; - // loop through keys one at a time and bind the appropriate callback - // function. for any key leading up to the final one it should - // increase the sequence. after the final, it should reset all sequences - for (i = 0; i < keys.length; ++i) { - _bindSingle(keys[i], i < keys.length - 1 ? _increaseSequence : _callbackAndReset, action, combo, i); + var node = this._getNodeAt(pointer); + if (node != null) { + if (node.clusterSize > 1) { + alert("Cannot create edges to a cluster.") + } + else { + this._createEdge(connectFromId,node.id); + this._createManipulatorBar(); } + } + this._unselectAll(); } + }; - /** - * binds a single keyboard combination - * - * @param {string} combination - * @param {Function} callback - * @param {string=} action - * @param {string=} sequence_name - name of sequence if part of sequence - * @param {number=} level - what part of the sequence the command is - * @returns void - */ - function _bindSingle(combination, callback, action, sequence_name, level) { - - // make sure multiple spaces in a row become a single space - combination = combination.replace(/\s+/g, ' '); - - var sequence = combination.split(' '), - i, - key, - keys, - modifiers = []; - // if this pattern is a sequence of keys then run through this method - // to reprocess each pattern one key at a time - if (sequence.length > 1) { - return _bindSequence(combination, sequence, callback, action); + /** + * Adds a node on the specified location + */ + exports._addNode = function() { + if (this._selectionIsEmpty() && this.editMode == true) { + var positionObject = this._pointerToPositionObject(this.pointerPosition); + var defaultData = {id:util.randomUUID(),x:positionObject.left,y:positionObject.top,label:"new",allowedToMoveX:true,allowedToMoveY:true}; + if (this.triggerFunctions.add) { + if (this.triggerFunctions.add.length == 2) { + var me = this; + this.triggerFunctions.add(defaultData, function(finalizedData) { + me.nodesData.add(finalizedData); + me._createManipulatorBar(); + me.moving = true; + me.start(); + }); + } + else { + alert(this.constants.labels['addError']); + this._createManipulatorBar(); + this.moving = true; + this.start(); } + } + else { + this.nodesData.add(defaultData); + this._createManipulatorBar(); + this.moving = true; + this.start(); + } + } + }; - // take the keys from this pattern and figure out what the actual - // pattern is all about - keys = combination === '+' ? ['+'] : combination.split('+'); - for (i = 0; i < keys.length; ++i) { - key = keys[i]; + /** + * connect two nodes with a new edge. + * + * @private + */ + exports._createEdge = function(sourceNodeId,targetNodeId) { + if (this.editMode == true) { + var defaultData = {from:sourceNodeId, to:targetNodeId}; + if (this.triggerFunctions.connect) { + if (this.triggerFunctions.connect.length == 2) { + var me = this; + this.triggerFunctions.connect(defaultData, function(finalizedData) { + me.edgesData.add(finalizedData); + me.moving = true; + me.start(); + }); + } + else { + alert(this.constants.labels["linkError"]); + this.moving = true; + this.start(); + } + } + else { + this.edgesData.add(defaultData); + this.moving = true; + this.start(); + } + } + }; - // normalize key names - if (_SPECIAL_ALIASES[key]) { - key = _SPECIAL_ALIASES[key]; - } + /** + * connect two nodes with a new edge. + * + * @private + */ + exports._editEdge = function(sourceNodeId,targetNodeId) { + if (this.editMode == true) { + var defaultData = {id: this.edgeBeingEdited.id, from:sourceNodeId, to:targetNodeId}; + if (this.triggerFunctions.editEdge) { + if (this.triggerFunctions.editEdge.length == 2) { + var me = this; + this.triggerFunctions.editEdge(defaultData, function(finalizedData) { + me.edgesData.update(finalizedData); + me.moving = true; + me.start(); + }); + } + else { + alert(this.constants.labels["linkError"]); + this.moving = true; + this.start(); + } + } + else { + this.edgesData.update(defaultData); + this.moving = true; + this.start(); + } + } + }; - // if this is not a keypress event then we should - // be smart about using shift keys - // this will only work for US keyboards however - if (action && action != 'keypress' && _SHIFT_MAP[key]) { - key = _SHIFT_MAP[key]; - modifiers.push('shift'); - } + /** + * Create the toolbar to edit the selected node. The label and the color can be changed. Other colors are derived from the chosen color. + * + * @private + */ + exports._editNode = function() { + if (this.triggerFunctions.edit && this.editMode == true) { + var node = this._getSelectedNode(); + var data = {id:node.id, + label: node.label, + group: node.group, + shape: node.shape, + color: { + background:node.color.background, + border:node.color.border, + highlight: { + background:node.color.highlight.background, + border:node.color.highlight.border + } + }}; + if (this.triggerFunctions.edit.length == 2) { + var me = this; + this.triggerFunctions.edit(data, function (finalizedData) { + me.nodesData.update(finalizedData); + me._createManipulatorBar(); + me.moving = true; + me.start(); + }); + } + else { + alert(this.constants.labels["editError"]); + } + } + else { + alert(this.constants.labels["editBoundError"]); + } + }; - // if this key is a modifier then add it to the list of modifiers - if (_isModifier(key)) { - modifiers.push(key); - } - } - // depending on what the key combination is - // we will try to pick the best event for it - action = _pickBestAction(key, modifiers, action); - // make sure to initialize array if this is the first time - // a callback is added for this key - if (!_callbacks[key]) { - _callbacks[key] = []; + + /** + * delete everything in the selection + * + * @private + */ + exports._deleteSelected = function() { + if (!this._selectionIsEmpty() && this.editMode == true) { + if (!this._clusterInSelection()) { + var selectedNodes = this.getSelectedNodes(); + var selectedEdges = this.getSelectedEdges(); + if (this.triggerFunctions.del) { + var me = this; + var data = {nodes: selectedNodes, edges: selectedEdges}; + if (this.triggerFunctions.del.length = 2) { + this.triggerFunctions.del(data, function (finalizedData) { + me.edgesData.remove(finalizedData.edges); + me.nodesData.remove(finalizedData.nodes); + me._unselectAll(); + me.moving = true; + me.start(); + }); + } + else { + alert(this.constants.labels["deleteError"]) + } + } + else { + this.edgesData.remove(selectedEdges); + this.nodesData.remove(selectedNodes); + this._unselectAll(); + this.moving = true; + this.start(); } + } + else { + alert(this.constants.labels["deleteClusterError"]); + } + } + }; - // remove an existing match if there is one - _getMatches(key, modifiers, action, !sequence_name, combination); - // add this call back to the array - // if it is a sequence put it at the beginning - // if not put it at the end - // - // this is important because the way these are processed expects - // the sequence ones to come first - _callbacks[key][sequence_name ? 'unshift' : 'push']({ - callback: callback, - modifiers: modifiers, - action: action, - seq: sequence_name, - level: level, - combo: combination - }); - } +/***/ }, +/* 47 */ +/***/ function(module, exports, __webpack_require__) { - /** - * binds multiple combinations to the same callback - * - * @param {Array} combinations - * @param {Function} callback - * @param {string|undefined} action - * @returns void - */ - function _bindMultiple(combinations, callback, action) { - for (var i = 0; i < combinations.length; ++i) { - _bindSingle(combinations[i], callback, action); - } + exports._cleanNavigation = function() { + // clean up previous navigation items + var wrapper = document.getElementById('network-navigation_wrapper'); + if (wrapper != null) { + this.containerElement.removeChild(wrapper); } + document.onmouseup = null; + }; - // start! - _addEvent(document, 'keypress', _handleKey); - _addEvent(document, 'keydown', _handleKey); - _addEvent(document, 'keyup', _handleKey); + /** + * Creation of the navigation controls nodes. They are drawn over the rest of the nodes and are not affected by scale and translation + * they have a triggerFunction which is called on click. If the position of the navigation controls is dependent + * on this.frame.canvas.clientWidth or this.frame.canvas.clientHeight, we flag horizontalAlignLeft and verticalAlignTop false. + * This means that the location will be corrected by the _relocateNavigation function on a size change of the canvas. + * + * @private + */ + exports._loadNavigationElements = function() { + this._cleanNavigation(); - var mousetrap = { + this.navigationDivs = {}; + var navigationDivs = ['up','down','left','right','zoomIn','zoomOut','zoomExtends']; + var navigationDivActions = ['_moveUp','_moveDown','_moveLeft','_moveRight','_zoomIn','_zoomOut','zoomExtent']; - /** - * binds an event to mousetrap - * - * can be a single key, a combination of keys separated with +, - * a comma separated list of keys, an array of keys, or - * a sequence of keys separated by spaces - * - * be sure to list the modifier keys first to make sure that the - * correct key ends up getting bound (the last key in the pattern) - * - * @param {string|Array} keys - * @param {Function} callback - * @param {string=} action - 'keypress', 'keydown', or 'keyup' - * @returns void - */ - bind: function(keys, callback, action) { - _bindMultiple(keys instanceof Array ? keys : [keys], callback, action); - _direct_map[keys + ':' + action] = callback; - return this; - }, + this.navigationDivs['wrapper'] = document.createElement('div'); + this.navigationDivs['wrapper'].id = "network-navigation_wrapper"; + this.navigationDivs['wrapper'].style.position = "absolute"; + this.navigationDivs['wrapper'].style.width = this.frame.canvas.clientWidth + "px"; + this.navigationDivs['wrapper'].style.height = this.frame.canvas.clientHeight + "px"; + this.containerElement.insertBefore(this.navigationDivs['wrapper'],this.frame); - /** - * unbinds an event to mousetrap - * - * the unbinding sets the callback function of the specified key combo - * to an empty function and deletes the corresponding key in the - * _direct_map dict. - * - * the keycombo+action has to be exactly the same as - * it was defined in the bind method - * - * TODO: actually remove this from the _callbacks dictionary instead - * of binding an empty function - * - * @param {string|Array} keys - * @param {string} action - * @returns void - */ - unbind: function(keys, action) { - if (_direct_map[keys + ':' + action]) { - delete _direct_map[keys + ':' + action]; - this.bind(keys, function() {}, action); - } - return this; - }, + for (var i = 0; i < navigationDivs.length; i++) { + this.navigationDivs[navigationDivs[i]] = document.createElement('div'); + this.navigationDivs[navigationDivs[i]].id = "network-navigation_" + navigationDivs[i]; + this.navigationDivs[navigationDivs[i]].className = "network-navigation " + navigationDivs[i]; + this.navigationDivs['wrapper'].appendChild(this.navigationDivs[navigationDivs[i]]); + this.navigationDivs[navigationDivs[i]].onmousedown = this[navigationDivActions[i]].bind(this); + } - /** - * triggers an event that has already been bound - * - * @param {string} keys - * @param {string=} action - * @returns void - */ - trigger: function(keys, action) { - _direct_map[keys + ':' + action](); - return this; - }, + document.onmouseup = this._stopMovement.bind(this); + }; - /** - * resets the library back to its initial state. this is useful - * if you want to clear out the current keyboard shortcuts and bind - * new ones - for example if you switch to another page - * - * @returns void - */ - reset: function() { - _callbacks = {}; - _direct_map = {}; - return this; - } - }; + /** + * this stops all movement induced by the navigation buttons + * + * @private + */ + exports._stopMovement = function() { + this._xStopMoving(); + this._yStopMoving(); + this._stopZoom(); + }; - module.exports = mousetrap; + /** + * stops the actions performed by page up and down etc. + * + * @param event + * @private + */ + exports._preventDefault = function(event) { + if (event !== undefined) { + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; + } + } + }; -/***/ }, -/* 49 */ -/***/ function(module, exports, __webpack_require__) { + /** + * move the screen up + * By using the increments, instead of adding a fixed number to the translation, we keep fluent and + * instant movement. The onKeypress event triggers immediately, then pauses, then triggers frequently + * To avoid this behaviour, we do the translation in the start loop. + * + * @private + */ + exports._moveUp = function(event) { + this.yIncrement = this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + this._preventDefault(event); + if (this.navigationDivs) { + this.navigationDivs['up'].className += " active"; + } + }; - var util = __webpack_require__(1); - var RepulsionMixin = __webpack_require__(52); - var HierarchialRepulsionMixin = __webpack_require__(53); - var BarnesHutMixin = __webpack_require__(54); /** - * Toggling barnes Hut calculation on and off. - * + * move the screen down * @private */ - exports._toggleBarnesHut = function () { - this.constants.physics.barnesHut.enabled = !this.constants.physics.barnesHut.enabled; - this._loadSelectedForceSolver(); - this.moving = true; - this.start(); + exports._moveDown = function(event) { + this.yIncrement = -this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + this._preventDefault(event); + if (this.navigationDivs) { + this.navigationDivs['down'].className += " active"; + } }; /** - * This loads the node force solver based on the barnes hut or repulsion algorithm - * + * move the screen left * @private */ - exports._loadSelectedForceSolver = function () { - // this overloads the this._calculateNodeForces - if (this.constants.physics.barnesHut.enabled == true) { - this._clearMixin(RepulsionMixin); - this._clearMixin(HierarchialRepulsionMixin); - - this.constants.physics.centralGravity = this.constants.physics.barnesHut.centralGravity; - this.constants.physics.springLength = this.constants.physics.barnesHut.springLength; - this.constants.physics.springConstant = this.constants.physics.barnesHut.springConstant; - this.constants.physics.damping = this.constants.physics.barnesHut.damping; - - this._loadMixin(BarnesHutMixin); + exports._moveLeft = function(event) { + this.xIncrement = this.constants.keyboard.speed.x; + this.start(); // if there is no node movement, the calculation wont be done + this._preventDefault(event); + if (this.navigationDivs) { + this.navigationDivs['left'].className += " active"; } - else if (this.constants.physics.hierarchicalRepulsion.enabled == true) { - this._clearMixin(BarnesHutMixin); - this._clearMixin(RepulsionMixin); + }; - this.constants.physics.centralGravity = this.constants.physics.hierarchicalRepulsion.centralGravity; - this.constants.physics.springLength = this.constants.physics.hierarchicalRepulsion.springLength; - this.constants.physics.springConstant = this.constants.physics.hierarchicalRepulsion.springConstant; - this.constants.physics.damping = this.constants.physics.hierarchicalRepulsion.damping; - this._loadMixin(HierarchialRepulsionMixin); + /** + * move the screen right + * @private + */ + exports._moveRight = function(event) { + this.xIncrement = -this.constants.keyboard.speed.y; + this.start(); // if there is no node movement, the calculation wont be done + this._preventDefault(event); + if (this.navigationDivs) { + this.navigationDivs['right'].className += " active"; } - else { - this._clearMixin(BarnesHutMixin); - this._clearMixin(HierarchialRepulsionMixin); - this.barnesHutTree = undefined; + }; - this.constants.physics.centralGravity = this.constants.physics.repulsion.centralGravity; - this.constants.physics.springLength = this.constants.physics.repulsion.springLength; - this.constants.physics.springConstant = this.constants.physics.repulsion.springConstant; - this.constants.physics.damping = this.constants.physics.repulsion.damping; - this._loadMixin(RepulsionMixin); + /** + * Zoom in, using the same method as the movement. + * @private + */ + exports._zoomIn = function(event) { + this.zoomIncrement = this.constants.keyboard.speed.zoom; + this.start(); // if there is no node movement, the calculation wont be done + this._preventDefault(event); + if (this.navigationDivs) { + this.navigationDivs['zoomIn'].className += " active"; } }; + /** - * Before calculating the forces, we check if we need to cluster to keep up performance and we check - * if there is more than one node. If it is just one node, we dont calculate anything. - * + * Zoom out * @private */ - exports._initializeForceCalculation = function () { - // stop calculation if there is only one node - if (this.nodeIndices.length == 1) { - this.nodes[this.nodeIndices[0]]._setForce(0, 0); - } - else { - // if there are too many nodes on screen, we cluster without repositioning - if (this.nodeIndices.length > this.constants.clustering.clusterThreshold && this.constants.clustering.enabled == true) { - this.clusterToFit(this.constants.clustering.reduceToNodes, false); - } - - // we now start the force calculation - this._calculateForces(); + exports._zoomOut = function() { + this.zoomIncrement = -this.constants.keyboard.speed.zoom; + this.start(); // if there is no node movement, the calculation wont be done + this._preventDefault(event); + if (this.navigationDivs) { + this.navigationDivs['zoomOut'].className += " active"; } }; /** - * Calculate the external forces acting on the nodes - * Forces are caused by: edges, repulsing forces between nodes, gravity + * Stop zooming and unhighlight the zoom controls * @private */ - exports._calculateForces = function () { - // Gravity is required to keep separated groups from floating off - // the forces are reset to zero in this loop by using _setForce instead - // of _addForce - - this._calculateGravitationalForces(); - this._calculateNodeForces(); - - if (this.constants.springConstant > 0) { - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - this._calculateSpringForcesWithSupport(); - } - else { - if (this.constants.physics.hierarchicalRepulsion.enabled == true) { - this._calculateHierarchicalSpringForces(); - } - else { - this._calculateSpringForces(); - } - } + exports._stopZoom = function() { + this.zoomIncrement = 0; + if (this.navigationDivs) { + this.navigationDivs['zoomIn'].className = this.navigationDivs['zoomIn'].className.replace(" active",""); + this.navigationDivs['zoomOut'].className = this.navigationDivs['zoomOut'].className.replace(" active",""); } }; /** - * Smooth curves are created by adding invisible nodes in the center of the edges. These nodes are also - * handled in the calculateForces function. We then use a quadratic curve with the center node as control. - * This function joins the datanodes and invisible (called support) nodes into one object. - * We do this so we do not contaminate this.nodes with the support nodes. - * + * Stop moving in the Y direction and unHighlight the up and down * @private */ - exports._updateCalculationNodes = function () { - if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { - this.calculationNodes = {}; - this.calculationNodeIndices = []; - - for (var nodeId in this.nodes) { - if (this.nodes.hasOwnProperty(nodeId)) { - this.calculationNodes[nodeId] = this.nodes[nodeId]; - } - } - var supportNodes = this.sectors['support']['nodes']; - for (var supportNodeId in supportNodes) { - if (supportNodes.hasOwnProperty(supportNodeId)) { - if (this.edges.hasOwnProperty(supportNodes[supportNodeId].parentEdgeId)) { - this.calculationNodes[supportNodeId] = supportNodes[supportNodeId]; - } - else { - supportNodes[supportNodeId]._setForce(0, 0); - } - } - } - - for (var idx in this.calculationNodes) { - if (this.calculationNodes.hasOwnProperty(idx)) { - this.calculationNodeIndices.push(idx); - } - } - } - else { - this.calculationNodes = this.nodes; - this.calculationNodeIndices = this.nodeIndices; + exports._yStopMoving = function() { + this.yIncrement = 0; + if (this.navigationDivs) { + this.navigationDivs['up'].className = this.navigationDivs['up'].className.replace(" active",""); + this.navigationDivs['down'].className = this.navigationDivs['down'].className.replace(" active",""); } }; /** - * this function applies the central gravity effect to keep groups from floating off - * + * Stop moving in the X direction and unHighlight left and right. * @private */ - exports._calculateGravitationalForces = function () { - var dx, dy, distance, node, i; - var nodes = this.calculationNodes; - var gravity = this.constants.physics.centralGravity; - var gravityForce = 0; - - for (i = 0; i < this.calculationNodeIndices.length; i++) { - node = nodes[this.calculationNodeIndices[i]]; - node.damping = this.constants.physics.damping; // possibly add function to alter damping properties of clusters. - // gravity does not apply when we are in a pocket sector - if (this._sector() == "default" && gravity != 0) { - dx = -node.x; - dy = -node.y; - distance = Math.sqrt(dx * dx + dy * dy); - - gravityForce = (distance == 0) ? 0 : (gravity / distance); - node.fx = dx * gravityForce; - node.fy = dy * gravityForce; - } - else { - node.fx = 0; - node.fy = 0; - } + exports._xStopMoving = function() { + this.xIncrement = 0; + if (this.navigationDivs) { + this.navigationDivs['left'].className = this.navigationDivs['left'].className.replace(" active",""); + this.navigationDivs['right'].className = this.navigationDivs['right'].className.replace(" active",""); } }; +/***/ }, +/* 48 */ +/***/ function(module, exports, __webpack_require__) { + exports._resetLevels = function() { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + var node = this.nodes[nodeId]; + if (node.preassignedLevel == false) { + node.level = -1; + } + } + } + }; /** - * this function calculates the effects of the springs in the case of unsmooth curves. + * This is the main function to layout the nodes in a hierarchical way. + * It checks if the node details are supplied correctly * * @private */ - exports._calculateSpringForces = function () { - var edgeLength, edge, edgeId; - var dx, dy, fx, fy, springForce, distance; - var edges = this.edges; + exports._setupHierarchicalLayout = function() { + if (this.constants.hierarchicalLayout.enabled == true && this.nodeIndices.length > 0) { + if (this.constants.hierarchicalLayout.direction == "RL" || this.constants.hierarchicalLayout.direction == "DU") { + this.constants.hierarchicalLayout.levelSeparation *= -1; + } + else { + this.constants.hierarchicalLayout.levelSeparation = Math.abs(this.constants.hierarchicalLayout.levelSeparation); + } - // forces caused by the edges, modelled as springs - for (edgeId in edges) { - if (edges.hasOwnProperty(edgeId)) { - edge = edges[edgeId]; - if (edge.connected) { - // only calculate forces if nodes are in the same sector - if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { - edgeLength = edge.customLength ? edge.length : this.constants.physics.springLength; - // this implies that the edges between big clusters are longer - edgeLength += (edge.to.clusterSize + edge.from.clusterSize - 2) * this.constants.clustering.edgeGrowth; + if (this.constants.hierarchicalLayout.direction == "RL" || this.constants.hierarchicalLayout.direction == "LR") { + if (this.constants.smoothCurves.enabled == true) { + this.constants.smoothCurves.type = "vertical"; + } + } + else { + if (this.constants.smoothCurves.enabled == true) { + this.constants.smoothCurves.type = "horizontal"; + } + } + // get the size of the largest hubs and check if the user has defined a level for a node. + var hubsize = 0; + var node, nodeId; + var definedLevel = false; + var undefinedLevel = false; - dx = (edge.from.x - edge.to.x); - dy = (edge.from.y - edge.to.y); - distance = Math.sqrt(dx * dx + dy * dy); + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.level != -1) { + definedLevel = true; + } + else { + undefinedLevel = true; + } + if (hubsize < node.edges.length) { + hubsize = node.edges.length; + } + } + } - if (distance == 0) { - distance = 0.01; - } + // if the user defined some levels but not all, alert and run without hierarchical layout + if (undefinedLevel == true && definedLevel == true) { + alert("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes."); + this.zoomExtent(true,this.constants.clustering.enabled); + if (!this.constants.clustering.enabled) { + this.start(); + } + } + else { + // setup the system to use hierarchical method. + this._changeConstants(); - // the 1/distance is so the fx and fy can be calculated without sine or cosine. - springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; + // define levels if undefined by the users. Based on hubsize + if (undefinedLevel == true) { + this._determineLevels(hubsize); + } + // check the distribution of the nodes per level. + var distribution = this._getDistribution(); - fx = dx * springForce; - fy = dy * springForce; + // place the nodes on the canvas. This also stablilizes the system. + this._placeNodesByHierarchy(distribution); - edge.from.fx += fx; - edge.from.fy += fy; - edge.to.fx -= fx; - edge.to.fy -= fy; - } - } + // start the simulation. + this.start(); } } }; - - /** - * This function calculates the springforces on the nodes, accounting for the support nodes. + * This function places the nodes on the canvas based on the hierarchial distribution. * + * @param {Object} distribution | obtained by the function this._getDistribution() * @private */ - exports._calculateSpringForcesWithSupport = function () { - var edgeLength, edge, edgeId, combinedClusterSize; - var edges = this.edges; - - // forces caused by the edges, modelled as springs - for (edgeId in edges) { - if (edges.hasOwnProperty(edgeId)) { - edge = edges[edgeId]; - if (edge.connected) { - // only calculate forces if nodes are in the same sector - if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { - if (edge.via != null) { - var node1 = edge.to; - var node2 = edge.via; - var node3 = edge.from; + exports._placeNodesByHierarchy = function(distribution) { + var nodeId, node; - edgeLength = edge.customLength ? edge.length : this.constants.physics.springLength; + // start placing all the level 0 nodes first. Then recursively position their branches. + for (nodeId in distribution[0].nodes) { + if (distribution[0].nodes.hasOwnProperty(nodeId)) { + node = distribution[0].nodes[nodeId]; + if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { + if (node.xFixed) { + node.x = distribution[0].minPos; + node.xFixed = false; - combinedClusterSize = node1.clusterSize + node3.clusterSize - 2; + distribution[0].minPos += distribution[0].nodeSpacing; + } + } + else { + if (node.yFixed) { + node.y = distribution[0].minPos; + node.yFixed = false; - // this implies that the edges between big clusters are longer - edgeLength += combinedClusterSize * this.constants.clustering.edgeGrowth; - this._calculateSpringForce(node1, node2, 0.5 * edgeLength); - this._calculateSpringForce(node2, node3, 0.5 * edgeLength); - } + distribution[0].minPos += distribution[0].nodeSpacing; } } + this._placeBranchNodes(node.edges,node.id,distribution,node.level); } } + + // stabilize the system after positioning. This function calls zoomExtent. + this._stabilize(); }; /** - * This is the code actually performing the calculation for the function above. It is split out to avoid repetition. + * This function get the distribution of levels based on hubsize * - * @param node1 - * @param node2 - * @param edgeLength + * @returns {Object} * @private */ - exports._calculateSpringForce = function (node1, node2, edgeLength) { - var dx, dy, fx, fy, springForce, distance; - - dx = (node1.x - node2.x); - dy = (node1.y - node2.y); - distance = Math.sqrt(dx * dx + dy * dy); + exports._getDistribution = function() { + var distribution = {}; + var nodeId, node, level; - if (distance == 0) { - distance = 0.01; + // we fix Y because the hierarchy is vertical, we fix X so we do not give a node an x position for a second time. + // the fix of X is removed after the x value has been set. + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + node.xFixed = true; + node.yFixed = true; + if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { + node.y = this.constants.hierarchicalLayout.levelSeparation*node.level; + } + else { + node.x = this.constants.hierarchicalLayout.levelSeparation*node.level; + } + if (!distribution.hasOwnProperty(node.level)) { + distribution[node.level] = {amount: 0, nodes: {}, minPos:0, nodeSpacing:0}; + } + distribution[node.level].amount += 1; + distribution[node.level].nodes[node.id] = node; + } } - // the 1/distance is so the fx and fy can be calculated without sine or cosine. - springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; - - fx = dx * springForce; - fy = dy * springForce; - - node1.fx += fx; - node1.fy += fy; - node2.fx -= fx; - node2.fy -= fy; - }; - - - /** - * Load the HTML for the physics config and bind it - * @private - */ - exports._loadPhysicsConfiguration = function () { - if (this.physicsConfiguration === undefined) { - this.backupConstants = {}; - util.deepExtend(this.backupConstants,this.constants); - - var hierarchicalLayoutDirections = ["LR", "RL", "UD", "DU"]; - this.physicsConfiguration = document.createElement('div'); - this.physicsConfiguration.className = "PhysicsConfiguration"; - this.physicsConfiguration.innerHTML = '' + - '' + - '' + - '' + - '' + - '' + - '' + - '
Simulation Mode:
Barnes HutRepulsionHierarchical
' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '
Options:
' - this.containerElement.parentElement.insertBefore(this.physicsConfiguration, this.containerElement); - this.optionsDiv = document.createElement("div"); - this.optionsDiv.style.fontSize = "14px"; - this.optionsDiv.style.fontFamily = "verdana"; - this.containerElement.parentElement.insertBefore(this.optionsDiv, this.containerElement); + // determine the largest amount of nodes of all levels + var maxCount = 0; + for (level in distribution) { + if (distribution.hasOwnProperty(level)) { + if (maxCount < distribution[level].amount) { + maxCount = distribution[level].amount; + } + } + } - var rangeElement; - rangeElement = document.getElementById('graph_BH_gc'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_gc', -1, "physics_barnesHut_gravitationalConstant"); - rangeElement = document.getElementById('graph_BH_cg'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_cg', 1, "physics_centralGravity"); - rangeElement = document.getElementById('graph_BH_sc'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sc', 1, "physics_springConstant"); - rangeElement = document.getElementById('graph_BH_sl'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sl', 1, "physics_springLength"); - rangeElement = document.getElementById('graph_BH_damp'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_damp', 1, "physics_damping"); + // set the initial position and spacing of each nodes accordingly + for (level in distribution) { + if (distribution.hasOwnProperty(level)) { + distribution[level].nodeSpacing = (maxCount + 1) * this.constants.hierarchicalLayout.nodeSpacing; + distribution[level].nodeSpacing /= (distribution[level].amount + 1); + distribution[level].minPos = distribution[level].nodeSpacing - (0.5 * (distribution[level].amount + 1) * distribution[level].nodeSpacing); + } + } - rangeElement = document.getElementById('graph_R_nd'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_nd', 1, "physics_repulsion_nodeDistance"); - rangeElement = document.getElementById('graph_R_cg'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_cg', 1, "physics_centralGravity"); - rangeElement = document.getElementById('graph_R_sc'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sc', 1, "physics_springConstant"); - rangeElement = document.getElementById('graph_R_sl'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sl', 1, "physics_springLength"); - rangeElement = document.getElementById('graph_R_damp'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_damp', 1, "physics_damping"); + return distribution; + }; - rangeElement = document.getElementById('graph_H_nd'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); - rangeElement = document.getElementById('graph_H_cg'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_cg', 1, "physics_centralGravity"); - rangeElement = document.getElementById('graph_H_sc'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sc', 1, "physics_springConstant"); - rangeElement = document.getElementById('graph_H_sl'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sl', 1, "physics_springLength"); - rangeElement = document.getElementById('graph_H_damp'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_damp', 1, "physics_damping"); - rangeElement = document.getElementById('graph_H_direction'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_direction', hierarchicalLayoutDirections, "hierarchicalLayout_direction"); - rangeElement = document.getElementById('graph_H_levsep'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_levsep', 1, "hierarchicalLayout_levelSeparation"); - rangeElement = document.getElementById('graph_H_nspac'); - rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nspac', 1, "hierarchicalLayout_nodeSpacing"); - var radioButton1 = document.getElementById("graph_physicsMethod1"); - var radioButton2 = document.getElementById("graph_physicsMethod2"); - var radioButton3 = document.getElementById("graph_physicsMethod3"); - radioButton2.checked = true; - if (this.constants.physics.barnesHut.enabled) { - radioButton1.checked = true; + /** + * this function allocates nodes in levels based on the recursive branching from the largest hubs. + * + * @param hubsize + * @private + */ + exports._determineLevels = function(hubsize) { + var nodeId, node; + + // determine hubs + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.edges.length == hubsize) { + node.level = 0; + } } - if (this.constants.hierarchicalLayout.enabled) { - radioButton3.checked = true; + } + + // branch from hubs + for (nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + node = this.nodes[nodeId]; + if (node.level == 0) { + this._setLevel(1,node.edges,node.id); + } } + } + }; - var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); - var graph_repositionNodes = document.getElementById("graph_repositionNodes"); - var graph_generateOptions = document.getElementById("graph_generateOptions"); - graph_toggleSmooth.onclick = graphToggleSmoothCurves.bind(this); - graph_repositionNodes.onclick = graphRepositionNodes.bind(this); - graph_generateOptions.onclick = graphGenerateOptions.bind(this); - if (this.constants.smoothCurves == true && this.constants.dynamicSmoothCurves == false) { - graph_toggleSmooth.style.background = "#A4FF56"; + /** + * Since hierarchical layout does not support: + * - smooth curves (based on the physics), + * - clustering (based on dynamic node counts) + * + * We disable both features so there will be no problems. + * + * @private + */ + exports._changeConstants = function() { + this.constants.clustering.enabled = false; + this.constants.physics.barnesHut.enabled = false; + this.constants.physics.hierarchicalRepulsion.enabled = true; + this._loadSelectedForceSolver(); + if (this.constants.smoothCurves.enabled == true) { + this.constants.smoothCurves.dynamic = false; + } + this._configureSmoothCurves(); + }; + + + /** + * This is a recursively called function to enumerate the branches from the largest hubs and place the nodes + * on a X position that ensures there will be no overlap. + * + * @param edges + * @param parentId + * @param distribution + * @param parentLevel + * @private + */ + exports._placeBranchNodes = function(edges, parentId, distribution, parentLevel) { + for (var i = 0; i < edges.length; i++) { + var childNode = null; + if (edges[i].toId == parentId) { + childNode = edges[i].from; } else { - graph_toggleSmooth.style.background = "#FF8532"; + childNode = edges[i].to; } + // if a node is conneceted to another node on the same level (or higher (means lower level))!, this is not handled here. + var nodeMoved = false; + if (this.constants.hierarchicalLayout.direction == "UD" || this.constants.hierarchicalLayout.direction == "DU") { + if (childNode.xFixed && childNode.level > parentLevel) { + childNode.xFixed = false; + childNode.x = distribution[childNode.level].minPos; + nodeMoved = true; + } + } + else { + if (childNode.yFixed && childNode.level > parentLevel) { + childNode.yFixed = false; + childNode.y = distribution[childNode.level].minPos; + nodeMoved = true; + } + } - switchConfigurations.apply(this); - - radioButton1.onchange = switchConfigurations.bind(this); - radioButton2.onchange = switchConfigurations.bind(this); - radioButton3.onchange = switchConfigurations.bind(this); + if (nodeMoved == true) { + distribution[childNode.level].minPos += distribution[childNode.level].nodeSpacing; + if (childNode.edges.length > 1) { + this._placeBranchNodes(childNode.edges,childNode.id,distribution,childNode.level); + } + } } }; + /** - * This overwrites the this.constants. + * this function is called recursively to enumerate the barnches of the largest hubs and give each node a level. * - * @param constantsVariableName - * @param value + * @param level + * @param edges + * @param parentId * @private */ - exports._overWriteGraphConstants = function (constantsVariableName, value) { - var nameArray = constantsVariableName.split("_"); - if (nameArray.length == 1) { - this.constants[nameArray[0]] = value; - } - else if (nameArray.length == 2) { - this.constants[nameArray[0]][nameArray[1]] = value; + exports._setLevel = function(level, edges, parentId) { + for (var i = 0; i < edges.length; i++) { + var childNode = null; + if (edges[i].toId == parentId) { + childNode = edges[i].from; + } + else { + childNode = edges[i].to; + } + if (childNode.level == -1 || childNode.level > level) { + childNode.level = level; + if (edges.length > 1) { + this._setLevel(level+1, childNode.edges, childNode.id); + } + } } - else if (nameArray.length == 3) { - this.constants[nameArray[0]][nameArray[1]][nameArray[2]] = value; + }; + + + /** + * Unfix nodes + * + * @private + */ + exports._restoreNodes = function() { + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.nodes[nodeId].xFixed = false; + this.nodes[nodeId].yFixed = false; + } } }; - /** - * this function is bound to the toggle smooth curves button. That is also why it is not in the prototype. - */ - function graphToggleSmoothCurves () { - this.constants.smoothCurves.enabled = !this.constants.smoothCurves.enabled; - var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); - if (this.constants.smoothCurves.enabled == true) {graph_toggleSmooth.style.background = "#A4FF56";} - else {graph_toggleSmooth.style.background = "#FF8532";} +/***/ }, +/* 49 */ +/***/ function(module, exports, __webpack_require__) { + + /*! Hammer.JS - v1.0.5 - 2013-04-07 + * http://eightmedia.github.com/hammer.js + * + * Copyright (c) 2013 Jorik Tangelder ; + * Licensed under the MIT license */ + + (function(window, undefined) { + 'use strict'; + + /** + * Hammer + * use this to create instances + * @param {HTMLElement} element + * @param {Object} options + * @returns {Hammer.Instance} + * @constructor + */ + var Hammer = function(element, options) { + return new Hammer.Instance(element, options || {}); + }; + + // default settings + Hammer.defaults = { + // add styles and attributes to the element to prevent the browser from doing + // its native behavior. this doesnt prevent the scrolling, but cancels + // the contextmenu, tap highlighting etc + // set to false to disable this + stop_browser_behavior: { + // this also triggers onselectstart=false for IE + userSelect: 'none', + // this makes the element blocking in IE10 >, you could experiment with the value + // see for more options this issue; https://github.com/EightMedia/hammer.js/issues/241 + touchAction: 'none', + touchCallout: 'none', + contentZooming: 'none', + userDrag: 'none', + tapHighlightColor: 'rgba(0,0,0,0)' + } + + // more settings are defined per gesture at gestures.js + }; + + // detect touchevents + Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled; + Hammer.HAS_TOUCHEVENTS = ('ontouchstart' in window); + + // dont use mouseevents on mobile devices + Hammer.MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i; + Hammer.NO_MOUSEEVENTS = Hammer.HAS_TOUCHEVENTS && navigator.userAgent.match(Hammer.MOBILE_REGEX); + + // eventtypes per touchevent (start, move, end) + // are filled by Hammer.event.determineEventTypes on setup + Hammer.EVENT_TYPES = {}; + + // direction defines + Hammer.DIRECTION_DOWN = 'down'; + Hammer.DIRECTION_LEFT = 'left'; + Hammer.DIRECTION_UP = 'up'; + Hammer.DIRECTION_RIGHT = 'right'; + + // pointer type + Hammer.POINTER_MOUSE = 'mouse'; + Hammer.POINTER_TOUCH = 'touch'; + Hammer.POINTER_PEN = 'pen'; + + // touch event defines + Hammer.EVENT_START = 'start'; + Hammer.EVENT_MOVE = 'move'; + Hammer.EVENT_END = 'end'; + + // hammer document where the base events are added at + Hammer.DOCUMENT = document; + + // plugins namespace + Hammer.plugins = {}; - this._configureSmoothCurves(false); - } + // if the window events are set... + Hammer.READY = false; /** - * this function is used to scramble the nodes - * + * setup events to detect gestures on the document */ - function graphRepositionNodes () { - for (var nodeId in this.calculationNodes) { - if (this.calculationNodes.hasOwnProperty(nodeId)) { - this.calculationNodes[nodeId].vx = 0; this.calculationNodes[nodeId].vy = 0; - this.calculationNodes[nodeId].fx = 0; this.calculationNodes[nodeId].fy = 0; + function setup() { + if(Hammer.READY) { + return; } - } - if (this.constants.hierarchicalLayout.enabled == true) { - this._setupHierarchicalLayout(); - } - else { - this.repositionNodes(); - } - this.moving = true; - this.start(); + + // find what eventtypes we add listeners to + Hammer.event.determineEventTypes(); + + // Register all gestures inside Hammer.gestures + for(var name in Hammer.gestures) { + if(Hammer.gestures.hasOwnProperty(name)) { + Hammer.detection.register(Hammer.gestures[name]); + } + } + + // Add touch events on the document + Hammer.event.onTouch(Hammer.DOCUMENT, Hammer.EVENT_MOVE, Hammer.detection.detect); + Hammer.event.onTouch(Hammer.DOCUMENT, Hammer.EVENT_END, Hammer.detection.detect); + + // Hammer is ready...! + Hammer.READY = true; } /** - * this is used to generate an options file from the playing with physics system. + * create new hammer instance + * all methods should return the instance itself, so it is chainable. + * @param {HTMLElement} element + * @param {Object} [options={}] + * @returns {Hammer.Instance} + * @constructor */ - function graphGenerateOptions () { - var options = "No options are required, default values used."; - var optionsSpecific = []; - var radioButton1 = document.getElementById("graph_physicsMethod1"); - var radioButton2 = document.getElementById("graph_physicsMethod2"); - if (radioButton1.checked == true) { - if (this.constants.physics.barnesHut.gravitationalConstant != this.backupConstants.physics.barnesHut.gravitationalConstant) {optionsSpecific.push("gravitationalConstant: " + this.constants.physics.barnesHut.gravitationalConstant);} - if (this.constants.physics.centralGravity != this.backupConstants.physics.barnesHut.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} - if (this.constants.physics.springLength != this.backupConstants.physics.barnesHut.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} - if (this.constants.physics.springConstant != this.backupConstants.physics.barnesHut.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} - if (this.constants.physics.damping != this.backupConstants.physics.barnesHut.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} - if (optionsSpecific.length != 0) { - options = "var options = {"; - options += "physics: {barnesHut: {"; - for (var i = 0; i < optionsSpecific.length; i++) { - options += optionsSpecific[i]; - if (i < optionsSpecific.length - 1) { - options += ", " - } - } - options += '}}' - } - if (this.constants.smoothCurves.enabled != this.backupConstants.smoothCurves.enabled) { - if (optionsSpecific.length == 0) {options = "var options = {";} - else {options += ", "} - options += "smoothCurves: " + this.constants.smoothCurves.enabled; - } - if (options != "No options are required, default values used.") { - options += '};' + Hammer.Instance = function(element, options) { + var self = this; + + // setup HammerJS window events and register all gestures + // this also sets up the default options + setup(); + + this.element = element; + + // start/stop detection option + this.enabled = true; + + // merge options + this.options = Hammer.utils.extend( + Hammer.utils.extend({}, Hammer.defaults), + options || {}); + + // add some css to the element to prevent the browser from doing its native behavoir + if(this.options.stop_browser_behavior) { + Hammer.utils.stopDefaultBrowserBehavior(this.element, this.options.stop_browser_behavior); } - } - else if (radioButton2.checked == true) { - options = "var options = {"; - options += "physics: {barnesHut: {enabled: false}"; - if (this.constants.physics.repulsion.nodeDistance != this.backupConstants.physics.repulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.repulsion.nodeDistance);} - if (this.constants.physics.centralGravity != this.backupConstants.physics.repulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} - if (this.constants.physics.springLength != this.backupConstants.physics.repulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} - if (this.constants.physics.springConstant != this.backupConstants.physics.repulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} - if (this.constants.physics.damping != this.backupConstants.physics.repulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} - if (optionsSpecific.length != 0) { - options += ", repulsion: {"; - for (var i = 0; i < optionsSpecific.length; i++) { - options += optionsSpecific[i]; - if (i < optionsSpecific.length - 1) { - options += ", " + + // start detection on touchstart + Hammer.event.onTouch(element, Hammer.EVENT_START, function(ev) { + if(self.enabled) { + Hammer.detection.startDetect(self, ev); } - } - options += '}}' - } - if (optionsSpecific.length == 0) {options += "}"} - if (this.constants.smoothCurves != this.backupConstants.smoothCurves) { - options += ", smoothCurves: " + this.constants.smoothCurves; - } - options += '};' - } - else { - options = "var options = {"; - if (this.constants.physics.hierarchicalRepulsion.nodeDistance != this.backupConstants.physics.hierarchicalRepulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.hierarchicalRepulsion.nodeDistance);} - if (this.constants.physics.centralGravity != this.backupConstants.physics.hierarchicalRepulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} - if (this.constants.physics.springLength != this.backupConstants.physics.hierarchicalRepulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} - if (this.constants.physics.springConstant != this.backupConstants.physics.hierarchicalRepulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} - if (this.constants.physics.damping != this.backupConstants.physics.hierarchicalRepulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} - if (optionsSpecific.length != 0) { - options += "physics: {hierarchicalRepulsion: {"; - for (var i = 0; i < optionsSpecific.length; i++) { - options += optionsSpecific[i]; - if (i < optionsSpecific.length - 1) { - options += ", "; + }); + + // return instance + return this; + }; + + + Hammer.Instance.prototype = { + /** + * bind events to the instance + * @param {String} gesture + * @param {Function} handler + * @returns {Hammer.Instance} + */ + on: function onEvent(gesture, handler){ + var gestures = gesture.split(' '); + for(var t=0; t; - * Licensed under the MIT license */ - (function(window, undefined) { - 'use strict'; + /** + * touch events with mouse fallback + * @param {HTMLElement} element + * @param {String} eventType like Hammer.EVENT_MOVE + * @param {Function} handler + */ + onTouch: function onTouch(element, eventType, handler) { + var self = this; - /** - * Hammer - * use this to create instances - * @param {HTMLElement} element - * @param {Object} options - * @returns {Hammer.Instance} - * @constructor - */ - var Hammer = function(element, options) { - return new Hammer.Instance(element, options || {}); - }; + this.bindDom(element, Hammer.EVENT_TYPES[eventType], function bindDomOnTouch(ev) { + var sourceEventType = ev.type.toLowerCase(); - // default settings - Hammer.defaults = { - // add styles and attributes to the element to prevent the browser from doing - // its native behavior. this doesnt prevent the scrolling, but cancels - // the contextmenu, tap highlighting etc - // set to false to disable this - stop_browser_behavior: { - // this also triggers onselectstart=false for IE - userSelect: 'none', - // this makes the element blocking in IE10 >, you could experiment with the value - // see for more options this issue; https://github.com/EightMedia/hammer.js/issues/241 - touchAction: 'none', - touchCallout: 'none', - contentZooming: 'none', - userDrag: 'none', - tapHighlightColor: 'rgba(0,0,0,0)' - } + // onmouseup, but when touchend has been fired we do nothing. + // this is for touchdevices which also fire a mouseup on touchend + if(sourceEventType.match(/mouse/) && touch_triggered) { + return; + } - // more settings are defined per gesture at gestures.js - }; + // mousebutton must be down or a touch event + else if( sourceEventType.match(/touch/) || // touch events are always on screen + sourceEventType.match(/pointerdown/) || // pointerevents touch + (sourceEventType.match(/mouse/) && ev.which === 1) // mouse is pressed + ){ + enable_detect = true; + } - // detect touchevents - Hammer.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled; - Hammer.HAS_TOUCHEVENTS = ('ontouchstart' in window); + // we are in a touch event, set the touch triggered bool to true, + // this for the conflicts that may occur on ios and android + if(sourceEventType.match(/touch|pointer/)) { + touch_triggered = true; + } - // dont use mouseevents on mobile devices - Hammer.MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i; - Hammer.NO_MOUSEEVENTS = Hammer.HAS_TOUCHEVENTS && navigator.userAgent.match(Hammer.MOBILE_REGEX); + // count the total touches on the screen + var count_touches = 0; - // eventtypes per touchevent (start, move, end) - // are filled by Hammer.event.determineEventTypes on setup - Hammer.EVENT_TYPES = {}; + // when touch has been triggered in this detection session + // and we are now handling a mouse event, we stop that to prevent conflicts + if(enable_detect) { + // update pointerevent + if(Hammer.HAS_POINTEREVENTS && eventType != Hammer.EVENT_END) { + count_touches = Hammer.PointerEvent.updatePointer(eventType, ev); + } + // touch + else if(sourceEventType.match(/touch/)) { + count_touches = ev.touches.length; + } + // mouse + else if(!touch_triggered) { + count_touches = sourceEventType.match(/up/) ? 0 : 1; + } - // direction defines - Hammer.DIRECTION_DOWN = 'down'; - Hammer.DIRECTION_LEFT = 'left'; - Hammer.DIRECTION_UP = 'up'; - Hammer.DIRECTION_RIGHT = 'right'; + // if we are in a end event, but when we remove one touch and + // we still have enough, set eventType to move + if(count_touches > 0 && eventType == Hammer.EVENT_END) { + eventType = Hammer.EVENT_MOVE; + } + // no touches, force the end event + else if(!count_touches) { + eventType = Hammer.EVENT_END; + } - // pointer type - Hammer.POINTER_MOUSE = 'mouse'; - Hammer.POINTER_TOUCH = 'touch'; - Hammer.POINTER_PEN = 'pen'; + // because touchend has no touches, and we often want to use these in our gestures, + // we send the last move event as our eventData in touchend + if(!count_touches && last_move_event !== null) { + ev = last_move_event; + } + // store the last move event + else { + last_move_event = ev; + } - // touch event defines - Hammer.EVENT_START = 'start'; - Hammer.EVENT_MOVE = 'move'; - Hammer.EVENT_END = 'end'; + // trigger the handler + handler.call(Hammer.detection, self.collectEventData(element, eventType, ev)); - // hammer document where the base events are added at - Hammer.DOCUMENT = document; + // remove pointerevent from list + if(Hammer.HAS_POINTEREVENTS && eventType == Hammer.EVENT_END) { + count_touches = Hammer.PointerEvent.updatePointer(eventType, ev); + } + } - // plugins namespace - Hammer.plugins = {}; + //debug(sourceEventType +" "+ eventType); - // if the window events are set... - Hammer.READY = false; + // on the end we reset everything + if(!count_touches) { + last_move_event = null; + enable_detect = false; + touch_triggered = false; + Hammer.PointerEvent.reset(); + } + }); + }, + + + /** + * we have different events for each device/browser + * determine what we need and set them in the Hammer.EVENT_TYPES constant + */ + determineEventTypes: function determineEventTypes() { + // determine the eventtype we want to set + var types; + + // pointerEvents magic + if(Hammer.HAS_POINTEREVENTS) { + types = Hammer.PointerEvent.getEvents(); + } + // on Android, iOS, blackberry, windows mobile we dont want any mouseevents + else if(Hammer.NO_MOUSEEVENTS) { + types = [ + 'touchstart', + 'touchmove', + 'touchend touchcancel']; + } + // for non pointer events browsers and mixed browsers, + // like chrome on windows8 touch laptop + else { + types = [ + 'touchstart mousedown', + 'touchmove mousemove', + 'touchend touchcancel mouseup']; + } - /** - * setup events to detect gestures on the document - */ - function setup() { - if(Hammer.READY) { - return; - } + Hammer.EVENT_TYPES[Hammer.EVENT_START] = types[0]; + Hammer.EVENT_TYPES[Hammer.EVENT_MOVE] = types[1]; + Hammer.EVENT_TYPES[Hammer.EVENT_END] = types[2]; + }, - // find what eventtypes we add listeners to - Hammer.event.determineEventTypes(); - // Register all gestures inside Hammer.gestures - for(var name in Hammer.gestures) { - if(Hammer.gestures.hasOwnProperty(name)) { - Hammer.detection.register(Hammer.gestures[name]); + /** + * create touchlist depending on the event + * @param {Object} ev + * @param {String} eventType used by the fakemultitouch plugin + */ + getTouchList: function getTouchList(ev/*, eventType*/) { + // get the fake pointerEvent touchlist + if(Hammer.HAS_POINTEREVENTS) { + return Hammer.PointerEvent.getTouchList(); } - } + // get the touchlist + else if(ev.touches) { + return ev.touches; + } + // make fake touchlist from mouse position + else { + return [{ + identifier: 1, + pageX: ev.pageX, + pageY: ev.pageY, + target: ev.target + }]; + } + }, - // Add touch events on the document - Hammer.event.onTouch(Hammer.DOCUMENT, Hammer.EVENT_MOVE, Hammer.detection.detect); - Hammer.event.onTouch(Hammer.DOCUMENT, Hammer.EVENT_END, Hammer.detection.detect); - // Hammer is ready...! - Hammer.READY = true; - } + /** + * collect event data for Hammer js + * @param {HTMLElement} element + * @param {String} eventType like Hammer.EVENT_MOVE + * @param {Object} eventData + */ + collectEventData: function collectEventData(element, eventType, ev) { + var touches = this.getTouchList(ev, eventType); - /** - * create new hammer instance - * all methods should return the instance itself, so it is chainable. - * @param {HTMLElement} element - * @param {Object} [options={}] - * @returns {Hammer.Instance} - * @constructor - */ - Hammer.Instance = function(element, options) { - var self = this; + // find out pointerType + var pointerType = Hammer.POINTER_TOUCH; + if(ev.type.match(/mouse/) || Hammer.PointerEvent.matchType(Hammer.POINTER_MOUSE, ev)) { + pointerType = Hammer.POINTER_MOUSE; + } - // setup HammerJS window events and register all gestures - // this also sets up the default options - setup(); + return { + center : Hammer.utils.getCenter(touches), + timeStamp : new Date().getTime(), + target : ev.target, + touches : touches, + eventType : eventType, + pointerType : pointerType, + srcEvent : ev, - this.element = element; + /** + * prevent the browser default actions + * mostly used to disable scrolling of the browser + */ + preventDefault: function() { + if(this.srcEvent.preventManipulation) { + this.srcEvent.preventManipulation(); + } - // start/stop detection option - this.enabled = true; + if(this.srcEvent.preventDefault) { + this.srcEvent.preventDefault(); + } + }, - // merge options - this.options = Hammer.utils.extend( - Hammer.utils.extend({}, Hammer.defaults), - options || {}); + /** + * stop bubbling the event up to its parents + */ + stopPropagation: function() { + this.srcEvent.stopPropagation(); + }, - // add some css to the element to prevent the browser from doing its native behavoir - if(this.options.stop_browser_behavior) { - Hammer.utils.stopDefaultBrowserBehavior(this.element, this.options.stop_browser_behavior); + /** + * immediately stop gesture detection + * might be useful after a swipe was detected + * @return {*} + */ + stopDetect: function() { + return Hammer.detection.stopDetect(); + } + }; } - - // start detection on touchstart - Hammer.event.onTouch(element, Hammer.EVENT_START, function(ev) { - if(self.enabled) { - Hammer.detection.startDetect(self, ev); - } - }); - - // return instance - return this; }; + Hammer.PointerEvent = { + /** + * holds all pointers + * @type {Object} + */ + pointers: {}, - Hammer.Instance.prototype = { /** - * bind events to the instance - * @param {String} gesture - * @param {Function} handler - * @returns {Hammer.Instance} + * get a list of pointers + * @returns {Array} touchlist */ - on: function onEvent(gesture, handler){ - var gestures = gesture.split(' '); - for(var t=0; t 0 && eventType == Hammer.EVENT_END) { - eventType = Hammer.EVENT_MOVE; - } - // no touches, force the end event - else if(!count_touches) { - eventType = Hammer.EVENT_END; - } + for(var t= 0,len=touches.length; t= y) { + return touch1.pageX - touch2.pageX > 0 ? Hammer.DIRECTION_LEFT : Hammer.DIRECTION_RIGHT; } - // for non pointer events browsers and mixed browsers, - // like chrome on windows8 touch laptop else { - types = [ - 'touchstart mousedown', - 'touchmove mousemove', - 'touchend touchcancel mouseup']; + return touch1.pageY - touch2.pageY > 0 ? Hammer.DIRECTION_UP : Hammer.DIRECTION_DOWN; } + }, - Hammer.EVENT_TYPES[Hammer.EVENT_START] = types[0]; - Hammer.EVENT_TYPES[Hammer.EVENT_MOVE] = types[1]; - Hammer.EVENT_TYPES[Hammer.EVENT_END] = types[2]; + + /** + * calculate the distance between two touches + * @param {Touch} touch1 + * @param {Touch} touch2 + * @returns {Number} distance + */ + getDistance: function getDistance(touch1, touch2) { + var x = touch2.pageX - touch1.pageX, + y = touch2.pageY - touch1.pageY; + return Math.sqrt((x*x) + (y*y)); }, /** - * create touchlist depending on the event - * @param {Object} ev - * @param {String} eventType used by the fakemultitouch plugin + * calculate the scale factor between two touchLists (fingers) + * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out + * @param {Array} start + * @param {Array} end + * @returns {Number} scale */ - getTouchList: function getTouchList(ev/*, eventType*/) { - // get the fake pointerEvent touchlist - if(Hammer.HAS_POINTEREVENTS) { - return Hammer.PointerEvent.getTouchList(); - } - // get the touchlist - else if(ev.touches) { - return ev.touches; + getScale: function getScale(start, end) { + // need two fingers... + if(start.length >= 2 && end.length >= 2) { + return this.getDistance(end[0], end[1]) / + this.getDistance(start[0], start[1]); } - // make fake touchlist from mouse position - else { - return [{ - identifier: 1, - pageX: ev.pageX, - pageY: ev.pageY, - target: ev.target - }]; + return 1; + }, + + + /** + * calculate the rotation degrees between two touchLists (fingers) + * @param {Array} start + * @param {Array} end + * @returns {Number} rotation + */ + getRotation: function getRotation(start, end) { + // need two fingers + if(start.length >= 2 && end.length >= 2) { + return this.getAngle(end[1], end[0]) - + this.getAngle(start[1], start[0]); } + return 0; }, /** - * collect event data for Hammer js - * @param {HTMLElement} element - * @param {String} eventType like Hammer.EVENT_MOVE - * @param {Object} eventData + * boolean if the direction is vertical + * @param {String} direction + * @returns {Boolean} is_vertical + */ + isVertical: function isVertical(direction) { + return (direction == Hammer.DIRECTION_UP || direction == Hammer.DIRECTION_DOWN); + }, + + + /** + * stop browser default behavior with css props + * @param {HtmlElement} element + * @param {Object} css_props */ - collectEventData: function collectEventData(element, eventType, ev) { - var touches = this.getTouchList(ev, eventType); + stopDefaultBrowserBehavior: function stopDefaultBrowserBehavior(element, css_props) { + var prop, + vendors = ['webkit','khtml','moz','ms','o','']; - // find out pointerType - var pointerType = Hammer.POINTER_TOUCH; - if(ev.type.match(/mouse/) || Hammer.PointerEvent.matchType(Hammer.POINTER_MOUSE, ev)) { - pointerType = Hammer.POINTER_MOUSE; + if(!css_props || !element.style) { + return; } - return { - center : Hammer.utils.getCenter(touches), - timeStamp : new Date().getTime(), - target : ev.target, - touches : touches, - eventType : eventType, - pointerType : pointerType, - srcEvent : ev, + // with css properties for modern browsers + for(var i = 0; i < vendors.length; i++) { + for(var p in css_props) { + if(css_props.hasOwnProperty(p)) { + prop = p; - /** - * prevent the browser default actions - * mostly used to disable scrolling of the browser - */ - preventDefault: function() { - if(this.srcEvent.preventManipulation) { - this.srcEvent.preventManipulation(); - } + // vender prefix at the property + if(vendors[i]) { + prop = vendors[i] + prop.substring(0, 1).toUpperCase() + prop.substring(1); + } - if(this.srcEvent.preventDefault) { - this.srcEvent.preventDefault(); + // set the style + element.style[prop] = css_props[p]; } - }, - - /** - * stop bubbling the event up to its parents - */ - stopPropagation: function() { - this.srcEvent.stopPropagation(); - }, - - /** - * immediately stop gesture detection - * might be useful after a swipe was detected - * @return {*} - */ - stopDetect: function() { - return Hammer.detection.stopDetect(); } - }; + } + + // also the disable onselectstart + if(css_props.userSelect == 'none') { + element.onselectstart = function() { + return false; + }; + } } }; - Hammer.PointerEvent = { - /** - * holds all pointers - * @type {Object} - */ - pointers: {}, + Hammer.detection = { + // contains all registred Hammer.gestures in the correct order + gestures: [], + + // data of the current Hammer.gesture detection session + current: null, + + // the previous Hammer.gesture session data + // is a full clone of the previous gesture.current object + previous: null, + + // when this becomes true, no gestures are fired + stopped: false, + /** - * get a list of pointers - * @returns {Array} touchlist + * start Hammer.gesture detection + * @param {Hammer.Instance} inst + * @param {Object} eventData */ - getTouchList: function() { - var self = this; - var touchlist = []; + startDetect: function startDetect(inst, eventData) { + // already busy with a Hammer.gesture detection on an element + if(this.current) { + return; + } - // we can use forEach since pointerEvents only is in IE10 - Object.keys(self.pointers).sort().forEach(function(id) { - touchlist.push(self.pointers[id]); - }); - return touchlist; + this.stopped = false; + + this.current = { + inst : inst, // reference to HammerInstance we're working for + startEvent : Hammer.utils.extend({}, eventData), // start eventData for distances, timing etc + lastEvent : false, // last eventData + name : '' // current gesture we're in/detected, can be 'tap', 'hold' etc + }; + + this.detect(eventData); }, + /** - * update the position of a pointer - * @param {String} type Hammer.EVENT_END - * @param {Object} pointerEvent + * Hammer.gesture detection + * @param {Object} eventData + * @param {Object} eventData */ - updatePointer: function(type, pointerEvent) { - if(type == Hammer.EVENT_END) { - this.pointers = {}; + detect: function detect(eventData) { + if(!this.current || this.stopped) { + return; } - else { - pointerEvent.identifier = pointerEvent.pointerId; - this.pointers[pointerEvent.pointerId] = pointerEvent; + + // extend event data with calculations about scale, distance etc + eventData = this.extendEventData(eventData); + + // instance options + var inst_options = this.current.inst.options; + + // call Hammer.gesture handlers + for(var g=0,len=this.gestures.length; g b.index) { + return 1; + } + return 0; + }); - /** - * calculate the velocity between two points - * @param {Number} delta_time - * @param {Number} delta_x - * @param {Number} delta_y - * @returns {Object} velocity - */ - getVelocity: function getVelocity(delta_time, delta_x, delta_y) { - return { - x: Math.abs(delta_x / delta_time) || 0, - y: Math.abs(delta_y / delta_time) || 0 - }; - }, + return this.gestures; + } + }; - /** - * calculate the angle between two coordinates - * @param {Touch} touch1 - * @param {Touch} touch2 - * @returns {Number} angle - */ - getAngle: function getAngle(touch1, touch2) { - var y = touch2.pageY - touch1.pageY, - x = touch2.pageX - touch1.pageX; - return Math.atan2(y, x) * 180 / Math.PI; - }, + Hammer.gestures = Hammer.gestures || {}; + /** + * Custom gestures + * ============================== + * + * Gesture object + * -------------------- + * The object structure of a gesture: + * + * { name: 'mygesture', + * index: 1337, + * defaults: { + * mygesture_option: true + * } + * handler: function(type, ev, inst) { + * // trigger gesture event + * inst.trigger(this.name, ev); + * } + * } - /** - * angle to direction define - * @param {Touch} touch1 - * @param {Touch} touch2 - * @returns {String} direction constant, like Hammer.DIRECTION_LEFT - */ - getDirection: function getDirection(touch1, touch2) { - var x = Math.abs(touch1.pageX - touch2.pageX), - y = Math.abs(touch1.pageY - touch2.pageY); + * @param {String} name + * this should be the name of the gesture, lowercase + * it is also being used to disable/enable the gesture per instance config. + * + * @param {Number} [index=1000] + * the index of the gesture, where it is going to be in the stack of gestures detection + * like when you build an gesture that depends on the drag gesture, it is a good + * idea to place it after the index of the drag gesture. + * + * @param {Object} [defaults={}] + * the default settings of the gesture. these are added to the instance settings, + * and can be overruled per instance. you can also add the name of the gesture, + * but this is also added by default (and set to true). + * + * @param {Function} handler + * this handles the gesture detection of your custom gesture and receives the + * following arguments: + * + * @param {Object} eventData + * event data containing the following properties: + * timeStamp {Number} time the event occurred + * target {HTMLElement} target element + * touches {Array} touches (fingers, pointers, mouse) on the screen + * pointerType {String} kind of pointer that was used. matches Hammer.POINTER_MOUSE|TOUCH + * center {Object} center position of the touches. contains pageX and pageY + * deltaTime {Number} the total time of the touches in the screen + * deltaX {Number} the delta on x axis we haved moved + * deltaY {Number} the delta on y axis we haved moved + * velocityX {Number} the velocity on the x + * velocityY {Number} the velocity on y + * angle {Number} the angle we are moving + * direction {String} the direction we are moving. matches Hammer.DIRECTION_UP|DOWN|LEFT|RIGHT + * distance {Number} the distance we haved moved + * scale {Number} scaling of the touches, needs 2 touches + * rotation {Number} rotation of the touches, needs 2 touches * + * eventType {String} matches Hammer.EVENT_START|MOVE|END + * srcEvent {Object} the source event, like TouchStart or MouseDown * + * startEvent {Object} contains the same properties as above, + * but from the first touch. this is used to calculate + * distances, deltaTime, scaling etc + * + * @param {Hammer.Instance} inst + * the instance we are doing the detection for. you can get the options from + * the inst.options object and trigger the gesture event by calling inst.trigger + * + * + * Handle gestures + * -------------------- + * inside the handler you can get/set Hammer.detection.current. This is the current + * detection session. It has the following properties + * @param {String} name + * contains the name of the gesture we have detected. it has not a real function, + * only to check in other gestures if something is detected. + * like in the drag gesture we set it to 'drag' and in the swipe gesture we can + * check if the current gesture is 'drag' by accessing Hammer.detection.current.name + * + * @readonly + * @param {Hammer.Instance} inst + * the instance we do the detection for + * + * @readonly + * @param {Object} startEvent + * contains the properties of the first gesture detection in this session. + * Used for calculations about timing, distance, etc. + * + * @readonly + * @param {Object} lastEvent + * contains all the properties of the last gesture detect in this session. + * + * after the gesture detection session has been completed (user has released the screen) + * the Hammer.detection.current object is copied into Hammer.detection.previous, + * this is usefull for gestures like doubletap, where you need to know if the + * previous gesture was a tap + * + * options that have been set by the instance can be received by calling inst.options + * + * You can trigger a gesture event by calling inst.trigger("mygesture", event). + * The first param is the name of your gesture, the second the event argument + * + * + * Register gestures + * -------------------- + * When an gesture is added to the Hammer.gestures object, it is auto registered + * at the setup of the first Hammer instance. You can also call Hammer.detection.register + * manually and pass your gesture object as a param + * + */ - if(x >= y) { - return touch1.pageX - touch2.pageX > 0 ? Hammer.DIRECTION_LEFT : Hammer.DIRECTION_RIGHT; - } - else { - return touch1.pageY - touch2.pageY > 0 ? Hammer.DIRECTION_UP : Hammer.DIRECTION_DOWN; - } + /** + * Hold + * Touch stays at the same place for x time + * @events hold + */ + Hammer.gestures.Hold = { + name: 'hold', + index: 10, + defaults: { + hold_timeout : 500, + hold_threshold : 1 }, + timer: null, + handler: function holdGesture(ev, inst) { + switch(ev.eventType) { + case Hammer.EVENT_START: + // clear any running timers + clearTimeout(this.timer); + // set the gesture so we can check in the timeout if it still is + Hammer.detection.current.name = this.name; - /** - * calculate the distance between two touches - * @param {Touch} touch1 - * @param {Touch} touch2 - * @returns {Number} distance - */ - getDistance: function getDistance(touch1, touch2) { - var x = touch2.pageX - touch1.pageX, - y = touch2.pageY - touch1.pageY; - return Math.sqrt((x*x) + (y*y)); - }, + // set timer and if after the timeout it still is hold, + // we trigger the hold event + this.timer = setTimeout(function() { + if(Hammer.detection.current.name == 'hold') { + inst.trigger('hold', ev); + } + }, inst.options.hold_timeout); + break; + + // when you move or end we clear the timer + case Hammer.EVENT_MOVE: + if(ev.distance > inst.options.hold_threshold) { + clearTimeout(this.timer); + } + break; + + case Hammer.EVENT_END: + clearTimeout(this.timer); + break; + } + } + }; - /** - * calculate the scale factor between two touchLists (fingers) - * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out - * @param {Array} start - * @param {Array} end - * @returns {Number} scale - */ - getScale: function getScale(start, end) { - // need two fingers... - if(start.length >= 2 && end.length >= 2) { - return this.getDistance(end[0], end[1]) / - this.getDistance(start[0], start[1]); - } - return 1; + /** + * Tap/DoubleTap + * Quick touch at a place or double at the same place + * @events tap, doubletap + */ + Hammer.gestures.Tap = { + name: 'tap', + index: 100, + defaults: { + tap_max_touchtime : 250, + tap_max_distance : 10, + tap_always : true, + doubletap_distance : 20, + doubletap_interval : 300 }, + handler: function tapGesture(ev, inst) { + if(ev.eventType == Hammer.EVENT_END) { + // previous gesture, for the double tap since these are two different gesture detections + var prev = Hammer.detection.previous, + did_doubletap = false; + // when the touchtime is higher then the max touch time + // or when the moving distance is too much + if(ev.deltaTime > inst.options.tap_max_touchtime || + ev.distance > inst.options.tap_max_distance) { + return; + } - /** - * calculate the rotation degrees between two touchLists (fingers) - * @param {Array} start - * @param {Array} end - * @returns {Number} rotation - */ - getRotation: function getRotation(start, end) { - // need two fingers - if(start.length >= 2 && end.length >= 2) { - return this.getAngle(end[1], end[0]) - - this.getAngle(start[1], start[0]); + // check if double tap + if(prev && prev.name == 'tap' && + (ev.timeStamp - prev.lastEvent.timeStamp) < inst.options.doubletap_interval && + ev.distance < inst.options.doubletap_distance) { + inst.trigger('doubletap', ev); + did_doubletap = true; + } + + // do a single tap + if(!did_doubletap || inst.options.tap_always) { + Hammer.detection.current.name = 'tap'; + inst.trigger(Hammer.detection.current.name, ev); + } } - return 0; - }, + } + }; - /** - * boolean if the direction is vertical - * @param {String} direction - * @returns {Boolean} is_vertical - */ - isVertical: function isVertical(direction) { - return (direction == Hammer.DIRECTION_UP || direction == Hammer.DIRECTION_DOWN); + /** + * Swipe + * triggers swipe events when the end velocity is above the threshold + * @events swipe, swipeleft, swiperight, swipeup, swipedown + */ + Hammer.gestures.Swipe = { + name: 'swipe', + index: 40, + defaults: { + // set 0 for unlimited, but this can conflict with transform + swipe_max_touches : 1, + swipe_velocity : 0.7 }, + handler: function swipeGesture(ev, inst) { + if(ev.eventType == Hammer.EVENT_END) { + // max touches + if(inst.options.swipe_max_touches > 0 && + ev.touches.length > inst.options.swipe_max_touches) { + return; + } + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(ev.velocityX > inst.options.swipe_velocity || + ev.velocityY > inst.options.swipe_velocity) { + // trigger swipe events + inst.trigger(this.name, ev); + inst.trigger(this.name + ev.direction, ev); + } + } + } + }; - /** - * stop browser default behavior with css props - * @param {HtmlElement} element - * @param {Object} css_props - */ - stopDefaultBrowserBehavior: function stopDefaultBrowserBehavior(element, css_props) { - var prop, - vendors = ['webkit','khtml','moz','ms','o','']; - if(!css_props || !element.style) { + /** + * Drag + * Move with x fingers (default 1) around on the page. Blocking the scrolling when + * moving left and right is a good practice. When all the drag events are blocking + * you disable scrolling on that area. + * @events drag, drapleft, dragright, dragup, dragdown + */ + Hammer.gestures.Drag = { + name: 'drag', + index: 50, + defaults: { + drag_min_distance : 10, + // set 0 for unlimited, but this can conflict with transform + drag_max_touches : 1, + // prevent default browser behavior when dragging occurs + // be careful with it, it makes the element a blocking element + // when you are using the drag gesture, it is a good practice to set this true + drag_block_horizontal : false, + drag_block_vertical : false, + // drag_lock_to_axis keeps the drag gesture on the axis that it started on, + // It disallows vertical directions if the initial direction was horizontal, and vice versa. + drag_lock_to_axis : false, + // drag lock only kicks in when distance > drag_lock_min_distance + // This way, locking occurs only when the distance has become large enough to reliably determine the direction + drag_lock_min_distance : 25 + }, + triggered: false, + handler: function dragGesture(ev, inst) { + // current gesture isnt drag, but dragged is true + // this means an other gesture is busy. now call dragend + if(Hammer.detection.current.name != this.name && this.triggered) { + inst.trigger(this.name +'end', ev); + this.triggered = false; return; } - // with css properties for modern browsers - for(var i = 0; i < vendors.length; i++) { - for(var p in css_props) { - if(css_props.hasOwnProperty(p)) { - prop = p; + // max touches + if(inst.options.drag_max_touches > 0 && + ev.touches.length > inst.options.drag_max_touches) { + return; + } - // vender prefix at the property - if(vendors[i]) { - prop = vendors[i] + prop.substring(0, 1).toUpperCase() + prop.substring(1); + switch(ev.eventType) { + case Hammer.EVENT_START: + this.triggered = false; + break; + + case Hammer.EVENT_MOVE: + // when the distance we moved is too small we skip this gesture + // or we can be already in dragging + if(ev.distance < inst.options.drag_min_distance && + Hammer.detection.current.name != this.name) { + return; + } + + // we are dragging! + Hammer.detection.current.name = this.name; + + // lock drag to axis? + if(Hammer.detection.current.lastEvent.drag_locked_to_axis || (inst.options.drag_lock_to_axis && inst.options.drag_lock_min_distance<=ev.distance)) { + ev.drag_locked_to_axis = true; + } + var last_direction = Hammer.detection.current.lastEvent.direction; + if(ev.drag_locked_to_axis && last_direction !== ev.direction) { + // keep direction on the axis that the drag gesture started on + if(Hammer.utils.isVertical(last_direction)) { + ev.direction = (ev.deltaY < 0) ? Hammer.DIRECTION_UP : Hammer.DIRECTION_DOWN; } + else { + ev.direction = (ev.deltaX < 0) ? Hammer.DIRECTION_LEFT : Hammer.DIRECTION_RIGHT; + } + } - // set the style - element.style[prop] = css_props[p]; + // first time, trigger dragstart event + if(!this.triggered) { + inst.trigger(this.name +'start', ev); + this.triggered = true; } - } - } - // also the disable onselectstart - if(css_props.userSelect == 'none') { - element.onselectstart = function() { - return false; - }; - } - } - }; + // trigger normal event + inst.trigger(this.name, ev); - Hammer.detection = { - // contains all registred Hammer.gestures in the correct order - gestures: [], + // direction event, like dragdown + inst.trigger(this.name + ev.direction, ev); - // data of the current Hammer.gesture detection session - current: null, + // block the browser events + if( (inst.options.drag_block_vertical && Hammer.utils.isVertical(ev.direction)) || + (inst.options.drag_block_horizontal && !Hammer.utils.isVertical(ev.direction))) { + ev.preventDefault(); + } + break; - // the previous Hammer.gesture session data - // is a full clone of the previous gesture.current object - previous: null, + case Hammer.EVENT_END: + // trigger dragend + if(this.triggered) { + inst.trigger(this.name +'end', ev); + } - // when this becomes true, no gestures are fired - stopped: false, + this.triggered = false; + break; + } + } + }; - /** - * start Hammer.gesture detection - * @param {Hammer.Instance} inst - * @param {Object} eventData - */ - startDetect: function startDetect(inst, eventData) { - // already busy with a Hammer.gesture detection on an element - if(this.current) { + /** + * Transform + * User want to scale or rotate with 2 fingers + * @events transform, pinch, pinchin, pinchout, rotate + */ + Hammer.gestures.Transform = { + name: 'transform', + index: 45, + defaults: { + // factor, no scale is 1, zoomin is to 0 and zoomout until higher then 1 + transform_min_scale : 0.01, + // rotation in degrees + transform_min_rotation : 1, + // prevent default browser behavior when two touches are on the screen + // but it makes the element a blocking element + // when you are using the transform gesture, it is a good practice to set this true + transform_always_block : false + }, + triggered: false, + handler: function transformGesture(ev, inst) { + // current gesture isnt drag, but dragged is true + // this means an other gesture is busy. now call dragend + if(Hammer.detection.current.name != this.name && this.triggered) { + inst.trigger(this.name +'end', ev); + this.triggered = false; return; } - this.stopped = false; - - this.current = { - inst : inst, // reference to HammerInstance we're working for - startEvent : Hammer.utils.extend({}, eventData), // start eventData for distances, timing etc - lastEvent : false, // last eventData - name : '' // current gesture we're in/detected, can be 'tap', 'hold' etc - }; - - this.detect(eventData); - }, - - - /** - * Hammer.gesture detection - * @param {Object} eventData - * @param {Object} eventData - */ - detect: function detect(eventData) { - if(!this.current || this.stopped) { + // atleast multitouch + if(ev.touches.length < 2) { return; } - // extend event data with calculations about scale, distance etc - eventData = this.extendEventData(eventData); + // prevent default when two fingers are on the screen + if(inst.options.transform_always_block) { + ev.preventDefault(); + } - // instance options - var inst_options = this.current.inst.options; + switch(ev.eventType) { + case Hammer.EVENT_START: + this.triggered = false; + break; - // call Hammer.gesture handlers - for(var g=0,len=this.gestures.length; g inst.options.transform_min_rotation) { + inst.trigger('rotate', ev); + } - /** - * clear the Hammer.gesture vars - * this is called on endDetect, but can also be used when a final Hammer.gesture has been detected - * to stop other Hammer.gestures from being fired - */ - stopDetect: function stopDetect() { - // clone current data to the store as the previous gesture - // used for the double tap gesture, since this is an other gesture detect session - this.previous = Hammer.utils.extend({}, this.current); + // trigger pinch event + if(scale_threshold > inst.options.transform_min_scale) { + inst.trigger('pinch', ev); + inst.trigger('pinch'+ ((ev.scale < 1) ? 'in' : 'out'), ev); + } + break; - // reset the current - this.current = null; + case Hammer.EVENT_END: + // trigger dragend + if(this.triggered) { + inst.trigger(this.name +'end', ev); + } - // stopped! - this.stopped = true; - }, + this.triggered = false; + break; + } + } + }; - /** - * extend eventData for Hammer.gestures - * @param {Object} ev - * @returns {Object} ev - */ - extendEventData: function extendEventData(ev) { - var startEv = this.current.startEvent; + /** + * Touch + * Called as first, tells the user has touched the screen + * @events touch + */ + Hammer.gestures.Touch = { + name: 'touch', + index: -Infinity, + defaults: { + // call preventDefault at touchstart, and makes the element blocking by + // disabling the scrolling of the page, but it improves gestures like + // transforming and dragging. + // be careful with using this, it can be very annoying for users to be stuck + // on the page + prevent_default: false, - // if the touches change, set the new touches over the startEvent touches - // this because touchevents don't have all the touches on touchstart, or the - // user must place his fingers at the EXACT same time on the screen, which is not realistic - // but, sometimes it happens that both fingers are touching at the EXACT same time - if(startEv && (ev.touches.length != startEv.touches.length || ev.touches === startEv.touches)) { - // extend 1 level deep to get the touchlist with the touch objects - startEv.touches = []; - for(var i=0,len=ev.touches.length; i b.index) { - return 1; - } - return 0; - }); + this.constants.physics.centralGravity = this.constants.physics.hierarchicalRepulsion.centralGravity; + this.constants.physics.springLength = this.constants.physics.hierarchicalRepulsion.springLength; + this.constants.physics.springConstant = this.constants.physics.hierarchicalRepulsion.springConstant; + this.constants.physics.damping = this.constants.physics.hierarchicalRepulsion.damping; - return this.gestures; - } - }; + this._loadMixin(HierarchialRepulsionMixin); + } + else { + this._clearMixin(BarnesHutMixin); + this._clearMixin(HierarchialRepulsionMixin); + this.barnesHutTree = undefined; + this.constants.physics.centralGravity = this.constants.physics.repulsion.centralGravity; + this.constants.physics.springLength = this.constants.physics.repulsion.springLength; + this.constants.physics.springConstant = this.constants.physics.repulsion.springConstant; + this.constants.physics.damping = this.constants.physics.repulsion.damping; - Hammer.gestures = Hammer.gestures || {}; + this._loadMixin(RepulsionMixin); + } + }; /** - * Custom gestures - * ============================== - * - * Gesture object - * -------------------- - * The object structure of a gesture: - * - * { name: 'mygesture', - * index: 1337, - * defaults: { - * mygesture_option: true - * } - * handler: function(type, ev, inst) { - * // trigger gesture event - * inst.trigger(this.name, ev); - * } - * } - - * @param {String} name - * this should be the name of the gesture, lowercase - * it is also being used to disable/enable the gesture per instance config. - * - * @param {Number} [index=1000] - * the index of the gesture, where it is going to be in the stack of gestures detection - * like when you build an gesture that depends on the drag gesture, it is a good - * idea to place it after the index of the drag gesture. - * - * @param {Object} [defaults={}] - * the default settings of the gesture. these are added to the instance settings, - * and can be overruled per instance. you can also add the name of the gesture, - * but this is also added by default (and set to true). - * - * @param {Function} handler - * this handles the gesture detection of your custom gesture and receives the - * following arguments: - * - * @param {Object} eventData - * event data containing the following properties: - * timeStamp {Number} time the event occurred - * target {HTMLElement} target element - * touches {Array} touches (fingers, pointers, mouse) on the screen - * pointerType {String} kind of pointer that was used. matches Hammer.POINTER_MOUSE|TOUCH - * center {Object} center position of the touches. contains pageX and pageY - * deltaTime {Number} the total time of the touches in the screen - * deltaX {Number} the delta on x axis we haved moved - * deltaY {Number} the delta on y axis we haved moved - * velocityX {Number} the velocity on the x - * velocityY {Number} the velocity on y - * angle {Number} the angle we are moving - * direction {String} the direction we are moving. matches Hammer.DIRECTION_UP|DOWN|LEFT|RIGHT - * distance {Number} the distance we haved moved - * scale {Number} scaling of the touches, needs 2 touches - * rotation {Number} rotation of the touches, needs 2 touches * - * eventType {String} matches Hammer.EVENT_START|MOVE|END - * srcEvent {Object} the source event, like TouchStart or MouseDown * - * startEvent {Object} contains the same properties as above, - * but from the first touch. this is used to calculate - * distances, deltaTime, scaling etc - * - * @param {Hammer.Instance} inst - * the instance we are doing the detection for. you can get the options from - * the inst.options object and trigger the gesture event by calling inst.trigger - * - * - * Handle gestures - * -------------------- - * inside the handler you can get/set Hammer.detection.current. This is the current - * detection session. It has the following properties - * @param {String} name - * contains the name of the gesture we have detected. it has not a real function, - * only to check in other gestures if something is detected. - * like in the drag gesture we set it to 'drag' and in the swipe gesture we can - * check if the current gesture is 'drag' by accessing Hammer.detection.current.name - * - * @readonly - * @param {Hammer.Instance} inst - * the instance we do the detection for - * - * @readonly - * @param {Object} startEvent - * contains the properties of the first gesture detection in this session. - * Used for calculations about timing, distance, etc. - * - * @readonly - * @param {Object} lastEvent - * contains all the properties of the last gesture detect in this session. - * - * after the gesture detection session has been completed (user has released the screen) - * the Hammer.detection.current object is copied into Hammer.detection.previous, - * this is usefull for gestures like doubletap, where you need to know if the - * previous gesture was a tap - * - * options that have been set by the instance can be received by calling inst.options - * - * You can trigger a gesture event by calling inst.trigger("mygesture", event). - * The first param is the name of your gesture, the second the event argument - * - * - * Register gestures - * -------------------- - * When an gesture is added to the Hammer.gestures object, it is auto registered - * at the setup of the first Hammer instance. You can also call Hammer.detection.register - * manually and pass your gesture object as a param + * Before calculating the forces, we check if we need to cluster to keep up performance and we check + * if there is more than one node. If it is just one node, we dont calculate anything. * + * @private */ + exports._initializeForceCalculation = function () { + // stop calculation if there is only one node + if (this.nodeIndices.length == 1) { + this.nodes[this.nodeIndices[0]]._setForce(0, 0); + } + else { + // if there are too many nodes on screen, we cluster without repositioning + if (this.nodeIndices.length > this.constants.clustering.clusterThreshold && this.constants.clustering.enabled == true) { + this.clusterToFit(this.constants.clustering.reduceToNodes, false); + } + + // we now start the force calculation + this._calculateForces(); + } + }; + /** - * Hold - * Touch stays at the same place for x time - * @events hold + * Calculate the external forces acting on the nodes + * Forces are caused by: edges, repulsing forces between nodes, gravity + * @private */ - Hammer.gestures.Hold = { - name: 'hold', - index: 10, - defaults: { - hold_timeout : 500, - hold_threshold : 1 - }, - timer: null, - handler: function holdGesture(ev, inst) { - switch(ev.eventType) { - case Hammer.EVENT_START: - // clear any running timers - clearTimeout(this.timer); + exports._calculateForces = function () { + // Gravity is required to keep separated groups from floating off + // the forces are reset to zero in this loop by using _setForce instead + // of _addForce - // set the gesture so we can check in the timeout if it still is - Hammer.detection.current.name = this.name; + this._calculateGravitationalForces(); + this._calculateNodeForces(); - // set timer and if after the timeout it still is hold, - // we trigger the hold event - this.timer = setTimeout(function() { - if(Hammer.detection.current.name == 'hold') { - inst.trigger('hold', ev); - } - }, inst.options.hold_timeout); - break; + if (this.constants.springConstant > 0) { + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this._calculateSpringForcesWithSupport(); + } + else { + if (this.constants.physics.hierarchicalRepulsion.enabled == true) { + this._calculateHierarchicalSpringForces(); + } + else { + this._calculateSpringForces(); + } + } + } + }; - // when you move or end we clear the timer - case Hammer.EVENT_MOVE: - if(ev.distance > inst.options.hold_threshold) { - clearTimeout(this.timer); - } - break; - case Hammer.EVENT_END: - clearTimeout(this.timer); - break; + /** + * Smooth curves are created by adding invisible nodes in the center of the edges. These nodes are also + * handled in the calculateForces function. We then use a quadratic curve with the center node as control. + * This function joins the datanodes and invisible (called support) nodes into one object. + * We do this so we do not contaminate this.nodes with the support nodes. + * + * @private + */ + exports._updateCalculationNodes = function () { + if (this.constants.smoothCurves.enabled == true && this.constants.smoothCurves.dynamic == true) { + this.calculationNodes = {}; + this.calculationNodeIndices = []; + + for (var nodeId in this.nodes) { + if (this.nodes.hasOwnProperty(nodeId)) { + this.calculationNodes[nodeId] = this.nodes[nodeId]; + } + } + var supportNodes = this.sectors['support']['nodes']; + for (var supportNodeId in supportNodes) { + if (supportNodes.hasOwnProperty(supportNodeId)) { + if (this.edges.hasOwnProperty(supportNodes[supportNodeId].parentEdgeId)) { + this.calculationNodes[supportNodeId] = supportNodes[supportNodeId]; + } + else { + supportNodes[supportNodeId]._setForce(0, 0); } + } + } + + for (var idx in this.calculationNodes) { + if (this.calculationNodes.hasOwnProperty(idx)) { + this.calculationNodeIndices.push(idx); + } } + } + else { + this.calculationNodes = this.nodes; + this.calculationNodeIndices = this.nodeIndices; + } }; /** - * Tap/DoubleTap - * Quick touch at a place or double at the same place - * @events tap, doubletap + * this function applies the central gravity effect to keep groups from floating off + * + * @private */ - Hammer.gestures.Tap = { - name: 'tap', - index: 100, - defaults: { - tap_max_touchtime : 250, - tap_max_distance : 10, - tap_always : true, - doubletap_distance : 20, - doubletap_interval : 300 - }, - handler: function tapGesture(ev, inst) { - if(ev.eventType == Hammer.EVENT_END) { - // previous gesture, for the double tap since these are two different gesture detections - var prev = Hammer.detection.previous, - did_doubletap = false; - - // when the touchtime is higher then the max touch time - // or when the moving distance is too much - if(ev.deltaTime > inst.options.tap_max_touchtime || - ev.distance > inst.options.tap_max_distance) { - return; - } + exports._calculateGravitationalForces = function () { + var dx, dy, distance, node, i; + var nodes = this.calculationNodes; + var gravity = this.constants.physics.centralGravity; + var gravityForce = 0; - // check if double tap - if(prev && prev.name == 'tap' && - (ev.timeStamp - prev.lastEvent.timeStamp) < inst.options.doubletap_interval && - ev.distance < inst.options.doubletap_distance) { - inst.trigger('doubletap', ev); - did_doubletap = true; - } + for (i = 0; i < this.calculationNodeIndices.length; i++) { + node = nodes[this.calculationNodeIndices[i]]; + node.damping = this.constants.physics.damping; // possibly add function to alter damping properties of clusters. + // gravity does not apply when we are in a pocket sector + if (this._sector() == "default" && gravity != 0) { + dx = -node.x; + dy = -node.y; + distance = Math.sqrt(dx * dx + dy * dy); - // do a single tap - if(!did_doubletap || inst.options.tap_always) { - Hammer.detection.current.name = 'tap'; - inst.trigger(Hammer.detection.current.name, ev); - } - } + gravityForce = (distance == 0) ? 0 : (gravity / distance); + node.fx = dx * gravityForce; + node.fy = dy * gravityForce; + } + else { + node.fx = 0; + node.fy = 0; } + } }; + + /** - * Swipe - * triggers swipe events when the end velocity is above the threshold - * @events swipe, swipeleft, swiperight, swipeup, swipedown + * this function calculates the effects of the springs in the case of unsmooth curves. + * + * @private */ - Hammer.gestures.Swipe = { - name: 'swipe', - index: 40, - defaults: { - // set 0 for unlimited, but this can conflict with transform - swipe_max_touches : 1, - swipe_velocity : 0.7 - }, - handler: function swipeGesture(ev, inst) { - if(ev.eventType == Hammer.EVENT_END) { - // max touches - if(inst.options.swipe_max_touches > 0 && - ev.touches.length > inst.options.swipe_max_touches) { - return; - } + exports._calculateSpringForces = function () { + var edgeLength, edge, edgeId; + var dx, dy, fx, fy, springForce, distance; + var edges = this.edges; - // when the distance we moved is too small we skip this gesture - // or we can be already in dragging - if(ev.velocityX > inst.options.swipe_velocity || - ev.velocityY > inst.options.swipe_velocity) { - // trigger swipe events - inst.trigger(this.name, ev); - inst.trigger(this.name + ev.direction, ev); - } + // forces caused by the edges, modelled as springs + for (edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + edge = edges[edgeId]; + if (edge.connected) { + // only calculate forces if nodes are in the same sector + if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { + edgeLength = edge.customLength ? edge.length : this.constants.physics.springLength; + // this implies that the edges between big clusters are longer + edgeLength += (edge.to.clusterSize + edge.from.clusterSize - 2) * this.constants.clustering.edgeGrowth; + + dx = (edge.from.x - edge.to.x); + dy = (edge.from.y - edge.to.y); + distance = Math.sqrt(dx * dx + dy * dy); + + if (distance == 0) { + distance = 0.01; + } + + // the 1/distance is so the fx and fy can be calculated without sine or cosine. + springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; + + fx = dx * springForce; + fy = dy * springForce; + + edge.from.fx += fx; + edge.from.fy += fy; + edge.to.fx -= fx; + edge.to.fy -= fy; } + } } + } }; + + /** - * Drag - * Move with x fingers (default 1) around on the page. Blocking the scrolling when - * moving left and right is a good practice. When all the drag events are blocking - * you disable scrolling on that area. - * @events drag, drapleft, dragright, dragup, dragdown + * This function calculates the springforces on the nodes, accounting for the support nodes. + * + * @private */ - Hammer.gestures.Drag = { - name: 'drag', - index: 50, - defaults: { - drag_min_distance : 10, - // set 0 for unlimited, but this can conflict with transform - drag_max_touches : 1, - // prevent default browser behavior when dragging occurs - // be careful with it, it makes the element a blocking element - // when you are using the drag gesture, it is a good practice to set this true - drag_block_horizontal : false, - drag_block_vertical : false, - // drag_lock_to_axis keeps the drag gesture on the axis that it started on, - // It disallows vertical directions if the initial direction was horizontal, and vice versa. - drag_lock_to_axis : false, - // drag lock only kicks in when distance > drag_lock_min_distance - // This way, locking occurs only when the distance has become large enough to reliably determine the direction - drag_lock_min_distance : 25 - }, - triggered: false, - handler: function dragGesture(ev, inst) { - // current gesture isnt drag, but dragged is true - // this means an other gesture is busy. now call dragend - if(Hammer.detection.current.name != this.name && this.triggered) { - inst.trigger(this.name +'end', ev); - this.triggered = false; - return; - } - - // max touches - if(inst.options.drag_max_touches > 0 && - ev.touches.length > inst.options.drag_max_touches) { - return; - } + exports._calculateSpringForcesWithSupport = function () { + var edgeLength, edge, edgeId, combinedClusterSize; + var edges = this.edges; - switch(ev.eventType) { - case Hammer.EVENT_START: - this.triggered = false; - break; + // forces caused by the edges, modelled as springs + for (edgeId in edges) { + if (edges.hasOwnProperty(edgeId)) { + edge = edges[edgeId]; + if (edge.connected) { + // only calculate forces if nodes are in the same sector + if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) { + if (edge.via != null) { + var node1 = edge.to; + var node2 = edge.via; + var node3 = edge.from; - case Hammer.EVENT_MOVE: - // when the distance we moved is too small we skip this gesture - // or we can be already in dragging - if(ev.distance < inst.options.drag_min_distance && - Hammer.detection.current.name != this.name) { - return; - } + edgeLength = edge.customLength ? edge.length : this.constants.physics.springLength; - // we are dragging! - Hammer.detection.current.name = this.name; + combinedClusterSize = node1.clusterSize + node3.clusterSize - 2; - // lock drag to axis? - if(Hammer.detection.current.lastEvent.drag_locked_to_axis || (inst.options.drag_lock_to_axis && inst.options.drag_lock_min_distance<=ev.distance)) { - ev.drag_locked_to_axis = true; - } - var last_direction = Hammer.detection.current.lastEvent.direction; - if(ev.drag_locked_to_axis && last_direction !== ev.direction) { - // keep direction on the axis that the drag gesture started on - if(Hammer.utils.isVertical(last_direction)) { - ev.direction = (ev.deltaY < 0) ? Hammer.DIRECTION_UP : Hammer.DIRECTION_DOWN; - } - else { - ev.direction = (ev.deltaX < 0) ? Hammer.DIRECTION_LEFT : Hammer.DIRECTION_RIGHT; - } - } + // this implies that the edges between big clusters are longer + edgeLength += combinedClusterSize * this.constants.clustering.edgeGrowth; + this._calculateSpringForce(node1, node2, 0.5 * edgeLength); + this._calculateSpringForce(node2, node3, 0.5 * edgeLength); + } + } + } + } + } + }; - // first time, trigger dragstart event - if(!this.triggered) { - inst.trigger(this.name +'start', ev); - this.triggered = true; - } - // trigger normal event - inst.trigger(this.name, ev); + /** + * This is the code actually performing the calculation for the function above. It is split out to avoid repetition. + * + * @param node1 + * @param node2 + * @param edgeLength + * @private + */ + exports._calculateSpringForce = function (node1, node2, edgeLength) { + var dx, dy, fx, fy, springForce, distance; - // direction event, like dragdown - inst.trigger(this.name + ev.direction, ev); + dx = (node1.x - node2.x); + dy = (node1.y - node2.y); + distance = Math.sqrt(dx * dx + dy * dy); - // block the browser events - if( (inst.options.drag_block_vertical && Hammer.utils.isVertical(ev.direction)) || - (inst.options.drag_block_horizontal && !Hammer.utils.isVertical(ev.direction))) { - ev.preventDefault(); - } - break; + if (distance == 0) { + distance = 0.01; + } - case Hammer.EVENT_END: - // trigger dragend - if(this.triggered) { - inst.trigger(this.name +'end', ev); - } + // the 1/distance is so the fx and fy can be calculated without sine or cosine. + springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; - this.triggered = false; - break; - } - } + fx = dx * springForce; + fy = dy * springForce; + + node1.fx += fx; + node1.fy += fy; + node2.fx -= fx; + node2.fy -= fy; }; /** - * Transform - * User want to scale or rotate with 2 fingers - * @events transform, pinch, pinchin, pinchout, rotate + * Load the HTML for the physics config and bind it + * @private */ - Hammer.gestures.Transform = { - name: 'transform', - index: 45, - defaults: { - // factor, no scale is 1, zoomin is to 0 and zoomout until higher then 1 - transform_min_scale : 0.01, - // rotation in degrees - transform_min_rotation : 1, - // prevent default browser behavior when two touches are on the screen - // but it makes the element a blocking element - // when you are using the transform gesture, it is a good practice to set this true - transform_always_block : false - }, - triggered: false, - handler: function transformGesture(ev, inst) { - // current gesture isnt drag, but dragged is true - // this means an other gesture is busy. now call dragend - if(Hammer.detection.current.name != this.name && this.triggered) { - inst.trigger(this.name +'end', ev); - this.triggered = false; - return; - } + exports._loadPhysicsConfiguration = function () { + if (this.physicsConfiguration === undefined) { + this.backupConstants = {}; + util.deepExtend(this.backupConstants,this.constants); - // atleast multitouch - if(ev.touches.length < 2) { - return; - } + var hierarchicalLayoutDirections = ["LR", "RL", "UD", "DU"]; + this.physicsConfiguration = document.createElement('div'); + this.physicsConfiguration.className = "PhysicsConfiguration"; + this.physicsConfiguration.innerHTML = '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
Simulation Mode:
Barnes HutRepulsionHierarchical
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
Options:
' + this.containerElement.parentElement.insertBefore(this.physicsConfiguration, this.containerElement); + this.optionsDiv = document.createElement("div"); + this.optionsDiv.style.fontSize = "14px"; + this.optionsDiv.style.fontFamily = "verdana"; + this.containerElement.parentElement.insertBefore(this.optionsDiv, this.containerElement); - // prevent default when two fingers are on the screen - if(inst.options.transform_always_block) { - ev.preventDefault(); - } + var rangeElement; + rangeElement = document.getElementById('graph_BH_gc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_gc', -1, "physics_barnesHut_gravitationalConstant"); + rangeElement = document.getElementById('graph_BH_cg'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_cg', 1, "physics_centralGravity"); + rangeElement = document.getElementById('graph_BH_sc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sc', 1, "physics_springConstant"); + rangeElement = document.getElementById('graph_BH_sl'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sl', 1, "physics_springLength"); + rangeElement = document.getElementById('graph_BH_damp'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_damp', 1, "physics_damping"); - switch(ev.eventType) { - case Hammer.EVENT_START: - this.triggered = false; - break; + rangeElement = document.getElementById('graph_R_nd'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_nd', 1, "physics_repulsion_nodeDistance"); + rangeElement = document.getElementById('graph_R_cg'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_cg', 1, "physics_centralGravity"); + rangeElement = document.getElementById('graph_R_sc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sc', 1, "physics_springConstant"); + rangeElement = document.getElementById('graph_R_sl'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sl', 1, "physics_springLength"); + rangeElement = document.getElementById('graph_R_damp'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_damp', 1, "physics_damping"); - case Hammer.EVENT_MOVE: - var scale_threshold = Math.abs(1-ev.scale); - var rotation_threshold = Math.abs(ev.rotation); + rangeElement = document.getElementById('graph_H_nd'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); + rangeElement = document.getElementById('graph_H_cg'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_cg', 1, "physics_centralGravity"); + rangeElement = document.getElementById('graph_H_sc'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sc', 1, "physics_springConstant"); + rangeElement = document.getElementById('graph_H_sl'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sl', 1, "physics_springLength"); + rangeElement = document.getElementById('graph_H_damp'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_damp', 1, "physics_damping"); + rangeElement = document.getElementById('graph_H_direction'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_direction', hierarchicalLayoutDirections, "hierarchicalLayout_direction"); + rangeElement = document.getElementById('graph_H_levsep'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_levsep', 1, "hierarchicalLayout_levelSeparation"); + rangeElement = document.getElementById('graph_H_nspac'); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nspac', 1, "hierarchicalLayout_nodeSpacing"); - // when the distance we moved is too small we skip this gesture - // or we can be already in dragging - if(scale_threshold < inst.options.transform_min_scale && - rotation_threshold < inst.options.transform_min_rotation) { - return; - } + var radioButton1 = document.getElementById("graph_physicsMethod1"); + var radioButton2 = document.getElementById("graph_physicsMethod2"); + var radioButton3 = document.getElementById("graph_physicsMethod3"); + radioButton2.checked = true; + if (this.constants.physics.barnesHut.enabled) { + radioButton1.checked = true; + } + if (this.constants.hierarchicalLayout.enabled) { + radioButton3.checked = true; + } - // we are transforming! - Hammer.detection.current.name = this.name; + var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); + var graph_repositionNodes = document.getElementById("graph_repositionNodes"); + var graph_generateOptions = document.getElementById("graph_generateOptions"); - // first time, trigger dragstart event - if(!this.triggered) { - inst.trigger(this.name +'start', ev); - this.triggered = true; - } + graph_toggleSmooth.onclick = graphToggleSmoothCurves.bind(this); + graph_repositionNodes.onclick = graphRepositionNodes.bind(this); + graph_generateOptions.onclick = graphGenerateOptions.bind(this); + if (this.constants.smoothCurves == true && this.constants.dynamicSmoothCurves == false) { + graph_toggleSmooth.style.background = "#A4FF56"; + } + else { + graph_toggleSmooth.style.background = "#FF8532"; + } - inst.trigger(this.name, ev); // basic transform event - // trigger rotate event - if(rotation_threshold > inst.options.transform_min_rotation) { - inst.trigger('rotate', ev); - } + switchConfigurations.apply(this); - // trigger pinch event - if(scale_threshold > inst.options.transform_min_scale) { - inst.trigger('pinch', ev); - inst.trigger('pinch'+ ((ev.scale < 1) ? 'in' : 'out'), ev); - } - break; + radioButton1.onchange = switchConfigurations.bind(this); + radioButton2.onchange = switchConfigurations.bind(this); + radioButton3.onchange = switchConfigurations.bind(this); + } + }; + + /** + * This overwrites the this.constants. + * + * @param constantsVariableName + * @param value + * @private + */ + exports._overWriteGraphConstants = function (constantsVariableName, value) { + var nameArray = constantsVariableName.split("_"); + if (nameArray.length == 1) { + this.constants[nameArray[0]] = value; + } + else if (nameArray.length == 2) { + this.constants[nameArray[0]][nameArray[1]] = value; + } + else if (nameArray.length == 3) { + this.constants[nameArray[0]][nameArray[1]][nameArray[2]] = value; + } + }; - case Hammer.EVENT_END: - // trigger dragend - if(this.triggered) { - inst.trigger(this.name +'end', ev); - } - this.triggered = false; - break; - } - } - }; + /** + * this function is bound to the toggle smooth curves button. That is also why it is not in the prototype. + */ + function graphToggleSmoothCurves () { + this.constants.smoothCurves.enabled = !this.constants.smoothCurves.enabled; + var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); + if (this.constants.smoothCurves.enabled == true) {graph_toggleSmooth.style.background = "#A4FF56";} + else {graph_toggleSmooth.style.background = "#FF8532";} + this._configureSmoothCurves(false); + } /** - * Touch - * Called as first, tells the user has touched the screen - * @events touch + * this function is used to scramble the nodes + * */ - Hammer.gestures.Touch = { - name: 'touch', - index: -Infinity, - defaults: { - // call preventDefault at touchstart, and makes the element blocking by - // disabling the scrolling of the page, but it improves gestures like - // transforming and dragging. - // be careful with using this, it can be very annoying for users to be stuck - // on the page - prevent_default: false, + function graphRepositionNodes () { + for (var nodeId in this.calculationNodes) { + if (this.calculationNodes.hasOwnProperty(nodeId)) { + this.calculationNodes[nodeId].vx = 0; this.calculationNodes[nodeId].vy = 0; + this.calculationNodes[nodeId].fx = 0; this.calculationNodes[nodeId].fy = 0; + } + } + if (this.constants.hierarchicalLayout.enabled == true) { + this._setupHierarchicalLayout(); + } + else { + this.repositionNodes(); + } + this.moving = true; + this.start(); + } - // disable mouse events, so only touch (or pen!) input triggers events - prevent_mouseevents: false - }, - handler: function touchGesture(ev, inst) { - if(inst.options.prevent_mouseevents && ev.pointerType == Hammer.POINTER_MOUSE) { - ev.stopDetect(); - return; + /** + * this is used to generate an options file from the playing with physics system. + */ + function graphGenerateOptions () { + var options = "No options are required, default values used."; + var optionsSpecific = []; + var radioButton1 = document.getElementById("graph_physicsMethod1"); + var radioButton2 = document.getElementById("graph_physicsMethod2"); + if (radioButton1.checked == true) { + if (this.constants.physics.barnesHut.gravitationalConstant != this.backupConstants.physics.barnesHut.gravitationalConstant) {optionsSpecific.push("gravitationalConstant: " + this.constants.physics.barnesHut.gravitationalConstant);} + if (this.constants.physics.centralGravity != this.backupConstants.physics.barnesHut.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} + if (this.constants.physics.springLength != this.backupConstants.physics.barnesHut.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} + if (this.constants.physics.springConstant != this.backupConstants.physics.barnesHut.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} + if (this.constants.physics.damping != this.backupConstants.physics.barnesHut.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} + if (optionsSpecific.length != 0) { + options = "var options = {"; + options += "physics: {barnesHut: {"; + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", " } - - if(inst.options.prevent_default) { - ev.preventDefault(); + } + options += '}}' + } + if (this.constants.smoothCurves.enabled != this.backupConstants.smoothCurves.enabled) { + if (optionsSpecific.length == 0) {options = "var options = {";} + else {options += ", "} + options += "smoothCurves: " + this.constants.smoothCurves.enabled; + } + if (options != "No options are required, default values used.") { + options += '};' + } + } + else if (radioButton2.checked == true) { + options = "var options = {"; + options += "physics: {barnesHut: {enabled: false}"; + if (this.constants.physics.repulsion.nodeDistance != this.backupConstants.physics.repulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.repulsion.nodeDistance);} + if (this.constants.physics.centralGravity != this.backupConstants.physics.repulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} + if (this.constants.physics.springLength != this.backupConstants.physics.repulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} + if (this.constants.physics.springConstant != this.backupConstants.physics.repulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} + if (this.constants.physics.damping != this.backupConstants.physics.repulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} + if (optionsSpecific.length != 0) { + options += ", repulsion: {"; + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", " } - - if(ev.eventType == Hammer.EVENT_START) { - inst.trigger(this.name, ev); + } + options += '}}' + } + if (optionsSpecific.length == 0) {options += "}"} + if (this.constants.smoothCurves != this.backupConstants.smoothCurves) { + options += ", smoothCurves: " + this.constants.smoothCurves; + } + options += '};' + } + else { + options = "var options = {"; + if (this.constants.physics.hierarchicalRepulsion.nodeDistance != this.backupConstants.physics.hierarchicalRepulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.hierarchicalRepulsion.nodeDistance);} + if (this.constants.physics.centralGravity != this.backupConstants.physics.hierarchicalRepulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} + if (this.constants.physics.springLength != this.backupConstants.physics.hierarchicalRepulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} + if (this.constants.physics.springConstant != this.backupConstants.physics.hierarchicalRepulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} + if (this.constants.physics.damping != this.backupConstants.physics.hierarchicalRepulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} + if (optionsSpecific.length != 0) { + options += "physics: {hierarchicalRepulsion: {"; + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", "; } + } + options += '}},'; } - }; + options += 'hierarchicalLayout: {'; + optionsSpecific = []; + if (this.constants.hierarchicalLayout.direction != this.backupConstants.hierarchicalLayout.direction) {optionsSpecific.push("direction: " + this.constants.hierarchicalLayout.direction);} + if (Math.abs(this.constants.hierarchicalLayout.levelSeparation) != this.backupConstants.hierarchicalLayout.levelSeparation) {optionsSpecific.push("levelSeparation: " + this.constants.hierarchicalLayout.levelSeparation);} + if (this.constants.hierarchicalLayout.nodeSpacing != this.backupConstants.hierarchicalLayout.nodeSpacing) {optionsSpecific.push("nodeSpacing: " + this.constants.hierarchicalLayout.nodeSpacing);} + if (optionsSpecific.length != 0) { + for (var i = 0; i < optionsSpecific.length; i++) { + options += optionsSpecific[i]; + if (i < optionsSpecific.length - 1) { + options += ", " + } + } + options += '}' + } + else { + options += "enabled:true}"; + } + options += '};' + } + this.optionsDiv.innerHTML = options; + } + /** - * Release - * Called as last, tells the user has released the screen - * @events release + * this is used to switch between barnesHut, repulsion and hierarchical. + * */ - Hammer.gestures.Release = { - name: 'release', - index: Infinity, - handler: function releaseGesture(ev, inst) { - if(ev.eventType == Hammer.EVENT_END) { - inst.trigger(this.name, ev); - } + function switchConfigurations () { + var ids = ["graph_BH_table", "graph_R_table", "graph_H_table"]; + var radioButton = document.querySelector('input[name="graph_physicsMethod"]:checked').value; + var tableId = "graph_" + radioButton + "_table"; + var table = document.getElementById(tableId); + table.style.display = "block"; + for (var i = 0; i < ids.length; i++) { + if (ids[i] != tableId) { + table = document.getElementById(ids[i]); + table.style.display = "none"; } - }; - - // node export - if(typeof module === 'object' && typeof module.exports === 'object'){ - module.exports = Hammer; + } + this._restoreNodes(); + if (radioButton == "R") { + this.constants.hierarchicalLayout.enabled = false; + this.constants.physics.hierarchicalRepulsion.enabled = false; + this.constants.physics.barnesHut.enabled = false; + } + else if (radioButton == "H") { + if (this.constants.hierarchicalLayout.enabled == false) { + this.constants.hierarchicalLayout.enabled = true; + this.constants.physics.hierarchicalRepulsion.enabled = true; + this.constants.physics.barnesHut.enabled = false; + this.constants.smoothCurves.enabled = false; + this._setupHierarchicalLayout(); + } + } + else { + this.constants.hierarchicalLayout.enabled = false; + this.constants.physics.hierarchicalRepulsion.enabled = false; + this.constants.physics.barnesHut.enabled = true; + } + this._loadSelectedForceSolver(); + var graph_toggleSmooth = document.getElementById("graph_toggleSmooth"); + if (this.constants.smoothCurves.enabled == true) {graph_toggleSmooth.style.background = "#A4FF56";} + else {graph_toggleSmooth.style.background = "#FF8532";} + this.moving = true; + this.start(); } - // just window export - else { - window.Hammer = Hammer; - // requireJS module definition - if(typeof window.define === 'function' && window.define.amd) { - window.define('hammer', [], function() { - return Hammer; - }); - } + + /** + * this generates the ranges depending on the iniital values. + * + * @param id + * @param map + * @param constantsVariableName + */ + function showValueOfRange (id,map,constantsVariableName) { + var valueId = id + "_value"; + var rangeValue = document.getElementById(id).value; + + if (map instanceof Array) { + document.getElementById(valueId).value = map[parseInt(rangeValue)]; + this._overWriteGraphConstants(constantsVariableName,map[parseInt(rangeValue)]); + } + else { + document.getElementById(valueId).value = parseInt(map) * parseFloat(rangeValue); + this._overWriteGraphConstants(constantsVariableName, parseInt(map) * parseFloat(rangeValue)); + } + + if (constantsVariableName == "hierarchicalLayout_direction" || + constantsVariableName == "hierarchicalLayout_levelSeparation" || + constantsVariableName == "hierarchicalLayout_nodeSpacing") { + this._setupHierarchicalLayout(); + } + this.moving = true; + this.start(); } - })(this); + /***/ }, /* 51 */ diff --git a/dist/vis.map b/dist/vis.map index 8a922d24..8caf28f0 100644 --- a/dist/vis.map +++ b/dist/vis.map @@ -1 +1 @@ -{"version":3,"file":"vis.map","sources":["./dist/vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Graph3d","Timeline","Graph2d","timeline","DataStep","Range","stack","TimeStep","components","items","Item","ItemBox","ItemPoint","ItemRange","Component","CurrentTime","CustomTime","DataAxis","GraphGroup","Group","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Edge","Groups","Images","Node","Popup","dotparser","Graph","Error","Hammer","moment","isNumber","object","Number","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","parse","isDataTable","google","visualization","DataTable","randomUUID","S4","Math","floor","random","toString","extend","a","i","len","arguments","length","other","prop","hasOwnProperty","selectiveExtend","props","Array","isArray","selectiveDeepExtend","b","TypeError","constructor","Object","undefined","deepExtend","equalArray","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","value","getAbsoluteLeft","elem","doc","document","documentElement","body","left","offsetLeft","e","offsetParent","scrollLeft","getAbsoluteTop","top","offsetTop","scrollTop","getPageY","event","pageY","clientY","targetTouches","clientTop","getPageX","pageX","clientX","clientLeft","addClassName","className","classes","split","indexOf","push","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","key","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","getTarget","window","target","srcElement","nodeType","parentNode","fakeGesture","eventType","gesture","collectEventData","center","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","GiveDec","Hex","Value","eval","GiveHex","Dec","parseColor","color","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","min","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","hexToRGB","hex","replace","toUpperCase","substring","d","f","r","g","RGBToHex","red","green","blue","RGBToHSV","minRGB","maxRGB","max","hue","saturation","HSVToRGB","q","t","rgb","isOk","test","selectiveBridgeObject","fields","referenceObject","objectTo","create","bridgeObject","mergeOptions","mergeTarget","options","enabled","binarySearch","orderedItems","range","field","field2","found","end","start","low","high","newLow","newHigh","guess","isVisible","binarySearchGeneric","sidePreference","newGuess","prevValue","nextValue","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","removeChild","getSVGElement","svgContainer","shift","createElementNS","appendChild","getDOMElement","DOMContainer","createElement","drawPoint","x","y","group","point","drawPoints","style","setAttributeNS","size","drawBar","width","height","rect","data","_options","_data","_fieldId","fieldId","_type","_subscribers","add","prototype","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","me","_addItem","columns","_getColumnNames","row","rows","getNumberOfRows","item","col","cols","getValue","update","updatedIds","addOrUpdate","_updateItem","get","ids","firstType","returnType","itemId","_getItem","order","_sort","_filterFields","_appendRow","getIds","getDataSet","map","mappedItems","filteredItem","name","sort","av","bv","remove","removedId","removedIds","_remove","clear","keys","maxField","itemField","minField","distinct","values","fieldType","count","exists","types","raw","converted","JSON","stringify","dataTable","getNumberOfColumns","getColumnId","getColumnLabel","addRow","setValue","_ids","_onEvent","apply","setData","viewOptions","getArguments","defaultFilter","dataSet","added","updated","removed","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","Camera","eye","Point3d","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","colorAxis","colorGrid","colorDot","colorDotBorder","setOptions","Slider","visible","frame","position","prev","play","next","bar","borderRadius","MozBorderRadius","backgroundColor","slide","onmousedown","_onMouseDown","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","Emitter","Point2d","Filter","StepNumber","armLocation","armRotation","horizontal","vertical","armLength","cameraLocation","cameraRotation","PI","calculateCameraOrientation","setArmLocation","z","setArmRotation","getArmRotation","rot","setArmLength","getArmLength","getCameraLocation","getCameraRotation","sin","cos","_setScale","scale","xCenter","yCenter","zCenter","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","cy","cz","sinTx","cosTx","sinTy","cosTy","sinTz","cosTz","dx","dy","dz","bx","by","ex","ey","ez","xcenter","canvas","clientWidth","ycenter","_setBackgroundColor","fill","stroke","strokeWidth","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","redraw","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","sortNumber","obj","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","hasChildNodes","firstChild","overflow","noCanvas","fontWeight","padding","innerHTML","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","G3DaddEventListener","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","animationStop","stop","_resizeCenter","charAt","parseFloat","setCameraPosition","pos","distance","getCameraPosition","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","getCurrent","textAlign","textBaseline","fillText","label","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","from","to","prettyStep","text","xText","yText","zText","offset","xOffset","yOffset","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","H","S","V","R","G","B","C","Hi","X","abs","parseInt","cross","topSideVisible","zAvg","transBottom","dist","sortDepth","aDiff","subtract","bDiff","crossproduct","crossProduct","radius","arc","j","surface","corners","xWidth","yWidth","surfaces","avg","transCenter","diff","leftButtonDown","_onMouseUp","which","button","touchDown","startMouseX","getMouseX","startMouseY","getMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","G3DpreventDefault","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","round","parameters","emit","G3DremoveEventListener","delay","mouseX","mouseY","tooltipTimeout","clearTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","setTimeout","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","delta","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","sign","as","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","content","line","dot","dom","boxShadow","borderLeft","contentWidth","offsetWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","G3DstopPropagation","stopPropagation","cancelBubble","preventDefault","returnValue","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","defaultOptions","autoResize","orientation","maxHeight","minHeight","_create","domProps","emitter","bind","snap","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","timeAxis","currentTime","customTime","itemSet","itemsData","groupsData","setItems","backgroundVertical","backgroundHorizontal","centerContainer","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","_onTouch","_onPinch","_onDragStart","_onDrag","hammer","prevent_default","listeners","events","args","slice","scrollTopMin","touch","destroy","_stopAutoResize","component","_initAutoResize","setCustomTime","time","getCustomTime","newDataSet","initialLoad","fit","setWindow","setGroups","groups","what","dataRange","getItemRange","setRange","dataset","minItem","maxStartItem","maxEndItem","setSelection","getSelection","getWindow","getRange","resized","borderRootHeight","borderRootWidth","autoHeight","containerHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","visibility","repaint","conversion","_startAutoResize","_onResize","lastWidth","lastHeight","watchTimer","setInterval","allowDragging","initialScrollTop","deltaY","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","linegraph","backgroundHorizontalContainer","minimumStep","forcedStepSize","current","autoScale","stepIndex","marginStart","marginEnd","majorSteps","minorSteps","_start","_end","setMinimumStep","setFirst","safeSize","minimumStepValue","orderOfMagnitude","log","LN10","minorStepIdx","magnitudefactor","pow","solutionFound","stepSize","first","niceStart","niceEnd","roundToMinor","marginRange","rounded","hasNext","previous","toPrecision","isMajor","now","hours","minutes","seconds","milliseconds","clone","direction","moveable","zoomable","zoomMin","zoomMax","_onDragEnd","_onHold","_onMouseWheel","validateDirection","getPointer","changed","_applyRange","newStart","newEnd","deltaX","diffRange","pointer","pointerDate","_pointerToDate","zoom","touches","initDate","move","EPSILON","orderByStart","orderByEnd","aTime","bTime","force","iMax","axis","collidingItem","jj","collision","nostack","SCALE","DAY","MILLISECOND","SECOND","MINUTE","HOUR","WEEKDAY","MONTH","YEAR","setFullYear","getFullYear","setMonth","setDate","setHours","setMinutes","setSeconds","setMilliseconds","getMilliseconds","getSeconds","getMinutes","getHours","getDate","getMonth","setScale","newScale","newStep","setAutoScale","enable","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","date","year","getLabelMinor","format","getLabelMajor","_isResized","_previousWidth","_previousHeight","showCurrentTime","parent","title","currentTimeTimer","showCustomTime","eventParams","drag","dragging","svg","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","linegraphSVG","DOMelements","lines","labels","conversionFactor","minWidth","stepPixels","stepPixelsForced","lineOffset","master","svgElements","amountOfGroups","addGroup","graphOptions","updateGroup","removeGroup","hide","show","lineContainer","display","_redrawGroupIcons","iconHeight","iconOffset","groupId","drawIcon","changeCalled","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineWidth","minorLineHeight","majorLineWidth","majorLineHeight","_redrawLabels","amountOfSteps","stepDifference","valueAtZero","marginStartPos","maxLabelSize","_redrawLabel","_redrawLine","characterHeight","largestWidth","majorCharWidth","minorCharWidth","convertValue","invertedValue","convertedValue","textMinor","createTextNode","measureCharMinor","textMajor","measureCharMajor","groupsUsingDefaultStyles","usingDefaultStyle","zeroPosition","setZeroPosition","catmullRom","parametrization","alpha","SVGcontainer","path","fillPath","fillHeight","outline","shaded","barWidth","bar1Height","bar2Height","visibleItems","byStart","byEnd","inner","foreground","marker","Element","getLabelWidth","restack","_updateVisibleItems","markerHeight","lastMarkerHeight","dirty","displayed","ii","repositionY","labelSet","setParent","_checkIfVisible","removeFromDataSet","removeItem","_constructByEndArray","endArray","initialPosByStart","newVisibleItems","initialPosByEnd","_checkIfInvisible","repositionX","align","groupOrder","selectable","editable","updateTime","onAdd","onUpdate","onMove","onRemove","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","selection","stackDirty","touchParams","UNGROUPED","box","_updateUngrouped","_onSelectItem","_onMultiSelectItem","_onAddItem","addCallback","fn","Function","markDirty","unselect","select","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","firstGroupIndex","firstGroupId","ungrouped","getLabelSet","oldItemsData","getItems","_order","getGroups","itemData","_removeItem","groupData","groupOptions","oldGroupId","oldGroup","itemFromTarget","selected","dragLeftItem","dragRightItem","itemProps","groupFromTarget","changes","ctrlKey","srcEvent","shiftKey","oldSelection","newSelection","xAbs","newItem","itemSetFromTarget","side","iconSize","iconSpacing","textArea","drawLegendIcons","getComputedStyle","paddingTop","yAxisOrientation","defaultGroup","sampling","graphHeight","barChart","dataAxis","legend","lastStart","rangePerPixelInv","_updateGraph","yAxisLeft","yAxisRight","legendLeft","legendRight","_updateAllGroupData","_updateGroup","groupsContent","ungroupedCounter","preprocessedGroup","preprocessedGroupData","processedGroupData","groupRanges","minDate","maxDate","_preprocessData","_updateYAxis","_convertYvalues","_drawLineGraph","_drawBarGraph","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","_toggleAxisVisiblity","drawIcons","axisUsed","coreDistance","_drawPoints","svgHeight","_catmullRom","_linear","dFill","datapoints","xValue","yValue","extractedData","increment","amountOfPoints","xDistance","pointsPerPixel","ceil","_catmullRomUniform","p0","p1","p2","p3","bp1","bp2","normalization","d1","d2","d3","A","N","M","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","majorLines","majorTexts","minorLines","minorTexts","lineTop","parentChanged","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","insertBefore","xFirstMajorLabel","cur","_repaintMinorText","_repaintMajorText","_repaintMajorLine","_repaintMinorLine","leftTime","leftText","widthText","arr","pop","childNodes","nodeValue","_repaintDeleteButton","anchor","deleteButton","itemSetHeight","marginLeft","baseClassName","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","dragLeft","dragRight","_initializeMixinLoaders","renderRefreshRate","renderTimestep","renderTime","maxPhysicsTicksPerRender","physicsDiscreteStepsize","stabilize","initializing","triggerFunctions","edit","editEdge","connect","del","constants","nodes","radiusMin","radiusMax","shape","image","fixed","fontColor","fontSize","fontFace","level","highlightColor","edges","widthSelectionMultiplier","hoverWidth","fontFill","arrowScaleFactor","dash","gap","altLength","configurePhysics","physics","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","repulsion","nodeDistance","hierarchicalRepulsion","clustering","initialMaxNodes","clusterThreshold","reduceToNodes","chainThreshold","clusterEdgeThreshold","sectorThreshold","screenSizeThreshold","fontSizeMultiplier","maxFontSize","forceAmplification","distanceAmplification","edgeGrowth","nodeScaling","maxNodeSizeIncrements","activeAreaBoxSize","clusterLevelDifference","navigation","keyboard","speed","dataManipulation","initiallyVisible","hierarchicalLayout","levelSeparation","nodeSpacing","freezeForStabilization","smoothCurves","maxVelocity","minVelocity","stabilizationIterations","link","editNode","back","addDescription","linkDescription","editEdgeDescription","addError","linkError","editError","editBoundError","deleteError","deleteClusterError","dragNetwork","dragNodes","hoverObj","images","setOnloadCallback","_redraw","xIncrement","yIncrement","zoomIncrement","_loadPhysicsSystem","_loadSectorSystem","_loadClusterSystem","_loadSelectionSystem","_loadHierarchySystem","_setTranslation","freezeSimulation","cachedFunctions","calculationNodes","calculationNodeIndices","nodeIndices","canvasTopLeft","canvasBottomRight","pointerPosition","areaCenter","previousScale","nodesData","edgesData","nodesListeners","_addNodes","_updateNodes","_removeNodes","edgesListeners","_addEdges","_updateEdges","_removeEdges","moving","timer","_setupHierarchicalLayout","zoomExtent","startWithClustering","mousetrap","MixinLoader","_getScriptPath","scripts","getElementsByTagName","src","_getRange","node","minY","maxY","minX","maxX","nodeId","_findCenter","_centerNetwork","initialZoom","disableStart","zoomLevel","numberOfNodes","factor","yDistance","xZoomLevel","yZoomLevel","_updateNodeIndexList","_clearNodeIndexList","idx","dotData","DOTToGraph","_setNodes","_setEdges","_putDataInSector","_stabilize","dragGraph","onEdit","onEditEdge","onConnect","onDelete","editMode","groupname","_loadNavigationControls","_loadManipulationSystem","_configureSmoothCurves","_createKeyBinds","pinch","_onTap","_onDoubleTap","_onRelease","_onMouseMoveTitle","reset","_moveUp","_yStopMoving","_moveDown","_moveLeft","_xStopMoving","_moveRight","_zoomIn","_stopZoom","_zoomOut","_createManipulatorBar","_deleteSelected","_getPointer","pinched","_getScale","_handleTouch","_handleDragStart","_getNodeAt","_getTranslation","isSelected","_selectObject","objectId","selectionObj","xFixed","yFixed","_handleOnDrag","_XconvertDOMtoCanvas","_XconvertCanvasToDOM","_YconvertDOMtoCanvas","_YconvertCanvasToDOM","_handleTap","_handleDoubleTap","_handleOnHold","_handleOnRelease","_zoom","scaleOld","scaleFrac","tx","ty","updateClustersDefault","popupObj","_checkHidePopup","checkShow","_checkShowPopup","popupTimer","edgeId","_getEdgeAt","_hoverObject","_blurObject","lastPopupNode","getTitle","isOverlappingWith","edge","connected","popup","setPosition","setText","manipulationDiv","navigationDivs","oldNodesData","_updateSelection","angle","_resetLevels","_updateCalculationNodes","_reconnectEdges","_updateValueRange","updateLabels","setProperties","properties","oldEdgesData","oldEdge","disconnect","showInternalIds","_createBezierNodes","via","sectors","setValueRange","w","save","translate","_doInAllSectors","restore","offsetX","offsetY","canvasToDOM","DOMtoCanvas","_drawNodes","alwaysShow","setScaleAndPos","inArea","draw","sMax","_drawEdges","_drawControlNodes","_freezeDefinedNodes","_physicsTick","_restoreFrozenNodes","iterations","fixedData","_isMoving","vmin","isMoving","_discreteStepNodes","nodesPresent","discreteStepLimited","discreteStep","vminCorrected","_doInAllActiveSectors","_doInSupportSector","_animationStep","_handleNavigation","calculationTime","maxSteps","timeRequired","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","ua","toLowerCase","requiresTimeout","toggleFreeze","smooth","mass","internalMultiplier","parentEdgeId","positionBezierNode","mixin","storePosition","dataArray","allowedToMoveX","allowedToMoveY","focusOnNode","nodePosition","requiredScale","canvasCenter","distanceFromCenter","console","fromId","toId","widthSelected","customLength","originalFromId","originalToId","widthFixed","lengthFixed","controlNodesEnabled","controlNodes","positions","connectedNode","_drawLine","_drawArrow","_drawArrowCenter","_drawDashLine","attachEdge","detachEdge","xFrom","yFrom","xTo","yTo","xObj","yObj","_getDistanceToEdge","_getLineWidth","_line","midpointX","midpointY","_pointOnLine","_label","resize","_circle","_pointOnCircle","networkScaleInv","quadraticCurveTo","measureText","fillRect","mozDash","setLineDash","pattern","lineDashOffset","mozDashOffset","lineCap","dashedLine","percentage","atan2","arrow","edgeSegmentLength","fromBorderDist","distanceToBorder","fromBorderPoint","toBorderDist","toBorderPoint","x1","y1","x2","y2","x3","y3","minDistance","px","py","something","u","nodeIdFrom","nodeIdTo","getControlNodePositions","_enableControlNodes","_disableControlNodes","_getSelectedControlNode","fromDistance","toDistance","_restoreControlNodes","defaultIndex","DEFAULT","load","url","img","Image","onload","imagelist","grouplist","dynamicEdges","reroutedEdges","fontDrawThreshold","horizontalAlignLeft","verticalAlignTop","baseRadiusValue","radiusFixed","preassignedLevel","fx","fy","vx","vy","minForce","resetCluster","dynamicEdgesLength","clusterSession","clusterSizeWidthFactor","clusterSizeHeightFactor","clusterSizeRadiusFactor","growthIndicator","networkScale","formationScale","clusterSize","containedNodes","containedEdges","clusterSessions","originalLabel","triggerFunction","groupObj","imageObj","_drawDatabase","_resizeDatabase","_drawBox","_resizeBox","_drawCircle","_resizeCircle","_drawEllipse","_resizeEllipse","_drawImage","_resizeImage","_drawText","_resizeText","_drawDot","_resizeShape","_drawSquare","_drawTriangle","_drawTriangleDown","_drawStar","_reset","clearSizeCache","_setForce","_addForce","isFixed","getDistance","globalAlpha","drawImage","textSize","getTextSize","clusterLineWidth","selectionLineWidth","roundRect","database","diameter","circle","defaultSize","ellipse","_drawShape","radiusMultiplier","baseline","labelUnderNode","lineCount","yLine","inView","clearVelocity","updateVelocity","massBeforeClustering","energyBefore","styleAttr","fontFamily","WebkitBorderRadius","whiteSpace","maxWidth","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","merge","o","addNode","graph","graphs","attr","addEdge","createEdge","getToken","tokenType","TOKENTYPE","NULL","token","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","strict","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","substr","forEach2","array1","array2","elem1","elem2","convertEdge","dotEdge","graphEdge","graphData","dotNode","graphNode","subEdge","{","}","[","]",";","=",",","->","--","sub","sum","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","dataView","progress","_step","precision","_current","setStep","calculatePrettyStep","log10","step1","step2","step5","getStep","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","n","r2d","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","wEllipse","hEllipse","ymb","yeb","xt","yt","xi","yi","xl","yl","xr","yr","dashArray","dashLength","dashCount","slope","distRemaining","dashIndex","PhysicsMixin","ClusterMixin","SectorsMixin","SelectionMixin","ManipulationMixin","NavigationMixin","HierarchicalLayoutMixin","_loadMixin","sourceVariable","mixinFunction","_clearMixin","_loadSelectedForceSolver","_loadPhysicsConfiguration","hubThreshold","activeSector","drawingNode","blockConnectingEdgeSelection","forceAppendSelection","editModeDiv","closeDiv","_cleanNavigation","_loadNavigationElements","_callbacks","once","self","removeListener","removeAllListeners","callbacks","cb","hasListeners","_addEvent","_characterFromEvent","fromCharCode","_MAP","_KEYCODE_MAP","_stop","tag_name","tagName","contentEditable","_modifiersMatch","modifiers1","modifiers2","_resetSequences","do_not_reset","active_sequences","_sequence_levels","_inside_sequence","_getMatches","character","modifiers","combination","matches","_isModifier","seq","combo","_eventModifiers","altKey","metaKey","_fireCallback","_handleCharacter","processed_sequence_callback","_handleKey","keyCode","_ignore_next_keyup","_resetSequenceTimer","_reset_timer","_getReverseMap","_REVERSE_MAP","_pickBestAction","_bindSequence","_increaseSequence","_callbackAndReset","_bindSingle","sequence_name","sequence","_SPECIAL_ALIASES","_SHIFT_MAP","_bindMultiple","combinations",8,9,13,16,17,18,20,27,32,33,34,35,36,37,38,39,40,45,46,91,93,224,106,107,109,110,111,186,187,188,189,190,191,192,219,220,221,222,"~","!","@","#","$","%","^","&","*","(",")","_","+",":","\"","<",">","?","|","command","return","escape","_direct_map","unbind","trigger","clusterToFit","maxNumberOfNodes","reposition","maxLevels","forceAggregateHubs","normalizeClusterLevels","increaseClusterLevel","repositionNodes","openCluster","isMovingBeforeClustering","_nodeInActiveArea","_sector","_addSector","decreaseClusterLevel","_expandClusterNode","_updateDynamicEdges","updateClusters","zoomDirection","recursive","doNotStart","amountOfNodes","_collapseSector","_formClusters","_openClusters","_openClustersBySize","_aggregateHubs","handleChains","chainPercentage","_getChainFraction","_reduceAmountOfChains","_getHubSize","_formClustersByHub","openAll","containedNodeId","childNode","_expelChildFromParent","_unselectAll","_releaseContainedEdges","_connectEdgeBackToChild","_validateEdges","othersPresent","childNodeId","_repositionBezierNodes","_formClustersByZoom","_forceClustersByZoom","minLength","_addToCluster","_clusterToSmallestNeighbour","smallestNeighbour","smallestNeighbourNode","neighbour","onlyEqual","_formClusterFromHub","hubNode","absorptionSizeOffset","allowCluster","edgesIdarray","amountOfInitialEdges","_addToContainedEdges","_connectEdgeToCluster","_containCircularEdgesFromNode","massBefore","correction","edgeToId","edgeFromId","k","_addToReroutedEdges","maxLevel","minLevel","clusterLevel","targetLevel","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","fraction","reduceAmount","chains","total","_switchToSector","sectorId","sectorType","_switchToActiveSector","_switchToFrozenSector","_switchToSupportSector","_loadLatestSector","_previousSector","_setActiveSector","newId","_forgetLastSector","_createNewSector","_deleteActiveSector","_deleteFrozenSector","_freezeSector","_activateSector","_mergeThisWithFrozen","_collapseThisToSingleCluster","sector","unqiueIdentifier","previousSector","runFunction","argument","_doInAllFrozenSectors","_drawSectorNodes","_drawAllSectorNodes","_getNodesOverlappingWith","overlappingNodes","_getAllNodesOverlappingWith","_pointerToPositionObject","positionObject","_getEdgesOverlappingWith","overlappingEdges","_getAllEdgesOverlappingWith","_addToSelection","_addToHover","_removeFromSelection","doNotTrigger","_unselectClusters","_getSelectedNodeCount","_getSelectedNode","_getSelectedEdge","_getSelectedEdgeCount","_getSelectedObjectCount","_selectionIsEmpty","_clusterInSelection","_selectConnectedEdges","_hoverConnectedEdges","_unselectConnectedEdges","append","highlightEdges","nodeIds","getSelectedNodes","edgeIds","getSelectedEdges","idArray","RangeError","selectNodes","selectEdges","_clearManipulatorBar","_restoreOverloadedFunctions","functionName","_toggleEditMode","toolbar","getElementById","boundFunction","edgeBeingEdited","selectedControlNode","addNodeButton","_createAddNodeToolbar","addEdgeButton","_createAddEdgeToolbar","editButton","_editNode","_createEditEdgeToolbar","editModeButton","backButton","_addNode","_handleConnect","_finishConnect","_selectControlNode","_controlNodeDrag","_releaseControlNode","newNode","_editEdge","alert","connectFromId","_createEdge","defaultData","finalizedData","sourceNodeId","targetNodeId","selectedNodes","selectedEdges","wrapper","navigationDivActions","_stopMovement","_preventDefault","hubsize","definedLevel","undefinedLevel","_changeConstants","_determineLevels","distribution","_getDistribution","_placeNodesByHierarchy","minPos","_placeBranchNodes","amount","maxCount","_setLevel","parentId","parentLevel","nodeMoved","_restoreNodes","setup","READY","determineEventTypes","gestures","detection","register","onTouch","DOCUMENT","EVENT_MOVE","detect","EVENT_END","Instance","defaults","stop_browser_behavior","userSelect","touchAction","touchCallout","contentZooming","userDrag","tapHighlightColor","HAS_POINTEREVENTS","pointerEnabled","msPointerEnabled","HAS_TOUCHEVENTS","MOBILE_REGEX","NO_MOUSEEVENTS","EVENT_TYPES","DIRECTION_DOWN","DIRECTION_LEFT","DIRECTION_UP","DIRECTION_RIGHT","POINTER_MOUSE","POINTER_TOUCH","POINTER_PEN","EVENT_START","plugins","utils","stopDefaultBrowserBehavior","ev","startDetect","handler","eventData","createEvent","initEvent","hasParent","dispatchEvent","state","last_move_event","enable_detect","touch_triggered","bindDom","sourceEventType","count_touches","PointerEvent","updatePointer","getEvents","getTouchList","identifier","pointerType","matchType","getCenter","timeStamp","getTime","preventManipulation","stopDetect","pointers","touchlist","pointerEvent","pointerId","MSPOINTER_TYPE_MOUSE","MSPOINTER_TYPE_TOUCH","MSPOINTER_TYPE_PEN","dest","valuesX","valuesY","getVelocity","delta_time","delta_x","delta_y","getAngle","touch1","touch2","getDirection","getScale","getRotation","isVertical","css_props","vendors","onselectstart","stopped","inst","startEvent","lastEvent","extendEventData","inst_options","startEv","velocity","deltaTime","velocityX","velocityY","rotation","Hold","hold_timeout","hold_threshold","Tap","tap_max_touchtime","tap_max_distance","tap_always","doubletap_distance","doubletap_interval","did_doubletap","Swipe","swipe_max_touches","swipe_velocity","Drag","drag_min_distance","drag_max_touches","drag_block_horizontal","drag_block_vertical","drag_lock_to_axis","drag_lock_min_distance","triggered","drag_locked_to_axis","last_direction","Transform","transform_min_scale","transform_min_rotation","transform_always_block","scale_threshold","rotation_threshold","Touch","Infinity","prevent_mouseevents","Release","graphToggleSmoothCurves","graph_toggleSmooth","graphRepositionNodes","graphGenerateOptions","optionsSpecific","radioButton1","radioButton2","checked","backupConstants","optionsDiv","switchConfigurations","radioButton","querySelector","tableId","table","showValueOfRange","constantsVariableName","valueId","rangeValue","_overWriteGraphConstants","RepulsionMixin","HierarchialRepulsionMixin","BarnesHutMixin","_toggleBarnesHut","barnesHutTree","_initializeForceCalculation","_calculateForces","_calculateGravitationalForces","_calculateNodeForces","_calculateSpringForcesWithSupport","_calculateHierarchicalSpringForces","_calculateSpringForces","supportNodes","supportNodeId","gravity","gravityForce","edgeLength","springForce","combinedClusterSize","node1","node2","node3","_calculateSpringForce","physicsConfiguration","hierarchicalLayoutDirections","parentElement","rangeElement","radioButton3","graph_repositionNodes","graph_generateOptions","nameArray","__WEBPACK_AMD_DEFINE_RESULT__","global","dfl","defaultParsingFlags","empty","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","deprecate","msg","printMsg","suppressDeprecationWarnings","warn","firstTime","padToken","func","leftZeroFill","ordinalizeToken","period","lang","ordinal","Language","Moment","config","checkOverflow","Duration","duration","normalizedInput","normalizeObjectUnits","years","quarters","quarter","months","month","weeks","week","days","day","hour","minute","second","millisecond","_milliseconds","_days","_months","_bubble","cloneMoment","result","momentProperties","absRound","number","targetLength","forceSign","output","addOrSubtractDurationFromMoment","mom","isAdding","updateOffset","_d","setTime","rawSetter","rawGetter","rawMonthSetter","input","compareArrays","dontConvert","lengthDiff","diffs","toInt","normalizeUnits","units","lowered","unitAliases","camelFunctions","inputObject","normalizedProp","makeList","setter","getter","method","_lang","results","utc","set","argumentForCoercion","coercedNumber","isFinite","daysInMonth","UTC","getUTCDate","weeksInYear","dow","doy","weekOfYear","daysInYear","isLeapYear","_a","_pf","DATE","_overflowDayOfYear","isValid","_isValid","_strict","normalizeLanguage","makeAs","model","_isUTC","zone","_offset","local","loadLang","abbr","languages","unloadLang","getLangDefinition","hasModule","removeFormattingTokens","makeFormatFunction","formattingTokens","formatTokenFunctions","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","getParseRegexForToken","parseTokenOneDigit","parseTokenThreeDigits","parseTokenFourDigits","parseTokenOneToFourDigits","parseTokenSignedNumber","parseTokenSixDigits","parseTokenOneToSixDigits","parseTokenTwoDigits","parseTokenOneToThreeDigits","parseTokenWord","_l","_meridiemParse","parseTokenTimestampMs","parseTokenTimezone","parseTokenT","parseTokenDigits","parseTokenOneOrTwoDigits","parseTokenOrdinal","RegExp","regexpEscape","unescapeFormat","timezoneMinutesFromString","string","possibleTzMatches","tzChunk","parts","parseTimezoneChunker","addTimeToArrayFromToken","datePartArray","monthsParse","_dayOfYear","parseTwoDigitYear","_isPm","isPM","_useUTC","_tzm","weekdaysParse","_w","invalidWeekday","dayOfYearFromWeekInfo","weekYear","weekday","temp","GG","W","E","_week","gg","dayOfYearFromWeeks","dayOfYear","dateFromConfig","currentDate","yearToUse","currentDateArray","makeUTCDate","getUTCMonth","makeDate","setUTCMinutes","getUTCMinutes","dateFromObject","_i","getUTCFullYear","makeDateFromStringAndFormat","_f","ISO_8601","parseISO","parsedInput","tokens","skipped","stringLength","totalParsedInputLength","matched","p4","makeDateFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","NaN","score","l","isoRegex","isoDates","isoTimes","makeDateFromString","createFromInputFallback","makeDateFromInput","aspNetJsonRegex","ms","setUTCFullYear","parseWeekday","language","substituteTimeAgo","withoutSuffix","isFuture","relativeTime","relativeTimeThresholds","dd","dm","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","daysToDayOfWeek","daysToAdd","getUTCDay","makeMoment","invalid","preparse","pickBy","moments","res","dayOfMonth","unit","makeAccessor","keepTime","makeDurationGetter","makeDurationAsGetter","makeGlobal","shouldDeprecate","ender","oldGlobalMoment","globalScope","VERSION","_isAMomentObject","aspNetTimeSpanJsonRegex","isoDurationRegex","isoFormat","unitMillisecondFactors","Milliseconds","Seconds","Minutes","Hours","Days","Months","Years","D","Q","DDD","dayofyear","isoweekday","isoweek","weekyear","isoweekyear","ordinalizeTokens","paddedTokens","MMM","monthsShort","MMMM","weekdaysMin","ddd","weekdaysShort","dddd","weekdays","isoWeek","YY","YYYY","YYYYY","YYYYYY","gggg","ggggg","isoWeekYear","GGGG","GGGGG","isoWeekday","meridiem","SS","SSS","SSSS","Z","ZZ","zoneAbbr","zz","zoneName","unix","lists","DDDD","_monthsShort","monthName","regex","_monthsParse","_weekdays","_weekdaysShort","_weekdaysMin","weekdayName","_weekdaysParse","_longDateFormat","LT","L","LL","LLL","LLLL","val","isLower","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","_relativeTime","future","past","mm","hh","MM","yy","pastFuture","_ordinal","postformat","_invalidDate","ret","parseIso","isDuration","inp","version","defaultFormat","relativeTimeThreshold","threshold","limit","_abbr","langData","flags","parseZone","isDSTShifted","parsingFlags","invalidAt","inputString","dur","asFloat","that","zoneDiff","startOf","humanize","fromNow","sod","isDST","getDay","endOf","isAfter","isBefore","isSame","getTimezoneOffset","_changeInProgress","hasAlignedHourOffset","isoWeeksInYear","weekInfo","dates","isoWeeks","toJSON","withSuffix","difference","toIsoString","asSeconds","asMonths","require","noGlobal","repulsingForce","a_base","minimumDistance","nodeCount","_formBarnesHutTree","_getForceContribution","children","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","MAX_VALUE","sizeDiff","minimumTreeSize","rootSize","halfRootSize","centerX","centerY","_splitBranch","_placeInTree","_updateBranchMass","totalMass","totalMassInv","biggestSize","skipMassUpdate","_placeInRegion","region","containedNode","_insertRegion","childSize","_drawTree","_drawBranch","branch","webpackContext","req","webpackContextResolve","./ar","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar.js","./az","./az.js","./bg","./bg.js","./bn","./bn.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de.js","./el","./el.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./eo","./eo.js","./es","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr.js","./gl","./gl.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it.js","./ja","./ja.js","./ka","./ka.js","./km","./km.js","./ko","./ko.js","./lb","./lb.js","./lt","./lt.js","./lv","./lv.js","./mk","./mk.js","./ml","./ml.js","./mr","./mr.js","./ms-my","./ms-my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl.js","./nn","./nn.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./sv","./sv.js","./ta","./ta.js","./th","./th.js","./tl-ph","./tl-ph.js","./tr","./tr.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./uk","./uk.js","./uz","./uz.js","./vi","./vi.js","./zh-cn","./zh-cn.js","./zh-tw","./zh-tw.js","resolve","__WEBPACK_AMD_DEFINE_ARRAY__","symbolMap","1","2","3","4","5","6","7","0","numberMap","١","٢","٣","٤","٥","٦","٧","٨","٩","٠","suffixes",70,80,50,100,10,30,60,90,"lastDigit","last2Digits","১","২","৩","৪","৫","৬","৭","৮","৯","০","relativeTimeWithMutation","mutation","specialMutationForYears","lastNumber","softMutation","mutationTable","plural","affix","lookup","processRelativeTime","monthsNominativeEl","monthsGenitiveEl","momentToFormat","_monthsGenitiveEl","_monthsNominativeEl","calendarEl","_calendarEl","monthsShortDot","ll","lll","llll","۱","۲","۳","۴","۵","۶","۷","۸","۹","۰","verbalNumber","numbersFuture","numbersPast","str","१","२","३","४","५","६","७","८","९","०","num","weekEndings","monthsCaseReplace","nominative","accusative","nounCase","monthsShortCaseReplace","weekdaysCaseReplace","ss","meridiemParse","processFutureTime","eifelerRegelAppliesToNumber","processPastTime","processLastWeek","eifelerRegelAppliesToWeekday","firstDigit","translateSeconds","translateSingular","forms","special","relativeWeekDay","weekDay","weekDays","word","relativeTimeWithPlural","monthsShortWithDots","monthsShortWithoutDots","monthsNominative","monthsSubjective","separator","translator","words","correctGrammaticalCase","wordKey","lastWeekDays","genitive","processHoursFunction","hm","startOfWeek","prefix","webpackPolyfill","paths"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"vis.map","sources":["./dist/vis.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","util","DOMutil","DataSet","DataView","Graph3d","Timeline","Graph2d","timeline","DataStep","Range","stack","TimeStep","components","items","Item","ItemBox","ItemPoint","ItemRange","Component","CurrentTime","CustomTime","DataAxis","GraphGroup","Group","ItemSet","Legend","LineGraph","TimeAxis","Network","network","Edge","Groups","Images","Node","Popup","dotparser","Graph","Error","Hammer","moment","isNumber","object","Number","isString","String","isDate","Date","match","ASPDateRegex","exec","isNaN","parse","isDataTable","google","visualization","DataTable","randomUUID","S4","Math","floor","random","toString","extend","a","i","len","arguments","length","other","prop","hasOwnProperty","selectiveExtend","props","Array","isArray","selectiveDeepExtend","b","TypeError","constructor","Object","undefined","deepExtend","equalArray","convert","type","Boolean","valueOf","isMoment","toDate","getType","toISOString","value","getAbsoluteLeft","elem","doc","document","documentElement","body","left","offsetLeft","e","offsetParent","scrollLeft","getAbsoluteTop","top","offsetTop","scrollTop","getPageY","event","pageY","clientY","targetTouches","clientTop","getPageX","pageX","clientX","clientLeft","addClassName","className","classes","split","indexOf","push","join","removeClassName","index","splice","forEach","callback","toArray","array","updateProperty","key","addEventListener","element","action","listener","useCapture","navigator","userAgent","attachEvent","removeEventListener","detachEvent","getTarget","window","target","srcElement","nodeType","parentNode","fakeGesture","eventType","gesture","collectEventData","center","option","asBoolean","defaultValue","asNumber","asString","asSize","asElement","GiveDec","Hex","Value","eval","GiveHex","Dec","parseColor","color","isValidHex","hsv","hexToHSV","lighterColorHSV","h","s","v","min","darkerColorHSV","darkerColorHex","HSVToHex","lighterColorHex","background","border","highlight","hover","hexToRGB","hex","replace","toUpperCase","substring","d","f","r","g","RGBToHex","red","green","blue","RGBToHSV","minRGB","maxRGB","max","hue","saturation","HSVToRGB","q","t","rgb","isOk","test","selectiveBridgeObject","fields","referenceObject","objectTo","create","bridgeObject","mergeOptions","mergeTarget","options","enabled","binarySearch","orderedItems","range","field","field2","found","low","high","newLow","newHigh","guess","isVisible","start","binarySearchGeneric","sidePreference","newGuess","prevValue","nextValue","prepareElements","JSONcontainer","elementType","redundant","used","cleanupElements","removeChild","getSVGElement","svgContainer","shift","createElementNS","appendChild","getDOMElement","DOMContainer","createElement","drawPoint","x","y","group","point","drawPoints","style","setAttributeNS","size","drawBar","width","height","rect","data","_options","_data","_fieldId","fieldId","_type","_subscribers","add","prototype","on","subscribers","subscribe","off","filter","unsubscribe","_trigger","params","senderId","concat","subscriber","addedIds","me","_addItem","columns","_getColumnNames","row","rows","getNumberOfRows","item","col","cols","getValue","update","updatedIds","addOrUpdate","_updateItem","get","ids","firstType","returnType","itemId","_getItem","order","_sort","_filterFields","_appendRow","getIds","getDataSet","map","mappedItems","filteredItem","name","sort","av","bv","remove","removedId","removedIds","_remove","clear","keys","maxField","itemField","minField","distinct","values","fieldType","count","exists","types","raw","converted","JSON","stringify","dataTable","getNumberOfColumns","getColumnId","getColumnLabel","addRow","setValue","_ids","_onEvent","apply","setData","viewOptions","getArguments","defaultFilter","dataSet","added","updated","removed","container","SyntaxError","containerElement","margin","defaultXCenter","defaultYCenter","xLabel","yLabel","zLabel","filterLabel","legendLabel","STYLE","DOT","showPerspective","showGrid","keepAspectRatio","showShadow","showGrayBottom","showTooltip","verticalRatio","animationInterval","animationPreload","camera","Camera","eye","Point3d","dataPoints","colX","colY","colZ","colValue","colFilter","xMin","xStep","xMax","yMin","yStep","yMax","zMin","zStep","zMax","valueMin","valueMax","xBarWidth","yBarWidth","colorAxis","colorGrid","colorDot","colorDotBorder","setOptions","Slider","visible","frame","position","prev","play","next","bar","borderRadius","MozBorderRadius","backgroundColor","slide","onmousedown","_onMouseDown","onclick","togglePlay","onChangeCallback","playTimeout","playInterval","playLoop","Emitter","Point2d","Filter","StepNumber","armLocation","armRotation","horizontal","vertical","armLength","cameraLocation","cameraRotation","PI","calculateCameraOrientation","setArmLocation","z","setArmRotation","getArmRotation","rot","setArmLength","getArmLength","getCameraLocation","getCameraRotation","sin","cos","_setScale","scale","xCenter","yCenter","zCenter","_convert3Dto2D","point3d","translation","_convertPointToTranslation","_convertTranslationToScreen","ax","ay","az","cx","cy","cz","sinTx","cosTx","sinTy","cosTy","sinTz","cosTz","dx","dy","dz","bx","by","ex","ey","ez","xcenter","canvas","clientWidth","ycenter","_setBackgroundColor","fill","stroke","strokeWidth","borderColor","borderWidth","borderStyle","BAR","BARCOLOR","BARSIZE","DOTLINE","DOTCOLOR","DOTSIZE","GRID","LINE","SURFACE","_getStyleNumber","styleName","_determineColumnIndexes","counter","column","getDistinctValues","distinctValues","getColumnRange","minMax","_dataInitialize","rawData","_onChange","dataFilter","setOnLoadCallback","redraw","withBars","defaultXBarWidth","dataX","defaultYBarWidth","dataY","xRange","defaultXMin","defaultXMax","defaultXStep","yRange","defaultYMin","defaultYMax","defaultYStep","zRange","defaultZMin","defaultZMax","defaultZStep","valueRange","defaultValueMin","defaultValueMax","_getDataPoints","sortNumber","obj","dataMatrix","xIndex","yIndex","trans","screen","bottom","pointRight","pointTop","pointCross","hasChildNodes","firstChild","overflow","noCanvas","fontWeight","padding","innerHTML","ontouchstart","_onTouchStart","onmousewheel","_onWheel","ontooltip","_onTooltip","G3DaddEventListener","onkeydown","setSize","_resizeCanvas","clientHeight","animationStart","slider","animationStop","stop","_resizeCenter","charAt","parseFloat","setCameraPosition","pos","distance","getCameraPosition","_readData","_redrawFilter","animationAutoStart","cameraPosition","styleNumber","tooltip","showAnimationControls","_redrawSlider","_redrawClear","_redrawAxis","_redrawDataGrid","_redrawDataLine","_redrawDataBar","_redrawDataDot","_redrawInfo","_redrawLegend","ctx","getContext","clearRect","widthMin","widthMax","dotSize","right","lineWidth","font","ymin","ymax","_hsv2rgb","strokeStyle","beginPath","moveTo","lineTo","strokeRect","fillStyle","closePath","gridLineLen","step","getCurrent","end","textAlign","textBaseline","fillText","label","setValues","setPlayInterval","onchange","getIndex","selectValue","setOnChangeCallback","lineStyle","getLabel","getSelectedValue","from","to","prettyStep","text","xText","yText","zText","offset","xOffset","yOffset","xMin2d","xMax2d","gridLenX","gridLenY","textMargin","armAngle","H","S","V","R","G","B","C","Hi","X","abs","parseInt","cross","topSideVisible","zAvg","transBottom","dist","sortDepth","aDiff","subtract","bDiff","crossproduct","crossProduct","radius","arc","j","surface","corners","xWidth","yWidth","surfaces","avg","transCenter","diff","leftButtonDown","_onMouseUp","which","button","touchDown","startMouseX","getMouseX","startMouseY","getMouseY","startStart","startEnd","startArmRotation","cursor","onmousemove","_onMouseMove","onmouseup","G3DpreventDefault","diffX","diffY","horizontalNew","verticalNew","snapAngle","snapValue","round","parameters","emit","G3DremoveEventListener","delay","mouseX","mouseY","tooltipTimeout","clearTimeout","_hideTooltip","dataPoint","_dataPointFromXY","_showTooltip","setTimeout","ontouchmove","_onTouchMove","ontouchend","_onTouchEnd","delta","wheelDelta","detail","oldLength","newLength","_insideTriangle","triangle","sign","as","bs","cs","distMax","closestDataPoint","closestDist","triangle1","triangle2","distX","distY","sqrt","content","line","dot","dom","boxShadow","borderLeft","contentWidth","offsetWidth","contentHeight","offsetHeight","lineHeight","dotWidth","dotHeight","G3DstopPropagation","stopPropagation","cancelBubble","preventDefault","returnValue","setIndex","playNext","interval","clearInterval","getPlayInterval","setPlayLoop","doLoop","onChange","indexToLeft","startClientX","startSlideX","leftToIndex","defaultOptions","autoResize","orientation","maxHeight","minHeight","_create","domProps","emitter","bind","snap","toScreen","_toScreen","toGlobalScreen","_toGlobalScreen","toTime","_toTime","toGlobalTime","_toGlobalTime","timeAxis","currentTime","customTime","itemSet","itemsData","groupsData","setItems","backgroundVertical","backgroundHorizontal","centerContainer","leftContainer","rightContainer","shadowTop","shadowBottom","shadowTopLeft","shadowBottomLeft","shadowTopRight","shadowBottomRight","_onTouch","_onPinch","_onDragStart","_onDrag","hammer","prevent_default","listeners","events","args","slice","scrollTopMin","touch","destroy","_stopAutoResize","component","_initAutoResize","setCustomTime","time","getCustomTime","newDataSet","initialLoad","fit","setWindow","setGroups","groups","what","dataRange","getItemRange","setRange","dataset","minItem","maxStartItem","maxEndItem","setSelection","getSelection","getWindow","getRange","resized","borderRootHeight","borderRootWidth","autoHeight","containerHeight","centerWidth","_updateScrollTop","visibilityTop","visibilityBottom","visibility","repaint","conversion","_startAutoResize","_onResize","lastWidth","lastHeight","watchTimer","setInterval","allowDragging","initialScrollTop","deltaY","oldScrollTop","_getScrollTop","newScrollTop","_setScrollTop","linegraph","backgroundHorizontalContainer","minimumStep","forcedStepSize","current","autoScale","stepIndex","marginStart","marginEnd","majorSteps","minorSteps","_start","_end","setMinimumStep","setFirst","safeSize","minimumStepValue","orderOfMagnitude","log","LN10","minorStepIdx","magnitudefactor","pow","solutionFound","stepSize","first","niceStart","niceEnd","roundToMinor","marginRange","rounded","hasNext","previous","toPrecision","isMajor","now","hours","minutes","seconds","milliseconds","clone","direction","moveable","zoomable","zoomMin","zoomMax","_onDragEnd","_onHold","_onMouseWheel","validateDirection","getPointer","changed","_applyRange","newStart","newEnd","deltaX","diffRange","pointer","pointerDate","_pointerToDate","zoom","touches","initDate","move","EPSILON","orderByStart","orderByEnd","aTime","bTime","force","iMax","axis","collidingItem","jj","collision","nostack","SCALE","DAY","MILLISECOND","SECOND","MINUTE","HOUR","WEEKDAY","MONTH","YEAR","setFullYear","getFullYear","setMonth","setDate","setHours","setMinutes","setSeconds","setMilliseconds","getMilliseconds","getSeconds","getMinutes","getHours","getDate","getMonth","setScale","newScale","newStep","setAutoScale","enable","stepYear","stepMonth","stepDay","stepHour","stepMinute","stepSecond","stepMillisecond","date","year","getLabelMinor","format","getLabelMajor","_isResized","_previousWidth","_previousHeight","showCurrentTime","parent","title","currentTimeTimer","showCustomTime","eventParams","drag","dragging","svg","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","linegraphSVG","DOMelements","lines","labels","conversionFactor","minWidth","stepPixels","stepPixelsForced","lineOffset","master","svgElements","amountOfGroups","addGroup","graphOptions","updateGroup","removeGroup","hide","show","lineContainer","display","_redrawGroupIcons","iconHeight","iconOffset","groupId","drawIcon","changeCalled","_calculateCharSize","minorLabelHeight","minorCharHeight","majorLabelHeight","majorCharHeight","minorLineWidth","minorLineHeight","majorLineWidth","majorLineHeight","_redrawLabels","amountOfSteps","stepDifference","valueAtZero","marginStartPos","maxLabelSize","_redrawLabel","_redrawLine","characterHeight","largestWidth","majorCharWidth","minorCharWidth","convertValue","invertedValue","convertedValue","textMinor","createTextNode","measureCharMinor","textMajor","measureCharMajor","groupsUsingDefaultStyles","usingDefaultStyle","zeroPosition","setZeroPosition","catmullRom","parametrization","alpha","SVGcontainer","path","fillPath","fillHeight","outline","shaded","barWidth","bar1Height","bar2Height","visibleItems","byStart","byEnd","inner","foreground","marker","Element","getLabelWidth","restack","_updateVisibleItems","markerHeight","lastMarkerHeight","dirty","displayed","ii","repositionY","labelSet","setParent","_checkIfVisible","removeFromDataSet","removeItem","_constructByEndArray","endArray","initialPosByStart","newVisibleItems","initialPosByEnd","_checkIfInvisible","repositionX","align","groupOrder","selectable","editable","updateTime","onAdd","onUpdate","onMove","onRemove","itemOptions","itemListeners","_onAdd","_onUpdate","_onRemove","groupListeners","_onAddGroups","_onUpdateGroups","_onRemoveGroups","groupIds","selection","stackDirty","touchParams","UNGROUPED","box","_updateUngrouped","_onSelectItem","_onMultiSelectItem","_onAddItem","addCallback","fn","Function","markDirty","unselect","select","_deselect","_orderGroups","visibleInterval","zoomed","lastVisibleInterval","firstGroup","_firstGroup","firstMargin","nonFirstMargin","groupMargin","groupResized","firstGroupIndex","firstGroupId","ungrouped","getLabelSet","oldItemsData","getItems","_order","getGroups","itemData","_removeItem","groupData","groupOptions","oldGroupId","oldGroup","itemFromTarget","selected","dragLeftItem","dragRightItem","itemProps","groupFromTarget","changes","ctrlKey","srcEvent","shiftKey","oldSelection","newSelection","xAbs","newItem","itemSetFromTarget","side","iconSize","iconSpacing","textArea","drawLegendIcons","getComputedStyle","paddingTop","yAxisOrientation","defaultGroup","sampling","graphHeight","barChart","dataAxis","legend","lastStart","rangePerPixelInv","_updateGraph","yAxisLeft","yAxisRight","legendLeft","legendRight","_updateAllGroupData","_updateGroup","groupsContent","ungroupedCounter","preprocessedGroup","preprocessedGroupData","processedGroupData","groupRanges","minDate","maxDate","_preprocessData","_updateYAxis","_convertYvalues","_drawLineGraph","_drawBarGraph","minVal","maxVal","yAxisLeftUsed","yAxisRightUsed","minLeft","minRight","maxLeft","maxRight","_toggleAxisVisiblity","drawIcons","axisUsed","coreDistance","_drawPoints","svgHeight","_catmullRom","_linear","dFill","datapoints","xValue","yValue","extractedData","increment","amountOfPoints","xDistance","pointsPerPixel","ceil","_catmullRomUniform","p0","p1","p2","p3","bp1","bp2","normalization","d1","d2","d3","A","N","M","d3powA","d2powA","d3pow2A","d2pow2A","d1pow2A","d1powA","majorLines","majorTexts","minorLines","minorTexts","lineTop","parentChanged","foregroundNextSibling","nextSibling","backgroundNextSibling","_repaintLabels","insertBefore","xFirstMajorLabel","cur","_repaintMinorText","_repaintMajorText","_repaintMajorLine","_repaintMinorLine","leftTime","leftText","widthText","arr","pop","childNodes","nodeValue","_repaintDeleteButton","anchor","deleteButton","itemSetHeight","marginLeft","baseClassName","_repaintDragLeft","_repaintDragRight","contentLeft","parentWidth","boxWidth","dragLeft","dragRight","_initializeMixinLoaders","renderRefreshRate","renderTimestep","renderTime","maxPhysicsTicksPerRender","physicsDiscreteStepsize","stabilize","initializing","triggerFunctions","edit","editEdge","connect","del","constants","nodes","radiusMin","radiusMax","shape","image","fixed","fontColor","fontSize","fontFace","level","highlightColor","edges","widthSelectionMultiplier","hoverWidth","fontFill","arrowScaleFactor","dash","gap","altLength","inheritColor","configurePhysics","physics","barnesHut","theta","gravitationalConstant","centralGravity","springLength","springConstant","damping","repulsion","nodeDistance","hierarchicalRepulsion","clustering","initialMaxNodes","clusterThreshold","reduceToNodes","chainThreshold","clusterEdgeThreshold","sectorThreshold","screenSizeThreshold","fontSizeMultiplier","maxFontSize","forceAmplification","distanceAmplification","edgeGrowth","nodeScaling","maxNodeSizeIncrements","activeAreaBoxSize","clusterLevelDifference","navigation","keyboard","speed","dataManipulation","initiallyVisible","hierarchicalLayout","levelSeparation","nodeSpacing","freezeForStabilization","smoothCurves","dynamic","roundness","dynamicSmoothCurves","maxVelocity","minVelocity","stabilizationIterations","link","editNode","back","addDescription","linkDescription","editEdgeDescription","addError","linkError","editError","editBoundError","deleteError","deleteClusterError","dragNetwork","dragNodes","hideEdgesOnDrag","hideNodesOnDrag","hoverObj","controlNodesActive","images","setOnloadCallback","_redraw","xIncrement","yIncrement","zoomIncrement","_loadPhysicsSystem","_loadSectorSystem","_loadClusterSystem","_loadSelectionSystem","_loadHierarchySystem","_setTranslation","freezeSimulation","cachedFunctions","calculationNodes","calculationNodeIndices","nodeIndices","canvasTopLeft","canvasBottomRight","pointerPosition","areaCenter","previousScale","nodesData","edgesData","nodesListeners","_addNodes","_updateNodes","_removeNodes","edgesListeners","_addEdges","_updateEdges","_removeEdges","moving","timer","_setupHierarchicalLayout","zoomExtent","startWithClustering","mousetrap","MixinLoader","_getScriptPath","scripts","getElementsByTagName","src","_getRange","node","minY","maxY","minX","maxX","nodeId","_findCenter","_centerNetwork","initialZoom","disableStart","zoomLevel","numberOfNodes","factor","yDistance","xZoomLevel","yZoomLevel","_updateNodeIndexList","_clearNodeIndexList","idx","dotData","DOTToGraph","_setNodes","_setEdges","_putDataInSector","_stabilize","dragGraph","onEdit","onEditEdge","onConnect","onDelete","editMode","groupname","_loadNavigationControls","_loadManipulationSystem","_configureSmoothCurves","_createKeyBinds","pinch","_onTap","_onDoubleTap","_onRelease","_onMouseMoveTitle","reset","_moveUp","_yStopMoving","_moveDown","_moveLeft","_xStopMoving","_moveRight","_zoomIn","_stopZoom","_zoomOut","_createManipulatorBar","_deleteSelected","_getPointer","pinched","_getScale","_handleTouch","_handleDragStart","_getNodeAt","_getTranslation","isSelected","_selectObject","objectId","selectionObj","xFixed","yFixed","_handleOnDrag","_XconvertDOMtoCanvas","_XconvertCanvasToDOM","_YconvertDOMtoCanvas","_YconvertCanvasToDOM","_handleTap","_handleDoubleTap","_handleOnHold","_handleOnRelease","_zoom","scaleOld","scaleFrac","tx","ty","updateClustersDefault","popupObj","_checkHidePopup","checkShow","_checkShowPopup","popupTimer","edgeId","_getEdgeAt","_hoverObject","_blurObject","lastPopupNode","getTitle","isOverlappingWith","edge","connected","popup","setPosition","setText","manipulationDiv","navigationDivs","oldNodesData","_updateSelection","angle","_resetLevels","_updateCalculationNodes","_reconnectEdges","_updateValueRange","updateLabels","setProperties","properties","oldEdgesData","oldEdge","disconnect","showInternalIds","_createBezierNodes","via","sectors","setValueRange","w","save","translate","_doInAllSectors","restore","offsetX","offsetY","canvasToDOM","DOMtoCanvas","_drawNodes","alwaysShow","setScaleAndPos","inArea","draw","sMax","_drawEdges","_drawControlNodes","_freezeDefinedNodes","_physicsTick","_restoreFrozenNodes","iterations","fixedData","_isMoving","vmin","isMoving","_discreteStepNodes","nodesPresent","discreteStepLimited","discreteStep","vminCorrected","_doInAllActiveSectors","_doInSupportSector","_animationStep","_handleNavigation","calculationTime","maxSteps","timeRequired","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","ua","toLowerCase","requiresTimeout","toggleFreeze","smooth","mass","internalMultiplier","parentEdgeId","positionBezierNode","mixin","storePosition","dataArray","allowedToMoveX","allowedToMoveY","focusOnNode","nodePosition","requiredScale","canvasCenter","distanceFromCenter","console","fromId","toId","widthSelected","customLength","originalFromId","originalToId","widthFixed","lengthFixed","controlNodesEnabled","controlNodes","positions","connectedNode","_drawLine","_drawArrow","_drawArrowCenter","_drawDashLine","attachEdge","detachEdge","xFrom","yFrom","xTo","yTo","xObj","yObj","_getDistanceToEdge","_getColor","colorObj","_getLineWidth","_line","midpointX","midpointY","_pointOnLine","_label","resize","_circle","_pointOnCircle","networkScaleInv","_getViaCoordinates","xVia","yVia","quadraticCurveTo","measureText","fillRect","mozDash","setLineDash","pattern","lineDashOffset","mozDashOffset","lineCap","dashedLine","percentage","atan2","arrow","edgeSegmentLength","fromBorderDist","distanceToBorder","fromBorderPoint","toBorderDist","toBorderPoint","x1","y1","x2","y2","x3","y3","minDistance","px","py","something","u","nodeIdFrom","nodeIdTo","getControlNodePositions","_enableControlNodes","_disableControlNodes","_getSelectedControlNode","fromDistance","toDistance","_restoreControlNodes","defaultIndex","DEFAULT","load","url","img","Image","onload","imagelist","grouplist","dynamicEdges","reroutedEdges","fontDrawThreshold","horizontalAlignLeft","verticalAlignTop","baseRadiusValue","radiusFixed","preassignedLevel","fx","fy","vx","vy","minForce","resetCluster","dynamicEdgesLength","clusterSession","clusterSizeWidthFactor","clusterSizeHeightFactor","clusterSizeRadiusFactor","growthIndicator","networkScale","formationScale","clusterSize","containedNodes","containedEdges","clusterSessions","originalLabel","triggerFunction","groupObj","imageObj","_drawDatabase","_resizeDatabase","_drawBox","_resizeBox","_drawCircle","_resizeCircle","_drawEllipse","_resizeEllipse","_drawImage","_resizeImage","_drawText","_resizeText","_drawDot","_resizeShape","_drawSquare","_drawTriangle","_drawTriangleDown","_drawStar","_reset","clearSizeCache","_setForce","_addForce","isFixed","getDistance","globalAlpha","drawImage","textSize","getTextSize","clusterLineWidth","selectionLineWidth","roundRect","database","diameter","circle","defaultSize","ellipse","_drawShape","radiusMultiplier","baseline","labelUnderNode","lineCount","yLine","inView","clearVelocity","updateVelocity","massBeforeClustering","energyBefore","styleAttr","fontFamily","WebkitBorderRadius","whiteSpace","maxWidth","parseDOT","parseGraph","nextPreview","isAlphaNumeric","regexAlphaNumeric","merge","o","addNode","graph","graphs","attr","addEdge","createEdge","getToken","tokenType","TOKENTYPE","NULL","token","isComment","DELIMITER","c2","DELIMITERS","IDENTIFIER","newSyntaxError","UNKNOWN","chop","strict","parseStatements","parseStatement","subgraph","parseSubgraph","parseEdge","parseAttributeStatement","parseNodeStatement","subgraphs","parseAttributeList","message","maxLength","substr","forEach2","array1","array2","elem1","elem2","convertEdge","dotEdge","graphEdge","graphData","dotNode","graphNode","subEdge","{","}","[","]",";","=",",","->","--","sub","sum","onLoadCallback","loadInBackground","isLoaded","getLoadedProgress","getColumn","getValues","dataView","progress","_step","precision","_current","setStep","calculatePrettyStep","log10","step1","step2","step5","getStep","CanvasRenderingContext2D","square","s2","ir","triangleDown","star","n","r2d","kappa","ox","oy","xe","ye","xm","ym","bezierCurveTo","wEllipse","hEllipse","ymb","yeb","xt","yt","xi","yi","xl","yl","xr","yr","dashArray","dashLength","dashCount","slope","distRemaining","dashIndex","PhysicsMixin","ClusterMixin","SectorsMixin","SelectionMixin","ManipulationMixin","NavigationMixin","HierarchicalLayoutMixin","_loadMixin","sourceVariable","mixinFunction","_clearMixin","_loadSelectedForceSolver","_loadPhysicsConfiguration","hubThreshold","activeSector","drawingNode","blockConnectingEdgeSelection","forceAppendSelection","editModeDiv","closeDiv","_cleanNavigation","_loadNavigationElements","_callbacks","once","self","removeListener","removeAllListeners","callbacks","cb","hasListeners","_addEvent","_characterFromEvent","fromCharCode","_MAP","_KEYCODE_MAP","_stop","tag_name","tagName","contentEditable","_modifiersMatch","modifiers1","modifiers2","_resetSequences","do_not_reset","active_sequences","_sequence_levels","_inside_sequence","_getMatches","character","modifiers","combination","matches","_isModifier","seq","combo","_eventModifiers","altKey","metaKey","_fireCallback","_handleCharacter","processed_sequence_callback","_handleKey","keyCode","_ignore_next_keyup","_resetSequenceTimer","_reset_timer","_getReverseMap","_REVERSE_MAP","_pickBestAction","_bindSequence","_increaseSequence","_callbackAndReset","_bindSingle","sequence_name","sequence","_SPECIAL_ALIASES","_SHIFT_MAP","_bindMultiple","combinations",8,9,13,16,17,18,20,27,32,33,34,35,36,37,38,39,40,45,46,91,93,224,106,107,109,110,111,186,187,188,189,190,191,192,219,220,221,222,"~","!","@","#","$","%","^","&","*","(",")","_","+",":","\"","<",">","?","|","command","return","escape","_direct_map","unbind","trigger","clusterToFit","maxNumberOfNodes","reposition","maxLevels","forceAggregateHubs","normalizeClusterLevels","increaseClusterLevel","repositionNodes","openCluster","isMovingBeforeClustering","_nodeInActiveArea","_sector","_addSector","decreaseClusterLevel","_expandClusterNode","_updateDynamicEdges","updateClusters","zoomDirection","recursive","doNotStart","amountOfNodes","_collapseSector","_formClusters","_openClusters","_openClustersBySize","_aggregateHubs","handleChains","chainPercentage","_getChainFraction","_reduceAmountOfChains","_getHubSize","_formClustersByHub","openAll","containedNodeId","childNode","_expelChildFromParent","_unselectAll","_releaseContainedEdges","_connectEdgeBackToChild","_validateEdges","othersPresent","childNodeId","_repositionBezierNodes","_formClustersByZoom","_forceClustersByZoom","minLength","_addToCluster","_clusterToSmallestNeighbour","smallestNeighbour","smallestNeighbourNode","neighbour","onlyEqual","_formClusterFromHub","hubNode","absorptionSizeOffset","allowCluster","edgesIdarray","amountOfInitialEdges","_addToContainedEdges","_connectEdgeToCluster","_containCircularEdgesFromNode","massBefore","correction","edgeToId","edgeFromId","k","_addToReroutedEdges","maxLevel","minLevel","clusterLevel","targetLevel","average","averageSquared","hubCounter","largestHub","variance","standardDeviation","fraction","reduceAmount","chains","total","_switchToSector","sectorId","sectorType","_switchToActiveSector","_switchToFrozenSector","_switchToSupportSector","_loadLatestSector","_previousSector","_setActiveSector","newId","_forgetLastSector","_createNewSector","_deleteActiveSector","_deleteFrozenSector","_freezeSector","_activateSector","_mergeThisWithFrozen","_collapseThisToSingleCluster","sector","unqiueIdentifier","previousSector","runFunction","argument","_doInAllFrozenSectors","_drawSectorNodes","_drawAllSectorNodes","_getNodesOverlappingWith","overlappingNodes","_getAllNodesOverlappingWith","_pointerToPositionObject","positionObject","_getEdgesOverlappingWith","overlappingEdges","_getAllEdgesOverlappingWith","_addToSelection","_addToHover","_removeFromSelection","doNotTrigger","_unselectClusters","_getSelectedNodeCount","_getSelectedNode","_getSelectedEdge","_getSelectedEdgeCount","_getSelectedObjectCount","_selectionIsEmpty","_clusterInSelection","_selectConnectedEdges","_hoverConnectedEdges","_unselectConnectedEdges","append","highlightEdges","nodeIds","getSelectedNodes","edgeIds","getSelectedEdges","idArray","RangeError","selectNodes","selectEdges","_clearManipulatorBar","_restoreOverloadedFunctions","functionName","_toggleEditMode","toolbar","getElementById","boundFunction","edgeBeingEdited","selectedControlNode","addNodeButton","_createAddNodeToolbar","addEdgeButton","_createAddEdgeToolbar","editButton","_editNode","_createEditEdgeToolbar","editModeButton","backButton","_addNode","_handleConnect","_finishConnect","_selectControlNode","_controlNodeDrag","_releaseControlNode","newNode","_editEdge","alert","connectFromId","_createEdge","defaultData","finalizedData","sourceNodeId","targetNodeId","selectedNodes","selectedEdges","wrapper","navigationDivActions","_stopMovement","_preventDefault","hubsize","definedLevel","undefinedLevel","_changeConstants","_determineLevels","distribution","_getDistribution","_placeNodesByHierarchy","minPos","_placeBranchNodes","amount","maxCount","_setLevel","parentId","parentLevel","nodeMoved","_restoreNodes","setup","READY","determineEventTypes","gestures","detection","register","onTouch","DOCUMENT","EVENT_MOVE","detect","EVENT_END","Instance","defaults","stop_browser_behavior","userSelect","touchAction","touchCallout","contentZooming","userDrag","tapHighlightColor","HAS_POINTEREVENTS","pointerEnabled","msPointerEnabled","HAS_TOUCHEVENTS","MOBILE_REGEX","NO_MOUSEEVENTS","EVENT_TYPES","DIRECTION_DOWN","DIRECTION_LEFT","DIRECTION_UP","DIRECTION_RIGHT","POINTER_MOUSE","POINTER_TOUCH","POINTER_PEN","EVENT_START","plugins","utils","stopDefaultBrowserBehavior","ev","startDetect","handler","eventData","createEvent","initEvent","hasParent","dispatchEvent","state","last_move_event","enable_detect","touch_triggered","bindDom","sourceEventType","count_touches","PointerEvent","updatePointer","getEvents","getTouchList","identifier","pointerType","matchType","getCenter","timeStamp","getTime","preventManipulation","stopDetect","pointers","touchlist","pointerEvent","pointerId","MSPOINTER_TYPE_MOUSE","MSPOINTER_TYPE_TOUCH","MSPOINTER_TYPE_PEN","dest","valuesX","valuesY","getVelocity","delta_time","delta_x","delta_y","getAngle","touch1","touch2","getDirection","getScale","getRotation","isVertical","css_props","vendors","onselectstart","stopped","inst","startEvent","lastEvent","extendEventData","inst_options","startEv","velocity","deltaTime","velocityX","velocityY","rotation","Hold","hold_timeout","hold_threshold","Tap","tap_max_touchtime","tap_max_distance","tap_always","doubletap_distance","doubletap_interval","did_doubletap","Swipe","swipe_max_touches","swipe_velocity","Drag","drag_min_distance","drag_max_touches","drag_block_horizontal","drag_block_vertical","drag_lock_to_axis","drag_lock_min_distance","triggered","drag_locked_to_axis","last_direction","Transform","transform_min_scale","transform_min_rotation","transform_always_block","scale_threshold","rotation_threshold","Touch","Infinity","prevent_mouseevents","Release","graphToggleSmoothCurves","graph_toggleSmooth","graphRepositionNodes","graphGenerateOptions","optionsSpecific","radioButton1","radioButton2","checked","backupConstants","optionsDiv","switchConfigurations","radioButton","querySelector","tableId","table","showValueOfRange","constantsVariableName","valueId","rangeValue","_overWriteGraphConstants","RepulsionMixin","HierarchialRepulsionMixin","BarnesHutMixin","_toggleBarnesHut","barnesHutTree","_initializeForceCalculation","_calculateForces","_calculateGravitationalForces","_calculateNodeForces","_calculateSpringForcesWithSupport","_calculateHierarchicalSpringForces","_calculateSpringForces","supportNodes","supportNodeId","gravity","gravityForce","edgeLength","springForce","combinedClusterSize","node1","node2","node3","_calculateSpringForce","physicsConfiguration","hierarchicalLayoutDirections","parentElement","rangeElement","radioButton3","graph_repositionNodes","graph_generateOptions","nameArray","__WEBPACK_AMD_DEFINE_RESULT__","global","dfl","defaultParsingFlags","empty","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","deprecate","msg","printMsg","suppressDeprecationWarnings","warn","firstTime","padToken","func","leftZeroFill","ordinalizeToken","period","lang","ordinal","Language","Moment","config","checkOverflow","Duration","duration","normalizedInput","normalizeObjectUnits","years","quarters","quarter","months","month","weeks","week","days","day","hour","minute","second","millisecond","_milliseconds","_days","_months","_bubble","cloneMoment","result","momentProperties","absRound","number","targetLength","forceSign","output","addOrSubtractDurationFromMoment","mom","isAdding","updateOffset","_d","setTime","rawSetter","rawGetter","rawMonthSetter","input","compareArrays","dontConvert","lengthDiff","diffs","toInt","normalizeUnits","units","lowered","unitAliases","camelFunctions","inputObject","normalizedProp","makeList","setter","getter","method","_lang","results","utc","set","argumentForCoercion","coercedNumber","isFinite","daysInMonth","UTC","getUTCDate","weeksInYear","dow","doy","weekOfYear","daysInYear","isLeapYear","_a","_pf","DATE","_overflowDayOfYear","isValid","_isValid","_strict","normalizeLanguage","makeAs","model","_isUTC","zone","_offset","local","loadLang","abbr","languages","unloadLang","getLangDefinition","hasModule","removeFormattingTokens","makeFormatFunction","formattingTokens","formatTokenFunctions","formatMoment","expandFormat","formatFunctions","invalidDate","replaceLongDateFormatTokens","longDateFormat","localFormattingTokens","lastIndex","getParseRegexForToken","parseTokenOneDigit","parseTokenThreeDigits","parseTokenFourDigits","parseTokenOneToFourDigits","parseTokenSignedNumber","parseTokenSixDigits","parseTokenOneToSixDigits","parseTokenTwoDigits","parseTokenOneToThreeDigits","parseTokenWord","_l","_meridiemParse","parseTokenTimestampMs","parseTokenTimezone","parseTokenT","parseTokenDigits","parseTokenOneOrTwoDigits","parseTokenOrdinal","RegExp","regexpEscape","unescapeFormat","timezoneMinutesFromString","string","possibleTzMatches","tzChunk","parts","parseTimezoneChunker","addTimeToArrayFromToken","datePartArray","monthsParse","_dayOfYear","parseTwoDigitYear","_isPm","isPM","_useUTC","_tzm","weekdaysParse","_w","invalidWeekday","dayOfYearFromWeekInfo","weekYear","weekday","temp","GG","W","E","_week","gg","dayOfYearFromWeeks","dayOfYear","dateFromConfig","currentDate","yearToUse","currentDateArray","makeUTCDate","getUTCMonth","makeDate","setUTCMinutes","getUTCMinutes","dateFromObject","_i","getUTCFullYear","makeDateFromStringAndFormat","_f","ISO_8601","parseISO","parsedInput","tokens","skipped","stringLength","totalParsedInputLength","matched","p4","makeDateFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","NaN","score","l","isoRegex","isoDates","isoTimes","makeDateFromString","createFromInputFallback","makeDateFromInput","aspNetJsonRegex","ms","setUTCFullYear","parseWeekday","language","substituteTimeAgo","withoutSuffix","isFuture","relativeTime","relativeTimeThresholds","dd","dm","firstDayOfWeek","firstDayOfWeekOfYear","adjustedMoment","daysToDayOfWeek","daysToAdd","getUTCDay","makeMoment","invalid","preparse","pickBy","moments","res","dayOfMonth","unit","makeAccessor","keepTime","makeDurationGetter","makeDurationAsGetter","makeGlobal","shouldDeprecate","ender","oldGlobalMoment","globalScope","VERSION","_isAMomentObject","aspNetTimeSpanJsonRegex","isoDurationRegex","isoFormat","unitMillisecondFactors","Milliseconds","Seconds","Minutes","Hours","Days","Months","Years","D","Q","DDD","dayofyear","isoweekday","isoweek","weekyear","isoweekyear","ordinalizeTokens","paddedTokens","MMM","monthsShort","MMMM","weekdaysMin","ddd","weekdaysShort","dddd","weekdays","isoWeek","YY","YYYY","YYYYY","YYYYYY","gggg","ggggg","isoWeekYear","GGGG","GGGGG","isoWeekday","meridiem","SS","SSS","SSSS","Z","ZZ","zoneAbbr","zz","zoneName","unix","lists","DDDD","_monthsShort","monthName","regex","_monthsParse","_weekdays","_weekdaysShort","_weekdaysMin","weekdayName","_weekdaysParse","_longDateFormat","LT","L","LL","LLL","LLLL","val","isLower","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","_relativeTime","future","past","mm","hh","MM","yy","pastFuture","_ordinal","postformat","_invalidDate","ret","parseIso","isDuration","inp","version","defaultFormat","relativeTimeThreshold","threshold","limit","_abbr","langData","flags","parseZone","isDSTShifted","parsingFlags","invalidAt","inputString","dur","asFloat","that","zoneDiff","startOf","humanize","fromNow","sod","isDST","getDay","endOf","isAfter","isBefore","isSame","getTimezoneOffset","_changeInProgress","hasAlignedHourOffset","isoWeeksInYear","weekInfo","dates","isoWeeks","toJSON","withSuffix","difference","toIsoString","asSeconds","asMonths","require","noGlobal","repulsingForce","a_base","minimumDistance","nodeCount","_formBarnesHutTree","_getForceContribution","children","NW","NE","SW","SE","parentBranch","childrenCount","centerOfMass","calcSize","MAX_VALUE","sizeDiff","minimumTreeSize","rootSize","halfRootSize","centerX","centerY","_splitBranch","_placeInTree","_updateBranchMass","totalMass","totalMassInv","biggestSize","skipMassUpdate","_placeInRegion","region","containedNode","_insertRegion","childSize","_drawTree","_drawBranch","branch","webpackContext","req","webpackContextResolve","./ar","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar.js","./az","./az.js","./bg","./bg.js","./bn","./bn.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de.js","./el","./el.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./eo","./eo.js","./es","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr.js","./gl","./gl.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it.js","./ja","./ja.js","./ka","./ka.js","./km","./km.js","./ko","./ko.js","./lb","./lb.js","./lt","./lt.js","./lv","./lv.js","./mk","./mk.js","./ml","./ml.js","./mr","./mr.js","./ms-my","./ms-my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl.js","./nn","./nn.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./sv","./sv.js","./ta","./ta.js","./th","./th.js","./tl-ph","./tl-ph.js","./tr","./tr.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./uk","./uk.js","./uz","./uz.js","./vi","./vi.js","./zh-cn","./zh-cn.js","./zh-tw","./zh-tw.js","resolve","__WEBPACK_AMD_DEFINE_ARRAY__","symbolMap","1","2","3","4","5","6","7","0","numberMap","١","٢","٣","٤","٥","٦","٧","٨","٩","٠","suffixes",70,80,50,100,10,30,60,90,"lastDigit","last2Digits","১","২","৩","৪","৫","৬","৭","৮","৯","০","relativeTimeWithMutation","mutation","specialMutationForYears","lastNumber","softMutation","mutationTable","plural","affix","lookup","processRelativeTime","monthsNominativeEl","monthsGenitiveEl","momentToFormat","_monthsGenitiveEl","_monthsNominativeEl","calendarEl","_calendarEl","monthsShortDot","ll","lll","llll","۱","۲","۳","۴","۵","۶","۷","۸","۹","۰","verbalNumber","numbersFuture","numbersPast","str","१","२","३","४","५","६","७","८","९","०","num","weekEndings","monthsCaseReplace","nominative","accusative","nounCase","monthsShortCaseReplace","weekdaysCaseReplace","ss","meridiemParse","processFutureTime","eifelerRegelAppliesToNumber","processPastTime","processLastWeek","eifelerRegelAppliesToWeekday","firstDigit","translateSeconds","translateSingular","forms","special","relativeWeekDay","weekDay","weekDays","word","relativeTimeWithPlural","monthsShortWithDots","monthsShortWithoutDots","monthsNominative","monthsSubjective","separator","translator","words","correctGrammaticalCase","wordKey","lastWeekDays","genitive","processHoursFunction","hm","startOfWeek","prefix","webpackPolyfill","paths"],"mappings":"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C,aAAc,GACdC,UAAW,GACXC,aAAc,GACdC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,aAAc,GACdC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,UAAW,GACXC,aAAc,GACdC,UAAW,GACXC,aAAc,GACdC,UAAW,GACXC,aAAc,GACdC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,aAAc,GACdC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,UAAW,GACXC,aAAc,GACdC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,GACRC,UAAW,GACXC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,UAAW,IACXC,UAAW,IACXC,aAAc,IACdC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,UAAW,IACXC,aAAc,IACdC,UAAW,IACXC,OAAQ,IACRC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"} \ No newline at end of file diff --git a/dist/vis.min.js b/dist/vis.min.js index 8933e740..9b4faa5e 100644 --- a/dist/vis.min.js +++ b/dist/vis.min.js @@ -5,7 +5,7 @@ * A dynamic, browser-based visualization library. * * @version 3.0.1-SNAPSHOT - * @date 2014-07-10 + * @date 2014-07-15 * * @license * Copyright (C) 2011-2014 Almende B.V, http://almende.com @@ -22,19 +22,19 @@ * License for the specific language governing permissions and limitations under * the License. */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):"object"==typeof exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function e(s){if(i[s])return i[s].exports;var n=i[s]={exports:{},id:s,loaded:!1};return t[s].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){e.util=i(1),e.DOMutil=i(2),e.DataSet=i(3),e.DataView=i(4),e.Graph3d=i(5),e.Timeline=i(6),e.Graph2d=i(7),e.timeline={DataStep:i(8),Range:i(9),stack:i(10),TimeStep:i(11),components:{items:{Item:i(22),ItemBox:i(23),ItemPoint:i(24),ItemRange:i(25)},Component:i(12),CurrentTime:i(13),CustomTime:i(14),DataAxis:i(15),GraphGroup:i(16),Group:i(17),ItemSet:i(18),Legend:i(19),LineGraph:i(20),TimeAxis:i(21)}},e.Network=i(26),e.network={Edge:i(27),Groups:i(28),Images:i(29),Node:i(30),Popup:i(31),dotparser:i(32)},e.Graph=function(){throw new Error("Graph is renamed to Network. Please create a graph as new vis.Network(...)")}},function(module,exports,__webpack_require__){var Hammer=__webpack_require__(38),moment=__webpack_require__(39);exports.isNumber=function(t){return t instanceof Number||"number"==typeof t},exports.isString=function(t){return t instanceof String||"string"==typeof t},exports.isDate=function(t){if(t instanceof Date)return!0;if(exports.isString(t)){var e=ASPDateRegex.exec(t);if(e)return!0;if(!isNaN(Date.parse(t)))return!0}return!1},exports.isDataTable=function(t){return"undefined"!=typeof google&&google.visualization&&google.visualization.DataTable&&t instanceof google.visualization.DataTable},exports.randomUUID=function(){var t=function(){return Math.floor(65536*Math.random()).toString(16)};return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},exports.extend=function(t){for(var e=1,i=arguments.length;i>e;e++){var s=arguments[e];for(var n in s)s.hasOwnProperty(n)&&(t[n]=s[n])}return t},exports.selectiveExtend=function(t,e){if(!Array.isArray(t))throw new Error("Array with property names expected as first argument");for(var i=2;ii;i++)if(t[i]!=e[i])return!1;return!0},exports.convert=function(t,e){var i;if(void 0===t)return void 0;if(null===t)return null;if(!e)return t;if("string"!=typeof e&&!(e instanceof String))throw new Error("Type must be a string");switch(e){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(moment.isMoment(t))return new Date(t.valueOf());if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])):moment(t).toDate();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"Moment":if(exports.isNumber(t))return moment(t);if(t instanceof Date)return moment(t.valueOf());if(moment.isMoment(t))return moment(t);if(exports.isString(t))return i=ASPDateRegex.exec(t),moment(i?Number(i[1]):t);throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"ISODate":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(moment.isMoment(t))return t.toDate().toISOString();if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])).toISOString():new Date(t).toISOString();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ISODate");case"ASPDate":if(exports.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(exports.isString(t)){i=ASPDateRegex.exec(t);var s;return s=i?new Date(Number(i[1])).valueOf():new Date(t).valueOf(),"/Date("+s+")/"}throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+e+'"')}};var ASPDateRegex=/^\/?Date\((\-?\d+)/i;exports.getType=function(t){var e=typeof t;return"object"==e?null==t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":t instanceof Array?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":e},exports.getAbsoluteLeft=function(t){for(var e=document.documentElement,i=document.body,s=t.offsetLeft,n=t.offsetParent;null!=n&&n!=i&&n!=e;)s+=n.offsetLeft,s-=n.scrollLeft,n=n.offsetParent;return s},exports.getAbsoluteTop=function(t){for(var e=document.documentElement,i=document.body,s=t.offsetTop,n=t.offsetParent;null!=n&&n!=i&&n!=e;)s+=n.offsetTop,s-=n.scrollTop,n=n.offsetParent;return s},exports.getPageY=function(t){if("pageY"in t)return t.pageY;var e;e="targetTouches"in t&&t.targetTouches.length?t.targetTouches[0].clientY:t.clientY;var i=document.documentElement,s=document.body;return e+(i&&i.scrollTop||s&&s.scrollTop||0)-(i&&i.clientTop||s&&s.clientTop||0)},exports.getPageX=function(t){if("pageY"in t)return t.pageX;var e;e="targetTouches"in t&&t.targetTouches.length?t.targetTouches[0].clientX:t.clientX;var i=document.documentElement,s=document.body;return e+(i&&i.scrollLeft||s&&s.scrollLeft||0)-(i&&i.clientLeft||s&&s.clientLeft||0)},exports.addClassName=function(t,e){var i=t.className.split(" ");-1==i.indexOf(e)&&(i.push(e),t.className=i.join(" "))},exports.removeClassName=function(t,e){var i=t.className.split(" "),s=i.indexOf(e);-1!=s&&(i.splice(s,1),t.className=i.join(" "))},exports.forEach=function(t,e){var i,s;if(t instanceof Array)for(i=0,s=t.length;s>i;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},exports.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},exports.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},exports.addEventListener=function(t,e,i,s){t.addEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,s)):t.attachEvent("on"+e,i)},exports.removeEventListener=function(t,e,i,s){t.removeEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,s)):t.detachEvent("on"+e,i)},exports.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},exports.fakeGesture=function(t,e){var i=null,s=Hammer.event.collectEventData(this,i,e);return isNaN(s.center.pageX)&&(s.center.pageX=e.pageX),isNaN(s.center.pageY)&&(s.center.pageY=e.pageY),s},exports.option={},exports.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},exports.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},exports.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},exports.option.asSize=function(t,e){return"function"==typeof t&&(t=t()),exports.isString(t)?t:exports.isNumber(t)?t+"px":e||null},exports.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},exports.GiveDec=function(Hex){var Value;return Value="A"==Hex?10:"B"==Hex?11:"C"==Hex?12:"D"==Hex?13:"E"==Hex?14:"F"==Hex?15:eval(Hex)},exports.GiveHex=function(t){var e;return e=10==t?"A":11==t?"B":12==t?"C":13==t?"D":14==t?"E":15==t?"F":""+t},exports.parseColor=function(t){var e;if(exports.isString(t))if(exports.isValidHex(t)){var i=exports.hexToHSV(t),s={h:i.h,s:.45*i.s,v:Math.min(1,1.05*i.v)},n={h:i.h,s:Math.min(1,1.25*i.v),v:.6*i.v},o=exports.HSVToHex(n.h,n.h,n.v),a=exports.HSVToHex(s.h,s.s,s.v);e={background:t,border:o,highlight:{background:a,border:o},hover:{background:a,border:o}}}else e={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}};else e={},e.background=t.background||"white",e.border=t.border||e.background,exports.isString(t.highlight)?e.highlight={border:t.highlight,background:t.highlight}:(e.highlight={},e.highlight.background=t.highlight&&t.highlight.background||e.background,e.highlight.border=t.highlight&&t.highlight.border||e.border),exports.isString(t.hover)?e.hover={border:t.hover,background:t.hover}:(e.hover={},e.hover.background=t.hover&&t.hover.background||e.background,e.hover.border=t.hover&&t.hover.border||e.border);return e},exports.hexToRGB=function(t){t=t.replace("#","").toUpperCase();var e=exports.GiveDec(t.substring(0,1)),i=exports.GiveDec(t.substring(1,2)),s=exports.GiveDec(t.substring(2,3)),n=exports.GiveDec(t.substring(3,4)),o=exports.GiveDec(t.substring(4,5)),a=exports.GiveDec(t.substring(5,6)),r=16*e+i,h=16*s+n,i=16*o+a;return{r:r,g:h,b:i}},exports.RGBToHex=function(t,e,i){var s=exports.GiveHex(Math.floor(t/16)),n=exports.GiveHex(t%16),o=exports.GiveHex(Math.floor(e/16)),a=exports.GiveHex(e%16),r=exports.GiveHex(Math.floor(i/16)),h=exports.GiveHex(i%16),d=s+n+o+a+r+h;return"#"+d},exports.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var s=Math.min(t,Math.min(e,i)),n=Math.max(t,Math.max(e,i));if(s==n)return{h:0,s:0,v:s};var o=t==s?e-i:i==s?t-e:i-t,a=t==s?3:i==s?1:5,r=60*(a-o/(n-s))/360,h=(n-s)/n,d=n;return{h:r,s:h,v:d}},exports.HSVToRGB=function(t,e,i){var s,n,o,a=Math.floor(6*t),r=6*t-a,h=i*(1-e),d=i*(1-r*e),l=i*(1-(1-r)*e);switch(a%6){case 0:s=i,n=l,o=h;break;case 1:s=d,n=i,o=h;break;case 2:s=h,n=i,o=l;break;case 3:s=h,n=d,o=i;break;case 4:s=l,n=h,o=i;break;case 5:s=i,n=h,o=d}return{r:Math.floor(255*s),g:Math.floor(255*n),b:Math.floor(255*o)}},exports.HSVToHex=function(t,e,i){var s=exports.HSVToRGB(t,e,i);return exports.RGBToHex(s.r,s.g,s.b)},exports.hexToHSV=function(t){var e=exports.hexToRGB(t);return exports.RGBToHSV(e.r,e.g,e.b)},exports.isValidHex=function(t){var e=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t);return e},exports.selectiveBridgeObject=function(t,e){if("object"==typeof e){for(var i=Object.create(e),s=0;so&&a>e||e>a&&r>e?(d=!0,a!=e&&("before"==s?e>o&&a>e&&(m=Math.max(0,m-1)):e>a&&r>e&&(m=Math.min(h.length-1,m+1)))):(e>a?l=Math.floor(.5*(c+l)):c=Math.floor(.5*(c+l)),n=Math.floor(.5*(c+l)),l==u&&c==p?(m=-1,d=!0):(c=p,l=u,m=Math.floor(.5*(c+l))));return m}},function(t,e){e.prepareElements=function(t){for(var e in t)t.hasOwnProperty(e)&&(t[e].redundant=t[e].used,t[e].used=[])},e.cleanupElements=function(t){for(var e in t)if(t.hasOwnProperty(e)&&t[e].redundant){for(var i=0;i0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(s)):(s=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.getDOMElement=function(t,e,i){var s;return e.hasOwnProperty(t)?e[t].redundant.length>0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElement(t),i.appendChild(s)):(s=document.createElement(t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.drawPoint=function(t,i,s,n,o){var a;return"circle"==s.options.drawPoints.style?(a=e.getSVGElement("circle",n,o),a.setAttributeNS(null,"cx",t),a.setAttributeNS(null,"cy",i),a.setAttributeNS(null,"r",.5*s.options.drawPoints.size),a.setAttributeNS(null,"class",s.className+" point")):(a=e.getSVGElement("rect",n,o),a.setAttributeNS(null,"x",t-.5*s.options.drawPoints.size),a.setAttributeNS(null,"y",i-.5*s.options.drawPoints.size),a.setAttributeNS(null,"width",s.options.drawPoints.size),a.setAttributeNS(null,"height",s.options.drawPoints.size),a.setAttributeNS(null,"class",s.className+" point")),a},e.drawBar=function(t,i,s,n,o,a,r){var h=e.getSVGElement("rect",a,r);h.setAttributeNS(null,"x",t-.5*s),h.setAttributeNS(null,"y",i),h.setAttributeNS(null,"width",s),h.setAttributeNS(null,"height",n),h.setAttributeNS(null,"class",o)}},function(t,e,i){function s(t,e){if(!t||Array.isArray(t)||n.isDataTable(t)||(e=t,t=null),this._options=e||{},this._data={},this._fieldId=this._options.fieldId||"id",this._type={},this._options.type)for(var i in this._options.type)if(this._options.type.hasOwnProperty(i)){var s=this._options.type[i];this._type[i]="Date"==s||"ISODate"==s||"ASPDate"==s?"Date":s}if(this._options.convert)throw new Error('Option "convert" is deprecated. Use "type" instead.');this._subscribers={},t&&this.add(t)}var n=i(1);s.prototype.on=function(t,e){var i=this._subscribers[t];i||(i=[],this._subscribers[t]=i),i.push({callback:e})},s.prototype.subscribe=s.prototype.on,s.prototype.off=function(t,e){var i=this._subscribers[t];i&&(this._subscribers[t]=i.filter(function(t){return t.callback!=e}))},s.prototype.unsubscribe=s.prototype.off,s.prototype._trigger=function(t,e,i){if("*"==t)throw new Error("Cannot trigger event *");var s=[];t in this._subscribers&&(s=s.concat(this._subscribers[t])),"*"in this._subscribers&&(s=s.concat(this._subscribers["*"]));for(var n=0;na;a++)i=o._addItem(t[a]),s.push(i);else if(n.isDataTable(t))for(var h=this._getColumnNames(t),d=0,l=t.getNumberOfRows();l>d;d++){for(var c={},u=0,p=h.length;p>u;u++){var m=h[u];c[m]=t.getValue(d,u)}i=o._addItem(c),s.push(i)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=o._addItem(t),s.push(i)}return s.length&&this._trigger("add",{items:s},e),s},s.prototype.update=function(t,e){var i=[],s=[],o=this,a=o._fieldId,r=function(t){var e=t[a];o._data[e]?(e=o._updateItem(t),s.push(e)):(e=o._addItem(t),i.push(e))};if(Array.isArray(t))for(var h=0,d=t.length;d>h;h++)r(t[h]);else if(n.isDataTable(t))for(var l=this._getColumnNames(t),c=0,u=t.getNumberOfRows();u>c;c++){for(var p={},m=0,_=l.length;_>m;m++){var f=l[m];p[f]=t.getValue(c,m)}r(p)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");r(t)}return i.length&&this._trigger("add",{items:i},e),s.length&&this._trigger("update",{items:s},e),i.concat(s)},s.prototype.get=function(){var t,e,i,s,o=this,a=n.getType(arguments[0]);"String"==a||"Number"==a?(t=arguments[0],i=arguments[1],s=arguments[2]):"Array"==a?(e=arguments[0],i=arguments[1],s=arguments[2]):(i=arguments[0],s=arguments[1]);var r;if(i&&i.returnType){if(r="DataTable"==i.returnType?"DataTable":"Array",s&&r!=n.getType(s))throw new Error('Type of parameter "data" ('+n.getType(s)+") does not correspond with specified options.type ("+i.type+")");if("DataTable"==r&&!n.isDataTable(s))throw new Error('Parameter "data" must be a DataTable when options.type is "DataTable"')}else r=s&&"DataTable"==n.getType(s)?"DataTable":"Array";var h,d,l,c,u=i&&i.type||this._options.type,p=i&&i.filter,m=[];if(void 0!=t)h=o._getItem(t,u),p&&!p(h)&&(h=null);else if(void 0!=e)for(l=0,c=e.length;c>l;l++)h=o._getItem(e[l],u),(!p||p(h))&&m.push(h);else for(d in this._data)this._data.hasOwnProperty(d)&&(h=o._getItem(d,u),(!p||p(h))&&m.push(h));if(i&&i.order&&void 0==t&&this._sort(m,i.order),i&&i.fields){var _=i.fields;if(void 0!=t)h=this._filterFields(h,_);else for(l=0,c=m.length;c>l;l++)m[l]=this._filterFields(m[l],_)}if("DataTable"==r){var f=this._getColumnNames(s);if(void 0!=t)o._appendRow(s,f,h);else for(l=0,c=m.length;c>l;l++)o._appendRow(s,f,m[l]);return s}if(void 0!=t)return h;if(s){for(l=0,c=m.length;c>l;l++)s.push(m[l]);return s}return m},s.prototype.getIds=function(t){var e,i,s,n,o,a=this._data,r=t&&t.filter,h=t&&t.order,d=t&&t.type||this._options.type,l=[];if(r)if(h){o=[];for(s in a)a.hasOwnProperty(s)&&(n=this._getItem(s,d),r(n)&&o.push(n));for(this._sort(o,h),e=0,i=o.length;i>e;e++)l[e]=o[e][this._fieldId]}else for(s in a)a.hasOwnProperty(s)&&(n=this._getItem(s,d),r(n)&&l.push(n[this._fieldId]));else if(h){o=[];for(s in a)a.hasOwnProperty(s)&&o.push(a[s]);for(this._sort(o,h),e=0,i=o.length;i>e;e++)l[e]=o[e][this._fieldId]}else for(s in a)a.hasOwnProperty(s)&&(n=a[s],l.push(n[this._fieldId]));return l},s.prototype.getDataSet=function(){return this},s.prototype.forEach=function(t,e){var i,s,n=e&&e.filter,o=e&&e.type||this._options.type,a=this._data;if(e&&e.order)for(var r=this.get(e),h=0,d=r.length;d>h;h++)i=r[h],s=i[this._fieldId],t(i,s);else for(s in a)a.hasOwnProperty(s)&&(i=this._getItem(s,o),(!n||n(i))&&t(i,s))},s.prototype.map=function(t,e){var i,s=e&&e.filter,n=e&&e.type||this._options.type,o=[],a=this._data;for(var r in a)a.hasOwnProperty(r)&&(i=this._getItem(r,n),(!s||s(i))&&o.push(t(i,r)));return e&&e.order&&this._sort(o,e.order),o},s.prototype._filterFields=function(t,e){var i={};for(var s in t)t.hasOwnProperty(s)&&-1!=e.indexOf(s)&&(i[s]=t[s]);return i},s.prototype._sort=function(t,e){if(n.isString(e)){var i=e;t.sort(function(t,e){var s=t[i],n=e[i];return s>n?1:n>s?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},s.prototype.remove=function(t,e){var i,s,n,o=[];if(Array.isArray(t))for(i=0,s=t.length;s>i;i++)n=this._remove(t[i]),null!=n&&o.push(n);else n=this._remove(t),null!=n&&o.push(n);return o.length&&this._trigger("remove",{items:o},e),o},s.prototype._remove=function(t){if(n.isNumber(t)||n.isString(t)){if(this._data[t])return delete this._data[t],t}else if(t instanceof Object){var e=t[this._fieldId];if(e&&this._data[e])return delete this._data[e],e}return null},s.prototype.clear=function(t){var e=Object.keys(this._data);return this._data={},this._trigger("remove",{items:e},t),e},s.prototype.max=function(t){var e=this._data,i=null,s=null;for(var n in e)if(e.hasOwnProperty(n)){var o=e[n],a=o[t];null!=a&&(!i||a>s)&&(i=o,s=a)}return i},s.prototype.min=function(t){var e=this._data,i=null,s=null;for(var n in e)if(e.hasOwnProperty(n)){var o=e[n],a=o[t];null!=a&&(!i||s>a)&&(i=o,s=a)}return i},s.prototype.distinct=function(t){var e,i=this._data,s=[],o=this._options.type&&this._options.type[t]||null,a=0;for(var r in i)if(i.hasOwnProperty(r)){var h=i[r],d=h[t],l=!1;for(e=0;a>e;e++)if(s[e]==d){l=!0;break}l||void 0===d||(s[a]=d,a++)}if(o)for(e=0;ei;i++)e[i]=t.getColumnId(i)||t.getColumnLabel(i);return e},s.prototype._appendRow=function(t,e,i){for(var s=t.addRow(),n=0,o=e.length;o>n;n++){var a=e[n];t.setValue(s,n,i[a])}},t.exports=s},function(t,e,i){function s(t,e){this._data=null,this._ids={},this._options=e||{},this._fieldId="id",this._subscribers={};var i=this;this.listener=function(){i._onEvent.apply(i,arguments)},this.setData(t)}var n=i(1),o=i(3);s.prototype.setData=function(t){var e,i,s;if(this._data){this._data.unsubscribe&&this._data.unsubscribe("*",this.listener),e=[];for(var n in this._ids)this._ids.hasOwnProperty(n)&&e.push(n);this._ids={},this._trigger("remove",{items:e})}if(this._data=t,this._data){for(this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||"id",e=this._data.getIds({filter:this._options&&this._options.filter}),i=0,s=e.length;s>i;i++)n=e[i],this._ids[n]=!0;this._trigger("add",{items:e}),this._data.on&&this._data.on("*",this.listener)}},s.prototype.get=function(){var t,e,i,s=this,o=n.getType(arguments[0]);"String"==o||"Number"==o||"Array"==o?(t=arguments[0],e=arguments[1],i=arguments[2]):(e=arguments[0],i=arguments[1]);var a=n.extend({},this._options,e);this._options.filter&&e&&e.filter&&(a.filter=function(t){return s._options.filter(t)&&e.filter(t)});var r=[];return void 0!=t&&r.push(t),r.push(a),r.push(i),this._data&&this._data.get.apply(this._data,r)},s.prototype.getIds=function(t){var e;if(this._data){var i,s=this._options.filter;i=t&&t.filter?s?function(e){return s(e)&&t.filter(e)}:t.filter:s,e=this._data.getIds({filter:i,order:t&&t.order})}else e=[];return e},s.prototype.getDataSet=function(){for(var t=this;t instanceof s;)t=t._data;return t||null},s.prototype._onEvent=function(t,e,i){var s,n,o,a,r=e&&e.items,h=this._data,d=[],l=[],c=[];if(r&&h){switch(t){case"add":for(s=0,n=r.length;n>s;s++)o=r[s],a=this.get(o),a&&(this._ids[o]=!0,d.push(o));break;case"update":for(s=0,n=r.length;n>s;s++)o=r[s],a=this.get(o),a?this._ids[o]?l.push(o):(this._ids[o]=!0,d.push(o)):this._ids[o]&&(delete this._ids[o],c.push(o));break;case"remove":for(s=0,n=r.length;n>s;s++)o=r[s],this._ids[o]&&(delete this._ids[o],c.push(o))}d.length&&this._trigger("add",{items:d},i),l.length&&this._trigger("update",{items:l},i),c.length&&this._trigger("remove",{items:c},i)}},s.prototype.on=o.prototype.on,s.prototype.off=o.prototype.off,s.prototype._trigger=o.prototype._trigger,s.prototype.subscribe=s.prototype.on,s.prototype.unsubscribe=s.prototype.off,t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.width="400px",this.height="400px",this.margin=10,this.defaultXCenter="55%",this.defaultYCenter="50%",this.xLabel="x",this.yLabel="y",this.zLabel="z",this.filterLabel="time",this.legendLabel="value",this.style=s.STYLE.DOT,this.showPerspective=!0,this.showGrid=!0,this.keepAspectRatio=!0,this.showShadow=!1,this.showGrayBottom=!1,this.showTooltip=!1,this.verticalRatio=.5,this.animationInterval=1e3,this.animationPreload=!1,this.camera=new s.Camera,this.eye=new h(0,0,-1),this.dataTable=null,this.dataPoints=null,this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.colFilter=void 0,this.xMin=0,this.xStep=void 0,this.xMax=1,this.yMin=0,this.yStep=void 0,this.yMax=1,this.zMin=0,this.zStep=void 0,this.zMax=1,this.valueMin=0,this.valueMax=1,this.xBarWidth=1,this.yBarWidth=1,this.colorAxis="#4D4D4D",this.colorGrid="#D3D3D3",this.colorDot="#7DC1FF",this.colorDotBorder="#3267D2",this.create(),this.setOptions(i),e&&this.setData(e)}function n(t,e){if(void 0===t)throw"Error: No container element defined";if(this.container=t,this.visible=e&&void 0!=e.visible?e.visible:!0,this.visible){this.frame=document.createElement("DIV"),this.frame.style.width="100%",this.frame.style.position="relative",this.container.appendChild(this.frame),this.frame.prev=document.createElement("INPUT"),this.frame.prev.type="BUTTON",this.frame.prev.value="Prev",this.frame.appendChild(this.frame.prev),this.frame.play=document.createElement("INPUT"),this.frame.play.type="BUTTON",this.frame.play.value="Play",this.frame.appendChild(this.frame.play),this.frame.next=document.createElement("INPUT"),this.frame.next.type="BUTTON",this.frame.next.value="Next",this.frame.appendChild(this.frame.next),this.frame.bar=document.createElement("INPUT"),this.frame.bar.type="BUTTON",this.frame.bar.style.position="absolute",this.frame.bar.style.border="1px solid red",this.frame.bar.style.width="100px",this.frame.bar.style.height="6px",this.frame.bar.style.borderRadius="2px",this.frame.bar.style.MozBorderRadius="2px",this.frame.bar.style.border="1px solid #7F7F7F",this.frame.bar.style.backgroundColor="#E5E5E5",this.frame.appendChild(this.frame.bar),this.frame.slide=document.createElement("INPUT"),this.frame.slide.type="BUTTON",this.frame.slide.style.margin="0px",this.frame.slide.value=" ",this.frame.slide.style.position="relative",this.frame.slide.style.left="-100px",this.frame.appendChild(this.frame.slide);var i=this;this.frame.slide.onmousedown=function(t){i._onMouseDown(t)},this.frame.prev.onclick=function(t){i.prev(t)},this.frame.play.onclick=function(t){i.togglePlay(t)},this.frame.next.onclick=function(t){i.next(t)}}this.onChangeCallback=void 0,this.values=[],this.index=void 0,this.playTimeout=void 0,this.playInterval=1e3,this.playLoop=!0}var o=i(41),a=i(3),r=i(4),h=i(33),d=i(34),l=i(35),c=i(36);o(s.prototype),s.Camera=function(){this.armLocation=new h,this.armRotation={},this.armRotation.horizontal=0,this.armRotation.vertical=0,this.armLength=1.7,this.cameraLocation=new h,this.cameraRotation=new h(.5*Math.PI,0,0),this.calculateCameraOrientation()},s.Camera.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},s.Camera.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),(void 0!==t||void 0!==e)&&this.calculateCameraOrientation()},s.Camera.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},s.Camera.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.calculateCameraOrientation())},s.Camera.prototype.getArmLength=function(){return this.armLength},s.Camera.prototype.getCameraLocation=function(){return this.cameraLocation},s.Camera.prototype.getCameraRotation=function(){return this.cameraRotation},s.Camera.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal},s.prototype._setScale=function(){this.scale=new h(1/(this.xMax-this.xMin),1/(this.yMax-this.yMin),1/(this.zMax-this.zMin)),this.keepAspectRatio&&(this.scale.x3&&(this.colFilter=3);else{if(this.style!==s.STYLE.DOTCOLOR&&this.style!==s.STYLE.DOTSIZE&&this.style!==s.STYLE.BARCOLOR&&this.style!==s.STYLE.BARSIZE)throw'Unknown style "'+this.style+'"';this.colX=0,this.colY=1,this.colZ=2,this.colValue=3,t.getNumberOfColumns()>4&&(this.colFilter=4)}},s.prototype.getNumberOfRows=function(t){return t.length},s.prototype.getNumberOfColumns=function(t){var e=0;for(var i in t[0])t[0].hasOwnProperty(i)&&e++;return e},s.prototype.getDistinctValues=function(t,e){for(var i=[],s=0;st[s][e]&&(i.min=t[s][e]),i.maxt;t++){var _=(t-p)/(m-p),f=240*_,g=this._hsv2rgb(f,1,1);u.strokeStyle=g,u.beginPath(),u.moveTo(h,a+t),u.lineTo(r,a+t),u.stroke()}u.strokeStyle=this.colorAxis,u.strokeRect(h,a,i,o)}if(this.style===s.STYLE.DOTSIZE&&(u.strokeStyle=this.colorAxis,u.fillStyle=this.colorDot,u.beginPath(),u.moveTo(h,a),u.lineTo(r,a),u.lineTo(r-i+e,d),u.lineTo(h,d),u.closePath(),u.fill(),u.stroke()),this.style===s.STYLE.DOTCOLOR||this.style===s.STYLE.DOTSIZE){var y=5,v=new c(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,!0);for(v.start(),v.getCurrent()0?this.yMin:this.yMax,n=this._convert3Dto2D(new h(b,a,this.zMin)),Math.cos(2*M)>0?(f.textAlign="center",f.textBaseline="top",n.y+=v):Math.sin(2*M)<0?(f.textAlign="right",f.textBaseline="middle"):(f.textAlign="left",f.textBaseline="middle"),f.fillStyle=this.colorAxis,f.fillText(" "+i.getCurrent()+" ",n.x,n.y),i.next()}for(f.lineWidth=1,s=void 0===this.defaultYStep,i=new c(this.yMin,this.yMax,this.yStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,n=this._convert3Dto2D(new h(o,i.getCurrent(),this.zMin)),Math.cos(2*M)<0?(f.textAlign="center",f.textBaseline="top",n.y+=v):Math.sin(2*M)>0?(f.textAlign="right",f.textBaseline="middle"):(f.textAlign="left",f.textBaseline="middle"),f.fillStyle=this.colorAxis,f.fillText(" "+i.getCurrent()+" ",n.x,n.y),i.next();for(f.lineWidth=1,s=void 0===this.defaultZStep,i=new c(this.zMin,this.zMax,this.zStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,a=Math.sin(M)<0?this.yMin:this.yMax;!i.end();)t=this._convert3Dto2D(new h(o,a,i.getCurrent())),f.strokeStyle=this.colorAxis,f.beginPath(),f.moveTo(t.x,t.y),f.lineTo(t.x-v,t.y),f.stroke(),f.textAlign="right",f.textBaseline="middle",f.fillStyle=this.colorAxis,f.fillText(i.getCurrent()+" ",t.x-5,t.y),i.next();f.lineWidth=1,t=this._convert3Dto2D(new h(o,a,this.zMin)),e=this._convert3Dto2D(new h(o,a,this.zMax)),f.strokeStyle=this.colorAxis,f.beginPath(),f.moveTo(t.x,t.y),f.lineTo(e.x,e.y),f.stroke(),f.lineWidth=1,p=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),m=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),f.strokeStyle=this.colorAxis,f.beginPath(),f.moveTo(p.x,p.y),f.lineTo(m.x,m.y),f.stroke(),p=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),m=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),f.strokeStyle=this.colorAxis,f.beginPath(),f.moveTo(p.x,p.y),f.lineTo(m.x,m.y),f.stroke(),f.lineWidth=1,t=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),f.strokeStyle=this.colorAxis,f.beginPath(),f.moveTo(t.x,t.y),f.lineTo(e.x,e.y),f.stroke(),t=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),f.strokeStyle=this.colorAxis,f.beginPath(),f.moveTo(t.x,t.y),f.lineTo(e.x,e.y),f.stroke();var w=this.xLabel;w.length>0&&(u=.1/this.scale.y,o=(this.xMin+this.xMax)/2,a=Math.cos(M)>0?this.yMin-u:this.yMax+u,n=this._convert3Dto2D(new h(o,a,this.zMin)),Math.cos(2*M)>0?(f.textAlign="center",f.textBaseline="top"):Math.sin(2*M)<0?(f.textAlign="right",f.textBaseline="middle"):(f.textAlign="left",f.textBaseline="middle"),f.fillStyle=this.colorAxis,f.fillText(w,n.x,n.y));var L=this.yLabel;L.length>0&&(l=.1/this.scale.x,o=Math.sin(M)>0?this.xMin-l:this.xMax+l,a=(this.yMin+this.yMax)/2,n=this._convert3Dto2D(new h(o,a,this.zMin)),Math.cos(2*M)<0?(f.textAlign="center",f.textBaseline="top"):Math.sin(2*M)>0?(f.textAlign="right",f.textBaseline="middle"):(f.textAlign="left",f.textBaseline="middle"),f.fillStyle=this.colorAxis,f.fillText(L,n.x,n.y));var x=this.zLabel;x.length>0&&(d=30,o=Math.cos(M)>0?this.xMin:this.xMax,a=Math.sin(M)<0?this.yMin:this.yMax,r=(this.zMin+this.zMax)/2,n=this._convert3Dto2D(new h(o,a,r)),f.textAlign="right",f.textBaseline="middle",f.fillStyle=this.colorAxis,f.fillText(x,n.x-d,n.y))},s.prototype._hsv2rgb=function(t,e,i){var s,n,o,a,r,h;switch(a=i*e,r=Math.floor(t/60),h=a*(1-Math.abs(t/60%2-1)),r){case 0:s=a,n=h,o=0;break;case 1:s=h,n=a,o=0;break;case 2:s=0,n=a,o=h;break;case 3:s=0,n=h,o=a;break;case 4:s=h,n=0,o=a;break;case 5:s=a,n=0,o=h;break;default:s=0,n=0,o=0}return"RGB("+parseInt(255*s)+","+parseInt(255*n)+","+parseInt(255*o)+")"},s.prototype._redrawDataGrid=function(){var t,e,i,n,o,a,r,d,l,c,u,p,m,_=this.frame.canvas,f=_.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(o=0;o0}else a=!0;a?(m=(t.point.z+e.point.z+i.point.z+n.point.z)/4,c=240*(1-(m-this.zMin)*this.scale.z/this.verticalRatio),u=1,this.showShadow?(p=Math.min(1+L.x/x/2,1),r=this._hsv2rgb(c,u,p),d=r):(p=1,r=this._hsv2rgb(c,u,p),d=this.colorAxis)):(r="gray",d=this.colorAxis),l=.5,f.lineWidth=l,f.fillStyle=r,f.strokeStyle=d,f.beginPath(),f.moveTo(t.screen.x,t.screen.y),f.lineTo(e.screen.x,e.screen.y),f.lineTo(n.screen.x,n.screen.y),f.lineTo(i.screen.x,i.screen.y),f.closePath(),f.fill(),f.stroke()}}else for(o=0;ou&&(u=0);var p,m,_;this.style===s.STYLE.DOTCOLOR?(p=240*(1-(d.point.value-this.valueMin)*this.scale.value),m=this._hsv2rgb(p,1,1),_=this._hsv2rgb(p,1,.8)):this.style===s.STYLE.DOTSIZE?(m=this.colorDot,_=this.colorDotBorder):(p=240*(1-(d.point.z-this.zMin)*this.scale.z/this.verticalRatio),m=this._hsv2rgb(p,1,1),_=this._hsv2rgb(p,1,.8)),i.lineWidth=1,i.strokeStyle=_,i.fillStyle=m,i.beginPath(),i.arc(d.screen.x,d.screen.y,u,0,2*Math.PI,!0),i.fill(),i.stroke()}}},s.prototype._redrawDataBar=function(){var t,e,i,n,o=this.frame.canvas,a=o.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(t=0;t0&&(t=this.dataPoints[0],s.lineWidth=1,s.strokeStyle="blue",s.beginPath(),s.moveTo(t.screen.x,t.screen.y)),e=1;e0&&s.stroke()}},s.prototype._onMouseDown=function(t){if(t=t||window.event,this.leftButtonDown&&this._onMouseUp(t),this.leftButtonDown=t.which?1===t.which:1===t.button,this.leftButtonDown||this.touchDown){this.startMouseX=getMouseX(t),this.startMouseY=getMouseY(t),this.startStart=new Date(this.start),this.startEnd=new Date(this.end),this.startArmRotation=this.camera.getArmRotation(),this.frame.style.cursor="move";var e=this;this.onmousemove=function(t){e._onMouseMove(t)},this.onmouseup=function(t){e._onMouseUp(t)},G3DaddEventListener(document,"mousemove",e.onmousemove),G3DaddEventListener(document,"mouseup",e.onmouseup),G3DpreventDefault(t)}},s.prototype._onMouseMove=function(t){t=t||window.event;var e=parseFloat(getMouseX(t))-this.startMouseX,i=parseFloat(getMouseY(t))-this.startMouseY,s=this.startArmRotation.horizontal+e/200,n=this.startArmRotation.vertical+i/200,o=4,a=Math.sin(o/360*2*Math.PI);Math.abs(Math.sin(s))0?1:0>t?-1:0}var s=e[0],n=e[1],o=e[2],a=i((n.x-s.x)*(t.y-s.y)-(n.y-s.y)*(t.x-s.x)),r=i((o.x-n.x)*(t.y-n.y)-(o.y-n.y)*(t.x-n.x)),h=i((s.x-o.x)*(t.y-o.y)-(s.y-o.y)*(t.x-o.x));return!(0!=a&&0!=r&&a!=r||0!=r&&0!=h&&r!=h||0!=a&&0!=h&&a!=h)},s.prototype._dataPointFromXY=function(t,e){var i,n=100,o=null,a=null,r=null,h=new d(t,e);if(this.style===s.STYLE.BAR||this.style===s.STYLE.BARCOLOR||this.style===s.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){o=this.dataPoints[i];var l=o.surfaces;if(l)for(var c=l.length-1;c>=0;c--){var u=l[c],p=u.corners,m=[p[0].screen,p[1].screen,p[2].screen],_=[p[2].screen,p[3].screen,p[0].screen];if(this._insideTriangle(h,m)||this._insideTriangle(h,_))return o}}else for(i=0;iv)&&n>v&&(r=v,a=o)}}return a},s.prototype._showTooltip=function(t){var e,i,s;this.tooltip?(e=this.tooltip.dom.content,i=this.tooltip.dom.line,s=this.tooltip.dom.dot):(e=document.createElement("div"),e.style.position="absolute",e.style.padding="10px",e.style.border="1px solid #4d4d4d",e.style.color="#1a1a1a",e.style.background="rgba(255,255,255,0.7)",e.style.borderRadius="2px",e.style.boxShadow="5px 5px 10px rgba(128,128,128,0.5)",i=document.createElement("div"),i.style.position="absolute",i.style.height="40px",i.style.width="0",i.style.borderLeft="1px solid #4d4d4d",s=document.createElement("div"),s.style.position="absolute",s.style.height="0",s.style.width="0",s.style.border="5px solid #4d4d4d",s.style.borderRadius="5px",this.tooltip={dataPoint:null,dom:{content:e,line:i,dot:s}}),this._hideTooltip(),this.tooltip.dataPoint=t,e.innerHTML="function"==typeof this.showTooltip?this.showTooltip(t.point):"
x:"+t.point.x+"
y:"+t.point.y+"
z:"+t.point.z+"
",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(s);var n=e.offsetWidth,o=e.offsetHeight,a=i.offsetHeight,r=s.offsetWidth,h=s.offsetHeight,d=t.screen.x-n/2;d=Math.min(Math.max(d,10),this.frame.clientWidth-10-n),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-a+"px",e.style.left=d+"px",e.style.top=t.screen.y-a-o+"px",s.style.left=t.screen.x-r/2+"px",s.style.top=t.screen.y-h/2+"px"},s.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},G3DaddEventListener=function(t,e,i,s){t.addEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,s)):t.attachEvent("on"+e,i)},G3DremoveEventListener=function(t,e,i,s){t.removeEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,s)):t.detachEvent("on"+e,i)},G3DstopPropagation=function(t){t||(t=window.event),t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},G3DpreventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},n.prototype.prev=function(){var t=this.getIndex();t>0&&(t--,this.setIndex(t))},n.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},n.prototype.setIndex=function(t){if(!(ts&&(s=0),s>this.values.length-1&&(s=this.values.length-1),s},n.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t/(this.values.length-1)*e,s=i+3;return s},n.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,s=this.leftToIndex(i);this.setIndex(s),G3DpreventDefault()},n.prototype._onMouseUp=function(){this.frame.style.cursor="auto",G3DremoveEventListener(document,"mousemove",this.onmousemove),G3DremoveEventListener(document,"mouseup",this.onmouseup),G3DpreventDefault()},getAbsoluteLeft=function(t){for(var e=0;null!==t;)e+=t.offsetLeft,e-=t.scrollLeft,t=t.offsetParent;return e},getAbsoluteTop=function(t){for(var e=0;null!==t;)e+=t.offsetTop,e-=t.scrollTop,t=t.offsetParent;return e},getMouseX=function(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0},getMouseY=function(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0},t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");var n=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=a.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},util:{snap:null,toScreen:n._toScreen.bind(n),toGlobalScreen:n._toGlobalScreen.bind(n),toTime:n._toTime.bind(n),toGlobalTime:n._toGlobalTime.bind(n)}},this.range=new d(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new l(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new c(this.body),this.components.push(this.currentTime),this.customTime=new u(this.body),this.components.push(this.customTime),this.itemSet=new p(this.body),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,i&&this.setOptions(i),e?this.setItems(e):this.redraw()}var n=i(41),o=i(49),a=i(1),r=i(3),h=i(4),d=i(9),l=i(21),c=i(13),u=i(14),p=i(18);n(s.prototype),s.prototype._create=function(t){this.dom={},this.dom.root=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.backgroundVertical=document.createElement("div"),this.dom.backgroundHorizontal=document.createElement("div"),this.dom.centerContainer=document.createElement("div"),this.dom.leftContainer=document.createElement("div"),this.dom.rightContainer=document.createElement("div"),this.dom.center=document.createElement("div"),this.dom.left=document.createElement("div"),this.dom.right=document.createElement("div"),this.dom.top=document.createElement("div"),this.dom.bottom=document.createElement("div"),this.dom.shadowTop=document.createElement("div"),this.dom.shadowBottom=document.createElement("div"),this.dom.shadowTopLeft=document.createElement("div"),this.dom.shadowBottomLeft=document.createElement("div"),this.dom.shadowTopRight=document.createElement("div"),this.dom.shadowBottomRight=document.createElement("div"),this.dom.background.className="vispanel background",this.dom.backgroundVertical.className="vispanel background vertical",this.dom.backgroundHorizontal.className="vispanel background horizontal",this.dom.centerContainer.className="vispanel center",this.dom.leftContainer.className="vispanel left",this.dom.rightContainer.className="vispanel right",this.dom.top.className="vispanel top",this.dom.bottom.className="vispanel bottom",this.dom.left.className="content",this.dom.center.className="content",this.dom.right.className="content",this.dom.shadowTop.className="shadow top",this.dom.shadowBottom.className="shadow bottom",this.dom.shadowTopLeft.className="shadow top",this.dom.shadowBottomLeft.className="shadow bottom",this.dom.shadowTopRight.className="shadow top",this.dom.shadowBottomRight.className="shadow bottom",this.dom.root.appendChild(this.dom.background),this.dom.root.appendChild(this.dom.backgroundVertical),this.dom.root.appendChild(this.dom.backgroundHorizontal),this.dom.root.appendChild(this.dom.centerContainer),this.dom.root.appendChild(this.dom.leftContainer),this.dom.root.appendChild(this.dom.rightContainer),this.dom.root.appendChild(this.dom.top),this.dom.root.appendChild(this.dom.bottom),this.dom.centerContainer.appendChild(this.dom.center),this.dom.leftContainer.appendChild(this.dom.left),this.dom.rightContainer.appendChild(this.dom.right),this.dom.centerContainer.appendChild(this.dom.shadowTop),this.dom.centerContainer.appendChild(this.dom.shadowBottom),this.dom.leftContainer.appendChild(this.dom.shadowTopLeft),this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft),this.dom.rightContainer.appendChild(this.dom.shadowTopRight),this.dom.rightContainer.appendChild(this.dom.shadowBottomRight),this.on("rangechange",this.redraw.bind(this)),this.on("change",this.redraw.bind(this)),this.on("touch",this._onTouch.bind(this)),this.on("pinch",this._onPinch.bind(this)),this.on("dragstart",this._onDragStart.bind(this)),this.on("drag",this._onDrag.bind(this)),this.hammer=o(this.dom.root,{prevent_default:!0}),this.listeners={};var e=this,i=["touch","pinch","tap","doubletap","hold","dragstart","drag","dragend","mousewheel","DOMMouseScroll"];if(i.forEach(function(t){var i=function(){var i=[t].concat(Array.prototype.slice.call(arguments,0));e.emit.apply(e,i)};e.hammer.on(t,i),e.listeners[t]=i}),this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0},this.touch={},!t)throw new Error("No container provided");t.appendChild(this.dom.root)},s.prototype.destroy=function(){this.clear(),this.off(),this._stopAutoResize(),this.dom.root.parentNode&&this.dom.root.parentNode.removeChild(this.dom.root),this.dom=null;for(var t in this.listeners)this.listeners.hasOwnProperty(t)&&delete this.listeners[t];this.listeners=null,this.hammer=null,this.components.forEach(function(t){t.destroy()}),this.body=null},s.prototype.setOptions=function(t){if(t){var e=["width","height","minHeight","maxHeight","autoResize","start","end","orientation"];a.selectiveExtend(e,this.options,t),this._initAutoResize()}if(this.components.forEach(function(e){e.setOptions(t)}),t&&t.order)throw new Error("Option order is deprecated. There is no replacement for this feature.");this.redraw()},s.prototype.setCustomTime=function(t){if(!this.customTime)throw new Error("Cannot get custom time: Custom time bar is not enabled");this.customTime.setCustomTime(t)},s.prototype.getCustomTime=function(){if(!this.customTime)throw new Error("Cannot get custom time: Custom time bar is not enabled");return this.customTime.getCustomTime()},s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof r||t instanceof h?t:new r(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e),i&&("start"in this.options||"end"in this.options)){this.fit();var s="start"in this.options?a.convert(this.options.start,"Date"):null,n="end"in this.options?a.convert(this.options.end,"Date"):null;this.setWindow(s,n)}},s.prototype.setGroups=function(t){var e;e=t?t instanceof r||t instanceof h?t:new r(t):null,this.groupsData=e,this.itemSet.setGroups(e)},s.prototype.clear=function(t){(!t||t.items)&&this.setItems(null),(!t||t.groups)&&this.setGroups(null),(!t||t.options)&&(this.components.forEach(function(t){t.setOptions(t.defaultOptions)}),this.setOptions(this.defaultOptions))},s.prototype.fit=function(){var t=this.getItemRange(),e=t.min,i=t.max;if(null!=e&&null!=i){var s=i.valueOf()-e.valueOf();0>=s&&(s=864e5),e=new Date(e.valueOf()-.05*s),i=new Date(i.valueOf()+.05*s)}(null!==e||null!==i)&&this.range.setRange(e,i)},s.prototype.getItemRange=function(){var t=this.itemsData.getDataSet(),e=null,i=null;if(t){var s=t.min("start");e=s?a.convert(s.start,"Date").valueOf():null;var n=t.max("start");n&&(i=a.convert(n.start,"Date").valueOf());var o=t.max("end");o&&(i=null==i?a.convert(o.end,"Date").valueOf():Math.max(i,a.convert(o.end,"Date").valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},s.prototype.setSelection=function(t){this.itemSet&&this.itemSet.setSelection(t)},s.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},s.prototype.setWindow=function(t,e){if(1==arguments.length){var i=arguments[0];this.range.setRange(i.start,i.end)}else this.range.setRange(t,e)},s.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},s.prototype.redraw=function(){var t=!1,e=this.options,i=this.props,s=this.dom;if(s){s.root.className="vis timeline root "+e.orientation,s.root.style.maxHeight=a.option.asSize(e.maxHeight,""),s.root.style.minHeight=a.option.asSize(e.minHeight,""),s.root.style.width=a.option.asSize(e.width,""),i.border.left=(s.centerContainer.offsetWidth-s.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(s.centerContainer.offsetHeight-s.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var n=s.root.offsetHeight-s.root.clientHeight,o=s.root.offsetWidth-s.root.clientWidth;i.center.height=s.center.offsetHeight,i.left.height=s.left.offsetHeight,i.right.height=s.right.offsetHeight,i.top.height=s.top.clientHeight||-i.border.top,i.bottom.height=s.bottom.clientHeight||-i.border.bottom;var r=Math.max(i.left.height,i.center.height,i.right.height),h=i.top.height+r+i.bottom.height+n+i.border.top+i.border.bottom;s.root.style.height=a.option.asSize(e.height,h+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-n;var d=i.root.height-i.top.height-i.bottom.height-n;i.centerContainer.height=d,i.leftContainer.height=d,i.rightContainer.height=i.leftContainer.height,i.root.width=s.root.offsetWidth,i.background.width=i.root.width-o,i.left.width=s.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=s.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var l=i.root.width-i.left.width-i.right.width-o;i.center.width=l,i.centerContainer.width=l,i.top.width=l,i.bottom.width=l,s.background.style.height=i.background.height+"px",s.backgroundVertical.style.height=i.background.height+"px",s.backgroundHorizontal.style.height=i.centerContainer.height+"px",s.centerContainer.style.height=i.centerContainer.height+"px",s.leftContainer.style.height=i.leftContainer.height+"px",s.rightContainer.style.height=i.rightContainer.height+"px",s.background.style.width=i.background.width+"px",s.backgroundVertical.style.width=i.centerContainer.width+"px",s.backgroundHorizontal.style.width=i.background.width+"px",s.centerContainer.style.width=i.center.width+"px",s.top.style.width=i.top.width+"px",s.bottom.style.width=i.bottom.width+"px",s.background.style.left="0",s.background.style.top="0",s.backgroundVertical.style.left=i.left.width+"px",s.backgroundVertical.style.top="0",s.backgroundHorizontal.style.left="0",s.backgroundHorizontal.style.top=i.top.height+"px",s.centerContainer.style.left=i.left.width+"px",s.centerContainer.style.top=i.top.height+"px",s.leftContainer.style.left="0",s.leftContainer.style.top=i.top.height+"px",s.rightContainer.style.left=i.left.width+i.center.width+"px",s.rightContainer.style.top=i.top.height+"px",s.top.style.left=i.left.width+"px",s.top.style.top="0",s.bottom.style.left=i.left.width+"px",s.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var c=this.props.scrollTop;"bottom"==e.orientation&&(c+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),s.center.style.left="0",s.center.style.top=c+"px",s.left.style.left="0",s.left.style.top=c+"px",s.right.style.left="0",s.right.style.top=c+"px";var u=0==this.props.scrollTop?"hidden":"",p=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";s.shadowTop.style.visibility=u,s.shadowBottom.style.visibility=p,s.shadowTopLeft.style.visibility=u,s.shadowBottomLeft.style.visibility=p,s.shadowTopRight.style.visibility=u,s.shadowBottomRight.style.visibility=p,this.components.forEach(function(e){t=e.redraw()||t}),t&&this.redraw()}},s.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},s.prototype._toTime=function(t){var e=this.range.conversion(this.props.center.width);return new Date(t/e.scale+e.offset)},s.prototype._toGlobalTime=function(t){var e=this.range.conversion(this.props.root.width);return new Date(t/e.scale+e.offset)},s.prototype._toScreen=function(t){var e=this.range.conversion(this.props.center.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._toGlobalScreen=function(t){var e=this.range.conversion(this.props.root.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},s.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){return 1!=t.options.autoResize?void t._stopAutoResize():void(t.dom.root&&(t.dom.root.clientWidth!=t.props.lastWidth||t.dom.root.clientHeight!=t.props.lastHeight)&&(t.props.lastWidth=t.dom.root.clientWidth,t.props.lastHeight=t.dom.root.clientHeight,t.emit("change")))},a.addEventListener(window,"resize",this._onResize),this.watchTimer=setInterval(this._onResize,1e3)},s.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),a.removeEventListener(window,"resize",this._onResize),this._onResize=null},s.prototype._onTouch=function(){this.touch.allowDragging=!0},s.prototype._onPinch=function(){this.touch.allowDragging=!1},s.prototype._onDragStart=function(){this.touch.initialScrollTop=this.props.scrollTop},s.prototype._onDrag=function(t){if(this.touch.allowDragging){var e=t.gesture.deltaY,i=this._getScrollTop(),s=this._setScrollTop(this.touch.initialScrollTop+e);s!=i&&this.redraw()}},s.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},s.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("bottom"==this.options.orientation&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTop=s&&(s=864e5),e=new Date(e.valueOf()-.05*s),i=new Date(i.valueOf()+.05*s)}(null!==e||null!==i)&&this.range.setRange(e,i)},s.prototype.getItemRange=function(){var t=this.itemsData,e=null,i=null;if(t){var s=t.min("start");e=s?a.convert(s.start,"Date").valueOf():null;var n=t.max("start");n&&(i=a.convert(n.start,"Date").valueOf());var o=t.max("end");o&&(i=null==i?a.convert(o.end,"Date").valueOf():Math.max(i,a.convert(o.end,"Date").valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},s.prototype.setWindow=function(t,e){if(1==arguments.length){var i=arguments[0];this.range.setRange(i.start,i.end)}else this.range.setRange(t,e)},s.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},s.prototype.redraw=function(){var t=!1,e=this.options,i=this.props,s=this.dom;if(s){s.root.className="vis timeline root "+e.orientation,s.root.style.maxHeight=a.option.asSize(e.maxHeight,""),s.root.style.minHeight=a.option.asSize(e.minHeight,""),s.root.style.width=a.option.asSize(e.width,""),i.border.left=(s.centerContainer.offsetWidth-s.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(s.centerContainer.offsetHeight-s.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var n=s.root.offsetHeight-s.root.clientHeight,o=s.root.offsetWidth-s.root.clientWidth;i.center.height=s.center.offsetHeight,i.left.height=s.left.offsetHeight,i.right.height=s.right.offsetHeight,i.top.height=s.top.clientHeight||-i.border.top,i.bottom.height=s.bottom.clientHeight||-i.border.bottom;var r=Math.max(i.left.height,i.center.height,i.right.height),h=i.top.height+r+i.bottom.height+n+i.border.top+i.border.bottom;s.root.style.height=a.option.asSize(e.height,h+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-n;var d=i.root.height-i.top.height-i.bottom.height-n;i.centerContainer.height=d,i.leftContainer.height=d,i.rightContainer.height=i.leftContainer.height,i.root.width=s.root.offsetWidth,i.background.width=i.root.width-o,i.left.width=s.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=s.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var l=i.root.width-i.left.width-i.right.width-o;i.center.width=l,i.centerContainer.width=l,i.top.width=l,i.bottom.width=l,s.background.style.height=i.background.height+"px",s.backgroundVertical.style.height=i.background.height+"px",s.backgroundHorizontalContainer.style.height=i.centerContainer.height+"px",s.centerContainer.style.height=i.centerContainer.height+"px",s.leftContainer.style.height=i.leftContainer.height+"px",s.rightContainer.style.height=i.rightContainer.height+"px",s.background.style.width=i.background.width+"px",s.backgroundVertical.style.width=i.centerContainer.width+"px",s.backgroundHorizontalContainer.style.width=i.background.width+"px",s.backgroundHorizontal.style.width=i.background.width+"px",s.centerContainer.style.width=i.center.width+"px",s.top.style.width=i.top.width+"px",s.bottom.style.width=i.bottom.width+"px",s.background.style.left="0",s.background.style.top="0",s.backgroundVertical.style.left=i.left.width+"px",s.backgroundVertical.style.top="0",s.backgroundHorizontalContainer.style.left="0",s.backgroundHorizontalContainer.style.top=i.top.height+"px",s.centerContainer.style.left=i.left.width+"px",s.centerContainer.style.top=i.top.height+"px",s.leftContainer.style.left="0",s.leftContainer.style.top=i.top.height+"px",s.rightContainer.style.left=i.left.width+i.center.width+"px",s.rightContainer.style.top=i.top.height+"px",s.top.style.left=i.left.width+"px",s.top.style.top="0",s.bottom.style.left=i.left.width+"px",s.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var c=this.props.scrollTop;"bottom"==e.orientation&&(c+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),s.center.style.left="0",s.center.style.top=c+"px",s.backgroundHorizontal.style.left="0",s.backgroundHorizontal.style.top=c+"px",s.left.style.left="0",s.left.style.top=c+"px",s.right.style.left="0",s.right.style.top=c+"px";var u=0==this.props.scrollTop?"hidden":"",p=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";s.shadowTop.style.visibility=u,s.shadowBottom.style.visibility=p,s.shadowTopLeft.style.visibility=u,s.shadowBottomLeft.style.visibility=p,s.shadowTopRight.style.visibility=u,s.shadowBottomRight.style.visibility=p,this.components.forEach(function(e){t=e.redraw()||t}),t&&this.redraw()}},s.prototype._toTime=function(t){var e=this.range.conversion(this.props.center.width);return new Date(t/e.scale+e.offset)},s.prototype._toGlobalTime=function(t){var e=this.range.conversion(this.props.root.width);return new Date(t/e.scale+e.offset)},s.prototype._toScreen=function(t){var e=this.range.conversion(this.props.center.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._toGlobalScreen=function(t){var e=this.range.conversion(this.props.root.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},s.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){return 1!=t.options.autoResize?void t._stopAutoResize():void(t.dom.root&&(t.dom.root.clientWidth!=t.props.lastWidth||t.dom.root.clientHeight!=t.props.lastHeight)&&(t.props.lastWidth=t.dom.root.clientWidth,t.props.lastHeight=t.dom.root.clientHeight,t.emit("change")))},a.addEventListener(window,"resize",this._onResize),this.watchTimer=setInterval(this._onResize,1e3)},s.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),a.removeEventListener(window,"resize",this._onResize),this._onResize=null},s.prototype._onTouch=function(){this.touch.allowDragging=!0},s.prototype._onPinch=function(){this.touch.allowDragging=!1},s.prototype._onDragStart=function(){this.touch.initialScrollTop=this.props.scrollTop},s.prototype._onDrag=function(t){if(this.touch.allowDragging){var e=t.gesture.deltaY,i=this._getScrollTop(),s=this._setScrollTop(this.touch.initialScrollTop+e);s!=i&&this.redraw()}},s.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},s.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("bottom"==this.options.orientation&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTopo&&(h=o);for(var d=!1,l=h;Math.abs(l)<=Math.abs(o);l++){r=Math.pow(10,l);for(var c=0;c=n){d=!0,a=c;break}}if(1==d)break}this.stepIndex=a,this.scale=r,this.step=r*this.minorSteps[a]},e.prototype.first=function(){this.setFirst()},e.prototype.setFirst=function(){var t=this._start-this.scale*this.minorSteps[this.stepIndex],e=this._end+this.scale*this.minorSteps[this.stepIndex];this.marginEnd=this.roundToMinor(e),this.marginStart=this.roundToMinor(t),this.marginRange=this.marginEnd-this.marginStart,this.current=this.marginEnd},e.prototype.roundToMinor=function(t){var e=t-t%(this.scale*this.minorSteps[this.stepIndex]);return t%(this.scale*this.minorSteps[this.stepIndex])>.5*this.scale*this.minorSteps[this.stepIndex]?e+this.scale*this.minorSteps[this.stepIndex]:e},e.prototype.hasNext=function(){return this.current>=this.marginStart},e.prototype.next=function(){var t=this.current;this.current-=this.step,this.current==t&&(this.current=this._end)},e.prototype.previous=function(){this.current+=this.step,this.marginEnd+=this.step,this.marginRange=this.marginEnd-this.marginStart},e.prototype.getCurrent=function(){for(var t=""+Number(this.current).toPrecision(5),e=t.length-1;e>0;e--){if("0"!=t[e]){if("."==t[e]||","==t[e]){t=t.slice(0,e);break}break}t=t.slice(0,e)}return t},e.prototype.snap=function(){},e.prototype.isMajor=function(){return this.current%(this.scale*this.majorSteps[this.stepIndex])==0},t.exports=e},function(t,e,i){function s(t,e){var i=r().hours(0).minutes(0).seconds(0).milliseconds(0);this.start=i.clone().add("days",-3).valueOf(),this.end=i.clone().add("days",4).valueOf(),this.body=t,this.defaultOptions={start:null,end:null,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10},this.options=a.extend({},this.defaultOptions),this.props={touch:{}},this.body.emitter.on("dragstart",this._onDragStart.bind(this)),this.body.emitter.on("drag",this._onDrag.bind(this)),this.body.emitter.on("dragend",this._onDragEnd.bind(this)),this.body.emitter.on("hold",this._onHold.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("DOMMouseScroll",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.setOptions(e)}function n(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}function o(t,e){return{x:t.pageX-a.getAbsoluteLeft(e),y:t.pageY-a.getAbsoluteTop(e)} -}var a=i(1),r=i(39),h=i(12);s.prototype=new h,s.prototype.setOptions=function(t){if(t){var e=["direction","min","max","zoomMin","zoomMax","moveable","zoomable"];a.selectiveExtend(e,this.options,t),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},s.prototype.setRange=function(t,e){var i=this._applyRange(t,e);if(i){var s={start:new Date(this.start),end:new Date(this.end)};this.body.emitter.emit("rangechange",s),this.body.emitter.emit("rangechanged",s)}},s.prototype._applyRange=function(t,e){var i,s=null!=t?a.convert(t,"Date").valueOf():this.start,n=null!=e?a.convert(e,"Date").valueOf():this.end,o=null!=this.options.max?a.convert(this.options.max,"Date").valueOf():null,r=null!=this.options.min?a.convert(this.options.min,"Date").valueOf():null;if(isNaN(s)||null===s)throw new Error('Invalid start "'+t+'"');if(isNaN(n)||null===n)throw new Error('Invalid end "'+e+'"');if(s>n&&(n=s),null!==r&&r>s&&(i=r-s,s+=i,n+=i,null!=o&&n>o&&(n=o)),null!==o&&n>o&&(i=n-o,s-=i,n-=i,null!=r&&r>s&&(s=r)),null!==this.options.zoomMin){var h=parseFloat(this.options.zoomMin);0>h&&(h=0),h>n-s&&(this.end-this.start===h?(s=this.start,n=this.end):(i=h-(n-s),s-=i/2,n+=i/2))}if(null!==this.options.zoomMax){var d=parseFloat(this.options.zoomMax);0>d&&(d=0),n-s>d&&(this.end-this.start===d?(s=this.start,n=this.end):(i=n-s-d,s+=i/2,n-=i/2))}var l=this.start!=s||this.end!=n;return this.start=s,this.end=n,l},s.prototype.getRange=function(){return{start:this.start,end:this.end}},s.prototype.conversion=function(t){return s.conversion(this.start,this.end,t)},s.conversion=function(t,e,i){return 0!=i&&e-t!=0?{offset:t,scale:i/(e-t)}:{offset:0,scale:1}},s.prototype._onDragStart=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.start=this.start,this.props.touch.end=this.end,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},s.prototype._onDrag=function(t){if(this.options.moveable){var e=this.options.direction;if(n(e),this.props.touch.allowDragging){var i="horizontal"==e?t.gesture.deltaX:t.gesture.deltaY,s=this.props.touch.end-this.props.touch.start,o="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height,a=-i/o*s;this._applyRange(this.props.touch.start+a,this.props.touch.end+a),this.body.emitter.emit("rangechange",{start:new Date(this.start),end:new Date(this.end)})}}},s.prototype._onDragEnd=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end)}))},s.prototype._onMouseWheel=function(t){if(this.options.zoomable&&this.options.moveable){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i;i=0>e?1-e/5:1/(1+e/5);var s=a.fakeGesture(this,t),n=o(s.center,this.body.dom.center),r=this._pointerToDate(n);this.zoom(i,r)}t.preventDefault()}},s.prototype._onTouch=function(){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null},s.prototype._onHold=function(){this.props.touch.allowDragging=!1},s.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable&&(this.props.touch.allowDragging=!1,t.gesture.touches.length>1)){this.props.touch.center||(this.props.touch.center=o(t.gesture.center,this.body.dom.center));var e=1/t.gesture.scale,i=this._pointerToDate(this.props.touch.center),s=parseInt(i+(this.props.touch.start-i)*e),n=parseInt(i+(this.props.touch.end-i)*e);this.setRange(s,n)}},s.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(n(i),"horizontal"==i){var s=this.body.domProps.center.width;return e=this.conversion(s),t.x/e.scale+e.offset}var o=this.body.domProps.center.height;return e=this.conversion(o),t.y/e.scale+e.offset},s.prototype.zoom=function(t,e){null==e&&(e=(this.start+this.end)/2);var i=e+(this.start-e)*t,s=e+(this.end-e)*t;this.setRange(i,s)},s.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,s=this.end+e*t;this.start=i,this.end=s},s.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,s=this.start-i,n=this.end-i;this.setRange(s,n)},t.exports=s},function(t,e){var i=.001;e.orderByStart=function(t){t.sort(function(t,e){return t.data.start-e.data.start})},e.orderByEnd=function(t){t.sort(function(t,e){var i="end"in t.data?t.data.end:t.data.start,s="end"in e.data?e.data.end:e.data.start;return i-s})},e.stack=function(t,i,s){var n,o;if(s)for(n=0,o=t.length;o>n;n++)t[n].top=null;for(n=0,o=t.length;o>n;n++){var a=t[n];if(null===a.top){a.top=i.axis;do{for(var r=null,h=0,d=t.length;d>h;h++){var l=t[h];if(null!==l.top&&l!==a&&e.collision(a,l,i.item)){r=l;break}}null!=r&&(a.top=r.top+r.height+i.item)}while(r)}}},e.nostack=function(t,e){var i,s;for(i=0,s=t.length;s>i;i++)t[i].top=e.axis},e.collision=function(t,e,s){return t.left-s+ie.left&&t.top-s+ie.top}},function(t,e,i){function s(t,e,i){this.current=new Date,this._start=new Date,this._end=new Date,this.autoScale=!0,this.scale=s.SCALE.DAY,this.step=1,this.setRange(t,e,i)}var n=i(39);s.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},s.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?new Date(t.valueOf()):new Date,this._end=void 0!=e?new Date(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},s.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},s.prototype.roundToMinor=function(){switch(this.scale){case s.SCALE.YEAR:this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step)),this.current.setMonth(0);case s.SCALE.MONTH:this.current.setDate(1);case s.SCALE.DAY:case s.SCALE.WEEKDAY:this.current.setHours(0);case s.SCALE.HOUR:this.current.setMinutes(0);case s.SCALE.MINUTE:this.current.setSeconds(0);case s.SCALE.SECOND:this.current.setMilliseconds(0)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()-this.current.getHours()%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step)}},s.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},s.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case s.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case s.SCALE.HOUR:this.current=new Date(this.current.valueOf()+1e3*this.step*60*60);var e=this.current.getHours();this.current.setHours(e-e%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}else switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()+this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()+this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()+this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},s.prototype.setAutoScale=function(t){this.autoScale=t},s.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,n=864e5,o=36e5,a=6e4,r=1e3,h=1;1e3*e>t&&(this.scale=s.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=s.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=s.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=s.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=s.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=s.SCALE.YEAR,this.step=5),e>t&&(this.scale=s.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=s.SCALE.MONTH,this.step=3),i>t&&(this.scale=s.SCALE.MONTH,this.step=1),5*n>t&&(this.scale=s.SCALE.DAY,this.step=5),2*n>t&&(this.scale=s.SCALE.DAY,this.step=2),n>t&&(this.scale=s.SCALE.DAY,this.step=1),n/2>t&&(this.scale=s.SCALE.WEEKDAY,this.step=1),4*o>t&&(this.scale=s.SCALE.HOUR,this.step=4),o>t&&(this.scale=s.SCALE.HOUR,this.step=1),15*a>t&&(this.scale=s.SCALE.MINUTE,this.step=15),10*a>t&&(this.scale=s.SCALE.MINUTE,this.step=10),5*a>t&&(this.scale=s.SCALE.MINUTE,this.step=5),a>t&&(this.scale=s.SCALE.MINUTE,this.step=1),15*r>t&&(this.scale=s.SCALE.SECOND,this.step=15),10*r>t&&(this.scale=s.SCALE.SECOND,this.step=10),5*r>t&&(this.scale=s.SCALE.SECOND,this.step=5),r>t&&(this.scale=s.SCALE.SECOND,this.step=1),200*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=200),100*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=100),50*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=50),10*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=10),5*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=5),h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=1)}},s.prototype.snap=function(t){var e=new Date(t.valueOf());if(this.scale==s.SCALE.YEAR){var i=e.getFullYear()+Math.round(e.getMonth()/12);e.setFullYear(Math.round(i/this.step)*this.step),e.setMonth(0),e.setDate(0),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MONTH)e.getDate()>15?(e.setDate(1),e.setMonth(e.getMonth()+1)):e.setDate(1),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0);else if(this.scale==s.SCALE.DAY){switch(this.step){case 5:case 2:e.setHours(24*Math.round(e.getHours()/24));break;default:e.setHours(12*Math.round(e.getHours()/12))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.WEEKDAY){switch(this.step){case 5:case 2:e.setHours(12*Math.round(e.getHours()/12));break;default:e.setHours(6*Math.round(e.getHours()/6))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.HOUR){switch(this.step){case 4:e.setMinutes(60*Math.round(e.getMinutes()/60));break;default:e.setMinutes(30*Math.round(e.getMinutes()/30))}e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MINUTE){switch(this.step){case 15:case 10:e.setMinutes(5*Math.round(e.getMinutes()/5)),e.setSeconds(0);break;case 5:e.setSeconds(60*Math.round(e.getSeconds()/60));break;default:e.setSeconds(30*Math.round(e.getSeconds()/30))}e.setMilliseconds(0)}else if(this.scale==s.SCALE.SECOND)switch(this.step){case 15:case 10:e.setSeconds(5*Math.round(e.getSeconds()/5)),e.setMilliseconds(0);break;case 5:e.setMilliseconds(1e3*Math.round(e.getMilliseconds()/1e3));break;default:e.setMilliseconds(500*Math.round(e.getMilliseconds()/500))}else if(this.scale==s.SCALE.MILLISECOND){var n=this.step>5?this.step/2:1;e.setMilliseconds(Math.round(e.getMilliseconds()/n)*n)}return e},s.prototype.isMajor=function(){switch(this.scale){case s.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case s.SCALE.SECOND:return 0==this.current.getSeconds();case s.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case s.SCALE.HOUR:return 0==this.current.getHours();case s.SCALE.WEEKDAY:case s.SCALE.DAY:return 1==this.current.getDate();case s.SCALE.MONTH:return 0==this.current.getMonth();case s.SCALE.YEAR:return!1;default:return!1}},s.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return n(t).format("SSS");case s.SCALE.SECOND:return n(t).format("s");case s.SCALE.MINUTE:return n(t).format("HH:mm");case s.SCALE.HOUR:return n(t).format("HH:mm");case s.SCALE.WEEKDAY:return n(t).format("ddd D");case s.SCALE.DAY:return n(t).format("D");case s.SCALE.MONTH:return n(t).format("MMM");case s.SCALE.YEAR:return n(t).format("YYYY");default:return""}},s.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return n(t).format("HH:mm:ss");case s.SCALE.SECOND:return n(t).format("D MMMM HH:mm");case s.SCALE.MINUTE:case s.SCALE.HOUR:return n(t).format("ddd D MMMM");case s.SCALE.WEEKDAY:case s.SCALE.DAY:return n(t).format("MMMM YYYY");case s.SCALE.MONTH:return n(t).format("YYYY");case s.SCALE.YEAR:return"";default:return""}},t.exports=s},function(t){function e(){this.options=null,this.props=null}e.prototype.setOptions=function(t){t&&util.extend(this.options,t)},e.prototype.redraw=function(){return!1},e.prototype.destroy=function(){},e.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=e},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCurrentTime:!0},this.options=n.extend({},this.defaultOptions),this._create(),this.setOptions(e)}var n=i(1),o=i(12);s.prototype=new o,s.prototype._create=function(){var t=document.createElement("div");t.className="currenttime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},s.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},s.prototype.setOptions=function(t){t&&n.selectiveExtend(["showCurrentTime"],this.options,t)},s.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=new Date,i=this.body.util.toScreen(e);this.bar.style.left=i+"px",this.bar.title="Current time: "+e}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},s.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,s=1/i/10;30>s&&(s=30),s>1e3&&(s=1e3),e.redraw(),e.currentTimeTimer=setTimeout(t,s)}var e=this;t()},s.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCustomTime:!1},this.options=o.extend({},this.defaultOptions),this.customTime=new Date,this.eventParams={},this._create(),this.setOptions(e)}var n=i(49),o=i(1),a=i(12);s.prototype=new a,s.prototype.setOptions=function(t){t&&o.selectiveExtend(["showCustomTime"],this.options,t)},s.prototype._create=function(){var t=document.createElement("div");t.className="customtime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t;var e=document.createElement("div");e.style.position="relative",e.style.top="0px",e.style.left="-10px",e.style.height="100%",e.style.width="20px",t.appendChild(e),this.hammer=n(t,{prevent_default:!0}),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this))},s.prototype.destroy=function(){this.options.showCustomTime=!1,this.redraw(),this.hammer.enable(!1),this.hammer=null,this.body=null},s.prototype.redraw=function(){if(this.options.showCustomTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar));var e=this.body.util.toScreen(this.customTime);this.bar.style.left=e+"px",this.bar.title="Time: "+this.customTime}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar);return!1},s.prototype.setCustomTime=function(t){this.customTime=new Date(t.valueOf()),this.redraw()},s.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},s.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation(),t.preventDefault()},s.prototype._onDrag=function(t){if(this.eventParams.dragging){var e=t.gesture.deltaX,i=this.body.util.toScreen(this.eventParams.customTime)+e,s=this.body.util.toTime(i);this.setCustomTime(s),this.body.emitter.emit("timechange",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault()}},s.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault())},t.exports=s},function(t,e,i){function s(t,e,i){this.id=n.randomUUID(),this.body=t,this.defaultOptions={orientation:"left",showMinorLabels:!0,showMajorLabels:!0,icons:!0,majorLinesOffset:7,minorLinesOffset:4,labelOffsetX:10,labelOffsetY:2,iconWidth:20,width:"40px",visible:!0},this.linegraphSVG=i,this.props={},this.DOMelements={lines:{},labels:{}},this.dom={},this.range={start:0,end:0},this.options=n.extend({},this.defaultOptions),this.conversionFactor=1,this.setOptions(e),this.width=Number((""+this.options.width).replace("px","")),this.minWidth=this.width,this.height=this.linegraphSVG.offsetHeight,this.stepPixels=25,this.stepPixelsForced=25,this.lineOffset=0,this.master=!0,this.svgElements={},this.groups={},this.amountOfGroups=0,this._create()}var n=i(1),o=i(2),a=i(12),r=i(8);s.prototype=new a,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype.setOptions=function(t){if(t){var e=!1;this.options.orientation!=t.orientation&&void 0!==t.orientation&&(e=!0);var i=["orientation","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","width","visible"];n.selectiveExtend(i,this.options,t),this.minWidth=Number((""+this.options.width).replace("px","")),1==e&&this.dom.frame&&(this.hide(),this.show())}},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.style.width=this.options.width,this.dom.frame.style.height=this.height,this.dom.lineContainer=document.createElement("div"),this.dom.lineContainer.style.width="100%",this.dom.lineContainer.style.height=this.height,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.height="100%",this.svg.style.width="100%",this.svg.style.display="block",this.dom.frame.appendChild(this.svg)},s.prototype._redrawGroupIcons=function(){o.prepareElements(this.svgElements);var t,e=this.options.iconWidth,i=15,s=4,n=s+.5*i;t="left"==this.options.orientation?s:this.width-e-s;for(var a in this.groups)this.groups.hasOwnProperty(a)&&(this.groups[a].drawIcon(t,n,this.svgElements,this.svg,e,i),n+=i+s);o.cleanupElements(this.svgElements)},s.prototype.show=function(){this.dom.frame.parentNode||("left"==this.options.orientation?this.body.dom.left.appendChild(this.dom.frame):this.body.dom.right.appendChild(this.dom.frame)),this.dom.lineContainer.parentNode||this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.lineContainer.parentNode&&this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer)},s.prototype.setRange=function(t,e){this.range.start=t,this.range.end=e},s.prototype.redraw=function(){var t=!1;if(0==this.amountOfGroups)this.hide();else{this.show(),this.height=Number(this.linegraphSVG.style.height.replace("px","")),this.dom.lineContainer.style.height=this.height+"px",this.width=1==this.options.visible?Number((""+this.options.width).replace("px","")):0;var e=this.props,i=this.dom.frame;i.className="dataaxis",this._calculateCharSize();var s=this.options.orientation,n=this.options.showMinorLabels,o=this.options.showMajorLabels;e.minorLabelHeight=n?e.minorCharHeight:0,e.majorLabelHeight=o?e.majorCharHeight:0,e.minorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.minorLinesOffset,e.minorLineHeight=1,e.majorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.majorLinesOffset,e.majorLineHeight=1,"left"==s?(i.style.top="0",i.style.left="0",i.style.bottom="",i.style.width=this.width+"px",i.style.height=this.height+"px"):(i.style.top="",i.style.bottom="0",i.style.left="0",i.style.width=this.width+"px",i.style.height=this.height+"px"),t=this._redrawLabels(),1==this.options.icons&&this._redrawGroupIcons()}return t},s.prototype._redrawLabels=function(){o.prepareElements(this.DOMelements);var t=this.options.orientation,e=this.master?this.props.majorCharHeight||10:this.stepPixelsForced,i=new r(this.range.start,this.range.end,e,this.dom.frame.offsetHeight);this.step=i,i.first();var s=this.dom.frame.offsetHeight/(i.marginRange/i.step+1);this.stepPixels=s;var n=this.height/s,a=0;if(0==this.master){s=this.stepPixelsForced,a=Math.round(this.height/s-n);for(var h=0;.5*a>h;h++)i.previous();n=this.height/s}this.valueAtZero=i.marginEnd;var d=0,l=1;i.next(),this.maxLabelSize=0;for(var c=0;l=0&&this._redrawLabel(c-2,i.getCurrent(),t,"yAxis major",this.props.majorCharHeight),this._redrawLine(c,t,"grid horizontal major",this.options.majorLinesOffset,this.props.majorLineWidth)):this._redrawLine(c,t,"grid horizontal minor",this.options.minorLinesOffset,this.props.minorLineWidth),i.next(),l++}this.conversionFactor=d/((n-1)*i.step);var p=1==this.options.icons?this.options.iconWidth+this.options.labelOffsetX+15:this.options.labelOffsetX+15;return this.maxLabelSize>this.width-p&&1==this.options.visible?(this.width=this.maxLabelSize+p,this.options.width=this.width+"px",o.cleanupElements(this.DOMelements),this.redraw(),!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+p),this.options.width=this.width+"px",o.cleanupElements(this.DOMelements),this.redraw(),!0):(o.cleanupElements(this.DOMelements),!1)},s.prototype._redrawLabel=function(t,e,i,s,n){var a=o.getDOMElement("div",this.DOMelements,this.dom.frame);a.className=s,a.innerHTML=e,"left"==i?(a.style.left="-"+this.options.labelOffsetX+"px",a.style.textAlign="right"):(a.style.right="-"+this.options.labelOffsetX+"px",a.style.textAlign="left"),a.style.top=t-.5*n+this.options.labelOffsetY+"px",e+="";var r=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSizee.axis){var c=d-e.axis;l-=c,n.forEach(h,function(t){t.top-=c})}r=l+e.item/2}else r=e.axis+e.item;r=Math.max(r,this.props.label.height);var u=this.dom.foreground;this.top=u.offsetTop,this.left=u.offsetLeft,this.width=u.offsetWidth,s=n.updateProperty(this,"height",r)||s,s=n.updateProperty(this.props.label,"width",this.dom.inner.clientWidth)||s,s=n.updateProperty(this.props.label,"height",this.dom.inner.clientHeight)||s,this.dom.background.style.height=r+"px",this.dom.foreground.style.height=r+"px",this.dom.label.style.height=r+"px";for(var p=0,m=this.visibleItems.length;m>p;p++){var _=this.visibleItems[p];_.repositionY()}return s},s.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},s.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var s=this.dom.axis;s.parentNode&&s.parentNode.removeChild(s)},s.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),t instanceof a&&-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},s.prototype.remove=function(t){delete this.items[t.id],t.setParent(this.itemSet);var e=this.visibleItems.indexOf(t);-1!=e&&this.visibleItems.splice(e,1)},s.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},s.prototype.order=function(){var t=n.toArray(this.items);this.orderedItems.byStart=t,this.orderedItems.byEnd=this._constructByEndArray(t),o.orderByStart(this.orderedItems.byStart),o.orderByEnd(this.orderedItems.byEnd) -},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0)for(o=0;o=0&&!this._checkIfInvisible(t.byStart[o],a,i);o--);for(o=s+1;o=0&&!this._checkIfInvisible(t.byEnd[o],a,i);o--);for(o=r+1;oe;e++)s=this.selection[e],n=this.items[s],n&&n.unselect();for(this.selection=[],e=0,i=t.length;i>e;e++)s=t[e],n=this.items[s],n&&(this.selection.push(s),n.select())}},s.prototype.getSelection=function(){return this.selection.concat([])},s.prototype._deselect=function(t){for(var e=this.selection,i=0,s=e.length;s>i;i++)if(e[i]==t){e.splice(i,1);break}},s.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=o.option.asSize,s=this.options,n=s.orientation,a=!1,r=this.dom.frame,h=s.editable.updateTime||s.editable.updateGroup;r.className="itemset"+(h?" editable":""),a=this._orderGroups()||a;var d=e.end-e.start,l=d!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;l&&(this.stackDirty=!0),this.lastVisibleInterval=d,this.props.lastWidth=this.props.width;var c=this.stackDirty,u=this._firstGroup(),p={item:t.item,axis:t.axis},m={item:t.item,axis:t.item/2},_=0,f=t.axis+t.item;return o.forEach(this.groups,function(t){var i=t==u?p:m,s=t.redraw(e,i,c);a=s||a,_+=t.height}),_=Math.max(_,f),this.stackDirty=!1,r.style.height=i(_),this.props.top=r.offsetTop,this.props.left=r.offsetLeft,this.props.width=r.offsetWidth,this.props.height=_,this.dom.axis.style.top=i("top"==n?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.dom.axis.style.left=this.body.domProps.border.left+"px",a=this._isResized()||a},s.prototype._firstGroup=function(){var t="top"==this.options.orientation?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[p];return i||null},s.prototype._updateUngrouped=function(){var t=this.groups[p];if(this.groupsData)t&&(t.hide(),delete this.groups[p]);else if(!t){var e=null,i=null;t=new d(e,i,this),this.groups[p]=t;for(var s in this.items)this.items.hasOwnProperty(s)&&t.add(this.items[s]);t.show()}},s.prototype.getLabelSet=function(){return this.dom.labelSet},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof a||t instanceof r))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(o.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;o.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}},s.prototype.getItems=function(){return this.itemsData},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(o.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof a||t instanceof r))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;o.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("change")},s.prototype.getGroups=function(){return this.groupsData},s.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},s.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i=e.itemsData.get(t,e.itemOptions),n=e.items[t],o=i.type||e.options.type||(i.end?"range":"box"),a=s.types[o];if(n&&(a&&n instanceof a?e._updateItem(n,i):(e._removeItem(n),n=null)),!n){if(!a)throw new TypeError("rangeoverflow"==o?'Item type "rangeoverflow" is deprecated. Use css styling instead: .vis.timeline .item.range .content {overflow: visible;}':'Unknown item type "'+o+'"');n=new a(i,e.conversion,e.options),n.id=t,e._addItem(n)}}),this._order(),this.stackDirty=!0,this.body.emitter.emit("change")},s.prototype._onAdd=s.prototype._onUpdate,s.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var s=i.items[t];s&&(e++,i._removeItem(s))}),e&&(this._order(),this.stackDirty=!0,this.body.emitter.emit("change"))},s.prototype._order=function(){o.forEach(this.groups,function(t){t.order()})},s.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},s.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),s=e.groups[t];if(s)s.setData(i);else{if(t==p)throw new Error("Illegal group id. "+t+" is a reserved id.");var n=Object.create(e.options);o.extend(n,{height:null}),s=new d(t,i,e),e.groups[t]=s;for(var a in e.items)if(e.items.hasOwnProperty(a)){var r=e.items[a];r.data.group==t&&s.add(r)}s.order(),s.show()}}),this.body.emitter.emit("change")},s.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("change")},s.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!o.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},s.prototype._addItem=function(t){this.items[t.id]=t;var e=this.groupsData?t.data.group:p,i=this.groups[e];i&&i.add(t)},s.prototype._updateItem=function(t,e){var i=t.data.group;if(t.data=e,t.displayed&&t.redraw(),i!=t.data.group){var s=this.groups[i];s&&s.remove(t);var n=this.groupsData?t.data.group:p,o=this.groups[n];o&&o.add(t)}},s.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1);var i=this.groupsData?t.data.group:p,s=this.groups[i];s&&s.remove(t)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0||n.length>0)&&this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}},s.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.body.util.snap||null,n=s.itemFromTarget(t);if(n){var a=e.itemsData.get(n.id);this.options.onUpdate(a,function(t){t&&e.itemsData.update(t)})}else{var r=o.getAbsoluteLeft(this.dom.frame),h=t.gesture.center.pageX-r,d=this.body.util.toTime(h),l={start:i?i(d):d,content:"new item"};if("range"===this.options.type){var c=this.body.util.toTime(h+this.props.width/5);l.end=i?i(c):c}l[this.itemsData.fieldId]=o.randomUUID();var u=s.groupFromTarget(t);u&&(l.group=u.groupId),this.options.onAdd(l,function(t){t&&e.itemsData.add(l)})}}},s.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e,i=s.itemFromTarget(t);if(i){e=this.getSelection();var n=e.indexOf(i.id);-1==n?e.push(i.id):e.splice(n,1),this.setSelection(e),this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}}},s.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},s.groupFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-group"))return e["timeline-group"];e=e.parentNode}return null},s.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},t.exports=s},function(t,e,i){function s(t,e,i){this.body=t,this.defaultOptions={enabled:!0,icons:!0,iconSize:20,iconSpacing:6,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-left"}},this.side=i,this.options=n.extend({},this.defaultOptions),this.svgElements={},this.dom={},this.groups={},this.amountOfGroups=0,this._create(),this.setOptions(e)}var n=i(1),o=i(2),a=i(12);s.prototype=new a,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.className="legend",this.dom.frame.style.position="absolute",this.dom.frame.style.top="10px",this.dom.frame.style.display="block",this.dom.textArea=document.createElement("div"),this.dom.textArea.className="legendText",this.dom.textArea.style.position="relative",this.dom.textArea.style.top="0px",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.width=this.options.iconSize+5+"px",this.dom.frame.appendChild(this.svg),this.dom.frame.appendChild(this.dom.textArea)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setOptions=function(t){var e=["enabled","orientation","icons","left","right"];n.selectiveDeepExtend(e,this.options,t)},s.prototype.redraw=function(){if(0==this.options[this.side].visible||0==this.amountOfGroups||0==this.options.enabled)this.hide();else{this.show(),"top-left"==this.options[this.side].position||"bottom-left"==this.options[this.side].position?(this.dom.frame.style.left="4px",this.dom.frame.style.textAlign="left",this.dom.textArea.style.textAlign="left",this.dom.textArea.style.left=this.options.iconSize+15+"px",this.dom.textArea.style.right="",this.svg.style.left="0px",this.svg.style.right=""):(this.dom.frame.style.right="4px",this.dom.frame.style.textAlign="right",this.dom.textArea.style.textAlign="right",this.dom.textArea.style.right=this.options.iconSize+15+"px",this.dom.textArea.style.left="",this.svg.style.right="0px",this.svg.style.left=""),"top-left"==this.options[this.side].position||"top-right"==this.options[this.side].position?(this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.bottom=""):(this.dom.frame.style.bottom=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.top=""),0==this.options.icons?(this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+"px",this.dom.textArea.style.right="",this.dom.textArea.style.left="",this.svg.style.width="0px"):(this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+"px",this.drawLegendIcons());var t="";for(var e in this.groups)this.groups.hasOwnProperty(e)&&(t+=this.groups[e].content+"
");this.dom.textArea.innerHTML=t,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},s.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){o.prepareElements(this.svgElements);var t=window.getComputedStyle(this.dom.frame).paddingTop,e=Number(t.replace("px","")),i=e,s=this.options.iconSize,n=.75*this.options.iconSize,a=e+.5*n+3;this.svg.style.width=s+5+e+"px";for(var r in this.groups)this.groups.hasOwnProperty(r)&&(this.groups[r].drawIcon(i,a,this.svgElements,this.svg,s,n),a+=n+this.options.iconSpacing);o.cleanupElements(this.svgElements)}},t.exports=s},function(t,e,i){function s(t,e){this.id=n.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,align:"center"},catmullRom:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:"40px",visible:!0},legend:{enabled:!1,icons:!0,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}}},this.options=n.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={};var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechange",function(){if(0!=i.lastStart){var t=i.body.range.start-i.lastStart,e=i.body.range.end-i.body.range.start;if(0!=i.width){var s=i.width/e,n=t*s;i.svg.style.left=-i.width-n+"px"}}}),this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=n.option.asSize(-i.width),i._updateGraph.apply(i)}),this._create(),this.body.emitter.emit("change")}var n=i(1),o=i(2),a=i(3),r=i(4),h=i(12),d=i(15),l=i(16),c=i(19),u="__ungrouped__";s.prototype=new h,s.prototype._create=function(){var t=document.createElement("div");t.className="LineGraph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg),delete this.options.dataAxis.orientation,this.legendLeft=new c(this.body,this.options.legend,"left"),this.legendRight=new c(this.body,this.options.legend,"right"),this.show()},s.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort"];n.selectiveDeepExtend(e,this.options,t),n.mergeOptions(this.options,t,"catmullRom"),n.mergeOptions(this.options,t,"drawPoints"),n.mergeOptions(this.options,t,"shaded"),n.mergeOptions(this.options,t,"legend"),t.catmullRom&&"object"==typeof t.catmullRom&&t.catmullRom.parametrization&&("uniform"==t.catmullRom.parametrization?this.options.catmullRom.alpha=0:"chordal"==t.catmullRom.parametrization?this.options.catmullRom.alpha=1:(this.options.catmullRom.parametrization="centripetal",this.options.catmullRom.alpha=.5)),this.yAxisLeft&&void 0!==t.dataAxis&&(this.yAxisLeft.setOptions(this.options.dataAxis),this.yAxisRight.setOptions(this.options.dataAxis)),this.legendLeft&&void 0!==t.legend&&(this.legendLeft.setOptions(this.options.legend),this.legendRight.setOptions(this.options.legend)),this.groups.hasOwnProperty(u)&&this.groups[u].setOptions(t)}this.dom.frame&&this._updateGraph()},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof a||t instanceof r))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(n.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var o=this.id;n.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,o)}),e=this.itemsData.getIds(),this._onAdd(e)}this._updateUngrouped(),this._updateGraph(),this.redraw()},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(n.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof a||t instanceof r))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;n.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._onUpdate()},s.prototype._onUpdate=function(){this._updateUngrouped(),this._updateAllGroupData(),this._updateGraph(),this.redraw()},s.prototype._onAdd=function(t){this._onUpdate(t)},s.prototype._onRemove=function(t){this._onUpdate(t)},s.prototype._onUpdateGroups=function(t){for(var e=0;e0){for(s=0;sp){e.push(f);break}e.push(f)}}else for(var _=0;_u&&f.x0){for(var u=0;ui?i:r,d=s>d?s:d):(a=!0,h=h>i?i:h,l=s>l?s:l)}1==o&&this.yAxisLeft.setRange(r,d),1==a&&this.yAxisRight.setRange(h,l)}return n=this._toggleAxisVisiblity(o,this.yAxisLeft)||n,n=this._toggleAxisVisiblity(a,this.yAxisRight)||n,1==a&&1==o?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!o,0==this.yAxisRight.master?(1==a&&(this.yAxisLeft.lineOffset=this.yAxisRight.width),n=this.yAxisLeft.redraw()||n,this.yAxisRight.stepPixelsForced=this.yAxisLeft.stepPixels,n=this.yAxisRight.redraw()||n):n=this.yAxisRight.redraw()||n,n},s.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&(e.hide(),i=!0):e.dom.frame.parentNode||(e.show(),i=!0),i},s.prototype._drawBarGraph=function(t,e){if(null!=t&&t.length>0){var i,s=.1*e.options.barChart.width,n=0,a=e.options.barChart.width;"left"==e.options.barChart.align?n-=.5*a:"right"==e.options.barChart.align&&(n+=.5*a);for(var r=0;r0&&(i=Math.min(i,Math.abs(t[r-1].x-t[r].x))),a>i&&(a=s>i?s:i),o.drawBar(t[r].x+n,t[r].y,a,e.zeroPosition-t[r].y,e.className+" bar",this.svgElements,this.svg);1==e.options.drawPoints.enabled&&this._drawPoints(t,e,this.svgElements,this.svg,n)}},s.prototype._drawLineGraph=function(t,e){if(null!=t&&t.length>0){var i,s,n=Number(this.svg.style.height.replace("px",""));if(i=o.getSVGElement("path",this.svgElements,this.svg),i.setAttributeNS(null,"class",e.className),s=1==e.options.catmullRom.enabled?this._catmullRom(t,e):this._linear(t),1==e.options.shaded.enabled){var a,r=o.getSVGElement("path",this.svgElements,this.svg);a="top"==e.options.shaded.orientation?"M"+t[0].x+",0 "+s+"L"+t[t.length-1].x+",0":"M"+t[0].x+","+n+" "+s+"L"+t[t.length-1].x+","+n,r.setAttributeNS(null,"class",e.className+" fill"),r.setAttributeNS(null,"d",a)}i.setAttributeNS(null,"d","M"+s),1==e.options.drawPoints.enabled&&this._drawPoints(t,e,this.svgElements,this.svg)}},s.prototype._drawPoints=function(t,e,i,s,n){void 0===n&&(n=0);for(var a=0;au;u+=a)i=o(t[u].x)+this.width-1,s=t[u].y,n.push({x:i,y:s}),h=h>s?s:h,d=s>d?s:d;return{min:h,max:d,data:n}},s.prototype._convertYvalues=function(t,e){var i,s,n=[],o=this.yAxisLeft,a=Number(this.svg.style.height.replace("px",""));"right"==e.options.yAxisOrientation&&(o=this.yAxisRight);for(var r=0;rl;l++)e=0==l?t[0]:t[l-1],i=t[l],s=t[l+1],n=d>l+2?t[l+2]:s,o={x:(-e.x+6*i.x+s.x)*h,y:(-e.y+6*i.y+s.y)*h},a={x:(i.x+6*s.x-n.x)*h,y:(i.y+6*s.y-n.y)*h},r+="C"+o.x+","+o.y+" "+a.x+","+a.y+" "+s.x+","+s.y+" ";return r},s.prototype._catmullRom=function(t,e){var i=e.options.catmullRom.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);for(var s,n,o,a,r,h,d,l,c,u,p,m,_,f,g,y,v,M,b,w=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",L=t.length,x=0;L-1>x;x++)s=0==x?t[0]:t[x-1],n=t[x],o=t[x+1],a=L>x+2?t[x+2]:o,d=Math.sqrt(Math.pow(s.x-n.x,2)+Math.pow(s.y-n.y,2)),l=Math.sqrt(Math.pow(n.x-o.x,2)+Math.pow(n.y-o.y,2)),c=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),f=Math.pow(c,i),y=Math.pow(c,2*i),g=Math.pow(l,i),v=Math.pow(l,2*i),b=Math.pow(d,i),M=Math.pow(d,2*i),u=2*M+3*b*g+v,p=2*y+3*f*g+v,m=3*b*(b+g),m>0&&(m=1/m),_=3*f*(f+g),_>0&&(_=1/_),r={x:(-v*s.x+u*n.x+M*o.x)*m,y:(-v*s.y+u*n.y+M*o.y)*m},h={x:(y*n.x+p*o.x-v*a.x)*_,y:(y*n.y+p*o.y-v*a.y)*_},0==r.x&&0==r.y&&(r=n),0==h.x&&0==h.y&&(h=o),w+="C"+r.x+","+r.y+" "+h.x+","+h.y+" "+o.x+","+o.y+" "; -return w},s.prototype._linear=function(t){for(var e="",i=0;id;){d++;var l=o.getCurrent(),c=this.body.util.toScreen(l),u=o.isMajor();this.options.showMinorLabels&&this._repaintMinorText(c,o.getLabelMinor(),t),u&&this.options.showMajorLabels?(c>0&&(void 0==h&&(h=c),this._repaintMajorText(c,o.getLabelMajor(),t)),this._repaintMajorLine(c,t)):this._repaintMinorLine(c,t),o.next()}if(this.options.showMajorLabels){var p=this.body.util.toTime(0),m=o.getLabelMajor(p),_=m.length*(this.props.majorCharWidth||10)+10;(void 0==h||h>_)&&this._repaintMajorText(0,m,t)}n.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},s.prototype._repaintMinorText=function(t,e,i){var s=this.dom.redundant.minorTexts.shift();if(!s){var n=document.createTextNode("");s=document.createElement("div"),s.appendChild(n),s.className="text minor",this.dom.foreground.appendChild(s)}this.dom.minorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?this.props.majorLabelHeight+"px":"0",s.style.left=t+"px"},s.prototype._repaintMajorText=function(t,e,i){var s=this.dom.redundant.majorTexts.shift();if(!s){var n=document.createTextNode(e);s=document.createElement("div"),s.className="text major",s.appendChild(n),this.dom.foreground.appendChild(s)}this.dom.majorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?"0":this.props.minorLabelHeight+"px",s.style.left=t+"px"},s.prototype._repaintMinorLine=function(t,e){var i=this.dom.redundant.minorLines.shift();i||(i=document.createElement("div"),i.className="grid vertical minor",this.dom.background.appendChild(i)),this.dom.minorLines.push(i);var s=this.props;i.style.top="top"==e?s.majorLabelHeight+"px":this.body.domProps.top.height+"px",i.style.height=s.minorLineHeight+"px",i.style.left=t-s.minorLineWidth/2+"px"},s.prototype._repaintMajorLine=function(t,e){var i=this.dom.redundant.majorLines.shift();i||(i=document.createElement("DIV"),i.className="grid vertical major",this.dom.background.appendChild(i)),this.dom.majorLines.push(i);var s=this.props;i.style.top="top"==e?"0":this.body.domProps.top.height+"px",i.style.left=t-s.majorLineWidth/2+"px",i.style.height=s.majorLineHeight+"px"},s.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="text minor measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="text minor measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth},s.prototype.snap=function(t){return this.step.snap(t)},t.exports=s},function(t,e,i){function s(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.dirty=!0,this.top=null,this.left=null,this.width=null,this.height=null}var n=i(49);s.prototype.select=function(){this.selected=!0,this.displayed&&this.redraw()},s.prototype.unselect=function(){this.selected=!1,this.displayed&&this.redraw()},s.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},s.prototype.isVisible=function(){return!1},s.prototype.show=function(){return!1},s.prototype.hide=function(){return!1},s.prototype.redraw=function(){},s.prototype.repositionX=function(){},s.prototype.repositionY=function(){},s.prototype._repaintDeleteButton=function(t){if(this.selected&&this.options.editable.remove&&!this.dom.deleteButton){var e=this,i=document.createElement("div");i.className="delete",i.title="Delete this item",n(i,{preventDefault:!0}).on("tap",function(t){e.parent.removeFromDataSet(e),t.stopPropagation()}),t.appendChild(i),this.dom.deleteButton=i}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);n.call(this,t,e,i)}var n=i(22);s.prototype=new n(null,null,null),s.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start-e&&this.data.startt.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),t.box["timeline-item"]=this),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw time axis: parent has no foreground container element");e.appendChild(t.box)}if(this.displayed=!0,this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)t.content.innerHTML="",t.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);t.content.innerHTML=this.content}this.dirty=!0}this.data.title!=this.title&&(t.box.title=this.data.title,this.title=this.data.title);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");this.className!=i&&(this.className=i,t.box.className=this.baseClassName+i,this.dirty=!0),this.dirty&&(this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dirty=!1),this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},s.prototype.show=function(){this.displayed||this.redraw()},s.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.top=null,this.left=null,this.displayed=!1}},s.prototype.repositionX=function(){var t,e=this.props,i=this.parent.width,s=this.conversion.toScreen(this.data.start),n=this.conversion.toScreen(this.data.end),o=this.options.padding;-i>s&&(s=-i),n>2*i&&(n=2*i);var a=Math.max(n-s,1);this.overflow?(t=Math.max(-s,0),this.left=s,this.width=a+this.props.content.width):(t=0>s?Math.min(-s,n-s-e.content.width-2*o):0,this.left=s,this.width=a),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=a+"px",this.dom.content.style.left=t+"px"},s.prototype.repositionY=function(){var t=this.options.orientation,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},s.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="drag-left",t.dragLeftItem=this,n(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},s.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="drag-right",t.dragRightItem=this,n(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this._initializeMixinLoaders(),this.containerElement=t,this.width="100%",this.height="100%",this.renderRefreshRate=60,this.renderTimestep=1e3/this.renderRefreshRate,this.renderTime=.5*this.renderTimestep,this.maxPhysicsTicksPerRender=3,this.physicsDiscreteStepsize=.5,this.stabilize=!0,this.selectable=!0,this.initializing=!0,this.triggerFunctions={add:null,edit:null,editEdge:null,connect:null,del:null},this.constants={nodes:{radiusMin:5,radiusMax:20,radius:5,shape:"ellipse",image:void 0,widthMin:16,widthMax:64,fixed:!1,fontColor:"black",fontSize:14,fontFace:"verdana",level:-1,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},borderColor:"#2B7CE9",backgroundColor:"#97C2FC",highlightColor:"#D2E5FF",group:void 0},edges:{widthMin:1,widthMax:15,width:1,widthSelectionMultiplier:2,hoverWidth:1.5,style:"line",color:{color:"#848484",highlight:"#848484",hover:"#848484"},fontColor:"#343434",fontSize:14,fontFace:"arial",fontFill:"white",arrowScaleFactor:1,dash:{length:10,gap:5,altLength:void 0}},configurePhysics:!1,physics:{barnesHut:{enabled:!0,theta:1/.6,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09},repulsion:{centralGravity:.1,springLength:200,springConstant:.05,nodeDistance:100,damping:.09},hierarchicalRepulsion:{enabled:!1,centralGravity:.5,springLength:150,springConstant:.01,nodeDistance:60,damping:.09},damping:null,centralGravity:null,springLength:null,springConstant:null},clustering:{enabled:!1,initialMaxNodes:100,clusterThreshold:500,reduceToNodes:300,chainThreshold:.4,clusterEdgeThreshold:20,sectorThreshold:100,screenSizeThreshold:.2,fontSizeMultiplier:4,maxFontSize:1e3,forceAmplification:.1,distanceAmplification:.1,edgeGrowth:20,nodeScaling:{width:1,height:1,radius:1},maxNodeSizeIncrements:600,activeAreaBoxSize:80,clusterLevelDifference:2},navigation:{enabled:!1},keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02}},dataManipulation:{enabled:!1,initiallyVisible:!1},hierarchicalLayout:{enabled:!1,levelSeparation:150,nodeSpacing:100,direction:"UD"},freezeForStabilization:!1,smoothCurves:!0,maxVelocity:10,minVelocity:.1,stabilizationIterations:1e3,labels:{add:"Add Node",edit:"Edit",link:"Add Link",del:"Delete selected",editNode:"Edit Node",editEdge:"Edit Edge",back:"Back",addDescription:"Click in an empty space to place a new node.",linkDescription:"Click on a node and drag the edge to another node to connect them.",editEdgeDescription:"Click on the control points and drag them to a node to connect to it.",addError:"The function for add does not support two arguments (data,callback).",linkError:"The function for connect does not support two arguments (data,callback).",editError:"The function for edit does not support two arguments (data, callback).",editBoundError:"No edit function has been bound to this button.",deleteError:"The function for delete does not support two arguments (data, callback).",deleteClusterError:"Clusters cannot be deleted."},tooltip:{delay:300,fontColor:"black",fontSize:14,fontFace:"verdana",color:{border:"#666",background:"#FFFFC6"}},dragNetwork:!0,dragNodes:!0,zoomable:!0,hover:!1},this.hoverObj={nodes:{},edges:{}};var n=this;this.groups=new c,this.images=new u,this.images.setOnloadCallback(function(){n._redraw()}),this.xIncrement=0,this.yIncrement=0,this.zoomIncrement=0,this._loadPhysicsSystem(),this._create(),this._loadSectorSystem(),this._loadClusterSystem(),this._loadSelectionSystem(),this._loadHierarchySystem(),this._setTranslation(this.frame.clientWidth/2,this.frame.clientHeight/2),this._setScale(1),this.setOptions(i),this.freezeSimulation=!1,this.cachedFunctions={},this.calculationNodes={},this.calculationNodeIndices=[],this.nodeIndices=[],this.nodes={},this.edges={},this.canvasTopLeft={x:0,y:0},this.canvasBottomRight={x:0,y:0},this.pointerPosition={x:0,y:0},this.areaCenter={},this.scale=1,this.previousScale=this.scale,this.nodesData=null,this.edgesData=null,this.nodesListeners={add:function(t,e){n._addNodes(e.items),n.start()},update:function(t,e){n._updateNodes(e.items),n.start()},remove:function(t,e){n._removeNodes(e.items),n.start()}},this.edgesListeners={add:function(t,e){n._addEdges(e.items),n.start()},update:function(t,e){n._updateEdges(e.items),n.start()},remove:function(t,e){n._removeEdges(e.items),n.start()}},this.moving=!0,this.timer=void 0,this.setData(e,this.constants.clustering.enabled||this.constants.hierarchicalLayout.enabled),this.initializing=!1,1==this.constants.hierarchicalLayout.enabled?this._setupHierarchicalLayout():0==this.stabilize&&this.zoomExtent(!0,this.constants.clustering.enabled),this.constants.clustering.enabled&&this.startWithClustering()}var n=i(41),o=i(49),a=i(42),r=i(1),h=i(3),d=i(4),l=i(32),c=i(28),u=i(29),p=i(30),m=i(27),_=i(31),f=i(40);i(37),n(s.prototype),s.prototype._getScriptPath=function(){for(var t=document.getElementsByTagName("script"),e=0;et.x&&(s=t.x),nt.y&&(e=t.y),i=this.constants.clustering.initialMaxNodes?49.07548/(n+142.05338)+91444e-8:12.662/(n+7.4147)+.0964822:1==this.constants.clustering.enabled&&n>=this.constants.clustering.initialMaxNodes?77.5271985/(n+187.266146)+476710517e-13:30.5062972/(n+19.93597763)+.08413486;var o=Math.min(this.frame.canvas.clientWidth/600,this.frame.canvas.clientHeight/600);i*=o}else{var a=1.1*(Math.abs(s.minX)+Math.abs(s.maxX)),r=1.1*(Math.abs(s.minY)+Math.abs(s.maxY)),h=this.frame.canvas.clientWidth/a,d=this.frame.canvas.clientHeight/r;i=d>=h?h:d}i>1&&(i=1),this._setScale(i),this._centerNetwork(s),0==e&&(this.moving=!0,this.start())},s.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},s.prototype.setData=function(t,e){if(void 0===e&&(e=!1),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){if(t&&t.dot){var i=l.DOTToGraph(t.dot);return void this.setData(i)}}else this._setNodes(t&&t.nodes),this._setEdges(t&&t.edges);if(this._putDataInSector(),!e)if(this.stabilize){var s=this;setTimeout(function(){s._stabilize(),s.start()},0)}else this.start()},s.prototype.setOptions=function(t){if(t){var e;if(void 0!==t.width&&(this.width=t.width),void 0!==t.height&&(this.height=t.height),void 0!==t.stabilize&&(this.stabilize=t.stabilize),void 0!==t.selectable&&(this.selectable=t.selectable),void 0!==t.smoothCurves&&(this.constants.smoothCurves=t.smoothCurves),void 0!==t.freezeForStabilization&&(this.constants.freezeForStabilization=t.freezeForStabilization),void 0!==t.configurePhysics&&(this.constants.configurePhysics=t.configurePhysics),void 0!==t.stabilizationIterations&&(this.constants.stabilizationIterations=t.stabilizationIterations),void 0!==t.dragNetwork&&(this.constants.dragNetwork=t.dragNetwork),void 0!==t.dragNodes&&(this.constants.dragNodes=t.dragNodes),void 0!==t.zoomable&&(this.constants.zoomable=t.zoomable),void 0!==t.hover&&(this.constants.hover=t.hover),void 0!==t.dragGraph)throw new Error("Option dragGraph is renamed to dragNetwork");if(void 0!==t.labels)for(e in t.labels)t.labels.hasOwnProperty(e)&&(this.constants.labels[e]=t.labels[e]);if(t.onAdd&&(this.triggerFunctions.add=t.onAdd),t.onEdit&&(this.triggerFunctions.edit=t.onEdit),t.onEditEdge&&(this.triggerFunctions.editEdge=t.onEditEdge),t.onConnect&&(this.triggerFunctions.connect=t.onConnect),t.onDelete&&(this.triggerFunctions.del=t.onDelete),t.physics){if(t.physics.barnesHut){this.constants.physics.barnesHut.enabled=!0;for(e in t.physics.barnesHut)t.physics.barnesHut.hasOwnProperty(e)&&(this.constants.physics.barnesHut[e]=t.physics.barnesHut[e])}if(t.physics.repulsion){this.constants.physics.barnesHut.enabled=!1;for(e in t.physics.repulsion)t.physics.repulsion.hasOwnProperty(e)&&(this.constants.physics.repulsion[e]=t.physics.repulsion[e])}if(t.physics.hierarchicalRepulsion){this.constants.hierarchicalLayout.enabled=!0,this.constants.physics.hierarchicalRepulsion.enabled=!0,this.constants.physics.barnesHut.enabled=!1;for(e in t.physics.hierarchicalRepulsion)t.physics.hierarchicalRepulsion.hasOwnProperty(e)&&(this.constants.physics.hierarchicalRepulsion[e]=t.physics.hierarchicalRepulsion[e])}}if(t.hierarchicalLayout){this.constants.hierarchicalLayout.enabled=!0;for(e in t.hierarchicalLayout)t.hierarchicalLayout.hasOwnProperty(e)&&(this.constants.hierarchicalLayout[e]=t.hierarchicalLayout[e])}else void 0!==t.hierarchicalLayout&&(this.constants.hierarchicalLayout.enabled=!1);if(t.clustering){this.constants.clustering.enabled=!0;for(e in t.clustering)t.clustering.hasOwnProperty(e)&&(this.constants.clustering[e]=t.clustering[e])}else void 0!==t.clustering&&(this.constants.clustering.enabled=!1);if(t.navigation){this.constants.navigation.enabled=!0;for(e in t.navigation)t.navigation.hasOwnProperty(e)&&(this.constants.navigation[e]=t.navigation[e])}else void 0!==t.navigation&&(this.constants.navigation.enabled=!1);if(t.keyboard){this.constants.keyboard.enabled=!0;for(e in t.keyboard)t.keyboard.hasOwnProperty(e)&&(this.constants.keyboard[e]=t.keyboard[e])}else void 0!==t.keyboard&&(this.constants.keyboard.enabled=!1);if(t.dataManipulation){this.constants.dataManipulation.enabled=!0;for(e in t.dataManipulation)t.dataManipulation.hasOwnProperty(e)&&(this.constants.dataManipulation[e]=t.dataManipulation[e]);this.editMode=this.constants.dataManipulation.initiallyVisible}else void 0!==t.dataManipulation&&(this.constants.dataManipulation.enabled=!1);if(t.edges){for(e in t.edges)t.edges.hasOwnProperty(e)&&"object"!=typeof t.edges[e]&&(this.constants.edges[e]=t.edges[e]);void 0!==t.edges.color&&(r.isString(t.edges.color)?(this.constants.edges.color={},this.constants.edges.color.color=t.edges.color,this.constants.edges.color.highlight=t.edges.color,this.constants.edges.color.hover=t.edges.color):(void 0!==t.edges.color.color&&(this.constants.edges.color.color=t.edges.color.color),void 0!==t.edges.color.highlight&&(this.constants.edges.color.highlight=t.edges.color.highlight),void 0!==t.edges.color.hover&&(this.constants.edges.color.hover=t.edges.color.hover))),t.edges.fontColor||void 0!==t.edges.color&&(r.isString(t.edges.color)?this.constants.edges.fontColor=t.edges.color:void 0!==t.edges.color.color&&(this.constants.edges.fontColor=t.edges.color.color)),t.edges.dash&&(void 0!==t.edges.dash.length&&(this.constants.edges.dash.length=t.edges.dash.length),void 0!==t.edges.dash.gap&&(this.constants.edges.dash.gap=t.edges.dash.gap),void 0!==t.edges.dash.altLength&&(this.constants.edges.dash.altLength=t.edges.dash.altLength))}if(t.nodes){for(e in t.nodes)t.nodes.hasOwnProperty(e)&&(this.constants.nodes[e]=t.nodes[e]);t.nodes.color&&(this.constants.nodes.color=r.parseColor(t.nodes.color))}if(t.groups)for(var i in t.groups)if(t.groups.hasOwnProperty(i)){var s=t.groups[i];this.groups.add(i,s)}if(t.tooltip){for(e in t.tooltip)t.tooltip.hasOwnProperty(e)&&(this.constants.tooltip[e]=t.tooltip[e]);t.tooltip.color&&(this.constants.tooltip.color=r.parseColor(t.tooltip.color))}}this._loadPhysicsSystem(),this._loadNavigationControls(),this._loadManipulationSystem(),this._configureSmoothCurves(),this._createKeyBinds(),this.setSize(this.width,this.height),this.moving=!0,this.start()},s.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="network-frame",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),!this.frame.canvas.getContext){var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}var e=this;this.drag={},this.pinch={},this.hammer=o(this.frame.canvas,{prevent_default:!0}),this.hammer.on("tap",e._onTap.bind(e)),this.hammer.on("doubletap",e._onDoubleTap.bind(e)),this.hammer.on("hold",e._onHold.bind(e)),this.hammer.on("pinch",e._onPinch.bind(e)),this.hammer.on("touch",e._onTouch.bind(e)),this.hammer.on("dragstart",e._onDragStart.bind(e)),this.hammer.on("drag",e._onDrag.bind(e)),this.hammer.on("dragend",e._onDragEnd.bind(e)),this.hammer.on("release",e._onRelease.bind(e)),this.hammer.on("mousewheel",e._onMouseWheel.bind(e)),this.hammer.on("DOMMouseScroll",e._onMouseWheel.bind(e)),this.hammer.on("mousemove",e._onMouseMoveTitle.bind(e)),this.containerElement.appendChild(this.frame)},s.prototype._createKeyBinds=function(){var t=this;this.mousetrap=a,this.mousetrap.reset(),1==this.constants.keyboard.enabled&&(this.mousetrap.bind("up",this._moveUp.bind(t),"keydown"),this.mousetrap.bind("up",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("down",this._moveDown.bind(t),"keydown"),this.mousetrap.bind("down",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("left",this._moveLeft.bind(t),"keydown"),this.mousetrap.bind("left",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("right",this._moveRight.bind(t),"keydown"),this.mousetrap.bind("right",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("=",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("=",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("-",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("-",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("[",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("[",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("]",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("]",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pageup",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("pageup",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pagedown",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("pagedown",this._stopZoom.bind(t),"keyup")),1==this.constants.dataManipulation.enabled&&(this.mousetrap.bind("escape",this._createManipulatorBar.bind(t)),this.mousetrap.bind("del",this._deleteSelected.bind(t)))},s.prototype._getPointer=function(t){return{x:t.pageX-r.getAbsoluteLeft(this.frame.canvas),y:t.pageY-r.getAbsoluteTop(this.frame.canvas)}},s.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.center),this.drag.pinched=!1,this.pinch.scale=this._getScale(),this._handleTouch(this.drag.pointer) -},s.prototype._onDragStart=function(){this._handleDragStart()},s.prototype._handleDragStart=function(){var t=this.drag,e=this._getNodeAt(t.pointer);if(t.dragging=!0,t.selection=[],t.translation=this._getTranslation(),t.nodeId=null,null!=e){t.nodeId=e.id,e.isSelected()||this._selectObject(e,!1);for(var i in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(i)){var s=this.selectionObj.nodes[i],n={id:s.id,node:s,x:s.x,y:s.y,xFixed:s.xFixed,yFixed:s.yFixed};s.xFixed=!0,s.yFixed=!0,t.selection.push(n)}}},s.prototype._onDrag=function(t){this._handleOnDrag(t)},s.prototype._handleOnDrag=function(t){if(!this.drag.pinched){var e=this._getPointer(t.gesture.center),i=this,s=this.drag,n=s.selection;if(n&&n.length&&1==this.constants.dragNodes){var o=e.x-s.pointer.x,a=e.y-s.pointer.y;n.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._XconvertDOMtoCanvas(i._XconvertCanvasToDOM(t.x)+o)),t.yFixed||(e.y=i._YconvertDOMtoCanvas(i._YconvertCanvasToDOM(t.y)+a))}),this.moving||(this.moving=!0,this.start())}else if(1==this.constants.dragNetwork){var r=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+r,this.drag.translation.y+h),this._redraw(),this.moving=!0,this.start()}}},s.prototype._onDragEnd=function(){this.drag.dragging=!1;var t=this.drag.selection;t&&t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed})},s.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},s.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},s.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},s.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},s.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},s.prototype._zoom=function(t,e){if(1==this.constants.zoomable){var i=this._getScale();1e-5>t&&(t=1e-5),t>10&&(t=10);var s=this._getTranslation(),n=t/i,o=(1-n)*e.x+s.x*n,a=(1-n)*e.y+s.y*n;return this.areaCenter={x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)},this._setScale(t),this._setTranslation(o,a),this.updateClustersDefault(),this._redraw(),t>i?this.emit("zoom",{direction:"+"}):this.emit("zoom",{direction:"-"}),t}},s.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this._getScale(),s=e/10;0>e&&(s/=1-s),i*=1+s;var n=r.fakeGesture(this,t),o=this._getPointer(n.center);this._zoom(i,o)}t.preventDefault()},s.prototype._onMouseMoveTitle=function(t){var e=r.fakeGesture(this,t),i=this._getPointer(e.center);this.popupObj&&this._checkHidePopup(i);var s=this,n=function(){s._checkShowPopup(i)};if(this.popupTimer&&clearInterval(this.popupTimer),this.drag.dragging||(this.popupTimer=setTimeout(n,this.constants.tooltip.delay)),1==this.constants.hover){for(var o in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(o)&&(this.hoverObj.edges[o].hover=!1,delete this.hoverObj.edges[o]);var a=this._getNodeAt(i);null==a&&(a=this._getEdgeAt(i)),null!=a&&this._hoverObject(a);for(var h in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(h)&&(a instanceof p&&a.id!=h||a instanceof m||null==a)&&(this._blurObject(this.hoverObj.nodes[h]),delete this.hoverObj.nodes[h]);this.redraw()}},s.prototype._checkShowPopup=function(t){var e,i={left:this._XconvertDOMtoCanvas(t.x),top:this._YconvertDOMtoCanvas(t.y),right:this._XconvertDOMtoCanvas(t.x),bottom:this._YconvertDOMtoCanvas(t.y)},s=this.popupObj;if(void 0==this.popupObj){var n=this.nodes;for(e in n)if(n.hasOwnProperty(e)){var o=n[e];if(void 0!==o.getTitle()&&o.isOverlappingWith(i)){this.popupObj=o;break}}}if(void 0===this.popupObj){var a=this.edges;for(e in a)if(a.hasOwnProperty(e)){var r=a[e];if(r.connected&&void 0!==r.getTitle()&&r.isOverlappingWith(i)){this.popupObj=r;break}}}if(this.popupObj){if(this.popupObj!=s){var h=this;h.popup||(h.popup=new _(h.frame,h.constants.tooltip)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupObj.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},s.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},s.prototype.setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,void 0!==this.manipulationDiv&&(this.manipulationDiv.style.width=this.frame.canvas.clientWidth+"px"),void 0!==this.navigationDivs&&void 0!==this.navigationDivs.wrapper&&(this.navigationDivs.wrapper.style.width=this.frame.canvas.clientWidth+"px",this.navigationDivs.wrapper.style.height=this.frame.canvas.clientHeight+"px"),this.emit("resize",{width:this.frame.canvas.width,height:this.frame.canvas.height})},s.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof h||t instanceof d)this.nodesData=t;else if(t instanceof Array)this.nodesData=new h,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new h}if(e&&r.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;r.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},s.prototype._addNodes=function(t){for(var e,i=0,s=t.length;s>i;i++){e=t[i];var n=this.nodesData.get(e),o=new p(n,this.images,this.groups,this.constants);if(this.nodes[e]=o,!(0!=o.xFixed&&0!=o.yFixed||null!==o.x&&null!==o.y)){var a=1*t.length,r=2*Math.PI*Math.random();0==o.xFixed&&(o.x=a*Math.cos(r)),0==o.yFixed&&(o.y=a*Math.sin(r))}this.moving=!0}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateValueRange(this.nodes),this.updateLabels()},s.prototype._updateNodes=function(t){for(var e=this.nodes,i=this.nodesData,s=0,n=t.length;n>s;s++){var o=t[s],a=e[o],r=i.get(o);a?a.setProperties(r,this.constants):(a=new p(properties,this.images,this.groups,this.constants),e[o]=a)}this.moving=!0,1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateNodeIndexList(),this._reconnectEdges(),this._updateValueRange(e)},s.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,s=t.length;s>i;i++){var n=t[i];delete e[n]}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},s.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof h||t instanceof d)this.edgesData=t;else if(t instanceof Array)this.edgesData=new h,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new h}if(e&&r.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;r.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},s.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,n=t.length;n>s;s++){var o=t[s],a=e[o];a&&a.disconnect();var r=i.get(o,{showInternalIds:!0});e[o]=new m(r,this,this.constants)}this.moving=!0,this._updateValueRange(e),this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,n=t.length;n>s;s++){var o=t[s],a=i.get(o),r=e[o];r?(r.disconnect(),r.setProperties(a,this.constants),r.connect()):(r=new m(a,this,this.constants),this.edges[o]=r)}this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this.moving=!0,this._updateValueRange(e)},s.prototype._removeEdges=function(t){for(var e=this.edges,i=0,s=t.length;s>i;i++){var n=t[i],o=e[n];o&&(null!=o.via&&delete this.sectors.support.nodes[o.via.id],o.disconnect(),delete e[n])}this.moving=!0,this._updateValueRange(e),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var s=i[t];s.from=null,s.to=null,s.connect()}},s.prototype._updateValueRange=function(t){var e,i=void 0,s=void 0;for(e in t)if(t.hasOwnProperty(e)){var n=t[e].getValue();void 0!==n&&(i=void 0===i?n:Math.min(n,i),s=void 0===s?n:Math.max(n,s))}if(void 0!==i&&void 0!==s)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,s)},s.prototype.redraw=function(){this.setSize(this.width,this.height),this._redraw()},s.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d"),e=this.frame.canvas.width,i=this.frame.canvas.height;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this.canvasTopLeft={x:this._XconvertDOMtoCanvas(0),y:this._YconvertDOMtoCanvas(0)},this.canvasBottomRight={x:this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth),y:this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight)},this._doInAllSectors("_drawAllSectorNodes",t),this._doInAllSectors("_drawEdges",t),this._doInAllSectors("_drawNodes",t,!1),this._doInAllSectors("_drawControlNodes",t),t.restore()},s.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e),this.emit("viewChanged")},s.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},s.prototype._setScale=function(t){this.scale=t},s.prototype._getScale=function(){return this.scale},s.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},s.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},s.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},s.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},s.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},s.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},s.prototype._drawNodes=function(t,e){void 0===e&&(e=!1);var i=this.nodes,s=[];for(var n in i)i.hasOwnProperty(n)&&(i[n].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight),i[n].isSelected()?s.push(n):(i[n].inArea()||e)&&i[n].draw(t));for(var o=0,a=s.length;a>o;o++)(i[s[o]].inArea()||e)&&i[s[o]].draw(t)},s.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var s=e[i];s.setScale(this.scale),s.connected&&e[i].draw(t)}},s.prototype._drawControlNodes=function(t){var e=this.edges;for(var i in e)e.hasOwnProperty(i)&&e[i]._drawControlNodes(t)},s.prototype._stabilize=function(){1==this.constants.freezeForStabilization&&this._freezeDefinedNodes();for(var t=0;this.moving&&t0)for(t in i)i.hasOwnProperty(t)&&(i[t].discreteStepLimited(e,this.constants.maxVelocity),s=!0);else for(t in i)i.hasOwnProperty(t)&&(i[t].discreteStep(e),s=!0);if(1==s){var n=this.constants.minVelocity/Math.max(this.scale,.05);this.moving=n>.5*this.constants.maxVelocity?!0:this._isMoving(n)}},s.prototype._physicsTick=function(){this.freezeSimulation||this.moving&&(this._doInAllActiveSectors("_initializeForceCalculation"),this._doInAllActiveSectors("_discreteStepNodes"),this.constants.smoothCurves&&this._doInSupportSector("_discreteStepNodes"),this._findCenter(this._getRange()))},s.prototype._animationStep=function(){this.timer=void 0,this._handleNavigation(),this.start();var t=Date.now(),e=1;this._physicsTick();for(var i=Date.now()-t;i<.9*(this.renderTimestep-this.renderTime)&&eh}return!1},s.prototype._drawLine=function(t){if(t.strokeStyle=1==this.selected?this.color.highlight:1==this.hover?this.color.hover:this.color.color,t.lineWidth=this._getLineWidth(),this.from!=this.to){this._line(t);var e;if(this.label){if(1==this.smooth){var i=.5*(.5*(this.from.x+this.via.x)+.5*(this.to.x+this.via.x)),s=.5*(.5*(this.from.y+this.via.y)+.5*(this.to.y+this.via.y));e={x:i,y:s}}else e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}}else{var n,o,a=this.length/4,r=this.from;r.width||r.resize(t),r.width>r.height?(n=r.x+r.width/2,o=r.y-a):(n=r.x+a,o=r.y-r.height/2),this._circle(t,n,o,a),e=this._pointOnCircle(n,o,a,.5),this._label(t,this.label,e.x,e.y)}},s.prototype._getLineWidth=function(){return 1==this.selected?Math.min(this.widthSelected,this.widthMax)*this.networkScaleInv:1==this.hover?Math.min(this.hoverWidth,this.widthMax)*this.networkScaleInv:this.width*this.networkScaleInv},s.prototype._line=function(t){t.beginPath(),t.moveTo(this.from.x,this.from.y),1==this.smooth?t.quadraticCurveTo(this.via.x,this.via.y,this.to.x,this.to.y):t.lineTo(this.to.x,this.to.y),t.stroke()},s.prototype._circle=function(t,e,i,s){t.beginPath(),t.arc(e,i,s,0,2*Math.PI,!1),t.stroke()},s.prototype._label=function(t,e,i,s){if(e){t.font=(this.from.selected||this.to.selected?"bold ":"")+this.fontSize+"px "+this.fontFace,t.fillStyle=this.fontFill;var n=t.measureText(e).width,o=this.fontSize,a=i-n/2,r=s-o/2;t.fillRect(a,r,n,o),t.fillStyle=this.fontColor||"black",t.textAlign="left",t.textBaseline="top",t.fillText(e,a,r)}},s.prototype._drawDashLine=function(t){if(t.strokeStyle=1==this.selected?this.color.highlight:1==this.hover?this.color.hover:this.color.color,t.lineWidth=this._getLineWidth(),void 0!==t.mozDash||void 0!==t.setLineDash){t.beginPath(),t.moveTo(this.from.x,this.from.y);var e=[0];e=void 0!==this.dash.length&&void 0!==this.dash.gap?[this.dash.length,this.dash.gap]:[5,5],"undefined"!=typeof t.setLineDash?(t.setLineDash(e),t.lineDashOffset=0):(t.mozDash=e,t.mozDashOffset=0),1==this.smooth?t.quadraticCurveTo(this.via.x,this.via.y,this.to.x,this.to.y):t.lineTo(this.to.x,this.to.y),t.stroke(),"undefined"!=typeof t.setLineDash?(t.setLineDash([0]),t.lineDashOffset=0):(t.mozDash=[0],t.mozDashOffset=0)}else t.beginPath(),t.lineCap="round",void 0!==this.dash.altLength?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.dash.length,this.dash.gap,this.dash.altLength,this.dash.gap]):void 0!==this.dash.length&&void 0!==this.dash.gap?t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.dash.length,this.dash.gap]):(t.moveTo(this.from.x,this.from.y),t.lineTo(this.to.x,this.to.y)),t.stroke();if(this.label){var i;if(1==this.smooth){var s=.5*(.5*(this.from.x+this.via.x)+.5*(this.to.x+this.via.x)),n=.5*(.5*(this.from.y+this.via.y)+.5*(this.to.y+this.via.y));i={x:s,y:n}}else i=this._pointOnLine(.5);this._label(t,this.label,i.x,i.y)}},s.prototype._pointOnLine=function(t){return{x:(1-t)*this.from.x+t*this.to.x,y:(1-t)*this.from.y+t*this.to.y}},s.prototype._pointOnCircle=function(t,e,i,s){var n=2*(s-3/8)*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}},s.prototype._drawArrowCenter=function(t){var e;if(1==this.selected?(t.strokeStyle=this.color.highlight,t.fillStyle=this.color.highlight):1==this.hover?(t.strokeStyle=this.color.hover,t.fillStyle=this.color.hover):(t.strokeStyle=this.color.color,t.fillStyle=this.color.color),t.lineWidth=this._getLineWidth(),this.from!=this.to){this._line(t);var i=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),s=(10+5*this.width)*this.arrowScaleFactor;if(1==this.smooth){var n=.5*(.5*(this.from.x+this.via.x)+.5*(this.to.x+this.via.x)),o=.5*(.5*(this.from.y+this.via.y)+.5*(this.to.y+this.via.y));e={x:n,y:o}}else e=this._pointOnLine(.5);t.arrow(e.x,e.y,i,s),t.fill(),t.stroke(),this.label&&this._label(t,this.label,e.x,e.y)}else{var a,r,h=.25*Math.max(100,this.length),d=this.from;d.width||d.resize(t),d.width>d.height?(a=d.x+.5*d.width,r=d.y-h):(a=d.x+h,r=d.y-.5*d.height),this._circle(t,a,r,h);var i=.2*Math.PI,s=(10+5*this.width)*this.arrowScaleFactor;e=this._pointOnCircle(a,r,h,.5),t.arrow(e.x,e.y,i,s),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(a,r,h,.5),this._label(t,this.label,e.x,e.y))}},s.prototype._drawArrow=function(t){1==this.selected?(t.strokeStyle=this.color.highlight,t.fillStyle=this.color.highlight):1==this.hover?(t.strokeStyle=this.color.hover,t.fillStyle=this.color.hover):(t.strokeStyle=this.color.color,t.fillStyle=this.color.color),t.lineWidth=this._getLineWidth();var e,i;if(this.from!=this.to){e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var s=this.to.x-this.from.x,n=this.to.y-this.from.y,o=Math.sqrt(s*s+n*n),a=this.from.distanceToBorder(t,e+Math.PI),r=(o-a)/o,h=r*this.from.x+(1-r)*this.to.x,d=r*this.from.y+(1-r)*this.to.y;1==this.smooth&&(e=Math.atan2(this.to.y-this.via.y,this.to.x-this.via.x),s=this.to.x-this.via.x,n=this.to.y-this.via.y,o=Math.sqrt(s*s+n*n));var l,c,u=this.to.distanceToBorder(t,e),p=(o-u)/o;if(1==this.smooth?(l=(1-p)*this.via.x+p*this.to.x,c=(1-p)*this.via.y+p*this.to.y):(l=(1-p)*this.from.x+p*this.to.x,c=(1-p)*this.from.y+p*this.to.y),t.beginPath(),t.moveTo(h,d),1==this.smooth?t.quadraticCurveTo(this.via.x,this.via.y,l,c):t.lineTo(l,c),t.stroke(),i=(10+5*this.width)*this.arrowScaleFactor,t.arrow(l,c,e,i),t.fill(),t.stroke(),this.label){var m;if(1==this.smooth){var _=.5*(.5*(this.from.x+this.via.x)+.5*(this.to.x+this.via.x)),f=.5*(.5*(this.from.y+this.via.y)+.5*(this.to.y+this.via.y));m={x:_,y:f}}else m=this._pointOnLine(.5);this._label(t,this.label,m.x,m.y)}}else{var g,y,v,M=this.from,b=.25*Math.max(100,this.length);M.width||M.resize(t),M.width>M.height?(g=M.x+.5*M.width,y=M.y-b,v={x:g,y:M.y,angle:.9*Math.PI}):(g=M.x+b,y=M.y-.5*M.height,v={x:M.x,y:y,angle:.6*Math.PI}),t.beginPath(),t.arc(g,y,b,0,2*Math.PI,!1),t.stroke();var i=(10+5*this.width)*this.arrowScaleFactor;t.arrow(v.x,v.y,v.angle,i),t.fill(),t.stroke(),this.label&&(m=this._pointOnCircle(g,y,b,.5),this._label(t,this.label,m.x,m.y))}},s.prototype._getDistanceToEdge=function(t,e,i,s,n,o){if(this.from!=this.to){if(1==this.smooth){var a,r,h,d,l,c,u=1e9;for(a=0;10>a;a++)r=.1*a,h=Math.pow(1-r,2)*t+2*r*(1-r)*this.via.x+Math.pow(r,2)*i,d=Math.pow(1-r,2)*e+2*r*(1-r)*this.via.y+Math.pow(r,2)*s,l=Math.abs(n-h),c=Math.abs(o-d),u=Math.min(u,Math.sqrt(l*l+c*c));return u}var p=i-t,m=s-e,_=p*p+m*m,f=((n-t)*p+(o-e)*m)/_;f>1?f=1:0>f&&(f=0);var h=t+f*p,d=e+f*m,l=h-n,c=d-o;return Math.sqrt(l*l+c*c)}var h,d,l,c,g=this.length/4,y=this.from;return y.width||y.resize(ctx),y.width>y.height?(h=y.x+y.width/2,d=y.y-g):(h=y.x+g,d=y.y-y.height/2),l=h-n,c=d-o,Math.abs(Math.sqrt(l*l+c*c)-g)},s.prototype.setScale=function(t){this.networkScaleInv=1/t},s.prototype.select=function(){this.selected=!0},s.prototype.unselect=function(){this.selected=!1},s.prototype.positionBezierNode=function(){null!==this.via&&(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y))},s.prototype._drawControlNodes=function(t){if(1==this.controlNodesEnabled){if(null===this.controlNodes.from&&null===this.controlNodes.to){var e="edgeIdFrom:".concat(this.id),i="edgeIdTo:".concat(this.id),s={nodes:{group:"",radius:8},physics:{damping:0},clustering:{maxNodeSizeIncrements:0,nodeScaling:{width:0,height:0,radius:0}}};this.controlNodes.from=new o({id:e,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s),this.controlNodes.to=new o({id:i,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s)}0==this.controlNodes.from.selected&&0==this.controlNodes.to.selected&&(this.controlNodes.positions=this.getControlNodePositions(t),this.controlNodes.from.x=this.controlNodes.positions.from.x,this.controlNodes.from.y=this.controlNodes.positions.from.y,this.controlNodes.to.x=this.controlNodes.positions.to.x,this.controlNodes.to.y=this.controlNodes.positions.to.y),this.controlNodes.from.draw(t),this.controlNodes.to.draw(t)}else this.controlNodes={from:null,to:null,positions:{}}},s.prototype._enableControlNodes=function(){this.controlNodesEnabled=!0},s.prototype._disableControlNodes=function(){this.controlNodesEnabled=!1},s.prototype._getSelectedControlNode=function(t,e){var i=this.controlNodes.positions,s=Math.sqrt(Math.pow(t-i.from.x,2)+Math.pow(e-i.from.y,2)),n=Math.sqrt(Math.pow(t-i.to.x,2)+Math.pow(e-i.to.y,2));return 15>s?(this.connectedNode=this.from,this.from=this.controlNodes.from,this.controlNodes.from):15>n?(this.connectedNode=this.to,this.to=this.controlNodes.to,this.controlNodes.to):null},s.prototype._restoreControlNodes=function(){1==this.controlNodes.from.selected&&(this.from=this.connectedNode,this.connectedNode=null,this.controlNodes.from.unselect()),1==this.controlNodes.to.selected&&(this.to=this.connectedNode,this.connectedNode=null,this.controlNodes.to.unselect())},s.prototype.getControlNodePositions=function(t){var e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),i=this.to.x-this.from.x,s=this.to.y-this.from.y,n=Math.sqrt(i*i+s*s),o=this.from.distanceToBorder(t,e+Math.PI),a=(n-o)/n,r=a*this.from.x+(1-a)*this.to.x,h=a*this.from.y+(1-a)*this.to.y;1==this.smooth&&(e=Math.atan2(this.to.y-this.via.y,this.to.x-this.via.x),i=this.to.x-this.via.x,s=this.to.y-this.via.y,n=Math.sqrt(i*i+s*s));var d,l,c=this.to.distanceToBorder(t,e),u=(n-c)/n;return 1==this.smooth?(d=(1-u)*this.via.x+u*this.to.x,l=(1-u)*this.via.y+u*this.to.y):(d=(1-u)*this.from.x+u*this.to.x,l=(1-u)*this.from.y+u*this.to.y),{from:{x:r,y:h},to:{x:d,y:l}}},t.exports=s},function(t,e,i){function s(){this.clear(),this.defaultIndex=0}var n=i(1);s.DEFAULT=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"}}],s.prototype.clear=function(){this.groups={},this.groups.length=function(){var t=0;for(var e in this)this.hasOwnProperty(e)&&t++;return t}},s.prototype.get=function(t){var e=this.groups[t];if(void 0==e){var i=this.defaultIndex%s.DEFAULT.length;this.defaultIndex++,e={},e.color=s.DEFAULT[i],this.groups[t]=e}return e},s.prototype.add=function(t,e){return this.groups[t]=e,e.color&&(e.color=n.parseColor(e.color)),e},t.exports=s},function(t){function e(){this.images={},this.callback=void 0}e.prototype.setOnloadCallback=function(t){this.callback=t},e.prototype.load=function(t){var e=this.images[t];if(void 0==e){var i=this;e=new Image,this.images[t]=e,e.onload=function(){i.callback&&i.callback(this)},e.src=t}return e},t.exports=e},function(t,e,i){function s(t,e,i,s){this.selected=!1,this.hover=!1,this.edges=[],this.dynamicEdges=[],this.reroutedEdges={},this.group=s.nodes.group,this.fontSize=Number(s.nodes.fontSize),this.fontFace=s.nodes.fontFace,this.fontColor=s.nodes.fontColor,this.fontDrawThreshold=3,this.color=s.nodes.color,this.id=void 0,this.shape=s.nodes.shape,this.image=s.nodes.image,this.x=null,this.y=null,this.xFixed=!1,this.yFixed=!1,this.horizontalAlignLeft=!0,this.verticalAlignTop=!0,this.radius=s.nodes.radius,this.baseRadiusValue=s.nodes.radius,this.radiusFixed=!1,this.radiusMin=s.nodes.radiusMin,this.radiusMax=s.nodes.radiusMax,this.level=-1,this.preassignedLevel=!1,this.imagelist=e,this.grouplist=i,this.fx=0,this.fy=0,this.vx=0,this.vy=0,this.minForce=s.minForce,this.damping=s.physics.damping,this.mass=1,this.fixedData={x:null,y:null},this.setProperties(t,s),this.resetCluster(),this.dynamicEdgesLength=0,this.clusterSession=0,this.clusterSizeWidthFactor=s.clustering.nodeScaling.width,this.clusterSizeHeightFactor=s.clustering.nodeScaling.height,this.clusterSizeRadiusFactor=s.clustering.nodeScaling.radius,this.maxNodeSizeIncrements=s.clustering.maxNodeSizeIncrements,this.growthIndicator=0,this.networkScaleInv=1,this.networkScale=1,this.canvasTopLeft={x:-300,y:-300},this.canvasBottomRight={x:300,y:300},this.parentEdgeId=null -}var n=i(1);s.prototype.resetCluster=function(){this.formationScale=void 0,this.clusterSize=1,this.containedNodes={},this.containedEdges={},this.clusterSessions=[]},s.prototype.attachEdge=function(t){-1==this.edges.indexOf(t)&&this.edges.push(t),-1==this.dynamicEdges.indexOf(t)&&this.dynamicEdges.push(t),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.detachEdge=function(t){var e=this.edges.indexOf(t);-1!=e&&(this.edges.splice(e,1),this.dynamicEdges.splice(e,1)),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.setProperties=function(t,e){if(t){if(this.originalLabel=void 0,void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.originalLabel=t.label),void 0!==t.title&&(this.title=t.title),void 0!==t.group&&(this.group=t.group),void 0!==t.x&&(this.x=t.x),void 0!==t.y&&(this.y=t.y),void 0!==t.value&&(this.value=t.value),void 0!==t.level&&(this.level=t.level,this.preassignedLevel=!0),void 0!==t.mass&&(this.mass=t.mass),void 0!==t.horizontalAlignLeft&&(this.horizontalAlignLeft=t.horizontalAlignLeft),void 0!==t.verticalAlignTop&&(this.verticalAlignTop=t.verticalAlignTop),void 0!==t.triggerFunction&&(this.triggerFunction=t.triggerFunction),void 0===this.id)throw"Node must have an id";if(this.group){var i=this.grouplist.get(this.group);for(var s in i)i.hasOwnProperty(s)&&(this[s]=i[s])}if(void 0!==t.shape&&(this.shape=t.shape),void 0!==t.image&&(this.image=t.image),void 0!==t.radius&&(this.radius=t.radius),void 0!==t.color&&(this.color=n.parseColor(t.color)),void 0!==t.fontColor&&(this.fontColor=t.fontColor),void 0!==t.fontSize&&(this.fontSize=t.fontSize),void 0!==t.fontFace&&(this.fontFace=t.fontFace),void 0!==this.image&&""!=this.image){if(!this.imagelist)throw"No imagelist provided";this.imageObj=this.imagelist.load(this.image)}switch(this.xFixed=this.xFixed||void 0!==t.x&&!t.allowedToMoveX,this.yFixed=this.yFixed||void 0!==t.y&&!t.allowedToMoveY,this.radiusFixed=this.radiusFixed||void 0!==t.radius,"image"==this.shape&&(this.radiusMin=e.nodes.widthMin,this.radiusMax=e.nodes.widthMax),this.shape){case"database":this.draw=this._drawDatabase,this.resize=this._resizeDatabase;break;case"box":this.draw=this._drawBox,this.resize=this._resizeBox;break;case"circle":this.draw=this._drawCircle,this.resize=this._resizeCircle;break;case"ellipse":this.draw=this._drawEllipse,this.resize=this._resizeEllipse;break;case"image":this.draw=this._drawImage,this.resize=this._resizeImage;break;case"text":this.draw=this._drawText,this.resize=this._resizeText;break;case"dot":this.draw=this._drawDot,this.resize=this._resizeShape;break;case"square":this.draw=this._drawSquare,this.resize=this._resizeShape;break;case"triangle":this.draw=this._drawTriangle,this.resize=this._resizeShape;break;case"triangleDown":this.draw=this._drawTriangleDown,this.resize=this._resizeShape;break;case"star":this.draw=this._drawStar,this.resize=this._resizeShape;break;default:this.draw=this._drawEllipse,this.resize=this._resizeEllipse}this._reset()}},s.prototype.select=function(){this.selected=!0,this._reset()},s.prototype.unselect=function(){this.selected=!1,this._reset()},s.prototype.clearSizeCache=function(){this._reset()},s.prototype._reset=function(){this.width=void 0,this.height=void 0},s.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},s.prototype.distanceToBorder=function(t,e){var i=1;switch(this.width||this.resize(t),this.shape){case"circle":case"dot":return this.radius+i;case"ellipse":var s=this.width/2,n=this.height/2,o=Math.sin(e)*s,a=Math.cos(e)*n;return s*n/Math.sqrt(o*o+a*a);case"box":case"image":case"text":default:return this.width?Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i:0}},s.prototype._setForce=function(t,e){this.fx=t,this.fy=e},s.prototype._addForce=function(t,e){this.fx+=t,this.fy+=e},s.prototype.discreteStep=function(t){if(!this.xFixed){var e=this.damping*this.vx,i=(this.fx-e)/this.mass;this.vx+=i*t,this.x+=this.vx*t}if(!this.yFixed){var s=this.damping*this.vy,n=(this.fy-s)/this.mass;this.vy+=n*t,this.y+=this.vy*t}},s.prototype.discreteStepLimited=function(t,e){if(this.xFixed)this.fx=0;else{var i=this.damping*this.vx,s=(this.fx-i)/this.mass;this.vx+=s*t,this.vx=Math.abs(this.vx)>e?this.vx>0?e:-e:this.vx,this.x+=this.vx*t}if(this.yFixed)this.fy=0;else{var n=this.damping*this.vy,o=(this.fy-n)/this.mass;this.vy+=o*t,this.vy=Math.abs(this.vy)>e?this.vy>0?e:-e:this.vy,this.y+=this.vy*t}},s.prototype.isFixed=function(){return this.xFixed&&this.yFixed},s.prototype.isMoving=function(t){return Math.abs(this.vx)>t||Math.abs(this.vy)>t},s.prototype.isSelected=function(){return this.selected},s.prototype.getValue=function(){return this.value},s.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},s.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.radius=(this.radiusMin+this.radiusMax)/2;else{var i=(this.radiusMax-this.radiusMin)/(e-t);this.radius=(this.value-t)*i+this.radiusMin}this.baseRadiusValue=this.radius},s.prototype.draw=function(){throw"Draw method not initialized for node"},s.prototype.resize=function(){throw"Resize method not initialized for node"},s.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},s.prototype._resizeImage=function(){if(!this.width||!this.height){var t,e;if(this.value){this.radius=this.baseRadiusValue;var i=this.imageObj.height/this.imageObj.width;void 0!==i?(t=this.radius||this.imageObj.width,e=this.radius*i||this.imageObj.height):(t=0,e=0)}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.growthIndicator=0,this.width>0&&this.height>0&&(this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t)}},s.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;if(0!=this.imageObj.width){if(this.clusterSize>1){var i=this.clusterSize>1?10:0;i*=this.networkScaleInv,i=Math.min(.2*this.width,i),t.globalAlpha=.5,t.drawImage(this.imageObj,this.left-i,this.top-i,this.width+2*i,this.height+2*i)}t.globalAlpha=1,t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2}else e=this.y;this._label(t,this.label,this.x,e,void 0,"top")},s.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=2;t.strokeStyle=this.selected?this.color.highlight.border:this.hover?this.color.hover.border:this.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.roundRect(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth,this.radius),t.stroke()),t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.color.background,t.roundRect(this.left,this.top,this.width,this.height,this.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=i.width+2*e;this.width=s,this.height=s,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-s}},s.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=2;t.strokeStyle=this.selected?this.color.highlight.border:this.hover?this.color.hover.border:this.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.database(this.x-this.width/2-2*t.lineWidth,this.y-.5*this.height-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.hover?this.color.hover.background:this.color.background,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=Math.max(i.width,i.height)+2*e;this.radius=s/2,this.width=s,this.height=s,this.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.radius-.5*s}},s.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=2;t.strokeStyle=this.selected?this.color.highlight.border:this.hover?this.color.hover.border:this.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.circle(this.x,this.y,this.radius+2*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.hover?this.color.hover.background:this.color.background,t.circle(this.x,this.y,this.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.width1&&(t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.ellipse(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.hover?this.color.hover.background:this.color.background,t.ellipse(this.left,this.top,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._drawDot=function(t){this._drawShape(t,"circle")},s.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},s.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},s.prototype._drawSquare=function(t){this._drawShape(t,"square")},s.prototype._drawStar=function(t){this._drawShape(t,"star")},s.prototype._resizeShape=function(){if(!this.width){this.radius=this.baseRadiusValue;var t=2*this.radius;this.width=t,this.height=t,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t}},s.prototype._drawShape=function(t,e){this._resizeShape(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var i=2.5,s=2,n=2;switch(e){case"dot":n=2;break;case"square":n=2;break;case"triangle":n=3;break;case"triangleDown":n=3;break;case"star":n=4}t.strokeStyle=this.selected?this.color.highlight.border:this.hover?this.color.hover.border:this.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:1)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t[e](this.x,this.y,this.radius+n*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:1)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.hover?this.color.hover.background:this.color.background,t[e](this.x,this.y,this.radius),t.fill(),t.stroke(),this.label&&this._label(t,this.label,this.x,this.y+this.height/2,void 0,"top",!0)},s.prototype._resizeText=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawText=function(t){this._resizeText(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,this._label(t,this.label,this.x,this.y)},s.prototype._label=function(t,e,i,s,n,o,a){if(e&&this.fontSize*this.networkScale>this.fontDrawThreshold){t.font=(this.selected?"bold ":"")+this.fontSize+"px "+this.fontFace,t.fillStyle=this.fontColor||"black",t.textAlign=n||"center",t.textBaseline=o||"middle";var r=e.split("\n"),h=r.length,d=this.fontSize+4,l=s+(1-h)/2*d;1==a&&(l=s+(1-h)/(2*d));for(var c=0;h>c;c++)t.fillText(r[c],i,l),l+=d}},s.prototype.getTextSize=function(t){if(void 0!==this.label){t.font=(this.selected?"bold ":"")+this.fontSize+"px "+this.fontFace;for(var e=this.label.split("\n"),i=(this.fontSize+4)*e.length,s=0,n=0,o=e.length;o>n;n++)s=Math.max(s,t.measureText(e[n]).width);return{width:s,height:i}}return{width:0,height:0}},s.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.networkScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.networkScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.networkScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.ys&&(o=s-e-this.padding),on&&(a=n-i-this.padding),ai;i++)if(e.id===a.nodes[i].id){n=a.nodes[i];break}for(n||(n={id:e.id},t.node&&(n.attr=r(n.attr,t.node))),i=o.length-1;i>=0;i--){var h=o[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(n)&&h.nodes.push(n)}e.attr&&(n.attr=r(n.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=r({},t.edge);e.attr=r(i,e.attr)}}function c(t,e,i,s,n){var o={from:e,to:i,type:s};return t.edge&&(o.attr=r({},t.edge)),o.attr=r(o.attr||{},n),o}function u(){for(C=D.NULL,E="";" "==k||" "==k||"\n"==k||"\r"==k;)n();do{var t=!1;if("#"==k){for(var e=S-1;" "==Y.charAt(e)||" "==Y.charAt(e);)e--;if("\n"==Y.charAt(e)||""==Y.charAt(e)){for(;""!=k&&"\n"!=k;)n();t=!0}}if("/"==k&&"/"==o()){for(;""!=k&&"\n"!=k;)n();t=!0}if("/"==k&&"*"==o()){for(;""!=k;){if("*"==k&&"/"==o()){n(),n();break}n()}t=!0}for(;" "==k||" "==k||"\n"==k||"\r"==k;)n()}while(t);if(""==k)return void(C=D.DELIMITER);var i=k+o();if(T[i])return C=D.DELIMITER,E=i,n(),void n();if(T[k])return C=D.DELIMITER,E=k,void n();if(a(k)||"-"==k){for(E+=k,n();a(k);)E+=k,n();return"false"==E?E=!1:"true"==E?E=!0:isNaN(Number(E))||(E=Number(E)),void(C=D.IDENTIFIER)}if('"'==k){for(n();""!=k&&('"'!=k||'"'==k&&'"'==o());)E+=k,'"'==k&&n(),n();if('"'!=k)throw b('End of string " expected');return n(),void(C=D.IDENTIFIER)}for(C=D.UNKNOWN;""!=k;)E+=k,n();throw new SyntaxError('Syntax error in part "'+w(E,30)+'"')}function p(){var t={};if(s(),u(),"strict"==E&&(t.strict=!0,u()),("graph"==E||"digraph"==E)&&(t.type=E,u()),C==D.IDENTIFIER&&(t.id=E,u()),"{"!=E)throw b("Angle bracket { expected");if(u(),m(t),"}"!=E)throw b("Angle bracket } expected");if(u(),""!==E)throw b("End of file expected");return u(),delete t.node,delete t.edge,delete t.graph,t}function m(t){for(;""!==E&&"}"!=E;)_(t),";"==E&&u()}function _(t){var e=f(t);if(e)return void v(t,e);var i=g(t);if(!i){if(C!=D.IDENTIFIER)throw b("Identifier expected");var s=E;if(u(),"="==E){if(u(),C!=D.IDENTIFIER)throw b("Identifier expected");t[s]=E,u()}else y(t,s)}}function f(t){var e=null;if("subgraph"==E&&(e={},e.type="subgraph",u(),C==D.IDENTIFIER&&(e.id=E,u())),"{"==E){if(u(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,m(e),"}"!=E)throw b("Angle bracket } expected");u(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function g(t){return"node"==E?(u(),t.node=M(),"node"):"edge"==E?(u(),t.edge=M(),"edge"):"graph"==E?(u(),t.graph=M(),"graph"):null}function y(t,e){var i={id:e},s=M();s&&(i.attr=s),d(t,i),v(t,e)}function v(t,e){for(;"->"==E||"--"==E;){var i,s=E;u();var n=f(t);if(n)i=n;else{if(C!=D.IDENTIFIER)throw b("Identifier or subgraph expected");i=E,d(t,{id:i}),u()}var o=M(),a=c(t,e,i,s,o);l(t,a),e=i}}function M(){for(var t=null;"["==E;){for(u(),t={};""!==E&&"]"!=E;){if(C!=D.IDENTIFIER)throw b("Attribute name expected");var e=E;if(u(),"="!=E)throw b("Equal sign = expected");if(u(),C!=D.IDENTIFIER)throw b("Attribute value expected");var i=E;h(t,e,i),u(),","==E&&u()}if("]"!=E)throw b("Bracket ] expected");u()}return t}function b(t){return new SyntaxError(t+', got "'+w(E,30)+'" (char '+S+")")}function w(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function L(t,e,i){t instanceof Array?t.forEach(function(t){e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}):e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}function x(t){function e(t){var e={from:t.from,to:t.to};return r(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var s=i(t),n={nodes:[],edges:[],options:{}};return s.nodes&&s.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};r(e,t.attr),e.image&&(e.shape="image"),n.nodes.push(e)}),s.edges&&s.edges.forEach(function(t){var i,s;i=t.from instanceof Object?t.from.nodes:{id:t.from},s=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var i=e(t);n.edges.push(i)}),L(i,s,function(i,s){var o=c(n,i.id,s.id,t.type,t.attr),a=e(o);n.edges.push(a)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var i=e(t);n.edges.push(i)})}),s.attr&&(n.options=s.attr),n}var D={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},T={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},Y="",S=0,k="",E="",C=D.NULL,N=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=x},function(t){function e(t,e,i){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0,this.z=void 0!==i?i:0}e.subtract=function(t,i){var s=new e;return s.x=t.x-i.x,s.y=t.y-i.y,s.z=t.z-i.z,s},e.add=function(t,i){var s=new e;return s.x=t.x+i.x,s.y=t.y+i.y,s.z=t.z+i.z,s},e.avg=function(t,i){return new e((t.x+i.x)/2,(t.y+i.y)/2,(t.z+i.z)/2)},e.crossProduct=function(t,i){var s=new e;return s.x=t.y*i.z-t.z*i.y,s.y=t.z*i.x-t.x*i.z,s.z=t.x*i.y-t.y*i.x,s},e.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},t.exports=e},function(t){Point2d=function(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0},t.exports=Point2d},function(t,e,i){function s(t,e,i){this.data=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=i.getDistinctValues(t.get(),this.column),this.values.sort(function(t,e){return t>e?1:e>t?-1:0}),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var n=i(4);s.prototype.isLoaded=function(){return this.loaded},s.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},s.prototype.getLabel=function(){return this.graph.filterLabel},s.prototype.getColumn=function(){return this.column},s.prototype.getSelectedValue=function(){return void 0===this.index?void 0:this.values[this.index]},s.prototype.getValues=function(){return this.values},s.prototype.getValue=function(t){if(t>=this.values.length)throw"Error: index out of range";return this.values[t]},s.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var s=new n(this.data,{filter:function(t){return t[i.column]==i.value}}).get();e=this.graph._getDataPoints(s),this.dataPoints[t]=e}return e},s.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},s.prototype.selectValue=function(t){if(t>=this.values.length)throw"Error: index out of range";this.index=t,this.value=this.values[t]},s.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t=t||(void 0!==i&&(this.prettyStep=i),this._step=this.prettyStep===!0?e.calculatePrettyStep(t):t)},e.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),s=2*Math.pow(10,Math.round(e(t/2))),n=5*Math.pow(10,Math.round(e(t/5))),o=i;return Math.abs(s-t)<=Math.abs(o-t)&&(o=s),Math.abs(n-t)<=Math.abs(o-t)&&(o=n),0>=o&&(o=1),o},e.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},e.prototype.getStep=function(){return this._step},e.prototype.start=function(){this._current=this._start-this._start%this._step},e.prototype.next=function(){this._current+=this._step},e.prototype.end=function(){return this._current>this._end},t.exports=e},function(){"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1)},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i)},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath();var s=2*i,n=s/2,o=Math.sqrt(3)/6*s,a=Math.sqrt(s*s-n*n);this.moveTo(t,e-(a-o)),this.lineTo(t+n,e+o),this.lineTo(t-n,e+o),this.lineTo(t,e-(a-o)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath();var s=2*i,n=s/2,o=Math.sqrt(3)/6*s,a=Math.sqrt(s*s-n*n);this.moveTo(t,e+(a-o)),this.lineTo(t+n,e-o),this.lineTo(t-n,e-o),this.lineTo(t,e+(a-o)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath();for(var s=0;10>s;s++){var n=s%2===0?1.3*i:.5*i;this.lineTo(t+n*Math.sin(2*s*Math.PI/10),e-n*Math.cos(2*s*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,s,n){var o=Math.PI/180;0>i-2*n&&(n=i/2),0>s-2*n&&(n=s/2),this.beginPath(),this.moveTo(t+n,e),this.lineTo(t+i-n,e),this.arc(t+i-n,e+n,n,270*o,360*o,!1),this.lineTo(t+i,e+s-n),this.arc(t+i-n,e+s-n,n,0,90*o,!1),this.lineTo(t+n,e+s),this.arc(t+n,e+s-n,n,90*o,180*o,!1),this.lineTo(t,e+n),this.arc(t+n,e+n,n,180*o,270*o,!1)},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,s){var n=.5522848,o=i/2*n,a=s/2*n,r=t+i,h=e+s,d=t+i/2,l=e+s/2;this.beginPath(),this.moveTo(t,l),this.bezierCurveTo(t,l-a,d-o,e,d,e),this.bezierCurveTo(d+o,e,r,l-a,r,l),this.bezierCurveTo(r,l+a,d+o,h,d,h),this.bezierCurveTo(d-o,h,t,l+a,t,l)},CanvasRenderingContext2D.prototype.database=function(t,e,i,s){var n=1/3,o=i,a=s*n,r=.5522848,h=o/2*r,d=a/2*r,l=t+o,c=e+a,u=t+o/2,p=e+a/2,m=e+(s-a/2),_=e+s;this.beginPath(),this.moveTo(l,p),this.bezierCurveTo(l,p+d,u+h,c,u,c),this.bezierCurveTo(u-h,c,t,p+d,t,p),this.bezierCurveTo(t,p-d,u-h,e,u,e),this.bezierCurveTo(u+h,e,l,p-d,l,p),this.lineTo(l,m),this.bezierCurveTo(l,m+d,u+h,_,u,_),this.bezierCurveTo(u-h,_,t,m+d,t,m),this.lineTo(t,p)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,s){var n=t-s*Math.cos(i),o=e-s*Math.sin(i),a=t-.9*s*Math.cos(i),r=e-.9*s*Math.sin(i),h=n+s/3*Math.cos(i+.5*Math.PI),d=o+s/3*Math.sin(i+.5*Math.PI),l=n+s/3*Math.cos(i-.5*Math.PI),c=o+s/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(a,r),this.lineTo(l,c),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,s,n){n||(n=[10,5]),0==u&&(u=.001);var o=n.length;this.moveTo(t,e);for(var a=i-t,r=s-e,h=r/a,d=Math.sqrt(a*a+r*r),l=0,c=!0;d>=.1;){var u=n[l++%o];u>d&&(u=d);var p=Math.sqrt(u*u/(1+h*h));0>a&&(p=-p),t+=p,e+=h*p,this[c?"lineTo":"moveTo"](t,e),d-=u,c=!c}})},function(t,e,i){t.exports="undefined"!=typeof window?window.Hammer||i(49):function(){throw Error("hammer.js is only available in a browser, not in node.js.")}},function(t,e,i){t.exports="undefined"!=typeof window&&window.moment||i(51)},function(t,e,i){var s=i(50),n=i(43),o=i(44),a=i(45),r=i(46),h=i(47),d=i(48);e._loadMixin=function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},e._clearMixin=function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=void 0)},e._loadPhysicsSystem=function(){this._loadMixin(s),this._loadSelectedForceSolver(),1==this.constants.configurePhysics&&this._loadPhysicsConfiguration()},e._loadClusterSystem=function(){this.clusterSession=0,this.hubThreshold=5,this._loadMixin(n)},e._loadSectorSystem=function(){this.sectors={},this.activeSector=["default"],this.sectors.active={},this.sectors.active["default"]={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:void 0},this.sectors.frozen={},this.sectors.support={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:void 0},this.nodeIndices=this.sectors.active["default"].nodeIndices,this._loadMixin(o)},e._loadSelectionSystem=function(){this.selectionObj={nodes:{},edges:{}},this._loadMixin(a)},e._loadManipulationSystem=function(){this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,1==this.constants.dataManipulation.enabled?(void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="network-manipulationDiv",this.manipulationDiv.id="network-manipulationDiv",this.manipulationDiv.style.display=1==this.editMode?"block":"none",this.containerElement.insertBefore(this.manipulationDiv,this.frame)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="network-manipulation-editMode",this.editModeDiv.id="network-manipulation-editMode",this.editModeDiv.style.display=1==this.editMode?"none":"block",this.containerElement.insertBefore(this.editModeDiv,this.frame)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="network-manipulation-closeDiv",this.closeDiv.id="network-manipulation-closeDiv",this.closeDiv.style.display=this.manipulationDiv.style.display,this.containerElement.insertBefore(this.closeDiv,this.frame)),this._loadMixin(r),this._createManipulatorBar()):void 0!==this.manipulationDiv&&(this._createManipulatorBar(),this.containerElement.removeChild(this.manipulationDiv),this.containerElement.removeChild(this.editModeDiv),this.containerElement.removeChild(this.closeDiv),this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0,this._clearMixin(r))},e._loadNavigationControls=function(){this._loadMixin(h),this._cleanNavigation(),1==this.constants.navigation.enabled&&this._loadNavigationElements()},e._loadHierarchySystem=function(){this._loadMixin(d)}},function(t){function e(t){return t?i(t):void 0}function i(t){for(var i in e.prototype)t[i]=e.prototype[i];return t}t.exports=e,e.prototype.on=e.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},e.prototype.once=function(t,e){function i(){s.off(t,i),e.apply(this,arguments)}var s=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},e.prototype.off=e.prototype.removeListener=e.prototype.removeAllListeners=e.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this; -var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var s,n=0;ns;++s)i[s].apply(this,e)}return this},e.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},e.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t){function e(t,e,i){return t.addEventListener?t.addEventListener(e,i,!1):void t.attachEvent("on"+e,i)}function i(t){return"keypress"==t.type?String.fromCharCode(t.which):M[t.which]?M[t.which]:b[t.which]?b[t.which]:String.fromCharCode(t.which).toLowerCase()}function s(t){var e=t.target||t.srcElement,i=e.tagName;return(" "+e.className+" ").indexOf(" mousetrap ")>-1?!1:"INPUT"==i||"SELECT"==i||"TEXTAREA"==i||e.contentEditable&&"true"==e.contentEditable}function n(t,e){return t.sort().join(",")===e.sort().join(",")}function o(t){t=t||{};var e,i=!1;for(e in T)t[e]?i=!0:T[e]=0;i||(S=!1)}function a(t,e,i,s,o){var a,r,h=[];if(!x[t])return[];for("keyup"==i&&c(t)&&(e=[t]),a=0;a95&&112>t||M.hasOwnProperty(t)&&(y[M[t]]=t)}return y}function m(t,e,i){return i||(i=p()[t]?"keydown":"keypress"),"keypress"==i&&e.length&&(i="keydown"),i}function _(t,e,s,n){T[t]=0,n||(n=m(e[0],[]));var a,r=function(){S=n,++T[t],u()},d=function(t){h(s,t),"keyup"!==n&&(Y=i(t)),setTimeout(o,10)};for(a=0;a1)return _(t,d,e,i);for(h="+"===t?["+"]:t.split("+"),o=0;o":".","?":"/","|":"\\"},L={option:"alt",command:"meta","return":"enter",escape:"esc"},x={},D={},T={},Y=!1,S=!1,k=1;20>k;++k)M[111+k]="f"+k;for(k=0;9>=k;++k)M[k+96]=k;e(document,"keypress",l),e(document,"keydown",l),e(document,"keyup",l);var E={bind:function(t,e,i){return g(t instanceof Array?t:[t],e,i),D[t+":"+i]=e,this},unbind:function(t,e){return D[t+":"+e]&&(delete D[t+":"+e],this.bind(t,function(){},e)),this},trigger:function(t,e){return D[t+":"+e](),this},reset:function(){return x={},D={},this}};t.exports=E},function(t,e){e.startWithClustering=function(){this.clusterToFit(this.constants.clustering.initialMaxNodes,!0),this.updateLabels(),this.stabilize&&this._stabilize(),this.start()},e.clusterToFit=function(t,e){for(var i=this.nodeIndices.length,s=50,n=0;i>t&&s>n;)n%3==0?(this.forceAggregateHubs(!0),this.normalizeClusterLevels()):this.increaseClusterLevel(),i=this.nodeIndices.length,n+=1;n>0&&1==e&&this.repositionNodes(),this._updateCalculationNodes()},e.openCluster=function(t){var e=this.moving;if(t.clusterSize>this.constants.clustering.sectorThreshold&&this._nodeInActiveArea(t)&&("default"!=this._sector()||1!=this.nodeIndices.length)){this._addSector(t);for(var i=0;this.nodeIndices.lengthi;)this.decreaseClusterLevel(),i+=1}else this._expandClusterNode(t,!1,!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this._updateCalculationNodes(),this.updateLabels();this.moving!=e&&this.start()},e.updateClustersDefault=function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},e.increaseClusterLevel=function(){this.updateClusters(-1,!1,!0)},e.decreaseClusterLevel=function(){this.updateClusters(1,!1,!0)},e.updateClusters=function(t,e,i,s){var n=this.moving,o=this.nodeIndices.length;this.previousScale>this.scale&&0==t&&this._collapseSector(),this.previousScale>this.scale||-1==t?this._formClusters(i):(this.previousScalethis.scale||-1==t)&&(this._aggregateHubs(i),this._updateNodeIndexList()),(this.previousScale>this.scale||-1==t)&&(this.handleChains(),this._updateNodeIndexList()),this.previousScale=this.scale,this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.lengththis.constants.clustering.chainThreshold&&this._reduceAmountOfChains(1-this.constants.clustering.chainThreshold/t)},e._aggregateHubs=function(t){this._getHubSize(),this._formClustersByHub(t,!1)},e.forceAggregateHubs=function(t){var e=this.moving,i=this.nodeIndices.length;this._aggregateHubs(!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.length!=i&&(this.clusterSession+=1),(0==t||void 0===t)&&this.moving!=e&&this.start()},e._openClustersBySize=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];1==e.inView()&&(e.width*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||e.height*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight)&&this.openCluster(e)}},e._openClusters=function(t,e){for(var i=0;i1&&(t.clusterSizei)){var a=o.from,r=o.to;o.to.mass>o.from.mass&&(a=o.to,r=o.from),1==r.dynamicEdgesLength?this._addToCluster(a,r,!1):1==a.dynamicEdgesLength&&this._addToCluster(r,a,!1)}}},e._forceClustersByZoom=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];if(1==e.dynamicEdgesLength&&0!=e.dynamicEdges.length){var i=e.dynamicEdges[0],s=i.toId==e.id?this.nodes[i.fromId]:this.nodes[i.toId];e.id!=s.id&&(s.mass>e.mass?this._addToCluster(s,e,!0):this._addToCluster(e,s,!0))}}},e._clusterToSmallestNeighbour=function(t){for(var e=-1,i=null,s=0;sn.clusterSessions.length&&(e=n.clusterSessions.length,i=n)}null!=n&&void 0!==this.nodes[n.id]&&this._addToCluster(n,t,!0)},e._formClustersByHub=function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,e)},e._formClusterFromHub=function(t,e,i,s){if(void 0===s&&(s=0),t.dynamicEdgesLength>=this.hubThreshold&&0==i||t.dynamicEdgesLength==this.hubThreshold&&1==i){for(var n,o,a,r=this.constants.clustering.clusterEdgeThreshold/this.scale,h=!1,d=[],l=t.dynamicEdges.length,c=0;l>c;c++)d.push(t.dynamicEdges[c].id);if(0==e)for(h=!1,c=0;l>c;c++){var u=this.edges[d[c]];if(void 0!==u&&u.connected&&u.toId!=u.fromId&&(n=u.to.x-u.from.x,o=u.to.y-u.from.y,a=Math.sqrt(n*n+o*o),r>a)){h=!0;break}}if(!e&&h||e)for(c=0;l>c;c++)if(u=this.edges[d[c]],void 0!==u){var p=this.nodes[u.fromId==t.id?u.toId:u.fromId];p.dynamicEdges.length<=this.hubThreshold+s&&p.id!=t.id&&this._addToCluster(t,p,e)}}},e._addToCluster=function(t,e,i){t.containedNodes[e.id]=e;for(var s=0;s1)for(var s=0;s1&&(e.label="[".concat(String(e.clusterSize),"]"))}for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(e=this.nodes[t],1==e.clusterSize&&(e.label=void 0!==e.originalLabel?e.originalLabel:String(e.id)))},e.normalizeClusterLevels=function(){var t,e=0,i=1e9,s=0;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(s=this.nodes[t].clusterSessions.length,s>e&&(e=s),i>s&&(i=s));if(e-i>this.constants.clustering.clusterLevelDifference){var n=this.nodeIndices.length,o=e-this.constants.clustering.clusterLevelDifference;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodes[t].clusterSessions.lengths&&(s=o.dynamicEdgesLength),t+=o.dynamicEdgesLength,e+=Math.pow(o.dynamicEdgesLength,2),i+=1}t/=i,e/=i;var a=e-Math.pow(t,2),r=Math.sqrt(a);this.hubThreshold=Math.floor(t+2*r),this.hubThreshold>s&&(this.hubThreshold=s)},e._reduceAmountOfChains=function(t){this.hubThreshold=2;var e=Math.floor(this.nodeIndices.length*t);for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&e>0&&(this._formClusterFromHub(this.nodes[i],!0,!0,1),e-=1)},e._getChainFraction=function(){var t=0,e=0;for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&(2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&(t+=1),e+=1);return t/e}},function(t,e,i){var s=i(1);e._putDataInSector=function(){this.sectors.active[this._sector()].nodes=this.nodes,this.sectors.active[this._sector()].edges=this.edges,this.sectors.active[this._sector()].nodeIndices=this.nodeIndices},e._switchToSector=function(t,e){void 0===e||"active"==e?this._switchToActiveSector(t):this._switchToFrozenSector(t)},e._switchToActiveSector=function(t){this.nodeIndices=this.sectors.active[t].nodeIndices,this.nodes=this.sectors.active[t].nodes,this.edges=this.sectors.active[t].edges},e._switchToSupportSector=function(){this.nodeIndices=this.sectors.support.nodeIndices,this.nodes=this.sectors.support.nodes,this.edges=this.sectors.support.edges},e._switchToFrozenSector=function(t){this.nodeIndices=this.sectors.frozen[t].nodeIndices,this.nodes=this.sectors.frozen[t].nodes,this.edges=this.sectors.frozen[t].edges},e._loadLatestSector=function(){this._switchToSector(this._sector())},e._sector=function(){return this.activeSector[this.activeSector.length-1]},e._previousSector=function(){if(this.activeSector.length>1)return this.activeSector[this.activeSector.length-2];throw new TypeError("there are not enough sectors in the this.activeSector array.")},e._setActiveSector=function(t){this.activeSector.push(t)},e._forgetLastSector=function(){this.activeSector.pop()},e._createNewSector=function(t){this.sectors.active[t]={nodes:{},edges:{},nodeIndices:[],formationScale:this.scale,drawingNode:void 0},this.sectors.active[t].drawingNode=new Node({id:t,color:{background:"#eaefef",border:"495c5e"}},{},{},this.constants),this.sectors.active[t].drawingNode.clusterSize=2},e._deleteActiveSector=function(t){delete this.sectors.active[t]},e._deleteFrozenSector=function(t){delete this.sectors.frozen[t]},e._freezeSector=function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},e._activateSector=function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},e._mergeThisWithFrozen=function(t){for(var e in this.nodes)this.nodes.hasOwnProperty(e)&&(this.sectors.frozen[t].nodes[e]=this.nodes[e]);for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.sectors.frozen[t].edges[i]=this.edges[i]);for(var s=0;s1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInSupportSector=function(t,e){if(void 0===e)this._switchToSupportSector(),this[t]();else{this._switchToSupportSector();var i=Array.prototype.splice.call(arguments,1);i.length>1?this[t](i[0],i[1]):this[t](e)}this._loadLatestSector()},e._doInAllFrozenSectors=function(t,e){if(void 0===e)for(var i in this.sectors.frozen)this.sectors.frozen.hasOwnProperty(i)&&(this._switchToFrozenSector(i),this[t]());else for(var i in this.sectors.frozen)if(this.sectors.frozen.hasOwnProperty(i)){this._switchToFrozenSector(i);var s=Array.prototype.splice.call(arguments,1);s.length>1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInAllSectors=function(t,e){var i=Array.prototype.splice.call(arguments,1);void 0===e?(this._doInAllActiveSectors(t),this._doInAllFrozenSectors(t)):i.length>1?(this._doInAllActiveSectors(t,i[0],i[1]),this._doInAllFrozenSectors(t,i[0],i[1])):(this._doInAllActiveSectors(t,e),this._doInAllFrozenSectors(t,e))},e._clearNodeIndexList=function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},e._drawSectorNodes=function(t,e){var i,s=1e9,n=-1e9,o=1e9,a=-1e9;for(var r in this.sectors[e])if(this.sectors[e].hasOwnProperty(r)&&void 0!==this.sectors[e][r].drawingNode){this._switchToSector(r,e),s=1e9,n=-1e9,o=1e9,a=-1e9;for(var h in this.nodes)this.nodes.hasOwnProperty(h)&&(i=this.nodes[h],i.resize(t),o>i.x-.5*i.width&&(o=i.x-.5*i.width),ai.y-.5*i.height&&(s=i.y-.5*i.height),n0?this.nodes[i[i.length-1]]:null},e._getEdgesOverlappingWith=function(t,e){var i=this.edges;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},e._getAllEdgesOverlappingWith=function(t){var e=[];return this._doInAllActiveSectors("_getEdgesOverlappingWith",t,e),e},e._getEdgeAt=function(t){var e=this._pointerToPositionObject(t),i=this._getAllEdgesOverlappingWith(e);return i.length>0?this.edges[i[i.length-1]]:null},e._addToSelection=function(t){t instanceof s?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t},e._addToHover=function(t){t instanceof s?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t},e._removeFromSelection=function(t){t instanceof s?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]},e._unselectAll=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].unselect();for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&this.selectionObj.edges[i].unselect();this.selectionObj={nodes:{},edges:{}},0==t&&this.emit("select",this.getSelection())},e._unselectClusters=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].clusterSize>1&&(this.selectionObj.nodes[e].unselect(),this._removeFromSelection(this.selectionObj.nodes[e]));0==t&&this.emit("select",this.getSelection())},e._getSelectedNodeCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedNode=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return null},e._getSelectedEdge=function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t];return null},e._getSelectedEdgeCount=function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedObjectCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t},e._selectionIsEmpty=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0},e._clusterInSelection=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1},e._selectConnectedEdges=function(t){for(var e=0;ee;e++){s=t[e];var n=this.nodes[s];if(!n)throw new RangeError('Node with id "'+s+'" not found');this._selectObject(n,!0,!0)}console.log("setSelection is deprecated. Please use selectNodes instead."),this.redraw()},e.selectNodes=function(t,e){var i,s,n;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),i=0,s=t.length;s>i;i++){n=t[i];var o=this.nodes[n];if(!o)throw new RangeError('Node with id "'+n+'" not found');this._selectObject(o,!0,!0,e)}this.redraw()},e.selectEdges=function(t){var e,i,s;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),e=0,i=t.length;i>e;e++){s=t[e];var n=this.edges[s];if(!n)throw new RangeError('Edge with id "'+s+'" not found');this._selectObject(n,!0,!0,highlightEdges)}this.redraw()},e._updateSelection=function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},function(t,e,i){var s=i(1),n=i(30),o=i(27);e._clearManipulatorBar=function(){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild)},e._restoreOverloadedFunctions=function(){for(var t in this.cachedFunctions)this.cachedFunctions.hasOwnProperty(t)&&(this[t]=this.cachedFunctions[t])},e._toggleEditMode=function(){this.editMode=!this.editMode;var t=document.getElementById("network-manipulationDiv"),e=document.getElementById("network-manipulation-closeDiv"),i=document.getElementById("network-manipulation-editMode");1==this.editMode?(t.style.display="block",e.style.display="block",i.style.display="none",e.onclick=this._toggleEditMode.bind(this)):(t.style.display="none",e.style.display="none",i.style.display="block",e.onclick=null),this._createManipulatorBar()},e._createManipulatorBar=function(){if(this.boundFunction&&this.off("select",this.boundFunction),void 0!==this.edgeBeingEdited&&(this.edgeBeingEdited._disableControlNodes(),this.edgeBeingEdited=void 0,this.selectedControlNode=null),this._restoreOverloadedFunctions(),this.freezeSimulation=!1,this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,1==this.editMode){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDiv.innerHTML=""+this.constants.labels.add+"
"+this.constants.labels.link+"",1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?this.manipulationDiv.innerHTML+="
"+this.constants.labels.editNode+"":1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDiv.innerHTML+="
"+this.constants.labels.editEdge+""),0==this._selectionIsEmpty()&&(this.manipulationDiv.innerHTML+="
"+this.constants.labels.del+"");var t=document.getElementById("network-manipulate-addNode");t.onclick=this._createAddNodeToolbar.bind(this);var e=document.getElementById("network-manipulate-connectNode");if(e.onclick=this._createAddEdgeToolbar.bind(this),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit){var i=document.getElementById("network-manipulate-editNode");i.onclick=this._editNode.bind(this)}else if(1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()){var i=document.getElementById("network-manipulate-editEdge");i.onclick=this._createEditEdgeToolbar.bind(this)}if(0==this._selectionIsEmpty()){var s=document.getElementById("network-manipulate-delete");s.onclick=this._deleteSelected.bind(this)}var n=document.getElementById("network-manipulation-closeDiv");n.onclick=this._toggleEditMode.bind(this),this.boundFunction=this._createManipulatorBar.bind(this),this.on("select",this.boundFunction)}else{this.editModeDiv.innerHTML=""+this.constants.labels.edit+"";var o=document.getElementById("network-manipulate-editModeButton");o.onclick=this._toggleEditMode.bind(this)}},e._createAddNodeToolbar=function(){this._clearManipulatorBar(),this.boundFunction&&this.off("select",this.boundFunction),this.manipulationDiv.innerHTML=""+this.constants.labels.back+"
"+this.constants.labels.addDescription+""; -var t=document.getElementById("network-manipulate-back");t.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._addNode.bind(this),this.on("select",this.boundFunction)},e._createAddEdgeToolbar=function(){this._clearManipulatorBar(),this._unselectAll(!0),this.freezeSimulation=!0,this.boundFunction&&this.off("select",this.boundFunction),this._unselectAll(),this.forceAppendSelection=!1,this.blockConnectingEdgeSelection=!0,this.manipulationDiv.innerHTML=""+this.constants.labels.back+"
"+this.constants.labels.linkDescription+"";var t=document.getElementById("network-manipulate-back");t.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._handleConnect.bind(this),this.on("select",this.boundFunction),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this._handleTouch=this._handleConnect,this._handleOnRelease=this._finishConnect,this._redraw()},e._createEditEdgeToolbar=function(){this._clearManipulatorBar(),this.boundFunction&&this.off("select",this.boundFunction),this.edgeBeingEdited=this._getSelectedEdge(),this.edgeBeingEdited._enableControlNodes(),this.manipulationDiv.innerHTML=""+this.constants.labels.back+"
"+this.constants.labels.editEdgeDescription+"";var t=document.getElementById("network-manipulate-back");t.onclick=this._createManipulatorBar.bind(this),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this.cachedFunctions._handleTap=this._handleTap,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleTouch=this._selectControlNode,this._handleTap=function(){},this._handleOnDrag=this._controlNodeDrag,this._handleDragStart=function(){},this._handleOnRelease=this._releaseControlNode,this._redraw()},e._selectControlNode=function(t){this.edgeBeingEdited.controlNodes.from.unselect(),this.edgeBeingEdited.controlNodes.to.unselect(),this.selectedControlNode=this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(t.x),this._YconvertDOMtoCanvas(t.y)),null!==this.selectedControlNode&&(this.selectedControlNode.select(),this.freezeSimulation=!0),this._redraw()},e._controlNodeDrag=function(t){var e=this._getPointer(t.gesture.center);null!==this.selectedControlNode&&void 0!==this.selectedControlNode&&(this.selectedControlNode.x=this._XconvertDOMtoCanvas(e.x),this.selectedControlNode.y=this._YconvertDOMtoCanvas(e.y)),this._redraw()},e._releaseControlNode=function(t){var e=this._getNodeAt(t);null!=e?(1==this.edgeBeingEdited.controlNodes.from.selected&&(this._editEdge(e.id,this.edgeBeingEdited.to.id),this.edgeBeingEdited.controlNodes.from.unselect()),1==this.edgeBeingEdited.controlNodes.to.selected&&(this._editEdge(this.edgeBeingEdited.from.id,e.id),this.edgeBeingEdited.controlNodes.to.unselect())):this.edgeBeingEdited._restoreControlNodes(),this.freezeSimulation=!1,this._redraw()},e._handleConnect=function(t){if(0==this._getSelectedNodeCount()){var e=this._getNodeAt(t);null!=e&&(e.clusterSize>1?alert("Cannot create edges to a cluster."):(this._selectObject(e,!1),this.sectors.support.nodes.targetNode=new n({id:"targetNode"},{},{},this.constants),this.sectors.support.nodes.targetNode.x=e.x,this.sectors.support.nodes.targetNode.y=e.y,this.sectors.support.nodes.targetViaNode=new n({id:"targetViaNode"},{},{},this.constants),this.sectors.support.nodes.targetViaNode.x=e.x,this.sectors.support.nodes.targetViaNode.y=e.y,this.sectors.support.nodes.targetViaNode.parentEdgeId="connectionEdge",this.edges.connectionEdge=new o({id:"connectionEdge",from:e.id,to:this.sectors.support.nodes.targetNode.id},this,this.constants),this.edges.connectionEdge.from=e,this.edges.connectionEdge.connected=!0,this.edges.connectionEdge.smooth=!0,this.edges.connectionEdge.selected=!0,this.edges.connectionEdge.to=this.sectors.support.nodes.targetNode,this.edges.connectionEdge.via=this.sectors.support.nodes.targetViaNode,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleOnDrag=function(t){var e=this._getPointer(t.gesture.center);this.sectors.support.nodes.targetNode.x=this._XconvertDOMtoCanvas(e.x),this.sectors.support.nodes.targetNode.y=this._YconvertDOMtoCanvas(e.y),this.sectors.support.nodes.targetViaNode.x=.5*(this._XconvertDOMtoCanvas(e.x)+this.edges.connectionEdge.from.x),this.sectors.support.nodes.targetViaNode.y=this._YconvertDOMtoCanvas(e.y)},this.moving=!0,this.start()))}},e._finishConnect=function(t){if(1==this._getSelectedNodeCount()){this._handleOnDrag=this.cachedFunctions._handleOnDrag,delete this.cachedFunctions._handleOnDrag;var e=this.edges.connectionEdge.fromId;delete this.edges.connectionEdge,delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode;var i=this._getNodeAt(t);null!=i&&(i.clusterSize>1?alert("Cannot create edges to a cluster."):(this._createEdge(e,i.id),this._createManipulatorBar())),this._unselectAll()}},e._addNode=function(){if(this._selectionIsEmpty()&&1==this.editMode){var t=this._pointerToPositionObject(this.pointerPosition),e={id:s.randomUUID(),x:t.left,y:t.top,label:"new",allowedToMoveX:!0,allowedToMoveY:!0};if(this.triggerFunctions.add)if(2==this.triggerFunctions.add.length){var i=this;this.triggerFunctions.add(e,function(t){i.nodesData.add(t),i._createManipulatorBar(),i.moving=!0,i.start()})}else alert(this.constants.labels.addError),this._createManipulatorBar(),this.moving=!0,this.start();else this.nodesData.add(e),this._createManipulatorBar(),this.moving=!0,this.start()}},e._createEdge=function(t,e){if(1==this.editMode){var i={from:t,to:e};if(this.triggerFunctions.connect)if(2==this.triggerFunctions.connect.length){var s=this;this.triggerFunctions.connect(i,function(t){s.edgesData.add(t),s.moving=!0,s.start()})}else alert(this.constants.labels.linkError),this.moving=!0,this.start();else this.edgesData.add(i),this.moving=!0,this.start()}},e._editEdge=function(t,e){if(1==this.editMode){var i={id:this.edgeBeingEdited.id,from:t,to:e};if(this.triggerFunctions.editEdge)if(2==this.triggerFunctions.editEdge.length){var s=this;this.triggerFunctions.editEdge(i,function(t){s.edgesData.update(t),s.moving=!0,s.start()})}else alert(this.constants.labels.linkError),this.moving=!0,this.start();else this.edgesData.update(i),this.moving=!0,this.start()}},e._editNode=function(){if(this.triggerFunctions.edit&&1==this.editMode){var t=this._getSelectedNode(),e={id:t.id,label:t.label,group:t.group,shape:t.shape,color:{background:t.color.background,border:t.color.border,highlight:{background:t.color.highlight.background,border:t.color.highlight.border}}};if(2==this.triggerFunctions.edit.length){var i=this;this.triggerFunctions.edit(e,function(t){i.nodesData.update(t),i._createManipulatorBar(),i.moving=!0,i.start()})}else alert(this.constants.labels.editError)}else alert(this.constants.labels.editBoundError)},e._deleteSelected=function(){if(!this._selectionIsEmpty()&&1==this.editMode)if(this._clusterInSelection())alert(this.constants.labels.deleteClusterError);else{var t=this.getSelectedNodes(),e=this.getSelectedEdges();if(this.triggerFunctions.del){var i=this,s={nodes:t,edges:e};(this.triggerFunctions.del.length=2)?this.triggerFunctions.del(s,function(t){i.edgesData.remove(t.edges),i.nodesData.remove(t.nodes),i._unselectAll(),i.moving=!0,i.start()}):alert(this.constants.labels.deleteError)}else this.edgesData.remove(e),this.nodesData.remove(t),this._unselectAll(),this.moving=!0,this.start()}}},function(t,e){e._cleanNavigation=function(){var t=document.getElementById("network-navigation_wrapper");null!=t&&this.containerElement.removeChild(t),document.onmouseup=null},e._loadNavigationElements=function(){this._cleanNavigation(),this.navigationDivs={};var t=["up","down","left","right","zoomIn","zoomOut","zoomExtends"],e=["_moveUp","_moveDown","_moveLeft","_moveRight","_zoomIn","_zoomOut","zoomExtent"];this.navigationDivs.wrapper=document.createElement("div"),this.navigationDivs.wrapper.id="network-navigation_wrapper",this.navigationDivs.wrapper.style.position="absolute",this.navigationDivs.wrapper.style.width=this.frame.canvas.clientWidth+"px",this.navigationDivs.wrapper.style.height=this.frame.canvas.clientHeight+"px",this.containerElement.insertBefore(this.navigationDivs.wrapper,this.frame);for(var i=0;i0){"RL"==this.constants.hierarchicalLayout.direction||"DU"==this.constants.hierarchicalLayout.direction?this.constants.hierarchicalLayout.levelSeparation*=-1:this.constants.hierarchicalLayout.levelSeparation=Math.abs(this.constants.hierarchicalLayout.levelSeparation);var t,e,i=0,s=!1,n=!1;for(e in this.nodes)this.nodes.hasOwnProperty(e)&&(t=this.nodes[e],-1!=t.level?s=!0:n=!0,is&&(o.xFixed=!1,o.x=i[o.level].minPos,a=!0):o.yFixed&&o.level>s&&(o.yFixed=!1,o.y=i[o.level].minPos,a=!0),1==a&&(i[o.level].minPos+=i[o.level].nodeSpacing,o.edges.length>1&&this._placeBranchNodes(o.edges,o.id,i,o.level))}},e._setLevel=function(t,e,i){for(var s=0;st)&&(n.level=t,e.length>1&&this._setLevel(t+1,n.edges,n.id))}},e._restoreNodes=function(){for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.nodes[t].xFixed=!1,this.nodes[t].yFixed=!1)}},function(t){!function(e,i){"use strict";function s(){if(!n.READY){n.event.determineEventTypes();for(var t in n.gestures)n.gestures.hasOwnProperty(t)&&n.detection.register(n.gestures[t]);n.event.onTouch(n.DOCUMENT,n.EVENT_MOVE,n.detection.detect),n.event.onTouch(n.DOCUMENT,n.EVENT_END,n.detection.detect),n.READY=!0}}var n=function(t,e){return new n.Instance(t,e||{})};n.defaults={stop_browser_behavior:{userSelect:"none",touchAction:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},n.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled,n.HAS_TOUCHEVENTS="ontouchstart"in e,n.MOBILE_REGEX=/mobile|tablet|ip(ad|hone|od)|android/i,n.NO_MOUSEEVENTS=n.HAS_TOUCHEVENTS&&navigator.userAgent.match(n.MOBILE_REGEX),n.EVENT_TYPES={},n.DIRECTION_DOWN="down",n.DIRECTION_LEFT="left",n.DIRECTION_UP="up",n.DIRECTION_RIGHT="right",n.POINTER_MOUSE="mouse",n.POINTER_TOUCH="touch",n.POINTER_PEN="pen",n.EVENT_START="start",n.EVENT_MOVE="move",n.EVENT_END="end",n.DOCUMENT=document,n.plugins={},n.READY=!1,n.Instance=function(t,e){var i=this;return s(),this.element=t,this.enabled=!0,this.options=n.utils.extend(n.utils.extend({},n.defaults),e||{}),this.options.stop_browser_behavior&&n.utils.stopDefaultBrowserBehavior(this.element,this.options.stop_browser_behavior),n.event.onTouch(t,n.EVENT_START,function(t){i.enabled&&n.detection.startDetect(i,t)}),this},n.Instance.prototype={on:function(t,e){for(var i=t.split(" "),s=0;s0&&e==n.EVENT_END?e=n.EVENT_MOVE:l||(e=n.EVENT_END),l||null===o?o=h:h=o,i.call(n.detection,s.collectEventData(t,e,h)),n.HAS_POINTEREVENTS&&e==n.EVENT_END&&(l=n.PointerEvent.updatePointer(e,h))),l||(o=null,a=!1,r=!1,n.PointerEvent.reset())}})},determineEventTypes:function(){var t;t=n.HAS_POINTEREVENTS?n.PointerEvent.getEvents():n.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],n.EVENT_TYPES[n.EVENT_START]=t[0],n.EVENT_TYPES[n.EVENT_MOVE]=t[1],n.EVENT_TYPES[n.EVENT_END]=t[2]},getTouchList:function(t){return n.HAS_POINTEREVENTS?n.PointerEvent.getTouchList():t.touches?t.touches:[{identifier:1,pageX:t.pageX,pageY:t.pageY,target:t.target}]},collectEventData:function(t,e,i){var s=this.getTouchList(i,e),o=n.POINTER_TOUCH;return(i.type.match(/mouse/)||n.PointerEvent.matchType(n.POINTER_MOUSE,i))&&(o=n.POINTER_MOUSE),{center:n.utils.getCenter(s),timeStamp:(new Date).getTime(),target:i.target,touches:s,eventType:e,pointerType:o,srcEvent:i,preventDefault:function(){this.srcEvent.preventManipulation&&this.srcEvent.preventManipulation(),this.srcEvent.preventDefault&&this.srcEvent.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return n.detection.stopDetect()}}}},n.PointerEvent={pointers:{},getTouchList:function(){var t=this,e=[];return Object.keys(t.pointers).sort().forEach(function(i){e.push(t.pointers[i])}),e},updatePointer:function(t,e){return t==n.EVENT_END?this.pointers={}:(e.identifier=e.pointerId,this.pointers[e.pointerId]=e),Object.keys(this.pointers).length},matchType:function(t,e){if(!e.pointerType)return!1;var i={};return i[n.POINTER_MOUSE]=e.pointerType==e.MSPOINTER_TYPE_MOUSE||e.pointerType==n.POINTER_MOUSE,i[n.POINTER_TOUCH]=e.pointerType==e.MSPOINTER_TYPE_TOUCH||e.pointerType==n.POINTER_TOUCH,i[n.POINTER_PEN]=e.pointerType==e.MSPOINTER_TYPE_PEN||e.pointerType==n.POINTER_PEN,i[t]},getEvents:function(){return["pointerdown MSPointerDown","pointermove MSPointerMove","pointerup pointercancel MSPointerUp MSPointerCancel"]},reset:function(){this.pointers={}}},n.utils={extend:function(t,e,s){for(var n in e)t[n]!==i&&s||(t[n]=e[n]);return t},hasParent:function(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1},getCenter:function(t){for(var e=[],i=[],s=0,n=t.length;n>s;s++)e.push(t[s].pageX),i.push(t[s].pageY);return{pageX:(Math.min.apply(Math,e)+Math.max.apply(Math,e))/2,pageY:(Math.min.apply(Math,i)+Math.max.apply(Math,i))/2}},getVelocity:function(t,e,i){return{x:Math.abs(e/t)||0,y:Math.abs(i/t)||0}},getAngle:function(t,e){var i=e.pageY-t.pageY,s=e.pageX-t.pageX;return 180*Math.atan2(i,s)/Math.PI},getDirection:function(t,e){var i=Math.abs(t.pageX-e.pageX),s=Math.abs(t.pageY-e.pageY);return i>=s?t.pageX-e.pageX>0?n.DIRECTION_LEFT:n.DIRECTION_RIGHT:t.pageY-e.pageY>0?n.DIRECTION_UP:n.DIRECTION_DOWN},getDistance:function(t,e){var i=e.pageX-t.pageX,s=e.pageY-t.pageY;return Math.sqrt(i*i+s*s)},getScale:function(t,e){return t.length>=2&&e.length>=2?this.getDistance(e[0],e[1])/this.getDistance(t[0],t[1]):1},getRotation:function(t,e){return t.length>=2&&e.length>=2?this.getAngle(e[1],e[0])-this.getAngle(t[1],t[0]):0},isVertical:function(t){return t==n.DIRECTION_UP||t==n.DIRECTION_DOWN},stopDefaultBrowserBehavior:function(t,e){var i,s=["webkit","khtml","moz","ms","o",""];if(e&&t.style){for(var n=0;ni;i++){var o=this.gestures[i];if(!this.stopped&&e[o.name]!==!1&&o.handler.call(o,t,this.current.inst)===!1){this.stopDetect();break}}return this.current&&(this.current.lastEvent=t),t.eventType==n.EVENT_END&&!t.touches.length-1&&this.stopDetect(),t}},stopDetect:function(){this.previous=n.utils.extend({},this.current),this.current=null,this.stopped=!0},extendEventData:function(t){var e=this.current.startEvent;if(e&&(t.touches.length!=e.touches.length||t.touches===e.touches)){e.touches=[];for(var i=0,s=t.touches.length;s>i;i++)e.touches.push(n.utils.extend({},t.touches[i]))}var o=t.timeStamp-e.timeStamp,a=t.center.pageX-e.center.pageX,r=t.center.pageY-e.center.pageY,h=n.utils.getVelocity(o,a,r);return n.utils.extend(t,{deltaTime:o,deltaX:a,deltaY:r,velocityX:h.x,velocityY:h.y,distance:n.utils.getDistance(e.center,t.center),angle:n.utils.getAngle(e.center,t.center),direction:n.utils.getDirection(e.center,t.center),scale:n.utils.getScale(e.touches,t.touches),rotation:n.utils.getRotation(e.touches,t.touches),startEvent:e}),t},register:function(t){var e=t.defaults||{};return e[t.name]===i&&(e[t.name]=!0),n.utils.extend(n.defaults,e,!0),t.index=t.index||1e3,this.gestures.push(t),this.gestures.sort(function(t,e){return t.indexe.index?1:0}),this.gestures}},n.gestures=n.gestures||{},n.gestures.Hold={name:"hold",index:10,defaults:{hold_timeout:500,hold_threshold:1},timer:null,handler:function(t,e){switch(t.eventType){case n.EVENT_START:clearTimeout(this.timer),n.detection.current.name=this.name,this.timer=setTimeout(function(){"hold"==n.detection.current.name&&e.trigger("hold",t)},e.options.hold_timeout);break;case n.EVENT_MOVE:t.distance>e.options.hold_threshold&&clearTimeout(this.timer);break;case n.EVENT_END:clearTimeout(this.timer)}}},n.gestures.Tap={name:"tap",index:100,defaults:{tap_max_touchtime:250,tap_max_distance:10,tap_always:!0,doubletap_distance:20,doubletap_interval:300},handler:function(t,e){if(t.eventType==n.EVENT_END){var i=n.detection.previous,s=!1;if(t.deltaTime>e.options.tap_max_touchtime||t.distance>e.options.tap_max_distance)return;i&&"tap"==i.name&&t.timeStamp-i.lastEvent.timeStamp0&&t.touches.length>e.options.swipe_max_touches)return;(t.velocityX>e.options.swipe_velocity||t.velocityY>e.options.swipe_velocity)&&(e.trigger(this.name,t),e.trigger(this.name+t.direction,t))}}},n.gestures.Drag={name:"drag",index:50,defaults:{drag_min_distance:10,drag_max_touches:1,drag_block_horizontal:!1,drag_block_vertical:!1,drag_lock_to_axis:!1,drag_lock_min_distance:25},triggered:!1,handler:function(t,e){if(n.detection.current.name!=this.name&&this.triggered)return e.trigger(this.name+"end",t),void(this.triggered=!1);if(!(e.options.drag_max_touches>0&&t.touches.length>e.options.drag_max_touches))switch(t.eventType){case n.EVENT_START:this.triggered=!1;break;case n.EVENT_MOVE:if(t.distancee.options.transform_min_rotation&&e.trigger("rotate",t),i>e.options.transform_min_scale&&(e.trigger("pinch",t),e.trigger("pinch"+(t.scale<1?"in":"out"),t));break;case n.EVENT_END:this.triggered&&e.trigger(this.name+"end",t),this.triggered=!1}}},n.gestures.Touch={name:"touch",index:-1/0,defaults:{prevent_default:!1,prevent_mouseevents:!1},handler:function(t,e){return e.options.prevent_mouseevents&&t.pointerType==n.POINTER_MOUSE?void t.stopDetect():(e.options.prevent_default&&t.preventDefault(),void(t.eventType==n.EVENT_START&&e.trigger(this.name,t)))}},n.gestures.Release={name:"release",index:1/0,handler:function(t,e){t.eventType==n.EVENT_END&&e.trigger(this.name,t)}},"object"==typeof t&&"object"==typeof t.exports?t.exports=n:(e.Hammer=n,"function"==typeof e.define&&e.define.amd&&e.define("hammer",[],function(){return n}))}(this)},function(t,e,i){function s(){this.constants.smoothCurves=!this.constants.smoothCurves;var t=document.getElementById("graph_toggleSmooth");t.style.background=1==this.constants.smoothCurves?"#A4FF56":"#FF8532",this._configureSmoothCurves(!1)}function n(){for(var t in this.calculationNodes)this.calculationNodes.hasOwnProperty(t)&&(this.calculationNodes[t].vx=0,this.calculationNodes[t].vy=0,this.calculationNodes[t].fx=0,this.calculationNodes[t].fy=0);1==this.constants.hierarchicalLayout.enabled?this._setupHierarchicalLayout():this.repositionNodes(),this.moving=!0,this.start()}function o(){var t="No options are required, default values used.",e=[],i=document.getElementById("graph_physicsMethod1"),s=document.getElementById("graph_physicsMethod2");if(1==i.checked){if(this.constants.physics.barnesHut.gravitationalConstant!=this.backupConstants.physics.barnesHut.gravitationalConstant&&e.push("gravitationalConstant: "+this.constants.physics.barnesHut.gravitationalConstant),this.constants.physics.centralGravity!=this.backupConstants.physics.barnesHut.centralGravity&&e.push("centralGravity: "+this.constants.physics.centralGravity),this.constants.physics.springLength!=this.backupConstants.physics.barnesHut.springLength&&e.push("springLength: "+this.constants.physics.springLength),this.constants.physics.springConstant!=this.backupConstants.physics.barnesHut.springConstant&&e.push("springConstant: "+this.constants.physics.springConstant),this.constants.physics.damping!=this.backupConstants.physics.barnesHut.damping&&e.push("damping: "+this.constants.physics.damping),0!=e.length){t="var options = {",t+="physics: {barnesHut: {";for(var n=0;nthis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},e._calculateForces=function(){this._calculateGravitationalForces(),this._calculateNodeForces(),1==this.constants.smoothCurves?this._calculateSpringForcesWithSupport():1==this.constants.physics.hierarchicalRepulsion.enabled?this._calculateHierarchicalSpringForces():this._calculateSpringForces()},e._updateCalculationNodes=function(){if(1==this.constants.smoothCurves){this.calculationNodes={},this.calculationNodeIndices=[];for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.calculationNodes[t]=this.nodes[t]);var e=this.sectors.support.nodes;for(var i in e)e.hasOwnProperty(i)&&(this.edges.hasOwnProperty(e[i].parentEdgeId)?this.calculationNodes[i]=e[i]:e[i]._setForce(0,0));for(var s in this.calculationNodes)this.calculationNodes.hasOwnProperty(s)&&this.calculationNodeIndices.push(s)}else this.calculationNodes=this.nodes,this.calculationNodeIndices=this.nodeIndices},e._calculateGravitationalForces=function(){var t,e,i,s,n,o=this.calculationNodes,a=this.constants.physics.centralGravity,r=0;for(n=0;nSimulation Mode:Barnes HutRepulsionHierarchical
Options:
',this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement),this.optionsDiv=document.createElement("div"),this.optionsDiv.style.fontSize="14px",this.optionsDiv.style.fontFamily="verdana",this.containerElement.parentElement.insertBefore(this.optionsDiv,this.containerElement);var e;e=document.getElementById("graph_BH_gc"),e.onchange=r.bind(this,"graph_BH_gc",-1,"physics_barnesHut_gravitationalConstant"),e=document.getElementById("graph_BH_cg"),e.onchange=r.bind(this,"graph_BH_cg",1,"physics_centralGravity"),e=document.getElementById("graph_BH_sc"),e.onchange=r.bind(this,"graph_BH_sc",1,"physics_springConstant"),e=document.getElementById("graph_BH_sl"),e.onchange=r.bind(this,"graph_BH_sl",1,"physics_springLength"),e=document.getElementById("graph_BH_damp"),e.onchange=r.bind(this,"graph_BH_damp",1,"physics_damping"),e=document.getElementById("graph_R_nd"),e.onchange=r.bind(this,"graph_R_nd",1,"physics_repulsion_nodeDistance"),e=document.getElementById("graph_R_cg"),e.onchange=r.bind(this,"graph_R_cg",1,"physics_centralGravity"),e=document.getElementById("graph_R_sc"),e.onchange=r.bind(this,"graph_R_sc",1,"physics_springConstant"),e=document.getElementById("graph_R_sl"),e.onchange=r.bind(this,"graph_R_sl",1,"physics_springLength"),e=document.getElementById("graph_R_damp"),e.onchange=r.bind(this,"graph_R_damp",1,"physics_damping"),e=document.getElementById("graph_H_nd"),e.onchange=r.bind(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),e=document.getElementById("graph_H_cg"),e.onchange=r.bind(this,"graph_H_cg",1,"physics_centralGravity"),e=document.getElementById("graph_H_sc"),e.onchange=r.bind(this,"graph_H_sc",1,"physics_springConstant"),e=document.getElementById("graph_H_sl"),e.onchange=r.bind(this,"graph_H_sl",1,"physics_springLength"),e=document.getElementById("graph_H_damp"),e.onchange=r.bind(this,"graph_H_damp",1,"physics_damping"),e=document.getElementById("graph_H_direction"),e.onchange=r.bind(this,"graph_H_direction",t,"hierarchicalLayout_direction"),e=document.getElementById("graph_H_levsep"),e.onchange=r.bind(this,"graph_H_levsep",1,"hierarchicalLayout_levelSeparation"),e=document.getElementById("graph_H_nspac"),e.onchange=r.bind(this,"graph_H_nspac",1,"hierarchicalLayout_nodeSpacing");var i=document.getElementById("graph_physicsMethod1"),d=document.getElementById("graph_physicsMethod2"),l=document.getElementById("graph_physicsMethod3");d.checked=!0,this.constants.physics.barnesHut.enabled&&(i.checked=!0),this.constants.hierarchicalLayout.enabled&&(l.checked=!0);var c=document.getElementById("graph_toggleSmooth"),u=document.getElementById("graph_repositionNodes"),p=document.getElementById("graph_generateOptions");c.onclick=s.bind(this),u.onclick=n.bind(this),p.onclick=o.bind(this),c.style.background=1==this.constants.smoothCurves?"#A4FF56":"#FF8532",a.apply(this),i.onchange=a.bind(this),d.onchange=a.bind(this),l.onchange=a.bind(this)}},e._overWriteGraphConstants=function(t,e){var i=t.split("_");1==i.length?this.constants[i[0]]=e:2==i.length?this.constants[i[0]][i[1]]=e:3==i.length&&(this.constants[i[0]][i[1]][i[2]]=e)}},function(t,e,i){var s;(function(t,n){(function(o){function a(t,e,i){switch(arguments.length){case 2:return null!=t?t:e;case 3:return null!=t?t:null!=e?e:i;default:throw new Error("Implement me")}}function r(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function h(t,e){function i(){ge.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}var s=!0;return m(function(){return s&&(i(),s=!1),e.apply(this,arguments)},e)}function d(t,e){return function(i){return g(t.call(this,i),e)}}function l(t,e){return function(i){return this.lang().ordinal(t.call(this,i),e)}}function c(){}function u(t){E(t),m(this,t)}function p(t){var e=L(t),i=e.year||0,s=e.quarter||0,n=e.month||0,o=e.week||0,a=e.day||0,r=e.hour||0,h=e.minute||0,d=e.second||0,l=e.millisecond||0;this._milliseconds=+l+1e3*d+6e4*h+36e5*r,this._days=+a+7*o,this._months=+n+3*s+12*i,this._data={},this._bubble()}function m(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return e.hasOwnProperty("toString")&&(t.toString=e.toString),e.hasOwnProperty("valueOf")&&(t.valueOf=e.valueOf),t}function _(t){var e,i={};for(e in t)t.hasOwnProperty(e)&&Ce.hasOwnProperty(e)&&(i[e]=t[e]);return i}function f(t){return 0>t?Math.ceil(t):Math.floor(t)}function g(t,e,i){for(var s=""+Math.abs(t),n=t>=0;s.lengths;s++)(i&&t[s]!==e[s]||!i&&D(t[s])!==D(e[s]))&&a++;return a+o}function w(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=ai[t]||ri[e]||e}return t}function L(t){var e,i,s={};for(i in t)t.hasOwnProperty(i)&&(e=w(i),e&&(s[e]=t[i]));return s}function x(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}ge[t]=function(s,n){var a,r,h=ge.fn._lang[t],d=[];if("number"==typeof s&&(n=s,s=o),r=function(t){var e=ge().utc().set(i,t);return h.call(ge.fn._lang,e,s||"")},null!=n)return r(n);for(a=0;e>a;a++)d.push(r(a));return d}}function D(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function T(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function Y(t,e,i){return ae(ge([t,11,31+e-i]),e,i).week}function S(t){return k(t)?366:365}function k(t){return t%4===0&&t%100!==0||t%400===0}function E(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[xe]<0||t._a[xe]>11?xe:t._a[De]<1||t._a[De]>T(t._a[Le],t._a[xe])?De:t._a[Te]<0||t._a[Te]>23?Te:t._a[Ye]<0||t._a[Ye]>59?Ye:t._a[Se]<0||t._a[Se]>59?Se:t._a[ke]<0||t._a[ke]>999?ke:-1,t._pf._overflowDayOfYear&&(Le>e||e>De)&&(e=De),t._pf.overflow=e)}function C(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length)),t._isValid}function N(t){return t?t.toLowerCase().replace("_","-"):t}function O(t,e){return e._isUTC?ge(t).zone(e._offset||0):ge(t).local()}function z(t,e){return e.abbr=t,Ee[t]||(Ee[t]=new c),Ee[t].set(e),Ee[t]}function I(t){delete Ee[t]}function A(t){var e,s,n,o,a=0,r=function(t){if(!Ee[t]&&Ne)try{i(55)("./"+t)}catch(e){}return Ee[t]};if(!t)return ge.fn._lang;if(!v(t)){if(s=r(t))return s;t=[t]}for(;a0;){if(s=r(o.slice(0,e).join("-")))return s;if(n&&n.length>=e&&b(o,n,!0)>=e-1)break;e--}a++}return ge.fn._lang}function P(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function F(t){var e,i,s=t.match(Ae);for(e=0,i=s.length;i>e;e++)s[e]=ui[s[e]]?ui[s[e]]:P(s[e]);return function(n){var o="";for(e=0;i>e;e++)o+=s[e]instanceof Function?s[e].call(n,t):s[e];return o}}function j(t,e){return t.isValid()?(e=H(e,t.lang()),hi[e]||(hi[e]=F(e)),hi[e](t)):t.lang().invalidDate()}function H(t,e){function i(t){return e.longDateFormat(t)||t}var s=5;for(Pe.lastIndex=0;s>=0&&Pe.test(t);)t=t.replace(Pe,i),Pe.lastIndex=0,s-=1;return t}function R(t,e){var i,s=e._strict;switch(t){case"Q":return qe;case"DDDD":return Ze;case"YYYY":case"GGGG":case"gggg":return s?Ke:He;case"Y":case"G":case"g":return Qe;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?$e:Re;case"S":if(s)return qe;case"SS":if(s)return Je;case"SSS":if(s)return Ze;case"DDD":return je;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Be;case"a":case"A":return A(e._l)._meridiemParse;case"X":return Ue;case"Z":case"ZZ":return Ge;case"T":return Ve;case"SSSS":return We;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?Je:Fe;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Fe;case"Do":return Xe;default:return i=new RegExp(Z(J(t.replace("\\","")),"i"))}}function W(t){t=t||"";var e=t.match(Ge)||[],i=e[e.length-1]||[],s=(i+"").match(ni)||["-",0,0],n=+(60*s[1])+D(s[2]);return"+"===s[0]?-n:n}function B(t,e,i){var s,n=i._a;switch(t){case"Q":null!=e&&(n[xe]=3*(D(e)-1));break;case"M":case"MM":null!=e&&(n[xe]=D(e)-1);break;case"MMM":case"MMMM":s=A(i._l).monthsParse(e),null!=s?n[xe]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(n[De]=D(e));break;case"Do":null!=e&&(n[De]=D(parseInt(e,10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=D(e));break;case"YY":n[Le]=ge.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":n[Le]=D(e);break;case"a":case"A":i._isPm=A(i._l).isPM(e);break;case"H":case"HH":case"h":case"hh":n[Te]=D(e);break;case"m":case"mm":n[Ye]=D(e);break;case"s":case"ss":n[Se]=D(e);break;case"S":case"SS":case"SSS":case"SSSS":n[ke]=D(1e3*("0."+e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=W(e);break;case"dd":case"ddd":case"dddd":s=A(i._l).weekdaysParse(e),null!=s?(i._w=i._w||{},i._w.d=s):i._pf.invalidWeekday=e;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":t=t.substr(0,1);case"gggg":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=D(e));break;case"gg":case"GG":i._w=i._w||{},i._w[t]=ge.parseTwoDigitYear(e)}}function G(t){var e,i,s,n,o,r,h,d;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(o=1,r=4,i=a(e.GG,t._a[Le],ae(ge(),1,4).year),s=a(e.W,1),n=a(e.E,1)):(d=A(t._l),o=d._week.dow,r=d._week.doy,i=a(e.gg,t._a[Le],ae(ge(),o,r).year),s=a(e.w,1),null!=e.d?(n=e.d,o>n&&++s):n=null!=e.e?e.e+o:o),h=re(i,s,n,r,o),t._a[Le]=h.year,t._dayOfYear=h.dayOfYear}function V(t){var e,i,s,n,o=[];if(!t._d){for(s=X(t),t._w&&null==t._a[De]&&null==t._a[xe]&&G(t),t._dayOfYear&&(n=a(t._a[Le],s[Le]),t._dayOfYear>S(n)&&(t._pf._overflowDayOfYear=!0),i=ie(n,0,t._dayOfYear),t._a[xe]=i.getUTCMonth(),t._a[De]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=o[e]=s[e];for(;7>e;e++)t._a[e]=o[e]=null==t._a[e]?2===e?1:0:t._a[e];t._d=(t._useUTC?ie:ee).apply(null,o),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm)}}function U(t){var e;t._d||(e=L(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],V(t))}function X(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function q(t){if(t._f===ge.ISO_8601)return void $(t);t._a=[],t._pf.empty=!0;var e,i,s,n,o,a=A(t._l),r=""+t._i,h=r.length,d=0;for(s=H(t._f,a).match(Ae)||[],e=0;e0&&t._pf.unusedInput.push(o),r=r.slice(r.indexOf(i)+i.length),d+=i.length),ui[n]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(n),B(n,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(n);t._pf.charsLeftOver=h-d,r.length>0&&t._pf.unusedInput.push(r),t._isPm&&t._a[Te]<12&&(t._a[Te]+=12),t._isPm===!1&&12===t._a[Te]&&(t._a[Te]=0),V(t),E(t)}function J(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,n){return e||i||s||n})}function Z(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function K(t){var e,i,s,n,o;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(n=0;no)&&(s=o,i=e));m(t,i||e)}function $(t){var e,i,s=t._i,n=ti.exec(s);if(n){for(t._pf.iso=!0,e=0,i=ii.length;i>e;e++)if(ii[e][1].exec(s)){t._f=ii[e][0]+(n[6]||" ");break}for(e=0,i=si.length;i>e;e++)if(si[e][1].exec(s)){t._f+=si[e][0];break}s.match(Ge)&&(t._f+="Z"),q(t)}else t._isValid=!1}function Q(t){$(t),t._isValid===!1&&(delete t._isValid,ge.createFromInputFallback(t))}function te(t){var e=t._i,i=Oe.exec(e);e===o?t._d=new Date:i?t._d=new Date(+i[1]):"string"==typeof e?Q(t):v(e)?(t._a=e.slice(0),V(t)):M(e)?t._d=new Date(+e):"object"==typeof e?U(t):"number"==typeof e?t._d=new Date(e):ge.createFromInputFallback(t)}function ee(t,e,i,s,n,o,a){var r=new Date(t,e,i,s,n,o,a);return 1970>t&&r.setFullYear(t),r}function ie(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function se(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function ne(t,e,i,s,n){return n.relativeTime(e||1,!!i,t,s)}function oe(t,e,i){var s=we(Math.abs(t)/1e3),n=we(s/60),o=we(n/60),a=we(o/24),r=we(a/365),h=s0,h[4]=i,ne.apply({},h)}function ae(t,e,i){var s,n=i-e,o=i-t.day();return o>n&&(o-=7),n-7>o&&(o+=7),s=ge(t).add("d",o),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function re(t,e,i,s,n){var o,a,r=ie(t,0,1).getUTCDay();return r=0===r?7:r,i=null!=i?i:n,o=n-r+(r>s?7:0)-(n>r?7:0),a=7*(e-1)+(i-n)+o+1,{year:a>0?t:t-1,dayOfYear:a>0?a:S(t-1)+a}}function he(t){var e=t._i,i=t._f;return null===e||i===o&&""===e?ge.invalid({nullInput:!0}):("string"==typeof e&&(t._i=e=A().preparse(e)),ge.isMoment(e)?(t=_(e),t._d=new Date(+e._d)):i?v(i)?K(t):q(t):te(t),new u(t))}function de(t,e){var i,s;if(1===e.length&&v(e[0])&&(e=e[0]),!e.length)return ge();for(i=e[0],s=1;s=0?"+":"-";return e+g(Math.abs(t),6)},gg:function(){return g(this.weekYear()%100,2)},gggg:function(){return g(this.weekYear(),4)},ggggg:function(){return g(this.weekYear(),5)},GG:function(){return g(this.isoWeekYear()%100,2)},GGGG:function(){return g(this.isoWeekYear(),4)},GGGGG:function(){return g(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return D(this.milliseconds()/100)},SS:function(){return g(D(this.milliseconds()/10),2)},SSS:function(){return g(this.milliseconds(),3)},SSSS:function(){return g(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+g(D(t/60),2)+":"+g(D(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+g(D(t/60),2)+g(D(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},pi=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];li.length;)ve=li.pop(),ui[ve+"o"]=l(ui[ve],ve);for(;ci.length;)ve=ci.pop(),ui[ve+ve]=d(ui[ve],2);for(ui.DDDD=d(ui.DDD,3),m(c.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,i,s;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(i=ge.utc([2e3,e]),s="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[e]=new RegExp(s.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()] -},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=ge([2e3,1]).day(e),s="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var i=this._calendar[t];return"function"==typeof i?i.apply(e):i},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,s){var n=this._relativeTime[i];return"function"==typeof n?n(t,e,i,s):n.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return ae(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),ge=function(t,e,i,s){var n;return"boolean"==typeof i&&(s=i,i=o),n={},n._isAMomentObject=!0,n._i=t,n._f=e,n._l=i,n._strict=s,n._isUTC=!1,n._pf=r(),he(n)},ge.suppressDeprecationWarnings=!1,ge.createFromInputFallback=h("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i)}),ge.min=function(){var t=[].slice.call(arguments,0);return de("isBefore",t)},ge.max=function(){var t=[].slice.call(arguments,0);return de("isAfter",t)},ge.utc=function(t,e,i,s){var n;return"boolean"==typeof i&&(s=i,i=o),n={},n._isAMomentObject=!0,n._useUTC=!0,n._isUTC=!0,n._l=i,n._i=t,n._f=e,n._strict=s,n._pf=r(),he(n).utc()},ge.unix=function(t){return ge(1e3*t)},ge.duration=function(t,e){var i,s,n,o=t,a=null;return ge.isDuration(t)?o={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(o={},e?o[e]=t:o.milliseconds=t):(a=ze.exec(t))?(i="-"===a[1]?-1:1,o={y:0,d:D(a[De])*i,h:D(a[Te])*i,m:D(a[Ye])*i,s:D(a[Se])*i,ms:D(a[ke])*i}):(a=Ie.exec(t))&&(i="-"===a[1]?-1:1,n=function(t){var e=t&&parseFloat(t.replace(",","."));return(isNaN(e)?0:e)*i},o={y:n(a[2]),M:n(a[3]),d:n(a[4]),h:n(a[5]),m:n(a[6]),s:n(a[7]),w:n(a[8])}),s=new p(o),ge.isDuration(t)&&t.hasOwnProperty("_lang")&&(s._lang=t._lang),s},ge.version=Me,ge.defaultFormat=ei,ge.ISO_8601=function(){},ge.momentProperties=Ce,ge.updateOffset=function(){},ge.relativeTimeThreshold=function(t,e){return di[t]===o?!1:(di[t]=e,!0)},ge.lang=function(t,e){var i;return t?(e?z(N(t),e):null===e?(I(t),t="en"):Ee[t]||A(t),i=ge.duration.fn._lang=ge.fn._lang=A(t),i._abbr):ge.fn._lang._abbr},ge.langData=function(t){return t&&t._lang&&t._lang._abbr&&(t=t._lang._abbr),A(t)},ge.isMoment=function(t){return t instanceof u||null!=t&&t.hasOwnProperty("_isAMomentObject")},ge.isDuration=function(t){return t instanceof p},ve=pi.length-1;ve>=0;--ve)x(pi[ve]);ge.normalizeUnits=function(t){return w(t)},ge.invalid=function(t){var e=ge.utc(0/0);return null!=t?m(e._pf,t):e._pf.userInvalidated=!0,e},ge.parseZone=function(){return ge.apply(null,arguments).parseZone()},ge.parseTwoDigitYear=function(t){return D(t)+(D(t)>68?1900:2e3)},m(ge.fn=u.prototype,{clone:function(){return ge(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=ge(this).utc();return 00:!1},parsingFlags:function(){return m({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(t){var e=j(this,t||ge.defaultFormat);return this.lang().postformat(e)},add:function(t,e){var i;return i="string"==typeof t&&"string"==typeof e?ge.duration(isNaN(+e)?+t:+e,isNaN(+e)?e:t):"string"==typeof t?ge.duration(+e,t):ge.duration(t,e),y(this,i,1),this},subtract:function(t,e){var i;return i="string"==typeof t&&"string"==typeof e?ge.duration(isNaN(+e)?+t:+e,isNaN(+e)?e:t):"string"==typeof t?ge.duration(+e,t):ge.duration(t,e),y(this,i,-1),this},diff:function(t,e,i){var s,n,o=O(t,this),a=6e4*(this.zone()-o.zone());return e=w(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+o.daysInMonth()),n=12*(this.year()-o.year())+(this.month()-o.month()),n+=(this-ge(this).startOf("month")-(o-ge(o).startOf("month")))/s,n-=6e4*(this.zone()-ge(this).startOf("month").zone()-(o.zone()-ge(o).startOf("month").zone()))/s,"year"===e&&(n/=12)):(s=this-o,n="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-a)/864e5:"week"===e?(s-a)/6048e5:s),i?n:f(n)},from:function(t,e){return ge.duration(this.diff(t)).lang(this.lang()._abbr).humanize(!e)},fromNow:function(t){return this.from(ge(),t)},calendar:function(t){var e=t||ge(),i=O(e,this).startOf("day"),s=this.diff(i,"days",!0),n=-6>s?"sameElse":-1>s?"lastWeek":0>s?"lastDay":1>s?"sameDay":2>s?"nextDay":7>s?"nextWeek":"sameElse";return this.format(this.lang().calendar(n,this))},isLeapYear:function(){return k(this.year())},isDST:function(){return this.zone()+ge(t).startOf(e)},isBefore:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)<+ge(t).startOf(e)},isSame:function(t,e){return e=e||"ms",+this.clone().startOf(e)===+O(t,this).startOf(e)},min:h("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(t){return t=ge.apply(null,arguments),this>t?this:t}),max:h("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(t){return t=ge.apply(null,arguments),t>this?this:t}),zone:function(t,e){var i=this._offset||0;return null==t?this._isUTC?i:this._d.getTimezoneOffset():("string"==typeof t&&(t=W(t)),Math.abs(t)<16&&(t=60*t),this._offset=t,this._isUTC=!0,i!==t&&(!e||this._changeInProgress?y(this,ge.duration(i-t,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,ge.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?ge(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return T(this.year(),this.month())},dayOfYear:function(t){var e=we((ge(this).startOf("day")-ge(this).startOf("year"))/864e5)+1;return null==t?e:this.add("d",t-e)},quarter:function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},weekYear:function(t){var e=ae(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==t?e:this.add("y",t-e)},isoWeekYear:function(t){var e=ae(this,1,4).year;return null==t?e:this.add("y",t-e)},week:function(t){var e=this.lang().week(this);return null==t?e:this.add("d",7*(t-e))},isoWeek:function(t){var e=ae(this,1,4).week;return null==t?e:this.add("d",7*(t-e))},weekday:function(t){var e=(this.day()+7-this.lang()._week.dow)%7;return null==t?e:this.add("d",t-e)},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},isoWeeksInYear:function(){return Y(this.year(),1,4)},weeksInYear:function(){var t=this._lang._week;return Y(this.year(),t.dow,t.doy)},get:function(t){return t=w(t),this[t]()},set:function(t,e){return t=w(t),"function"==typeof this[t]&&this[t](e),this},lang:function(t){return t===o?this._lang:(this._lang=A(t),this)}}),ge.fn.millisecond=ge.fn.milliseconds=pe("Milliseconds",!1),ge.fn.second=ge.fn.seconds=pe("Seconds",!1),ge.fn.minute=ge.fn.minutes=pe("Minutes",!1),ge.fn.hour=ge.fn.hours=pe("Hours",!0),ge.fn.date=pe("Date",!0),ge.fn.dates=h("dates accessor is deprecated. Use date instead.",pe("Date",!0)),ge.fn.year=pe("FullYear",!0),ge.fn.years=h("years accessor is deprecated. Use year instead.",pe("FullYear",!0)),ge.fn.days=ge.fn.day,ge.fn.months=ge.fn.month,ge.fn.weeks=ge.fn.week,ge.fn.isoWeeks=ge.fn.isoWeek,ge.fn.quarters=ge.fn.quarter,ge.fn.toJSON=ge.fn.toISOString,m(ge.duration.fn=p.prototype,{_bubble:function(){var t,e,i,s,n=this._milliseconds,o=this._days,a=this._months,r=this._data;r.milliseconds=n%1e3,t=f(n/1e3),r.seconds=t%60,e=f(t/60),r.minutes=e%60,i=f(e/60),r.hours=i%24,o+=f(i/24),r.days=o%30,a+=f(o/30),r.months=a%12,s=f(a/12),r.years=s},weeks:function(){return f(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*D(this._months/12)},humanize:function(t){var e=+this,i=oe(e,!t,this.lang());return t&&(i=this.lang().pastFuture(e,i)),this.lang().postformat(i)},add:function(t,e){var i=ge.duration(t,e);return this._milliseconds+=i._milliseconds,this._days+=i._days,this._months+=i._months,this._bubble(),this},subtract:function(t,e){var i=ge.duration(t,e);return this._milliseconds-=i._milliseconds,this._days-=i._days,this._months-=i._months,this._bubble(),this},get:function(t){return t=w(t),this[t.toLowerCase()+"s"]()},as:function(t){return t=w(t),this["as"+t.charAt(0).toUpperCase()+t.slice(1)+"s"]()},lang:ge.fn.lang,toIsoString:function(){var t=Math.abs(this.years()),e=Math.abs(this.months()),i=Math.abs(this.days()),s=Math.abs(this.hours()),n=Math.abs(this.minutes()),o=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(i?i+"D":"")+(s||n||o?"T":"")+(s?s+"H":"")+(n?n+"M":"")+(o?o+"S":""):"P0D"}});for(ve in oi)oi.hasOwnProperty(ve)&&(_e(ve,oi[ve]),me(ve.toLowerCase()));_e("Weeks",6048e5),ge.duration.fn.asMonths=function(){return(+this-31536e6*this.years())/2592e6+12*this.years()},ge.lang("en",{ordinal:function(t){var e=t%10,i=1===D(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),Ne?n.exports=ge:(s=function(t,e,i){return i.config&&i.config()&&i.config().noGlobal===!0&&(be.moment=ye),ge}.call(e,i,e,n),!(s!==o&&(n.exports=s)),fe(!0))}).call(this)}).call(e,function(){return this}(),i(130)(t))},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,n,o,a,r,h,d,l,c=this.calculationNodes,u=this.calculationNodeIndices,p=-2/3,m=4/3,_=this.constants.physics.repulsion.nodeDistance,f=_;for(d=0;di&&(a=.5*f>i?1:g*i+m,a*=0==o?1:1+o*this.constants.clustering.forceAmplification,a/=i,s=t*a,n=e*a,r.fx-=s,r.fy-=n,h.fx+=s,h.fy+=n)}}},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,n,o,a,r,h,d,l=this.calculationNodes,c=this.calculationNodeIndices,u=5,p=.5*-u,m=this.constants.physics.hierarchicalRepulsion.nodeDistance,_=m,f=p/_;for(h=0;hi)){o=f*i+u;var g=.05,y=2*_*2*g;o=g*Math.pow(i,2)-y*i+y*y/(4*g),0==i?i=.01:o/=i,s=t*o,n=e*o,a.fx-=s,a.fy-=n,r.fx+=s,r.fy+=n}},e._calculateHierarchicalSpringForces=function(){var t,e,i,s,n,o,a,r,h,d=this.edges;for(i in d)if(d.hasOwnProperty(i)&&(e=d[i],e.connected&&this.nodes.hasOwnProperty(e.toId)&&this.nodes.hasOwnProperty(e.fromId))){t=e.customLength?e.length:this.constants.physics.springLength,t+=(e.to.clusterSize+e.from.clusterSize-2)*this.constants.clustering.edgeGrowth,s=e.from.x-e.to.x,n=e.from.y-e.to.y,h=Math.sqrt(s*s+n*n),0==h&&(h=.01),h=Math.max(.8*t,Math.min(5*t,h)),r=this.constants.physics.springConstant*(t-h)/h,o=s*r,a=n*r,e.to.fx-=o,e.to.fy-=a,e.from.fx+=o,e.from.fy+=a;var l=5;h>t&&(l=25),e.from.level>e.to.level?(e.to.fx-=l*o,e.to.fy-=l*a):e.from.levelo;o++)t=e[i[o]],this._getForceContribution(n.root.children.NW,t),this._getForceContribution(n.root.children.NE,t),this._getForceContribution(n.root.children.SW,t),this._getForceContribution(n.root.children.SE,t)}},e._getForceContribution=function(t,e){if(t.childrenCount>0){var i,s,n;if(i=t.centerOfMass.x-e.x,s=t.centerOfMass.y-e.y,n=Math.sqrt(i*i+s*s),n*t.calcSize>this.constants.physics.barnesHut.theta){0==n&&(n=.1*Math.random(),i=n);var o=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.mass/(n*n*n),a=i*o,r=s*o;e.fx+=a,e.fy+=r}else if(4==t.childrenCount)this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e);else if(t.children.data.id!=e.id){0==n&&(n=.5*Math.random(),i=n);var o=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.mass/(n*n*n),a=i*o,r=s*o;e.fx+=a,e.fy+=r}}},e._formBarnesHutTree=function(t,e){for(var i,s=e.length,n=Number.MAX_VALUE,o=Number.MAX_VALUE,a=-Number.MAX_VALUE,r=-Number.MAX_VALUE,h=0;s>h;h++){var d=t[e[h]].x,l=t[e[h]].y;n>d&&(n=d),d>a&&(a=d),o>l&&(o=l),l>r&&(r=l)}var c=Math.abs(a-n)-Math.abs(r-o);c>0?(o-=.5*c,r+=.5*c):(n+=.5*c,a-=.5*c);var u=1e-5,p=Math.max(u,Math.abs(a-n)),m=.5*p,_=.5*(n+a),f=.5*(o+r),g={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:_-m,maxX:_+m,minY:f-m,maxY:f+m},size:p,calcSize:1/p,children:{data:null},maxWidth:0,level:0,childrenCount:4}};for(this._splitBranch(g.root),h=0;s>h;h++)i=t[e[h]],this._placeInTree(g.root,i);this.barnesHutTree=g},e._updateBranchMass=function(t,e){var i=t.mass+e.mass,s=1/i;t.centerOfMass.x=t.centerOfMass.x*t.mass+e.x*e.mass,t.centerOfMass.x*=s,t.centerOfMass.y=t.centerOfMass.y*t.mass+e.y*e.mass,t.centerOfMass.y*=s,t.mass=i;var n=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NW"):this._placeInRegion(t,e,"SW"):t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NE"):this._placeInRegion(t,e,"SE")},e._placeInRegion=function(t,e,i){switch(t.children[i].childrenCount){case 0:t.children[i].children.data=e,t.children[i].childrenCount=1,this._updateBranchMass(t.children[i],e);break;case 1:t.children[i].children.data.x==e.x&&t.children[i].children.data.y==e.y?(e.x+=Math.random(),e.y+=Math.random()):(this._splitBranch(t.children[i]),this._placeInTree(t.children[i],e));break;case 4:this._placeInTree(t.children[i],e)}},e._splitBranch=function(t){var e=null;1==t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)},e._insertRegion=function(t,e){var i,s,n,o,a=.5*t.size;switch(e){case"NW":i=t.range.minX,s=t.range.minX+a,n=t.range.minY,o=t.range.minY+a;break;case"NE":i=t.range.minX+a,s=t.range.maxX,n=t.range.minY,o=t.range.minY+a;break;case"SW":i=t.range.minX,s=t.range.minX+a,n=t.range.minY+a,o=t.range.maxY;break;case"SE":i=t.range.minX+a,s=t.range.maxX,n=t.range.minY+a,o=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:s,minY:n,maxY:o},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}},e._drawTree=function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))},e._drawBranch=function(t,e,i){void 0===i&&(i="#FF0000"),4==t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}},function(t,e,i){function s(t){return i(n(t))}function n(t){return o[t]||function(){throw new Error("Cannot find module '"+t+"'.")}()}var o={"./ar":58,"./ar-ma":56,"./ar-ma.js":56,"./ar-sa":57,"./ar-sa.js":57,"./ar.js":58,"./az":59,"./az.js":59,"./bg":60,"./bg.js":60,"./bn":61,"./bn.js":61,"./br":62,"./br.js":62,"./bs":63,"./bs.js":63,"./ca":64,"./ca.js":64,"./cs":65,"./cs.js":65,"./cv":66,"./cv.js":66,"./cy":67,"./cy.js":67,"./da":68,"./da.js":68,"./de":70,"./de-at":69,"./de-at.js":69,"./de.js":70,"./el":71,"./el.js":71,"./en-au":72,"./en-au.js":72,"./en-ca":73,"./en-ca.js":73,"./en-gb":74,"./en-gb.js":74,"./eo":75,"./eo.js":75,"./es":76,"./es.js":76,"./et":77,"./et.js":77,"./eu":78,"./eu.js":78,"./fa":79,"./fa.js":79,"./fi":80,"./fi.js":80,"./fo":81,"./fo.js":81,"./fr":83,"./fr-ca":82,"./fr-ca.js":82,"./fr.js":83,"./gl":84,"./gl.js":84,"./he":85,"./he.js":85,"./hi":86,"./hi.js":86,"./hr":87,"./hr.js":87,"./hu":88,"./hu.js":88,"./hy-am":89,"./hy-am.js":89,"./id":90,"./id.js":90,"./is":91,"./is.js":91,"./it":92,"./it.js":92,"./ja":93,"./ja.js":93,"./ka":94,"./ka.js":94,"./km":95,"./km.js":95,"./ko":96,"./ko.js":96,"./lb":97,"./lb.js":97,"./lt":98,"./lt.js":98,"./lv":99,"./lv.js":99,"./mk":100,"./mk.js":100,"./ml":101,"./ml.js":101,"./mr":102,"./mr.js":102,"./ms-my":103,"./ms-my.js":103,"./nb":104,"./nb.js":104,"./ne":105,"./ne.js":105,"./nl":106,"./nl.js":106,"./nn":107,"./nn.js":107,"./pl":108,"./pl.js":108,"./pt":110,"./pt-br":109,"./pt-br.js":109,"./pt.js":110,"./ro":111,"./ro.js":111,"./ru":112,"./ru.js":112,"./sk":113,"./sk.js":113,"./sl":114,"./sl.js":114,"./sq":115,"./sq.js":115,"./sr":117,"./sr-cyrl":116,"./sr-cyrl.js":116,"./sr.js":117,"./sv":118,"./sv.js":118,"./ta":119,"./ta.js":119,"./th":120,"./th.js":120,"./tl-ph":121,"./tl-ph.js":121,"./tr":122,"./tr.js":122,"./tzm":124,"./tzm-latn":123,"./tzm-latn.js":123,"./tzm.js":124,"./uk":125,"./uk.js":125,"./uz":126,"./uz.js":126,"./vi":127,"./vi.js":127,"./zh-cn":128,"./zh-cn.js":128,"./zh-tw":129,"./zh-tw.js":129};s.keys=function(){return Object.keys(o)},s.resolve=n,t.exports=s},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},i={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};return t.lang("ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(t){return 12>t?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return i[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},week:{dow:6,doy:12}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},i={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};return t.lang("ar",{months:"يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),monthsShort:"يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(t){return 12>t?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return i[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},week:{dow:6,doy:12}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};return t.lang("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gələn həftə] dddd [saat] LT",lastDay:"[dünən] LT",lastWeek:"[keçən həftə] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s əvvəl",s:"birneçə saniyyə",m:"bir dəqiqə",mm:"%d dəqiqə",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiem:function(t){return 4>t?"gecə":12>t?"səhər":17>t?"gündüz":"axşam"},ordinal:function(t){if(0===t)return t+"-ıncı";var i=t%10,s=t%100-i,n=t>=100?100:null;return t+(e[i]||e[s]||e[n])},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},ordinal:function(t){var e=t%10,i=t%100;return 0===t?t+"-ев":0===i?t+"-ен":i>10&&20>i?t+"-ти":1===e?t+"-ви":2===e?t+"-ри":7===e||8===e?t+"-ми":t+"-ти"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},i={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};return t.lang("bn",{months:"জানুয়ারী_ফেবুয়ারী_মার্চ_এপ্রিল_মে_জুন_জুলাই_অগাস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),monthsShort:"জানু_ফেব_মার্চ_এপর_মে_জুন_জুল_অগ_সেপ্ট_অক্টো_নভ_ডিসেম্".split("_"),weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পত্তিবার_শুক্রুবার_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পত্তি_শুক্রু_শনি".split("_"),weekdaysMin:"রব_সম_মঙ্গ_বু_ব্রিহ_শু_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কএক সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"},preparse:function(t){return t.replace(/[১২৩৪৫৬৭৮৯০]/g,function(t){return i[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiem:function(t){return 4>t?"রাত":10>t?"শকাল":17>t?"দুপুর":20>t?"বিকেল":"রাত"},week:{dow:0,doy:6}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s={mm:"munutenn",MM:"miz",dd:"devezh"};return t+" "+n(s[i],t)}function i(t){switch(s(t)){case 1:case 3:case 4:case 5:case 9:return t+" bloaz";default:return t+" vloaz"}}function s(t){return t>9?s(t%10):t}function n(t,e){return 2===e?o(t):t}function o(t){var e={m:"v",b:"v",d:"z"};return void 0===e[t.charAt(0)]?t:e[t.charAt(0)]+t.substring(1)}return t.lang("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),longDateFormat:{LT:"h[e]mm A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY LT",LLLL:"dddd, D [a viz] MMMM YYYY LT"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:e,h:"un eur",hh:"%d eur",d:"un devezh",dd:e,M:"ur miz",MM:e,y:"ur bloaz",yy:i},ordinal:function(t){var e=1===t?"añ":"vet";return t+e},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s=t+" ";switch(i){case"m":return e?"jedna minuta":"jedne minute";case"mm":return s+=1===t?"minuta":2===t||3===t||4===t?"minute":"minuta";case"h":return e?"jedan sat":"jednog sata";case"hh":return s+=1===t?"sat":2===t||3===t||4===t?"sata":"sati";case"dd":return s+=1===t?"dan":"dana";case"MM":return s+=1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci";case"yy":return s+=1===t?"godina":2===t||3===t||4===t?"godine":"godina"}}return t.lang("bs",{months:"januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT" -},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinal:"%dº",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t){return t>1&&5>t&&1!==~~(t/10)}function i(t,i,s,n){var o=t+" ";switch(s){case"s":return i||n?"pár sekund":"pár sekundami";case"m":return i?"minuta":n?"minutu":"minutou";case"mm":return i||n?o+(e(t)?"minuty":"minut"):o+"minutami";case"h":return i?"hodina":n?"hodinu":"hodinou";case"hh":return i||n?o+(e(t)?"hodiny":"hodin"):o+"hodinami";case"d":return i||n?"den":"dnem";case"dd":return i||n?o+(e(t)?"dny":"dní"):o+"dny";case"M":return i||n?"měsíc":"měsícem";case"MM":return i||n?o+(e(t)?"měsíce":"měsíců"):o+"měsíci";case"y":return i||n?"rok":"rokem";case"yy":return i||n?o+(e(t)?"roky":"let"):o+"lety"}}var s="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),n="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");return t.lang("cs",{months:s,monthsShort:n,monthsParse:function(t,e){var i,s=[];for(i=0;12>i;i++)s[i]=new RegExp("^"+t[i]+"$|^"+e[i]+"$","i");return s}(s,n),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H.mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("cv",{months:"кăрлач_нарăс_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),monthsShort:"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),weekdays:"вырсарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_эрнекун_шăматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кĕç_эрн_шăм".split("_"),weekdaysMin:"вр_тн_ыт_юн_кç_эр_шм".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",LLL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",LLLL:"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"},calendar:{sameDay:"[Паян] LT [сехетре]",nextDay:"[Ыран] LT [сехетре]",lastDay:"[Ĕнер] LT [сехетре]",nextWeek:"[Çитес] dddd LT [сехетре]",lastWeek:"[Иртнĕ] dddd LT [сехетре]",sameElse:"L"},relativeTime:{future:function(t){var e=/сехет$/i.exec(t)?"рен":/çул$/i.exec(t)?"тан":"ран";return t+e},past:"%s каялла",s:"пĕр-ик çеккунт",m:"пĕр минут",mm:"%d минут",h:"пĕр сехет",hh:"%d сехет",d:"пĕр кун",dd:"%d кун",M:"пĕр уйăх",MM:"%d уйăх",y:"пĕр çул",yy:"%d çул"},ordinal:"%d-мĕш",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},ordinal:function(t){var e=t,i="",s=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];return e>20?i=40===e||50===e||60===e||80===e||100===e?"fed":"ain":e>0&&(i=s[e]),t+i},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I går kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?s[i][0]:s[i][1]}return t.lang("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?s[i][0]:s[i][1]}return t.lang("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(t,e){return/D/.test(e.substring(0,e.indexOf("MMMM")))?this._monthsGenitiveEl[t.month()]:this._monthsNominativeEl[t.month()]},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(t,e,i){return t>11?i?"μμ":"ΜΜ":i?"πμ":"ΠΜ"},longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(t,e){var i=this._calendarEl[t],s=e&&e.hours();return"function"==typeof i&&(i=i.apply(e)),i.replace("{}",s%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},ordinal:function(t){return t+"η"},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(t){var e=t%10,i=1===~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(t){var e=t%10,i=1===~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(t){var e=t%10,i=1===~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ĵa_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY LT",LLLL:"dddd, [la] D[-an de] MMMM, YYYY LT"},meridiem:function(t,e,i){return t>11?i?"p.t.m.":"P.T.M.":i?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodiaŭ je] LT",nextDay:"[Morgaŭ je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hieraŭ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaŭ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinal:"%da",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),i="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");return t.lang("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,s){return/-MMM-/.test(s)?i[t.month()]:e[t.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [del] YYYY",LLL:"D [de] MMMM [del] YYYY LT",LLLL:"dddd, D [de] MMMM [del] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:"%dº",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i,s){var n={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:[t+" minuti",t+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[t+" tunni",t+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[t+" kuu",t+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[t+" aasta",t+" aastat"]};return e?n[i][2]?n[i][2]:n[i][1]:s?n[i][0]:n[i][1]}return t.lang("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:"%d päeva",M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] LT",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] LT",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] LT",llll:"ddd, YYYY[ko] MMM D[a] LT"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},i={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};return t.lang("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiem:function(t){return 12>t?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return i[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},ordinal:"%dم",week:{dow:6,doy:12}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,s,n){var o="";switch(s){case"s":return n?"muutaman sekunnin":"muutama sekunti";case"m":return n?"minuutin":"minuutti";case"mm":o=n?"minuutin":"minuuttia";break;case"h":return n?"tunnin":"tunti";case"hh":o=n?"tunnin":"tuntia";break;case"d":return n?"päivän":"päivä";case"dd":o=n?"päivän":"päivää";break;case"M":return n?"kuukauden":"kuukausi";case"MM":o=n?"kuukauden":"kuukautta";break;case"y":return n?"vuoden":"vuosi";case"yy":o=n?"vuoden":"vuotta"}return o=i(t,n)+" "+o}function i(t,e){return 10>t?e?n[t]:s[t]:t}var s="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),n=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",s[7],s[8],s[9]];return t.lang("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D. MMMM, YYYY LT"},calendar:{sameDay:"[Í dag kl.] LT",nextDay:"[Í morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[Í gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(t){return t+(1===t?"er":"")}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(t){return t+(1===t?"er":"")},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("gl",{months:"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),monthsShort:"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),weekdays:"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(t){return"uns segundos"===t?"nuns segundos":"en "+t},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY LT",LLLL:"dddd, D [ב]MMMM YYYY LT",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(t){return 2===t?"שעתיים":t+" שעות"},d:"יום",dd:function(t){return 2===t?"יומיים":t+" ימים"},M:"חודש",MM:function(t){return 2===t?"חודשיים":t+" חודשים"},y:"שנה",yy:function(t){return 2===t?"שנתיים":t+" שנים"}}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},i={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return t.lang("hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(t){return t.replace(/[१२३४५६७८९०]/g,function(t){return i[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiem:function(t){return 4>t?"रात":10>t?"सुबह":17>t?"दोपहर":20>t?"शाम":"रात"},week:{dow:0,doy:6}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s=t+" ";switch(i){case"m":return e?"jedna minuta":"jedne minute";case"mm":return s+=1===t?"minuta":2===t||3===t||4===t?"minute":"minuta";case"h":return e?"jedan sat":"jednog sata";case"hh":return s+=1===t?"sat":2===t||3===t||4===t?"sata":"sati";case"dd":return s+=1===t?"dan":"dana";case"MM":return s+=1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci";case"yy":return s+=1===t?"godina":2===t||3===t||4===t?"godine":"godina"}}return t.lang("hr",{months:"sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i,s){var n=t;switch(i){case"s":return s||e?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(s||e?" perc":" perce");case"mm":return n+(s||e?" perc":" perce");case"h":return"egy"+(s||e?" óra":" órája");case"hh":return n+(s||e?" óra":" órája");case"d":return"egy"+(s||e?" nap":" napja");case"dd":return n+(s||e?" nap":" napja");case"M":return"egy"+(s||e?" hónap":" hónapja");case"MM":return n+(s||e?" hónap":" hónapja");case"y":return"egy"+(s||e?" év":" éve");case"yy":return n+(s||e?" év":" éve")}return""}function i(t){return(t?"":"[múlt] ")+"["+s[this.day()]+"] LT[-kor]"}var s="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");return t.lang("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiem:function(t,e,i){return 12>t?i===!0?"de":"DE":i===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return i.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return i.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e){var i={nominative:"հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր".split("_"),accusative:"հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի".split("_")},s=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(e)?"accusative":"nominative";return i[s][t.month()] -}function i(t){var e="հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ".split("_");return e[t.month()]}function s(t){var e="կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ".split("_");return e[t.day()]}return t.lang("hy-am",{months:e,monthsShort:i,weekdays:s,weekdaysShort:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),weekdaysMin:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY թ.",LLL:"D MMMM YYYY թ., LT",LLLL:"dddd, D MMMM YYYY թ., LT"},calendar:{sameDay:"[այսօր] LT",nextDay:"[վաղը] LT",lastDay:"[երեկ] LT",nextWeek:function(){return"dddd [օրը ժամը] LT"},lastWeek:function(){return"[անցած] dddd [օրը ժամը] LT"},sameElse:"L"},relativeTime:{future:"%s հետո",past:"%s առաջ",s:"մի քանի վայրկյան",m:"րոպե",mm:"%d րոպե",h:"ժամ",hh:"%d ժամ",d:"օր",dd:"%d օր",M:"ամիս",MM:"%d ամիս",y:"տարի",yy:"%d տարի"},meridiem:function(t){return 4>t?"գիշերվա":12>t?"առավոտվա":17>t?"ցերեկվա":"երեկոյան"},ordinal:function(t,e){switch(e){case"DDD":case"w":case"W":case"DDDo":return 1===t?t+"-ին":t+"-րդ";default:return t}},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(t){return 11>t?"pagi":15>t?"siang":19>t?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t){return t%100===11?!0:t%10===1?!1:!0}function i(t,i,s,n){var o=t+" ";switch(s){case"s":return i||n?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return i?"mínúta":"mínútu";case"mm":return e(t)?o+(i||n?"mínútur":"mínútum"):i?o+"mínúta":o+"mínútu";case"hh":return e(t)?o+(i||n?"klukkustundir":"klukkustundum"):o+"klukkustund";case"d":return i?"dagur":n?"dag":"degi";case"dd":return e(t)?i?o+"dagar":o+(n?"daga":"dögum"):i?o+"dagur":o+(n?"dag":"degi");case"M":return i?"mánuður":n?"mánuð":"mánuði";case"MM":return e(t)?i?o+"mánuðir":o+(n?"mánuði":"mánuðum"):i?o+"mánuður":o+(n?"mánuð":"mánuði");case"y":return i||n?"ár":"ári";case"yy":return e(t)?o+(i||n?"ár":"árum"):o+(i||n?"ár":"ári")}}return t.lang("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:i,m:i,mm:i,h:"klukkustund",hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:"[lo scorso] dddd [alle] LT",sameElse:"L"},relativeTime:{future:function(t){return(/^[0-9].+$/.test(t)?"tra":"in")+" "+t},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinal:"%dº",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日LT",LLLL:"YYYY年M月D日LT dddd"},meridiem:function(t){return 12>t?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e){var i={nominative:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი".split("_"),accusative:"იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს".split("_")},s=/D[oD] *MMMM?/.test(e)?"accusative":"nominative";return i[s][t.month()]}function i(t,e){var i={nominative:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი".split("_"),accusative:"კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს".split("_")},s=/(წინა|შემდეგ)/.test(e)?"accusative":"nominative";return i[s][t.day()]}return t.lang("ka",{months:e,monthsShort:"იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),weekdays:i,weekdaysShort:"კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),weekdaysMin:"კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვალ] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინა] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(t){return/(წამი|წუთი|საათი|წელი)/.test(t)?t.replace(/ი$/,"ში"):t+"ში"},past:function(t){return/(წამი|წუთი|საათი|დღე|თვე)/.test(t)?t.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(t)?t.replace(/წელი$/,"წლის წინ"):void 0},s:"რამდენიმე წამი",m:"წუთი",mm:"%d წუთი",h:"საათი",hh:"%d საათი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinal:function(t){return 0===t?t:1===t?t+"-ლი":20>t||100>=t&&t%20===0||t%100===0?"მე-"+t:t+"-ე"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("km",{months:"មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysShort:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysMin:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[ថ្ងៃនៈ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្តាហ៍មុន] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀត",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយថ្ងៃ",dd:"%d ថ្ងៃ",M:"មួយខែ",MM:"%d ខែ",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h시 mm분",L:"YYYY.MM.DD",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 LT",LLLL:"YYYY년 MMMM D일 dddd LT"},meridiem:function(t){return 12>t?"오전":"오후"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇초",ss:"%d초",m:"일분",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한달",MM:"%d달",y:"일년",yy:"%d년"},ordinal:"%d일",meridiemParse:/(오전|오후)/,isPM:function(t){return"오후"===t}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],dd:[t+" Deeg",t+" Deeg"],M:["ee Mount","engem Mount"],MM:[t+" Méint",t+" Méint"],y:["ee Joer","engem Joer"],yy:[t+" Joer",t+" Joer"]};return e?s[i][0]:s[i][1]}function i(t){var e=t.substr(0,t.indexOf(" "));return a(e)?"a "+t:"an "+t}function s(t){var e=t.substr(0,t.indexOf(" "));return a(e)?"viru "+t:"virun "+t}function n(){var t=this.format("d");return o(t)?"[Leschte] dddd [um] LT":"[Leschten] dddd [um] LT"}function o(t){switch(t=parseInt(t,10)){case 0:case 1:case 3:case 5:case 6:return!0;default:return!1}}function a(t){if(t=parseInt(t,10),isNaN(t))return!1;if(0>t)return!0;if(10>t)return t>=4&&7>=t?!0:!1;if(100>t){var e=t%10,i=t/10;return a(0===e?i:e)}if(1e4>t){for(;t>=10;)t/=10;return a(t)}return t/=1e3,a(t)}return t.lang("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),longDateFormat:{LT:"H:mm [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:n},relativeTime:{future:i,past:s,s:"e puer Sekonnen",m:e,mm:"%d Minutten",h:e,hh:"%d Stonnen",d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i,s){return e?"kelios sekundės":s?"kelių sekundžių":"kelias sekundes"}function i(t,e,i,s){return e?n(i)[0]:s?n(i)[1]:n(i)[2]}function s(t){return t%10===0||t>10&&20>t}function n(t){return r[t].split("_")}function o(t,e,o,a){var r=t+" ";return 1===t?r+i(t,e,o[0],a):e?r+(s(t)?n(o)[1]:n(o)[0]):a?r+n(o)[1]:r+(s(t)?n(o)[1]:n(o)[2])}function a(t,e){var i=-1===e.indexOf("dddd HH:mm"),s=h[t.day()];return i?s:s.substring(0,s.length-2)+"į"}var r={m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"},h="sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_");return t.lang("lt",{months:"sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:a,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:e,m:i,mm:o,h:i,hh:o,d:i,dd:o,M:i,MM:o,y:i,yy:o},ordinal:function(t){return t+"-oji"},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s=t.split("_");return i?e%10===1&&11!==e?s[2]:s[3]:e%10===1&&11!==e?s[0]:s[1]}function i(t,i,n){return t+" "+e(s[n],t,i)}var s={mm:"minūti_minūtes_minūte_minūtes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mēnesi_mēnešus_mēnesis_mēneši",yy:"gadu_gadus_gads_gadi"};return t.lang("lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vēlāk",past:"%s agrāk",s:"dažas sekundes",m:"minūti",mm:i,h:"stundu",hh:i,d:"dienu",dd:i,M:"mēnesi",MM:i,y:"gadu",yy:i},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),weekdaysShort:"нед_пон_вто_сре_чет_пет_саб".split("_"),weekdaysMin:"нe_пo_вт_ср_че_пе_сa".split("_"),longDateFormat:{LT:"H:mm",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Денес во] LT",nextDay:"[Утре во] LT",nextWeek:"dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Во изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Во изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"после %s",past:"пред %s",s:"неколку секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",M:"месец",MM:"%d месеци",y:"година",yy:"%d години"},ordinal:function(t){var e=t%10,i=t%100;return 0===t?t+"-ев":0===i?t+"-ен":i>10&&20>i?t+"-ти":1===e?t+"-ви":2===e?t+"-ри":7===e||8===e?t+"-ми":t+"-ти"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ml",{months:"ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.".split("_"),weekdays:"ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച".split("_"),weekdaysShort:"ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി".split("_"),weekdaysMin:"ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ".split("_"),longDateFormat:{LT:"A h:mm -നു",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[ഇന്ന്] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇന്നലെ] LT",lastWeek:"[കഴിഞ്ഞ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s കഴിഞ്ഞ്",past:"%s മുൻപ്",s:"അൽപ നിമിഷങ്ങൾ",m:"ഒരു മിനിറ്റ്",mm:"%d മിനിറ്റ്",h:"ഒരു മണിക്കൂർ",hh:"%d മണിക്കൂർ",d:"ഒരു ദിവസം",dd:"%d ദിവസം",M:"ഒരു മാസം",MM:"%d മാസം",y:"ഒരു വർഷം",yy:"%d വർഷം"},meridiem:function(t){return 4>t?"രാത്രി":12>t?"രാവിലെ":17>t?"ഉച്ച കഴിഞ്ഞ്":20>t?"വൈകുന്നേരം":"രാത്രി"}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},i={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return t.lang("mr",{months:"जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),monthsShort:"जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),weekdays:"रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[उद्या] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%s नंतर",past:"%s पूर्वी",s:"सेकंद",m:"एक मिनिट",mm:"%d मिनिटे",h:"एक तास",hh:"%d तास",d:"एक दिवस",dd:"%d दिवस",M:"एक महिना",MM:"%d महिने",y:"एक वर्ष",yy:"%d वर्षे"},preparse:function(t){return t.replace(/[१२३४५६७८९०]/g,function(t){return i[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiem:function(t){return 4>t?"रात्री":10>t?"सकाळी":17>t?"दुपारी":20>t?"सायंकाळी":"रात्री"},week:{dow:0,doy:6}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(t){return 11>t?"pagi":15>t?"tengahari":19>t?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},i={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return t.lang("ne",{months:"जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर".split("_"),monthsShort:"जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.".split("_"),weekdays:"आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.".split("_"),weekdaysMin:"आइ._सो._मङ्_बु._बि._शु._श.".split("_"),longDateFormat:{LT:"Aको h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},preparse:function(t){return t.replace(/[१२३४५६७८९०]/g,function(t){return i[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiem:function(t){return 3>t?"राती":10>t?"बिहान":15>t?"दिउँसो":18>t?"बेलुका":20>t?"साँझ":"राती"},calendar:{sameDay:"[आज] LT",nextDay:"[भोली] LT",nextWeek:"[आउँदो] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गएको] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडी",s:"केही समय",m:"एक मिनेट",mm:"%d मिनेट",h:"एक घण्टा",hh:"%d घण्टा",d:"एक दिन",dd:"%d दिन",M:"एक महिना",MM:"%d महिना",y:"एक बर्ष",yy:"%d बर्ष"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),i="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");return t.lang("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,s){return/-MMM-/.test(s)?i[t.month()]:e[t.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mån_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_må_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I går klokka] LT",lastWeek:"[Føregåande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein månad",MM:"%d månader",y:"eit år",yy:"%d år"},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t){return 5>t%10&&t%10>1&&~~(t/10)%10!==1}function i(t,i,s){var n=t+" ";switch(s){case"m":return i?"minuta":"minutę";case"mm":return n+(e(t)?"minuty":"minut");case"h":return i?"godzina":"godzinę";case"hh":return n+(e(t)?"godziny":"godzin");case"MM":return n+(e(t)?"miesiące":"miesięcy");case"yy":return n+(e(t)?"lata":"lat")}}var s="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),n="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");return t.lang("pl",{months:function(t,e){return/D MMMM/.test(e)?n[t.month()]:s[t.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:i,mm:i,h:i,hh:i,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:i,y:"rok",yy:i},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº"})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},n=" ";return(t%100>=20||t>=100&&t%100===0)&&(n=" de "),t+n+s[i]}return t.lang("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:e,h:"o oră",hh:e,d:"o zi",dd:e,M:"o lună",MM:e,y:"un an",yy:e},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e){var i=t.split("_");return e%10===1&&e%100!==11?i[0]:e%10>=2&&4>=e%10&&(10>e%100||e%100>=20)?i[1]:i[2]}function i(t,i,s){var n={mm:i?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===s?i?"минута":"минуту":t+" "+e(n[s],+t)}function s(t,e){var i={nominative:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),accusative:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_")},s=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(e)?"accusative":"nominative";return i[s][t.month()]}function n(t,e){var i={nominative:"янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),accusative:"янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек".split("_")},s=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(e)?"accusative":"nominative";return i[s][t.month()]}function o(t,e){var i={nominative:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),accusative:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_")},s=/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/.test(e)?"accusative":"nominative";return i[s][t.day()]}return t.lang("ru",{months:s,monthsShort:n,weekdays:o,weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|я]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i],longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT"},lastWeek:function(){switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:i,mm:i,h:"час",hh:i,d:"день",dd:i,M:"месяц",MM:i,y:"год",yy:i},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(t){return/^(дня|вечера)$/.test(t)},meridiem:function(t){return 4>t?"ночи":12>t?"утра":17>t?"дня":"вечера"},ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":return t+"-й";case"D":return t+"-го";case"w":case"W":return t+"-я";default:return t}},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t){return t>1&&5>t}function i(t,i,s,n){var o=t+" ";switch(s){case"s":return i||n?"pár sekúnd":"pár sekundami";case"m":return i?"minúta":n?"minútu":"minútou";case"mm":return i||n?o+(e(t)?"minúty":"minút"):o+"minútami";case"h":return i?"hodina":n?"hodinu":"hodinou";case"hh":return i||n?o+(e(t)?"hodiny":"hodín"):o+"hodinami";case"d":return i||n?"deň":"dňom";case"dd":return i||n?o+(e(t)?"dni":"dní"):o+"dňami";case"M":return i||n?"mesiac":"mesiacom";case"MM":return i||n?o+(e(t)?"mesiace":"mesiacov"):o+"mesiacmi";case"y":return i||n?"rok":"rokom";case"yy":return i||n?o+(e(t)?"roky":"rokov"):o+"rokmi"}}var s="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),n="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return t.lang("sk",{months:s,monthsShort:n,monthsParse:function(t,e){var i,s=[];for(i=0;12>i;i++)s[i]=new RegExp("^"+t[i]+"$|^"+e[i]+"$","i");return s}(s,n),weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT"; -case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s=t+" ";switch(i){case"m":return e?"ena minuta":"eno minuto";case"mm":return s+=1===t?"minuta":2===t?"minuti":3===t||4===t?"minute":"minut";case"h":return e?"ena ura":"eno uro";case"hh":return s+=1===t?"ura":2===t?"uri":3===t||4===t?"ure":"ur";case"dd":return s+=1===t?"dan":"dni";case"MM":return s+=1===t?"mesec":2===t?"meseca":3===t||4===t?"mesece":"mesecev";case"yy":return s+=1===t?"leto":2===t?"leti":3===t||4===t?"leta":"let"}}return t.lang("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejšnja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"%s nazaj",s:"nekaj sekund",m:e,mm:e,h:e,hh:e,d:"en dan",dd:e,M:"en mesec",MM:e,y:"eno leto",yy:e},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),meridiem:function(t){return 12>t?"PD":"MD"},longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&4>=t?e[1]:e[2]},translate:function(t,i,s){var n=e.words[s];return 1===s.length?i?n[0]:n[1]:t+" "+e.correctGrammaticalCase(t,n)}};return t.lang("sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","сеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","среда","четвртак","петак","субота"],weekdaysShort:["нед.","пон.","уто.","сре.","чет.","пет.","суб."],weekdaysMin:["не","по","ут","ср","че","пе","су"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var t=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"];return t[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"дан",dd:e.translate,M:"месец",MM:e.translate,y:"годину",yy:e.translate},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&4>=t?e[1]:e[2]},translate:function(t,i,s){var n=e.words[s];return 1===s.length?i?n[0]:n[1]:t+" "+e.correctGrammaticalCase(t,n)}};return t.lang("sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","čet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","če","pe","su"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var t=["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return t[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mesec",MM:e.translate,y:"godinu",yy:e.translate},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},ordinal:function(t){var e=t%10,i=1===~~(t%100/10)?"e":1===e?"a":2===e?"a":3===e?"e":"e";return t+i},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ta",{months:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),monthsShort:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdays:"ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை".split("_"),weekdaysShort:"ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பு_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[இன்று] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேற்று] LT",lastWeek:"[கடந்த வாரம்] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இல்",past:"%s முன்",s:"ஒரு சில விநாடிகள்",m:"ஒரு நிமிடம்",mm:"%d நிமிடங்கள்",h:"ஒரு மணி நேரம்",hh:"%d மணி நேரம்",d:"ஒரு நாள்",dd:"%d நாட்கள்",M:"ஒரு மாதம்",MM:"%d மாதங்கள்",y:"ஒரு வருடம்",yy:"%d ஆண்டுகள்"},ordinal:function(t){return t+"வது"},meridiem:function(t){return t>=6&&10>=t?" காலை":t>=10&&14>=t?" நண்பகல்":t>=14&&18>=t?" எற்பாடு":t>=18&&20>=t?" மாலை":t>=20&&24>=t?" இரவு":t>=0&&6>=t?" வைகறை":void 0},week:{dow:0,doy:6}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิกา m นาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiem:function(t){return 12>t?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM DD, YYYY LT"},calendar:{sameDay:"[Ngayon sa] LT",nextDay:"[Bukas sa] LT",nextWeek:"dddd [sa] LT",lastDay:"[Kahapon sa] LT",lastWeek:"dddd [huling linggo] LT",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},ordinal:function(t){return t},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return t.lang("tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(t){if(0===t)return t+"'ıncı";var i=t%10,s=t%100-i,n=t>=100?100:null;return t+(e[i]||e[s]||e[n])},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuḍ",mm:"%d minuḍ",h:"saɛa",hh:"%d tassaɛin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("tzm",{months:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),monthsShort:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ⴰⵙⴷⵅ ⴴ] LT",nextDay:"[ⴰⵙⴽⴰ ⴴ] LT",nextWeek:"dddd [ⴴ] LT",lastDay:"[ⴰⵚⴰⵏⵜ ⴴ] LT",lastWeek:"dddd [ⴴ] LT",sameElse:"L"},relativeTime:{future:"ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",past:"ⵢⴰⵏ %s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉⵏⵓⴺ",mm:"%d ⵎⵉⵏⵓⴺ",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉⵏ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰⵏ",M:"ⴰⵢoⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔⵏ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙⵏ"},week:{dow:6,doy:12}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e){var i=t.split("_");return e%10===1&&e%100!==11?i[0]:e%10>=2&&4>=e%10&&(10>e%100||e%100>=20)?i[1]:i[2]}function i(t,i,s){var n={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===s?i?"хвилина":"хвилину":"h"===s?i?"година":"годину":t+" "+e(n[s],+t)}function s(t,e){var i={nominative:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_"),accusative:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_")},s=/D[oD]? *MMMM?/.test(e)?"accusative":"nominative";return i[s][t.month()]}function n(t,e){var i={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")},s=/(\[[ВвУу]\]) ?dddd/.test(e)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(e)?"genitive":"nominative";return i[s][t.day()]}function o(t){return function(){return t+"о"+(11===this.hours()?"б":"")+"] LT"}}return t.lang("uk",{months:s,monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:n,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., LT",LLLL:"dddd, D MMMM YYYY р., LT"},calendar:{sameDay:o("[Сьогодні "),nextDay:o("[Завтра "),lastDay:o("[Вчора "),nextWeek:o("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return o("[Минулої] dddd [").call(this);case 1:case 2:case 4:return o("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",m:i,mm:i,h:"годину",hh:i,d:"день",dd:i,M:"місяць",MM:i,y:"рік",yy:i},meridiem:function(t){return 4>t?"ночі":12>t?"ранку":17>t?"дня":"вечора"},ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t+"-й";case"D":return t+"-го";default:return t}},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("uz",{months:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"D MMMM YYYY, dddd LT"},calendar:{sameDay:"[Бугун соат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни соат] LT [да]",lastDay:"[Кеча соат] LT [да]",lastWeek:"[Утган] dddd [куни соат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурсат",m:"бир дакика",mm:"%d дакика",h:"бир соат",hh:"%d соат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},ordinal:function(t){return t},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日LT",LLLL:"YYYY年MMMD日ddddLT",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日LT",llll:"YYYY年MMMD日ddddLT"},meridiem:function(t,e){var i=100*t+e;return 600>i?"凌晨":900>i?"早上":1130>i?"上午":1230>i?"中午":1800>i?"下午":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var e,i;return e=t().startOf("week"),i=this.unix()-e.unix()>=604800?"[下]":"[本]",0===this.minutes()?i+"dddAh点整":i+"dddAh点mm"},lastWeek:function(){var e,i;return e=t().startOf("week"),i=this.unix()i?"早上":1130>i?"上午":1230>i?"中午":1800>i?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"日";case"M":return t+"月";case"w":case"W":return t+"週";default:return t}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"一分鐘",mm:"%d分鐘",h:"一小時",hh:"%d小時",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%d年"}})})},function(t){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}}])}); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):"object"==typeof exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function e(s){if(i[s])return i[s].exports;var n=i[s]={exports:{},id:s,loaded:!1};return t[s].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){e.util=i(1),e.DOMutil=i(2),e.DataSet=i(3),e.DataView=i(4),e.Graph3d=i(5),e.Timeline=i(6),e.Graph2d=i(7),e.timeline={DataStep:i(8),Range:i(9),stack:i(10),TimeStep:i(11),components:{items:{Item:i(22),ItemBox:i(23),ItemPoint:i(24),ItemRange:i(25)},Component:i(12),CurrentTime:i(13),CustomTime:i(14),DataAxis:i(15),GraphGroup:i(16),Group:i(17),ItemSet:i(18),Legend:i(19),LineGraph:i(20),TimeAxis:i(21)}},e.Network=i(26),e.network={Edge:i(27),Groups:i(28),Images:i(29),Node:i(30),Popup:i(31),dotparser:i(32)},e.Graph=function(){throw new Error("Graph is renamed to Network. Please create a graph as new vis.Network(...)")}},function(module,exports,__webpack_require__){var Hammer=__webpack_require__(38),moment=__webpack_require__(39);exports.isNumber=function(t){return t instanceof Number||"number"==typeof t},exports.isString=function(t){return t instanceof String||"string"==typeof t},exports.isDate=function(t){if(t instanceof Date)return!0;if(exports.isString(t)){var e=ASPDateRegex.exec(t);if(e)return!0;if(!isNaN(Date.parse(t)))return!0}return!1},exports.isDataTable=function(t){return"undefined"!=typeof google&&google.visualization&&google.visualization.DataTable&&t instanceof google.visualization.DataTable},exports.randomUUID=function(){var t=function(){return Math.floor(65536*Math.random()).toString(16)};return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},exports.extend=function(t){for(var e=1,i=arguments.length;i>e;e++){var s=arguments[e];for(var n in s)s.hasOwnProperty(n)&&(t[n]=s[n])}return t},exports.selectiveExtend=function(t,e){if(!Array.isArray(t))throw new Error("Array with property names expected as first argument");for(var i=2;ii;i++)if(t[i]!=e[i])return!1;return!0},exports.convert=function(t,e){var i;if(void 0===t)return void 0;if(null===t)return null;if(!e)return t;if("string"!=typeof e&&!(e instanceof String))throw new Error("Type must be a string");switch(e){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(moment.isMoment(t))return new Date(t.valueOf());if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])):moment(t).toDate();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"Moment":if(exports.isNumber(t))return moment(t);if(t instanceof Date)return moment(t.valueOf());if(moment.isMoment(t))return moment(t);if(exports.isString(t))return i=ASPDateRegex.exec(t),moment(i?Number(i[1]):t);throw new Error("Cannot convert object of type "+exports.getType(t)+" to type Date");case"ISODate":if(exports.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(moment.isMoment(t))return t.toDate().toISOString();if(exports.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])).toISOString():new Date(t).toISOString();throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ISODate");case"ASPDate":if(exports.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(exports.isString(t)){i=ASPDateRegex.exec(t);var s;return s=i?new Date(Number(i[1])).valueOf():new Date(t).valueOf(),"/Date("+s+")/"}throw new Error("Cannot convert object of type "+exports.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+e+'"')}};var ASPDateRegex=/^\/?Date\((\-?\d+)/i;exports.getType=function(t){var e=typeof t;return"object"==e?null==t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":t instanceof Array?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":e},exports.getAbsoluteLeft=function(t){for(var e=document.documentElement,i=document.body,s=t.offsetLeft,n=t.offsetParent;null!=n&&n!=i&&n!=e;)s+=n.offsetLeft,s-=n.scrollLeft,n=n.offsetParent;return s},exports.getAbsoluteTop=function(t){for(var e=document.documentElement,i=document.body,s=t.offsetTop,n=t.offsetParent;null!=n&&n!=i&&n!=e;)s+=n.offsetTop,s-=n.scrollTop,n=n.offsetParent;return s},exports.getPageY=function(t){if("pageY"in t)return t.pageY;var e;e="targetTouches"in t&&t.targetTouches.length?t.targetTouches[0].clientY:t.clientY;var i=document.documentElement,s=document.body;return e+(i&&i.scrollTop||s&&s.scrollTop||0)-(i&&i.clientTop||s&&s.clientTop||0)},exports.getPageX=function(t){if("pageY"in t)return t.pageX;var e;e="targetTouches"in t&&t.targetTouches.length?t.targetTouches[0].clientX:t.clientX;var i=document.documentElement,s=document.body;return e+(i&&i.scrollLeft||s&&s.scrollLeft||0)-(i&&i.clientLeft||s&&s.clientLeft||0)},exports.addClassName=function(t,e){var i=t.className.split(" ");-1==i.indexOf(e)&&(i.push(e),t.className=i.join(" "))},exports.removeClassName=function(t,e){var i=t.className.split(" "),s=i.indexOf(e);-1!=s&&(i.splice(s,1),t.className=i.join(" "))},exports.forEach=function(t,e){var i,s;if(t instanceof Array)for(i=0,s=t.length;s>i;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},exports.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},exports.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},exports.addEventListener=function(t,e,i,s){t.addEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,s)):t.attachEvent("on"+e,i)},exports.removeEventListener=function(t,e,i,s){t.removeEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,s)):t.detachEvent("on"+e,i)},exports.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},exports.fakeGesture=function(t,e){var i=null,s=Hammer.event.collectEventData(this,i,e);return isNaN(s.center.pageX)&&(s.center.pageX=e.pageX),isNaN(s.center.pageY)&&(s.center.pageY=e.pageY),s},exports.option={},exports.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},exports.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},exports.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},exports.option.asSize=function(t,e){return"function"==typeof t&&(t=t()),exports.isString(t)?t:exports.isNumber(t)?t+"px":e||null},exports.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},exports.GiveDec=function(Hex){var Value;return Value="A"==Hex?10:"B"==Hex?11:"C"==Hex?12:"D"==Hex?13:"E"==Hex?14:"F"==Hex?15:eval(Hex)},exports.GiveHex=function(t){var e;return e=10==t?"A":11==t?"B":12==t?"C":13==t?"D":14==t?"E":15==t?"F":""+t},exports.parseColor=function(t){var e;if(exports.isString(t))if(exports.isValidHex(t)){var i=exports.hexToHSV(t),s={h:i.h,s:.45*i.s,v:Math.min(1,1.05*i.v)},n={h:i.h,s:Math.min(1,1.25*i.v),v:.6*i.v},o=exports.HSVToHex(n.h,n.h,n.v),r=exports.HSVToHex(s.h,s.s,s.v);e={background:t,border:o,highlight:{background:r,border:o},hover:{background:r,border:o}}}else e={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}};else e={},e.background=t.background||"white",e.border=t.border||e.background,exports.isString(t.highlight)?e.highlight={border:t.highlight,background:t.highlight}:(e.highlight={},e.highlight.background=t.highlight&&t.highlight.background||e.background,e.highlight.border=t.highlight&&t.highlight.border||e.border),exports.isString(t.hover)?e.hover={border:t.hover,background:t.hover}:(e.hover={},e.hover.background=t.hover&&t.hover.background||e.background,e.hover.border=t.hover&&t.hover.border||e.border);return e},exports.hexToRGB=function(t){t=t.replace("#","").toUpperCase();var e=exports.GiveDec(t.substring(0,1)),i=exports.GiveDec(t.substring(1,2)),s=exports.GiveDec(t.substring(2,3)),n=exports.GiveDec(t.substring(3,4)),o=exports.GiveDec(t.substring(4,5)),r=exports.GiveDec(t.substring(5,6)),a=16*e+i,h=16*s+n,i=16*o+r;return{r:a,g:h,b:i}},exports.RGBToHex=function(t,e,i){var s=exports.GiveHex(Math.floor(t/16)),n=exports.GiveHex(t%16),o=exports.GiveHex(Math.floor(e/16)),r=exports.GiveHex(e%16),a=exports.GiveHex(Math.floor(i/16)),h=exports.GiveHex(i%16),d=s+n+o+r+a+h;return"#"+d},exports.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var s=Math.min(t,Math.min(e,i)),n=Math.max(t,Math.max(e,i));if(s==n)return{h:0,s:0,v:s};var o=t==s?e-i:i==s?t-e:i-t,r=t==s?3:i==s?1:5,a=60*(r-o/(n-s))/360,h=(n-s)/n,d=n;return{h:a,s:h,v:d}},exports.HSVToRGB=function(t,e,i){var s,n,o,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:s=i,n=l,o=h;break;case 1:s=d,n=i,o=h;break;case 2:s=h,n=i,o=l;break;case 3:s=h,n=d,o=i;break;case 4:s=l,n=h,o=i;break;case 5:s=i,n=h,o=d}return{r:Math.floor(255*s),g:Math.floor(255*n),b:Math.floor(255*o)}},exports.HSVToHex=function(t,e,i){var s=exports.HSVToRGB(t,e,i);return exports.RGBToHex(s.r,s.g,s.b)},exports.hexToHSV=function(t){var e=exports.hexToRGB(t);return exports.RGBToHSV(e.r,e.g,e.b)},exports.isValidHex=function(t){var e=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t);return e},exports.selectiveBridgeObject=function(t,e){if("object"==typeof e){for(var i=Object.create(e),s=0;so&&r>e||e>r&&a>e?(d=!0,r!=e&&("before"==s?e>o&&r>e&&(m=Math.max(0,m-1)):e>r&&a>e&&(m=Math.min(h.length-1,m+1)))):(e>r?l=Math.floor(.5*(c+l)):c=Math.floor(.5*(c+l)),n=Math.floor(.5*(c+l)),l==u&&c==p?(m=-1,d=!0):(c=p,l=u,m=Math.floor(.5*(c+l))));return m}},function(t,e){e.prepareElements=function(t){for(var e in t)t.hasOwnProperty(e)&&(t[e].redundant=t[e].used,t[e].used=[])},e.cleanupElements=function(t){for(var e in t)if(t.hasOwnProperty(e)&&t[e].redundant){for(var i=0;i0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(s)):(s=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.getDOMElement=function(t,e,i){var s;return e.hasOwnProperty(t)?e[t].redundant.length>0?(s=e[t].redundant[0],e[t].redundant.shift()):(s=document.createElement(t),i.appendChild(s)):(s=document.createElement(t),e[t]={used:[],redundant:[]},i.appendChild(s)),e[t].used.push(s),s},e.drawPoint=function(t,i,s,n,o){var r;return"circle"==s.options.drawPoints.style?(r=e.getSVGElement("circle",n,o),r.setAttributeNS(null,"cx",t),r.setAttributeNS(null,"cy",i),r.setAttributeNS(null,"r",.5*s.options.drawPoints.size),r.setAttributeNS(null,"class",s.className+" point")):(r=e.getSVGElement("rect",n,o),r.setAttributeNS(null,"x",t-.5*s.options.drawPoints.size),r.setAttributeNS(null,"y",i-.5*s.options.drawPoints.size),r.setAttributeNS(null,"width",s.options.drawPoints.size),r.setAttributeNS(null,"height",s.options.drawPoints.size),r.setAttributeNS(null,"class",s.className+" point")),r},e.drawBar=function(t,i,s,n,o,r,a){var h=e.getSVGElement("rect",r,a);h.setAttributeNS(null,"x",t-.5*s),h.setAttributeNS(null,"y",i),h.setAttributeNS(null,"width",s),h.setAttributeNS(null,"height",n),h.setAttributeNS(null,"class",o)}},function(t,e,i){function s(t,e){if(!t||Array.isArray(t)||n.isDataTable(t)||(e=t,t=null),this._options=e||{},this._data={},this._fieldId=this._options.fieldId||"id",this._type={},this._options.type)for(var i in this._options.type)if(this._options.type.hasOwnProperty(i)){var s=this._options.type[i];this._type[i]="Date"==s||"ISODate"==s||"ASPDate"==s?"Date":s}if(this._options.convert)throw new Error('Option "convert" is deprecated. Use "type" instead.');this._subscribers={},t&&this.add(t)}var n=i(1);s.prototype.on=function(t,e){var i=this._subscribers[t];i||(i=[],this._subscribers[t]=i),i.push({callback:e})},s.prototype.subscribe=s.prototype.on,s.prototype.off=function(t,e){var i=this._subscribers[t];i&&(this._subscribers[t]=i.filter(function(t){return t.callback!=e}))},s.prototype.unsubscribe=s.prototype.off,s.prototype._trigger=function(t,e,i){if("*"==t)throw new Error("Cannot trigger event *");var s=[];t in this._subscribers&&(s=s.concat(this._subscribers[t])),"*"in this._subscribers&&(s=s.concat(this._subscribers["*"]));for(var n=0;nr;r++)i=o._addItem(t[r]),s.push(i);else if(n.isDataTable(t))for(var h=this._getColumnNames(t),d=0,l=t.getNumberOfRows();l>d;d++){for(var c={},u=0,p=h.length;p>u;u++){var m=h[u];c[m]=t.getValue(d,u)}i=o._addItem(c),s.push(i)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=o._addItem(t),s.push(i)}return s.length&&this._trigger("add",{items:s},e),s},s.prototype.update=function(t,e){var i=[],s=[],o=this,r=o._fieldId,a=function(t){var e=t[r];o._data[e]?(e=o._updateItem(t),s.push(e)):(e=o._addItem(t),i.push(e))};if(Array.isArray(t))for(var h=0,d=t.length;d>h;h++)a(t[h]);else if(n.isDataTable(t))for(var l=this._getColumnNames(t),c=0,u=t.getNumberOfRows();u>c;c++){for(var p={},m=0,_=l.length;_>m;m++){var f=l[m];p[f]=t.getValue(c,m)}a(p)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");a(t)}return i.length&&this._trigger("add",{items:i},e),s.length&&this._trigger("update",{items:s},e),i.concat(s)},s.prototype.get=function(){var t,e,i,s,o=this,r=n.getType(arguments[0]);"String"==r||"Number"==r?(t=arguments[0],i=arguments[1],s=arguments[2]):"Array"==r?(e=arguments[0],i=arguments[1],s=arguments[2]):(i=arguments[0],s=arguments[1]);var a;if(i&&i.returnType){if(a="DataTable"==i.returnType?"DataTable":"Array",s&&a!=n.getType(s))throw new Error('Type of parameter "data" ('+n.getType(s)+") does not correspond with specified options.type ("+i.type+")");if("DataTable"==a&&!n.isDataTable(s))throw new Error('Parameter "data" must be a DataTable when options.type is "DataTable"')}else a=s&&"DataTable"==n.getType(s)?"DataTable":"Array";var h,d,l,c,u=i&&i.type||this._options.type,p=i&&i.filter,m=[];if(void 0!=t)h=o._getItem(t,u),p&&!p(h)&&(h=null);else if(void 0!=e)for(l=0,c=e.length;c>l;l++)h=o._getItem(e[l],u),(!p||p(h))&&m.push(h);else for(d in this._data)this._data.hasOwnProperty(d)&&(h=o._getItem(d,u),(!p||p(h))&&m.push(h));if(i&&i.order&&void 0==t&&this._sort(m,i.order),i&&i.fields){var _=i.fields;if(void 0!=t)h=this._filterFields(h,_);else for(l=0,c=m.length;c>l;l++)m[l]=this._filterFields(m[l],_)}if("DataTable"==a){var f=this._getColumnNames(s);if(void 0!=t)o._appendRow(s,f,h);else for(l=0,c=m.length;c>l;l++)o._appendRow(s,f,m[l]);return s}if(void 0!=t)return h;if(s){for(l=0,c=m.length;c>l;l++)s.push(m[l]);return s}return m},s.prototype.getIds=function(t){var e,i,s,n,o,r=this._data,a=t&&t.filter,h=t&&t.order,d=t&&t.type||this._options.type,l=[];if(a)if(h){o=[];for(s in r)r.hasOwnProperty(s)&&(n=this._getItem(s,d),a(n)&&o.push(n));for(this._sort(o,h),e=0,i=o.length;i>e;e++)l[e]=o[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(n=this._getItem(s,d),a(n)&&l.push(n[this._fieldId]));else if(h){o=[];for(s in r)r.hasOwnProperty(s)&&o.push(r[s]);for(this._sort(o,h),e=0,i=o.length;i>e;e++)l[e]=o[e][this._fieldId]}else for(s in r)r.hasOwnProperty(s)&&(n=r[s],l.push(n[this._fieldId]));return l},s.prototype.getDataSet=function(){return this},s.prototype.forEach=function(t,e){var i,s,n=e&&e.filter,o=e&&e.type||this._options.type,r=this._data;if(e&&e.order)for(var a=this.get(e),h=0,d=a.length;d>h;h++)i=a[h],s=i[this._fieldId],t(i,s);else for(s in r)r.hasOwnProperty(s)&&(i=this._getItem(s,o),(!n||n(i))&&t(i,s))},s.prototype.map=function(t,e){var i,s=e&&e.filter,n=e&&e.type||this._options.type,o=[],r=this._data;for(var a in r)r.hasOwnProperty(a)&&(i=this._getItem(a,n),(!s||s(i))&&o.push(t(i,a)));return e&&e.order&&this._sort(o,e.order),o},s.prototype._filterFields=function(t,e){var i={};for(var s in t)t.hasOwnProperty(s)&&-1!=e.indexOf(s)&&(i[s]=t[s]);return i},s.prototype._sort=function(t,e){if(n.isString(e)){var i=e;t.sort(function(t,e){var s=t[i],n=e[i];return s>n?1:n>s?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},s.prototype.remove=function(t,e){var i,s,n,o=[];if(Array.isArray(t))for(i=0,s=t.length;s>i;i++)n=this._remove(t[i]),null!=n&&o.push(n);else n=this._remove(t),null!=n&&o.push(n);return o.length&&this._trigger("remove",{items:o},e),o},s.prototype._remove=function(t){if(n.isNumber(t)||n.isString(t)){if(this._data[t])return delete this._data[t],t}else if(t instanceof Object){var e=t[this._fieldId];if(e&&this._data[e])return delete this._data[e],e}return null},s.prototype.clear=function(t){var e=Object.keys(this._data);return this._data={},this._trigger("remove",{items:e},t),e},s.prototype.max=function(t){var e=this._data,i=null,s=null;for(var n in e)if(e.hasOwnProperty(n)){var o=e[n],r=o[t];null!=r&&(!i||r>s)&&(i=o,s=r)}return i},s.prototype.min=function(t){var e=this._data,i=null,s=null;for(var n in e)if(e.hasOwnProperty(n)){var o=e[n],r=o[t];null!=r&&(!i||s>r)&&(i=o,s=r)}return i},s.prototype.distinct=function(t){var e,i=this._data,s=[],o=this._options.type&&this._options.type[t]||null,r=0;for(var a in i)if(i.hasOwnProperty(a)){var h=i[a],d=h[t],l=!1;for(e=0;r>e;e++)if(s[e]==d){l=!0;break}l||void 0===d||(s[r]=d,r++)}if(o)for(e=0;ei;i++)e[i]=t.getColumnId(i)||t.getColumnLabel(i);return e},s.prototype._appendRow=function(t,e,i){for(var s=t.addRow(),n=0,o=e.length;o>n;n++){var r=e[n];t.setValue(s,n,i[r])}},t.exports=s},function(t,e,i){function s(t,e){this._data=null,this._ids={},this._options=e||{},this._fieldId="id",this._subscribers={};var i=this;this.listener=function(){i._onEvent.apply(i,arguments)},this.setData(t)}var n=i(1),o=i(3);s.prototype.setData=function(t){var e,i,s;if(this._data){this._data.unsubscribe&&this._data.unsubscribe("*",this.listener),e=[];for(var n in this._ids)this._ids.hasOwnProperty(n)&&e.push(n);this._ids={},this._trigger("remove",{items:e})}if(this._data=t,this._data){for(this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||"id",e=this._data.getIds({filter:this._options&&this._options.filter}),i=0,s=e.length;s>i;i++)n=e[i],this._ids[n]=!0;this._trigger("add",{items:e}),this._data.on&&this._data.on("*",this.listener)}},s.prototype.get=function(){var t,e,i,s=this,o=n.getType(arguments[0]);"String"==o||"Number"==o||"Array"==o?(t=arguments[0],e=arguments[1],i=arguments[2]):(e=arguments[0],i=arguments[1]);var r=n.extend({},this._options,e);this._options.filter&&e&&e.filter&&(r.filter=function(t){return s._options.filter(t)&&e.filter(t)});var a=[];return void 0!=t&&a.push(t),a.push(r),a.push(i),this._data&&this._data.get.apply(this._data,a)},s.prototype.getIds=function(t){var e;if(this._data){var i,s=this._options.filter;i=t&&t.filter?s?function(e){return s(e)&&t.filter(e)}:t.filter:s,e=this._data.getIds({filter:i,order:t&&t.order})}else e=[];return e},s.prototype.getDataSet=function(){for(var t=this;t instanceof s;)t=t._data;return t||null},s.prototype._onEvent=function(t,e,i){var s,n,o,r,a=e&&e.items,h=this._data,d=[],l=[],c=[];if(a&&h){switch(t){case"add":for(s=0,n=a.length;n>s;s++)o=a[s],r=this.get(o),r&&(this._ids[o]=!0,d.push(o));break;case"update":for(s=0,n=a.length;n>s;s++)o=a[s],r=this.get(o),r?this._ids[o]?l.push(o):(this._ids[o]=!0,d.push(o)):this._ids[o]&&(delete this._ids[o],c.push(o));break;case"remove":for(s=0,n=a.length;n>s;s++)o=a[s],this._ids[o]&&(delete this._ids[o],c.push(o))}d.length&&this._trigger("add",{items:d},i),l.length&&this._trigger("update",{items:l},i),c.length&&this._trigger("remove",{items:c},i)}},s.prototype.on=o.prototype.on,s.prototype.off=o.prototype.off,s.prototype._trigger=o.prototype._trigger,s.prototype.subscribe=s.prototype.on,s.prototype.unsubscribe=s.prototype.off,t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.width="400px",this.height="400px",this.margin=10,this.defaultXCenter="55%",this.defaultYCenter="50%",this.xLabel="x",this.yLabel="y",this.zLabel="z",this.filterLabel="time",this.legendLabel="value",this.style=s.STYLE.DOT,this.showPerspective=!0,this.showGrid=!0,this.keepAspectRatio=!0,this.showShadow=!1,this.showGrayBottom=!1,this.showTooltip=!1,this.verticalRatio=.5,this.animationInterval=1e3,this.animationPreload=!1,this.camera=new s.Camera,this.eye=new h(0,0,-1),this.dataTable=null,this.dataPoints=null,this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.colFilter=void 0,this.xMin=0,this.xStep=void 0,this.xMax=1,this.yMin=0,this.yStep=void 0,this.yMax=1,this.zMin=0,this.zStep=void 0,this.zMax=1,this.valueMin=0,this.valueMax=1,this.xBarWidth=1,this.yBarWidth=1,this.colorAxis="#4D4D4D",this.colorGrid="#D3D3D3",this.colorDot="#7DC1FF",this.colorDotBorder="#3267D2",this.create(),this.setOptions(i),e&&this.setData(e)}function n(t,e){if(void 0===t)throw"Error: No container element defined";if(this.container=t,this.visible=e&&void 0!=e.visible?e.visible:!0,this.visible){this.frame=document.createElement("DIV"),this.frame.style.width="100%",this.frame.style.position="relative",this.container.appendChild(this.frame),this.frame.prev=document.createElement("INPUT"),this.frame.prev.type="BUTTON",this.frame.prev.value="Prev",this.frame.appendChild(this.frame.prev),this.frame.play=document.createElement("INPUT"),this.frame.play.type="BUTTON",this.frame.play.value="Play",this.frame.appendChild(this.frame.play),this.frame.next=document.createElement("INPUT"),this.frame.next.type="BUTTON",this.frame.next.value="Next",this.frame.appendChild(this.frame.next),this.frame.bar=document.createElement("INPUT"),this.frame.bar.type="BUTTON",this.frame.bar.style.position="absolute",this.frame.bar.style.border="1px solid red",this.frame.bar.style.width="100px",this.frame.bar.style.height="6px",this.frame.bar.style.borderRadius="2px",this.frame.bar.style.MozBorderRadius="2px",this.frame.bar.style.border="1px solid #7F7F7F",this.frame.bar.style.backgroundColor="#E5E5E5",this.frame.appendChild(this.frame.bar),this.frame.slide=document.createElement("INPUT"),this.frame.slide.type="BUTTON",this.frame.slide.style.margin="0px",this.frame.slide.value=" ",this.frame.slide.style.position="relative",this.frame.slide.style.left="-100px",this.frame.appendChild(this.frame.slide);var i=this;this.frame.slide.onmousedown=function(t){i._onMouseDown(t)},this.frame.prev.onclick=function(t){i.prev(t)},this.frame.play.onclick=function(t){i.togglePlay(t)},this.frame.next.onclick=function(t){i.next(t)}}this.onChangeCallback=void 0,this.values=[],this.index=void 0,this.playTimeout=void 0,this.playInterval=1e3,this.playLoop=!0}var o=i(41),r=i(3),a=i(4),h=i(33),d=i(34),l=i(35),c=i(36);o(s.prototype),s.Camera=function(){this.armLocation=new h,this.armRotation={},this.armRotation.horizontal=0,this.armRotation.vertical=0,this.armLength=1.7,this.cameraLocation=new h,this.cameraRotation=new h(.5*Math.PI,0,0),this.calculateCameraOrientation()},s.Camera.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},s.Camera.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),(void 0!==t||void 0!==e)&&this.calculateCameraOrientation()},s.Camera.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},s.Camera.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.calculateCameraOrientation())},s.Camera.prototype.getArmLength=function(){return this.armLength},s.Camera.prototype.getCameraLocation=function(){return this.cameraLocation},s.Camera.prototype.getCameraRotation=function(){return this.cameraRotation},s.Camera.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal},s.prototype._setScale=function(){this.scale=new h(1/(this.xMax-this.xMin),1/(this.yMax-this.yMin),1/(this.zMax-this.zMin)),this.keepAspectRatio&&(this.scale.x3&&(this.colFilter=3);else{if(this.style!==s.STYLE.DOTCOLOR&&this.style!==s.STYLE.DOTSIZE&&this.style!==s.STYLE.BARCOLOR&&this.style!==s.STYLE.BARSIZE)throw'Unknown style "'+this.style+'"';this.colX=0,this.colY=1,this.colZ=2,this.colValue=3,t.getNumberOfColumns()>4&&(this.colFilter=4)}},s.prototype.getNumberOfRows=function(t){return t.length},s.prototype.getNumberOfColumns=function(t){var e=0;for(var i in t[0])t[0].hasOwnProperty(i)&&e++;return e},s.prototype.getDistinctValues=function(t,e){for(var i=[],s=0;st[s][e]&&(i.min=t[s][e]),i.maxt;t++){var _=(t-p)/(m-p),f=240*_,g=this._hsv2rgb(f,1,1);u.strokeStyle=g,u.beginPath(),u.moveTo(h,r+t),u.lineTo(a,r+t),u.stroke()}u.strokeStyle=this.colorAxis,u.strokeRect(h,r,i,o)}if(this.style===s.STYLE.DOTSIZE&&(u.strokeStyle=this.colorAxis,u.fillStyle=this.colorDot,u.beginPath(),u.moveTo(h,r),u.lineTo(a,r),u.lineTo(a-i+e,d),u.lineTo(h,d),u.closePath(),u.fill(),u.stroke()),this.style===s.STYLE.DOTCOLOR||this.style===s.STYLE.DOTSIZE){var y=5,v=new c(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,!0);for(v.start(),v.getCurrent()0?this.yMin:this.yMax,n=this._convert3Dto2D(new h(b,r,this.zMin)),Math.cos(2*M)>0?(f.textAlign="center",f.textBaseline="top",n.y+=v):Math.sin(2*M)<0?(f.textAlign="right",f.textBaseline="middle"):(f.textAlign="left",f.textBaseline="middle"),f.fillStyle=this.colorAxis,f.fillText(" "+i.getCurrent()+" ",n.x,n.y),i.next()}for(f.lineWidth=1,s=void 0===this.defaultYStep,i=new c(this.yMin,this.yMax,this.yStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,n=this._convert3Dto2D(new h(o,i.getCurrent(),this.zMin)),Math.cos(2*M)<0?(f.textAlign="center",f.textBaseline="top",n.y+=v):Math.sin(2*M)>0?(f.textAlign="right",f.textBaseline="middle"):(f.textAlign="left",f.textBaseline="middle"),f.fillStyle=this.colorAxis,f.fillText(" "+i.getCurrent()+" ",n.x,n.y),i.next();for(f.lineWidth=1,s=void 0===this.defaultZStep,i=new c(this.zMin,this.zMax,this.zStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,r=Math.sin(M)<0?this.yMin:this.yMax;!i.end();)t=this._convert3Dto2D(new h(o,r,i.getCurrent())),f.strokeStyle=this.colorAxis,f.beginPath(),f.moveTo(t.x,t.y),f.lineTo(t.x-v,t.y),f.stroke(),f.textAlign="right",f.textBaseline="middle",f.fillStyle=this.colorAxis,f.fillText(i.getCurrent()+" ",t.x-5,t.y),i.next();f.lineWidth=1,t=this._convert3Dto2D(new h(o,r,this.zMin)),e=this._convert3Dto2D(new h(o,r,this.zMax)),f.strokeStyle=this.colorAxis,f.beginPath(),f.moveTo(t.x,t.y),f.lineTo(e.x,e.y),f.stroke(),f.lineWidth=1,p=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),m=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),f.strokeStyle=this.colorAxis,f.beginPath(),f.moveTo(p.x,p.y),f.lineTo(m.x,m.y),f.stroke(),p=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),m=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),f.strokeStyle=this.colorAxis,f.beginPath(),f.moveTo(p.x,p.y),f.lineTo(m.x,m.y),f.stroke(),f.lineWidth=1,t=this._convert3Dto2D(new h(this.xMin,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMin,this.yMax,this.zMin)),f.strokeStyle=this.colorAxis,f.beginPath(),f.moveTo(t.x,t.y),f.lineTo(e.x,e.y),f.stroke(),t=this._convert3Dto2D(new h(this.xMax,this.yMin,this.zMin)),e=this._convert3Dto2D(new h(this.xMax,this.yMax,this.zMin)),f.strokeStyle=this.colorAxis,f.beginPath(),f.moveTo(t.x,t.y),f.lineTo(e.x,e.y),f.stroke();var w=this.xLabel;w.length>0&&(u=.1/this.scale.y,o=(this.xMin+this.xMax)/2,r=Math.cos(M)>0?this.yMin-u:this.yMax+u,n=this._convert3Dto2D(new h(o,r,this.zMin)),Math.cos(2*M)>0?(f.textAlign="center",f.textBaseline="top"):Math.sin(2*M)<0?(f.textAlign="right",f.textBaseline="middle"):(f.textAlign="left",f.textBaseline="middle"),f.fillStyle=this.colorAxis,f.fillText(w,n.x,n.y));var L=this.yLabel;L.length>0&&(l=.1/this.scale.x,o=Math.sin(M)>0?this.xMin-l:this.xMax+l,r=(this.yMin+this.yMax)/2,n=this._convert3Dto2D(new h(o,r,this.zMin)),Math.cos(2*M)<0?(f.textAlign="center",f.textBaseline="top"):Math.sin(2*M)>0?(f.textAlign="right",f.textBaseline="middle"):(f.textAlign="left",f.textBaseline="middle"),f.fillStyle=this.colorAxis,f.fillText(L,n.x,n.y));var x=this.zLabel;x.length>0&&(d=30,o=Math.cos(M)>0?this.xMin:this.xMax,r=Math.sin(M)<0?this.yMin:this.yMax,a=(this.zMin+this.zMax)/2,n=this._convert3Dto2D(new h(o,r,a)),f.textAlign="right",f.textBaseline="middle",f.fillStyle=this.colorAxis,f.fillText(x,n.x-d,n.y))},s.prototype._hsv2rgb=function(t,e,i){var s,n,o,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:s=r,n=h,o=0;break;case 1:s=h,n=r,o=0;break;case 2:s=0,n=r,o=h;break;case 3:s=0,n=h,o=r;break;case 4:s=h,n=0,o=r;break;case 5:s=r,n=0,o=h;break;default:s=0,n=0,o=0}return"RGB("+parseInt(255*s)+","+parseInt(255*n)+","+parseInt(255*o)+")"},s.prototype._redrawDataGrid=function(){var t,e,i,n,o,r,a,d,l,c,u,p,m,_=this.frame.canvas,f=_.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(o=0;o0}else r=!0;r?(m=(t.point.z+e.point.z+i.point.z+n.point.z)/4,c=240*(1-(m-this.zMin)*this.scale.z/this.verticalRatio),u=1,this.showShadow?(p=Math.min(1+L.x/x/2,1),a=this._hsv2rgb(c,u,p),d=a):(p=1,a=this._hsv2rgb(c,u,p),d=this.colorAxis)):(a="gray",d=this.colorAxis),l=.5,f.lineWidth=l,f.fillStyle=a,f.strokeStyle=d,f.beginPath(),f.moveTo(t.screen.x,t.screen.y),f.lineTo(e.screen.x,e.screen.y),f.lineTo(n.screen.x,n.screen.y),f.lineTo(i.screen.x,i.screen.y),f.closePath(),f.fill(),f.stroke()}}else for(o=0;ou&&(u=0);var p,m,_;this.style===s.STYLE.DOTCOLOR?(p=240*(1-(d.point.value-this.valueMin)*this.scale.value),m=this._hsv2rgb(p,1,1),_=this._hsv2rgb(p,1,.8)):this.style===s.STYLE.DOTSIZE?(m=this.colorDot,_=this.colorDotBorder):(p=240*(1-(d.point.z-this.zMin)*this.scale.z/this.verticalRatio),m=this._hsv2rgb(p,1,1),_=this._hsv2rgb(p,1,.8)),i.lineWidth=1,i.strokeStyle=_,i.fillStyle=m,i.beginPath(),i.arc(d.screen.x,d.screen.y,u,0,2*Math.PI,!0),i.fill(),i.stroke()}}},s.prototype._redrawDataBar=function(){var t,e,i,n,o=this.frame.canvas,r=o.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(t=0;t0&&(t=this.dataPoints[0],s.lineWidth=1,s.strokeStyle="blue",s.beginPath(),s.moveTo(t.screen.x,t.screen.y)),e=1;e0&&s.stroke()}},s.prototype._onMouseDown=function(t){if(t=t||window.event,this.leftButtonDown&&this._onMouseUp(t),this.leftButtonDown=t.which?1===t.which:1===t.button,this.leftButtonDown||this.touchDown){this.startMouseX=getMouseX(t),this.startMouseY=getMouseY(t),this.startStart=new Date(this.start),this.startEnd=new Date(this.end),this.startArmRotation=this.camera.getArmRotation(),this.frame.style.cursor="move";var e=this;this.onmousemove=function(t){e._onMouseMove(t)},this.onmouseup=function(t){e._onMouseUp(t)},G3DaddEventListener(document,"mousemove",e.onmousemove),G3DaddEventListener(document,"mouseup",e.onmouseup),G3DpreventDefault(t)}},s.prototype._onMouseMove=function(t){t=t||window.event;var e=parseFloat(getMouseX(t))-this.startMouseX,i=parseFloat(getMouseY(t))-this.startMouseY,s=this.startArmRotation.horizontal+e/200,n=this.startArmRotation.vertical+i/200,o=4,r=Math.sin(o/360*2*Math.PI);Math.abs(Math.sin(s))0?1:0>t?-1:0}var s=e[0],n=e[1],o=e[2],r=i((n.x-s.x)*(t.y-s.y)-(n.y-s.y)*(t.x-s.x)),a=i((o.x-n.x)*(t.y-n.y)-(o.y-n.y)*(t.x-n.x)),h=i((s.x-o.x)*(t.y-o.y)-(s.y-o.y)*(t.x-o.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},s.prototype._dataPointFromXY=function(t,e){var i,n=100,o=null,r=null,a=null,h=new d(t,e);if(this.style===s.STYLE.BAR||this.style===s.STYLE.BARCOLOR||this.style===s.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){o=this.dataPoints[i];var l=o.surfaces;if(l)for(var c=l.length-1;c>=0;c--){var u=l[c],p=u.corners,m=[p[0].screen,p[1].screen,p[2].screen],_=[p[2].screen,p[3].screen,p[0].screen];if(this._insideTriangle(h,m)||this._insideTriangle(h,_))return o}}else for(i=0;iv)&&n>v&&(a=v,r=o)}}return r},s.prototype._showTooltip=function(t){var e,i,s;this.tooltip?(e=this.tooltip.dom.content,i=this.tooltip.dom.line,s=this.tooltip.dom.dot):(e=document.createElement("div"),e.style.position="absolute",e.style.padding="10px",e.style.border="1px solid #4d4d4d",e.style.color="#1a1a1a",e.style.background="rgba(255,255,255,0.7)",e.style.borderRadius="2px",e.style.boxShadow="5px 5px 10px rgba(128,128,128,0.5)",i=document.createElement("div"),i.style.position="absolute",i.style.height="40px",i.style.width="0",i.style.borderLeft="1px solid #4d4d4d",s=document.createElement("div"),s.style.position="absolute",s.style.height="0",s.style.width="0",s.style.border="5px solid #4d4d4d",s.style.borderRadius="5px",this.tooltip={dataPoint:null,dom:{content:e,line:i,dot:s}}),this._hideTooltip(),this.tooltip.dataPoint=t,e.innerHTML="function"==typeof this.showTooltip?this.showTooltip(t.point):"
x:"+t.point.x+"
y:"+t.point.y+"
z:"+t.point.z+"
",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(s);var n=e.offsetWidth,o=e.offsetHeight,r=i.offsetHeight,a=s.offsetWidth,h=s.offsetHeight,d=t.screen.x-n/2;d=Math.min(Math.max(d,10),this.frame.clientWidth-10-n),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=d+"px",e.style.top=t.screen.y-r-o+"px",s.style.left=t.screen.x-a/2+"px",s.style.top=t.screen.y-h/2+"px"},s.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},G3DaddEventListener=function(t,e,i,s){t.addEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,s)):t.attachEvent("on"+e,i)},G3DremoveEventListener=function(t,e,i,s){t.removeEventListener?(void 0===s&&(s=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,s)):t.detachEvent("on"+e,i)},G3DstopPropagation=function(t){t||(t=window.event),t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},G3DpreventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},n.prototype.prev=function(){var t=this.getIndex();t>0&&(t--,this.setIndex(t))},n.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},n.prototype.setIndex=function(t){if(!(ts&&(s=0),s>this.values.length-1&&(s=this.values.length-1),s},n.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t/(this.values.length-1)*e,s=i+3;return s},n.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,s=this.leftToIndex(i);this.setIndex(s),G3DpreventDefault()},n.prototype._onMouseUp=function(){this.frame.style.cursor="auto",G3DremoveEventListener(document,"mousemove",this.onmousemove),G3DremoveEventListener(document,"mouseup",this.onmouseup),G3DpreventDefault()},getAbsoluteLeft=function(t){for(var e=0;null!==t;)e+=t.offsetLeft,e-=t.scrollLeft,t=t.offsetParent;return e},getAbsoluteTop=function(t){for(var e=0;null!==t;)e+=t.offsetTop,e-=t.scrollTop,t=t.offsetParent;return e},getMouseX=function(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0},getMouseY=function(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0},t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");var n=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:"bottom",width:null,height:null,maxHeight:null,minHeight:null},this.options=r.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},util:{snap:null,toScreen:n._toScreen.bind(n),toGlobalScreen:n._toGlobalScreen.bind(n),toTime:n._toTime.bind(n),toGlobalTime:n._toGlobalTime.bind(n)}},this.range=new d(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new l(this.body),this.components.push(this.timeAxis),this.body.util.snap=this.timeAxis.snap.bind(this.timeAxis),this.currentTime=new c(this.body),this.components.push(this.currentTime),this.customTime=new u(this.body),this.components.push(this.customTime),this.itemSet=new p(this.body),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,i&&this.setOptions(i),e?this.setItems(e):this.redraw()}var n=i(41),o=i(49),r=i(1),a=i(3),h=i(4),d=i(9),l=i(21),c=i(13),u=i(14),p=i(18);n(s.prototype),s.prototype._create=function(t){this.dom={},this.dom.root=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.backgroundVertical=document.createElement("div"),this.dom.backgroundHorizontal=document.createElement("div"),this.dom.centerContainer=document.createElement("div"),this.dom.leftContainer=document.createElement("div"),this.dom.rightContainer=document.createElement("div"),this.dom.center=document.createElement("div"),this.dom.left=document.createElement("div"),this.dom.right=document.createElement("div"),this.dom.top=document.createElement("div"),this.dom.bottom=document.createElement("div"),this.dom.shadowTop=document.createElement("div"),this.dom.shadowBottom=document.createElement("div"),this.dom.shadowTopLeft=document.createElement("div"),this.dom.shadowBottomLeft=document.createElement("div"),this.dom.shadowTopRight=document.createElement("div"),this.dom.shadowBottomRight=document.createElement("div"),this.dom.background.className="vispanel background",this.dom.backgroundVertical.className="vispanel background vertical",this.dom.backgroundHorizontal.className="vispanel background horizontal",this.dom.centerContainer.className="vispanel center",this.dom.leftContainer.className="vispanel left",this.dom.rightContainer.className="vispanel right",this.dom.top.className="vispanel top",this.dom.bottom.className="vispanel bottom",this.dom.left.className="content",this.dom.center.className="content",this.dom.right.className="content",this.dom.shadowTop.className="shadow top",this.dom.shadowBottom.className="shadow bottom",this.dom.shadowTopLeft.className="shadow top",this.dom.shadowBottomLeft.className="shadow bottom",this.dom.shadowTopRight.className="shadow top",this.dom.shadowBottomRight.className="shadow bottom",this.dom.root.appendChild(this.dom.background),this.dom.root.appendChild(this.dom.backgroundVertical),this.dom.root.appendChild(this.dom.backgroundHorizontal),this.dom.root.appendChild(this.dom.centerContainer),this.dom.root.appendChild(this.dom.leftContainer),this.dom.root.appendChild(this.dom.rightContainer),this.dom.root.appendChild(this.dom.top),this.dom.root.appendChild(this.dom.bottom),this.dom.centerContainer.appendChild(this.dom.center),this.dom.leftContainer.appendChild(this.dom.left),this.dom.rightContainer.appendChild(this.dom.right),this.dom.centerContainer.appendChild(this.dom.shadowTop),this.dom.centerContainer.appendChild(this.dom.shadowBottom),this.dom.leftContainer.appendChild(this.dom.shadowTopLeft),this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft),this.dom.rightContainer.appendChild(this.dom.shadowTopRight),this.dom.rightContainer.appendChild(this.dom.shadowBottomRight),this.on("rangechange",this.redraw.bind(this)),this.on("change",this.redraw.bind(this)),this.on("touch",this._onTouch.bind(this)),this.on("pinch",this._onPinch.bind(this)),this.on("dragstart",this._onDragStart.bind(this)),this.on("drag",this._onDrag.bind(this)),this.hammer=o(this.dom.root,{prevent_default:!0}),this.listeners={};var e=this,i=["touch","pinch","tap","doubletap","hold","dragstart","drag","dragend","mousewheel","DOMMouseScroll"];if(i.forEach(function(t){var i=function(){var i=[t].concat(Array.prototype.slice.call(arguments,0));e.emit.apply(e,i)};e.hammer.on(t,i),e.listeners[t]=i}),this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0},this.touch={},!t)throw new Error("No container provided");t.appendChild(this.dom.root)},s.prototype.destroy=function(){this.clear(),this.off(),this._stopAutoResize(),this.dom.root.parentNode&&this.dom.root.parentNode.removeChild(this.dom.root),this.dom=null;for(var t in this.listeners)this.listeners.hasOwnProperty(t)&&delete this.listeners[t];this.listeners=null,this.hammer=null,this.components.forEach(function(t){t.destroy()}),this.body=null},s.prototype.setOptions=function(t){if(t){var e=["width","height","minHeight","maxHeight","autoResize","start","end","orientation"];r.selectiveExtend(e,this.options,t),this._initAutoResize()}if(this.components.forEach(function(e){e.setOptions(t)}),t&&t.order)throw new Error("Option order is deprecated. There is no replacement for this feature.");this.redraw()},s.prototype.setCustomTime=function(t){if(!this.customTime)throw new Error("Cannot get custom time: Custom time bar is not enabled");this.customTime.setCustomTime(t)},s.prototype.getCustomTime=function(){if(!this.customTime)throw new Error("Cannot get custom time: Custom time bar is not enabled");return this.customTime.getCustomTime()},s.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof a||t instanceof h?t:new a(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e),i&&("start"in this.options||"end"in this.options)){this.fit();var s="start"in this.options?r.convert(this.options.start,"Date"):null,n="end"in this.options?r.convert(this.options.end,"Date"):null;this.setWindow(s,n)}},s.prototype.setGroups=function(t){var e;e=t?t instanceof a||t instanceof h?t:new a(t):null,this.groupsData=e,this.itemSet.setGroups(e)},s.prototype.clear=function(t){(!t||t.items)&&this.setItems(null),(!t||t.groups)&&this.setGroups(null),(!t||t.options)&&(this.components.forEach(function(t){t.setOptions(t.defaultOptions)}),this.setOptions(this.defaultOptions))},s.prototype.fit=function(){var t=this.getItemRange(),e=t.min,i=t.max;if(null!=e&&null!=i){var s=i.valueOf()-e.valueOf();0>=s&&(s=864e5),e=new Date(e.valueOf()-.05*s),i=new Date(i.valueOf()+.05*s)}(null!==e||null!==i)&&this.range.setRange(e,i)},s.prototype.getItemRange=function(){var t=this.itemsData.getDataSet(),e=null,i=null;if(t){var s=t.min("start");e=s?r.convert(s.start,"Date").valueOf():null;var n=t.max("start");n&&(i=r.convert(n.start,"Date").valueOf());var o=t.max("end");o&&(i=null==i?r.convert(o.end,"Date").valueOf():Math.max(i,r.convert(o.end,"Date").valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},s.prototype.setSelection=function(t){this.itemSet&&this.itemSet.setSelection(t)},s.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},s.prototype.setWindow=function(t,e){if(1==arguments.length){var i=arguments[0];this.range.setRange(i.start,i.end)}else this.range.setRange(t,e)},s.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},s.prototype.redraw=function(){var t=!1,e=this.options,i=this.props,s=this.dom;if(s){s.root.className="vis timeline root "+e.orientation,s.root.style.maxHeight=r.option.asSize(e.maxHeight,""),s.root.style.minHeight=r.option.asSize(e.minHeight,""),s.root.style.width=r.option.asSize(e.width,""),i.border.left=(s.centerContainer.offsetWidth-s.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(s.centerContainer.offsetHeight-s.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var n=s.root.offsetHeight-s.root.clientHeight,o=s.root.offsetWidth-s.root.clientWidth;i.center.height=s.center.offsetHeight,i.left.height=s.left.offsetHeight,i.right.height=s.right.offsetHeight,i.top.height=s.top.clientHeight||-i.border.top,i.bottom.height=s.bottom.clientHeight||-i.border.bottom;var a=Math.max(i.left.height,i.center.height,i.right.height),h=i.top.height+a+i.bottom.height+n+i.border.top+i.border.bottom;s.root.style.height=r.option.asSize(e.height,h+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-n;var d=i.root.height-i.top.height-i.bottom.height-n;i.centerContainer.height=d,i.leftContainer.height=d,i.rightContainer.height=i.leftContainer.height,i.root.width=s.root.offsetWidth,i.background.width=i.root.width-o,i.left.width=s.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=s.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var l=i.root.width-i.left.width-i.right.width-o;i.center.width=l,i.centerContainer.width=l,i.top.width=l,i.bottom.width=l,s.background.style.height=i.background.height+"px",s.backgroundVertical.style.height=i.background.height+"px",s.backgroundHorizontal.style.height=i.centerContainer.height+"px",s.centerContainer.style.height=i.centerContainer.height+"px",s.leftContainer.style.height=i.leftContainer.height+"px",s.rightContainer.style.height=i.rightContainer.height+"px",s.background.style.width=i.background.width+"px",s.backgroundVertical.style.width=i.centerContainer.width+"px",s.backgroundHorizontal.style.width=i.background.width+"px",s.centerContainer.style.width=i.center.width+"px",s.top.style.width=i.top.width+"px",s.bottom.style.width=i.bottom.width+"px",s.background.style.left="0",s.background.style.top="0",s.backgroundVertical.style.left=i.left.width+"px",s.backgroundVertical.style.top="0",s.backgroundHorizontal.style.left="0",s.backgroundHorizontal.style.top=i.top.height+"px",s.centerContainer.style.left=i.left.width+"px",s.centerContainer.style.top=i.top.height+"px",s.leftContainer.style.left="0",s.leftContainer.style.top=i.top.height+"px",s.rightContainer.style.left=i.left.width+i.center.width+"px",s.rightContainer.style.top=i.top.height+"px",s.top.style.left=i.left.width+"px",s.top.style.top="0",s.bottom.style.left=i.left.width+"px",s.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var c=this.props.scrollTop;"bottom"==e.orientation&&(c+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),s.center.style.left="0",s.center.style.top=c+"px",s.left.style.left="0",s.left.style.top=c+"px",s.right.style.left="0",s.right.style.top=c+"px";var u=0==this.props.scrollTop?"hidden":"",p=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";s.shadowTop.style.visibility=u,s.shadowBottom.style.visibility=p,s.shadowTopLeft.style.visibility=u,s.shadowBottomLeft.style.visibility=p,s.shadowTopRight.style.visibility=u,s.shadowBottomRight.style.visibility=p,this.components.forEach(function(e){t=e.redraw()||t}),t&&this.redraw()}},s.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},s.prototype._toTime=function(t){var e=this.range.conversion(this.props.center.width);return new Date(t/e.scale+e.offset)},s.prototype._toGlobalTime=function(t){var e=this.range.conversion(this.props.root.width);return new Date(t/e.scale+e.offset)},s.prototype._toScreen=function(t){var e=this.range.conversion(this.props.center.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._toGlobalScreen=function(t){var e=this.range.conversion(this.props.root.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},s.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){return 1!=t.options.autoResize?void t._stopAutoResize():void(t.dom.root&&(t.dom.root.clientWidth!=t.props.lastWidth||t.dom.root.clientHeight!=t.props.lastHeight)&&(t.props.lastWidth=t.dom.root.clientWidth,t.props.lastHeight=t.dom.root.clientHeight,t.emit("change")))},r.addEventListener(window,"resize",this._onResize),this.watchTimer=setInterval(this._onResize,1e3)},s.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),r.removeEventListener(window,"resize",this._onResize),this._onResize=null},s.prototype._onTouch=function(){this.touch.allowDragging=!0},s.prototype._onPinch=function(){this.touch.allowDragging=!1},s.prototype._onDragStart=function(){this.touch.initialScrollTop=this.props.scrollTop},s.prototype._onDrag=function(t){if(this.touch.allowDragging){var e=t.gesture.deltaY,i=this._getScrollTop(),s=this._setScrollTop(this.touch.initialScrollTop+e);s!=i&&this.redraw()}},s.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},s.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("bottom"==this.options.orientation&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTop=s&&(s=864e5),e=new Date(e.valueOf()-.05*s),i=new Date(i.valueOf()+.05*s)}(null!==e||null!==i)&&this.range.setRange(e,i)},s.prototype.getItemRange=function(){var t=this.itemsData,e=null,i=null;if(t){var s=t.min("start");e=s?r.convert(s.start,"Date").valueOf():null;var n=t.max("start");n&&(i=r.convert(n.start,"Date").valueOf());var o=t.max("end");o&&(i=null==i?r.convert(o.end,"Date").valueOf():Math.max(i,r.convert(o.end,"Date").valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},s.prototype.setWindow=function(t,e){if(1==arguments.length){var i=arguments[0];this.range.setRange(i.start,i.end)}else this.range.setRange(t,e)},s.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},s.prototype.redraw=function(){var t=!1,e=this.options,i=this.props,s=this.dom;if(s){s.root.className="vis timeline root "+e.orientation,s.root.style.maxHeight=r.option.asSize(e.maxHeight,""),s.root.style.minHeight=r.option.asSize(e.minHeight,""),s.root.style.width=r.option.asSize(e.width,""),i.border.left=(s.centerContainer.offsetWidth-s.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(s.centerContainer.offsetHeight-s.centerContainer.clientHeight)/2,i.border.bottom=i.border.top;var n=s.root.offsetHeight-s.root.clientHeight,o=s.root.offsetWidth-s.root.clientWidth;i.center.height=s.center.offsetHeight,i.left.height=s.left.offsetHeight,i.right.height=s.right.offsetHeight,i.top.height=s.top.clientHeight||-i.border.top,i.bottom.height=s.bottom.clientHeight||-i.border.bottom;var a=Math.max(i.left.height,i.center.height,i.right.height),h=i.top.height+a+i.bottom.height+n+i.border.top+i.border.bottom;s.root.style.height=r.option.asSize(e.height,h+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-n;var d=i.root.height-i.top.height-i.bottom.height-n;i.centerContainer.height=d,i.leftContainer.height=d,i.rightContainer.height=i.leftContainer.height,i.root.width=s.root.offsetWidth,i.background.width=i.root.width-o,i.left.width=s.leftContainer.clientWidth||-i.border.left,i.leftContainer.width=i.left.width,i.right.width=s.rightContainer.clientWidth||-i.border.right,i.rightContainer.width=i.right.width;var l=i.root.width-i.left.width-i.right.width-o;i.center.width=l,i.centerContainer.width=l,i.top.width=l,i.bottom.width=l,s.background.style.height=i.background.height+"px",s.backgroundVertical.style.height=i.background.height+"px",s.backgroundHorizontalContainer.style.height=i.centerContainer.height+"px",s.centerContainer.style.height=i.centerContainer.height+"px",s.leftContainer.style.height=i.leftContainer.height+"px",s.rightContainer.style.height=i.rightContainer.height+"px",s.background.style.width=i.background.width+"px",s.backgroundVertical.style.width=i.centerContainer.width+"px",s.backgroundHorizontalContainer.style.width=i.background.width+"px",s.backgroundHorizontal.style.width=i.background.width+"px",s.centerContainer.style.width=i.center.width+"px",s.top.style.width=i.top.width+"px",s.bottom.style.width=i.bottom.width+"px",s.background.style.left="0",s.background.style.top="0",s.backgroundVertical.style.left=i.left.width+"px",s.backgroundVertical.style.top="0",s.backgroundHorizontalContainer.style.left="0",s.backgroundHorizontalContainer.style.top=i.top.height+"px",s.centerContainer.style.left=i.left.width+"px",s.centerContainer.style.top=i.top.height+"px",s.leftContainer.style.left="0",s.leftContainer.style.top=i.top.height+"px",s.rightContainer.style.left=i.left.width+i.center.width+"px",s.rightContainer.style.top=i.top.height+"px",s.top.style.left=i.left.width+"px",s.top.style.top="0",s.bottom.style.left=i.left.width+"px",s.bottom.style.top=i.top.height+i.centerContainer.height+"px",this._updateScrollTop();var c=this.props.scrollTop;"bottom"==e.orientation&&(c+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)),s.center.style.left="0",s.center.style.top=c+"px",s.backgroundHorizontal.style.left="0",s.backgroundHorizontal.style.top=c+"px",s.left.style.left="0",s.left.style.top=c+"px",s.right.style.left="0",s.right.style.top=c+"px";var u=0==this.props.scrollTop?"hidden":"",p=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";s.shadowTop.style.visibility=u,s.shadowBottom.style.visibility=p,s.shadowTopLeft.style.visibility=u,s.shadowBottomLeft.style.visibility=p,s.shadowTopRight.style.visibility=u,s.shadowBottomRight.style.visibility=p,this.components.forEach(function(e){t=e.redraw()||t}),t&&this.redraw()}},s.prototype._toTime=function(t){var e=this.range.conversion(this.props.center.width);return new Date(t/e.scale+e.offset)},s.prototype._toGlobalTime=function(t){var e=this.range.conversion(this.props.root.width);return new Date(t/e.scale+e.offset)},s.prototype._toScreen=function(t){var e=this.range.conversion(this.props.center.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._toGlobalScreen=function(t){var e=this.range.conversion(this.props.root.width);return(t.valueOf()-e.offset)*e.scale},s.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},s.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){return 1!=t.options.autoResize?void t._stopAutoResize():void(t.dom.root&&(t.dom.root.clientWidth!=t.props.lastWidth||t.dom.root.clientHeight!=t.props.lastHeight)&&(t.props.lastWidth=t.dom.root.clientWidth,t.props.lastHeight=t.dom.root.clientHeight,t.emit("change")))},r.addEventListener(window,"resize",this._onResize),this.watchTimer=setInterval(this._onResize,1e3)},s.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),r.removeEventListener(window,"resize",this._onResize),this._onResize=null},s.prototype._onTouch=function(){this.touch.allowDragging=!0},s.prototype._onPinch=function(){this.touch.allowDragging=!1},s.prototype._onDragStart=function(){this.touch.initialScrollTop=this.props.scrollTop},s.prototype._onDrag=function(t){if(this.touch.allowDragging){var e=t.gesture.deltaY,i=this._getScrollTop(),s=this._setScrollTop(this.touch.initialScrollTop+e);s!=i&&this.redraw()}},s.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},s.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("bottom"==this.options.orientation&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTopo&&(h=o);for(var d=!1,l=h;Math.abs(l)<=Math.abs(o);l++){a=Math.pow(10,l);for(var c=0;c=n){d=!0,r=c;break}}if(1==d)break}this.stepIndex=r,this.scale=a,this.step=a*this.minorSteps[r]},e.prototype.first=function(){this.setFirst()},e.prototype.setFirst=function(){var t=this._start-this.scale*this.minorSteps[this.stepIndex],e=this._end+this.scale*this.minorSteps[this.stepIndex];this.marginEnd=this.roundToMinor(e),this.marginStart=this.roundToMinor(t),this.marginRange=this.marginEnd-this.marginStart,this.current=this.marginEnd},e.prototype.roundToMinor=function(t){var e=t-t%(this.scale*this.minorSteps[this.stepIndex]);return t%(this.scale*this.minorSteps[this.stepIndex])>.5*this.scale*this.minorSteps[this.stepIndex]?e+this.scale*this.minorSteps[this.stepIndex]:e},e.prototype.hasNext=function(){return this.current>=this.marginStart},e.prototype.next=function(){var t=this.current;this.current-=this.step,this.current==t&&(this.current=this._end)},e.prototype.previous=function(){this.current+=this.step,this.marginEnd+=this.step,this.marginRange=this.marginEnd-this.marginStart},e.prototype.getCurrent=function(){for(var t=""+Number(this.current).toPrecision(5),e=t.length-1;e>0;e--){if("0"!=t[e]){if("."==t[e]||","==t[e]){t=t.slice(0,e);break}break}t=t.slice(0,e)}return t},e.prototype.snap=function(){},e.prototype.isMajor=function(){return this.current%(this.scale*this.majorSteps[this.stepIndex])==0},t.exports=e},function(t,e,i){function s(t,e){var i=a().hours(0).minutes(0).seconds(0).milliseconds(0);this.start=i.clone().add("days",-3).valueOf(),this.end=i.clone().add("days",4).valueOf(),this.body=t,this.defaultOptions={start:null,end:null,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10},this.options=r.extend({},this.defaultOptions),this.props={touch:{}},this.body.emitter.on("dragstart",this._onDragStart.bind(this)),this.body.emitter.on("drag",this._onDrag.bind(this)),this.body.emitter.on("dragend",this._onDragEnd.bind(this)),this.body.emitter.on("hold",this._onHold.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("DOMMouseScroll",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.setOptions(e)}function n(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}function o(t,e){return{x:t.pageX-r.getAbsoluteLeft(e),y:t.pageY-r.getAbsoluteTop(e)} +}var r=i(1),a=i(39),h=i(12);s.prototype=new h,s.prototype.setOptions=function(t){if(t){var e=["direction","min","max","zoomMin","zoomMax","moveable","zoomable"];r.selectiveExtend(e,this.options,t),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},s.prototype.setRange=function(t,e){var i=this._applyRange(t,e);if(i){var s={start:new Date(this.start),end:new Date(this.end)};this.body.emitter.emit("rangechange",s),this.body.emitter.emit("rangechanged",s)}},s.prototype._applyRange=function(t,e){var i,s=null!=t?r.convert(t,"Date").valueOf():this.start,n=null!=e?r.convert(e,"Date").valueOf():this.end,o=null!=this.options.max?r.convert(this.options.max,"Date").valueOf():null,a=null!=this.options.min?r.convert(this.options.min,"Date").valueOf():null;if(isNaN(s)||null===s)throw new Error('Invalid start "'+t+'"');if(isNaN(n)||null===n)throw new Error('Invalid end "'+e+'"');if(s>n&&(n=s),null!==a&&a>s&&(i=a-s,s+=i,n+=i,null!=o&&n>o&&(n=o)),null!==o&&n>o&&(i=n-o,s-=i,n-=i,null!=a&&a>s&&(s=a)),null!==this.options.zoomMin){var h=parseFloat(this.options.zoomMin);0>h&&(h=0),h>n-s&&(this.end-this.start===h?(s=this.start,n=this.end):(i=h-(n-s),s-=i/2,n+=i/2))}if(null!==this.options.zoomMax){var d=parseFloat(this.options.zoomMax);0>d&&(d=0),n-s>d&&(this.end-this.start===d?(s=this.start,n=this.end):(i=n-s-d,s+=i/2,n-=i/2))}var l=this.start!=s||this.end!=n;return this.start=s,this.end=n,l},s.prototype.getRange=function(){return{start:this.start,end:this.end}},s.prototype.conversion=function(t){return s.conversion(this.start,this.end,t)},s.conversion=function(t,e,i){return 0!=i&&e-t!=0?{offset:t,scale:i/(e-t)}:{offset:0,scale:1}},s.prototype._onDragStart=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.start=this.start,this.props.touch.end=this.end,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},s.prototype._onDrag=function(t){if(this.options.moveable){var e=this.options.direction;if(n(e),this.props.touch.allowDragging){var i="horizontal"==e?t.gesture.deltaX:t.gesture.deltaY,s=this.props.touch.end-this.props.touch.start,o="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height,r=-i/o*s;this._applyRange(this.props.touch.start+r,this.props.touch.end+r),this.body.emitter.emit("rangechange",{start:new Date(this.start),end:new Date(this.end)})}}},s.prototype._onDragEnd=function(){this.options.moveable&&this.props.touch.allowDragging&&(this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end)}))},s.prototype._onMouseWheel=function(t){if(this.options.zoomable&&this.options.moveable){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i;i=0>e?1-e/5:1/(1+e/5);var s=r.fakeGesture(this,t),n=o(s.center,this.body.dom.center),a=this._pointerToDate(n);this.zoom(i,a)}t.preventDefault()}},s.prototype._onTouch=function(){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null},s.prototype._onHold=function(){this.props.touch.allowDragging=!1},s.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable&&(this.props.touch.allowDragging=!1,t.gesture.touches.length>1)){this.props.touch.center||(this.props.touch.center=o(t.gesture.center,this.body.dom.center));var e=1/t.gesture.scale,i=this._pointerToDate(this.props.touch.center),s=parseInt(i+(this.props.touch.start-i)*e),n=parseInt(i+(this.props.touch.end-i)*e);this.setRange(s,n)}},s.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(n(i),"horizontal"==i){var s=this.body.domProps.center.width;return e=this.conversion(s),t.x/e.scale+e.offset}var o=this.body.domProps.center.height;return e=this.conversion(o),t.y/e.scale+e.offset},s.prototype.zoom=function(t,e){null==e&&(e=(this.start+this.end)/2);var i=e+(this.start-e)*t,s=e+(this.end-e)*t;this.setRange(i,s)},s.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,s=this.end+e*t;this.start=i,this.end=s},s.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,s=this.start-i,n=this.end-i;this.setRange(s,n)},t.exports=s},function(t,e){var i=.001;e.orderByStart=function(t){t.sort(function(t,e){return t.data.start-e.data.start})},e.orderByEnd=function(t){t.sort(function(t,e){var i="end"in t.data?t.data.end:t.data.start,s="end"in e.data?e.data.end:e.data.start;return i-s})},e.stack=function(t,i,s){var n,o;if(s)for(n=0,o=t.length;o>n;n++)t[n].top=null;for(n=0,o=t.length;o>n;n++){var r=t[n];if(null===r.top){r.top=i.axis;do{for(var a=null,h=0,d=t.length;d>h;h++){var l=t[h];if(null!==l.top&&l!==r&&e.collision(r,l,i.item)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical)}while(a)}}},e.nostack=function(t,e){var i,s;for(i=0,s=t.length;s>i;i++)t[i].top=e.axis},e.collision=function(t,e,s){return t.left-s.horizontal+ie.left&&t.top-s.vertical+ie.top}},function(t,e,i){function s(t,e,i){this.current=new Date,this._start=new Date,this._end=new Date,this.autoScale=!0,this.scale=s.SCALE.DAY,this.step=1,this.setRange(t,e,i)}var n=i(39);s.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},s.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?new Date(t.valueOf()):new Date,this._end=void 0!=e?new Date(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},s.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},s.prototype.roundToMinor=function(){switch(this.scale){case s.SCALE.YEAR:this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step)),this.current.setMonth(0);case s.SCALE.MONTH:this.current.setDate(1);case s.SCALE.DAY:case s.SCALE.WEEKDAY:this.current.setHours(0);case s.SCALE.HOUR:this.current.setMinutes(0);case s.SCALE.MINUTE:this.current.setSeconds(0);case s.SCALE.SECOND:this.current.setMilliseconds(0)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()-this.current.getHours()%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step)}},s.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},s.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case s.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case s.SCALE.HOUR:this.current=new Date(this.current.valueOf()+1e3*this.step*60*60);var e=this.current.getHours();this.current.setHours(e-e%this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}else switch(this.scale){case s.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case s.SCALE.SECOND:this.current.setSeconds(this.current.getSeconds()+this.step);break;case s.SCALE.MINUTE:this.current.setMinutes(this.current.getMinutes()+this.step);break;case s.SCALE.HOUR:this.current.setHours(this.current.getHours()+this.step);break;case s.SCALE.WEEKDAY:case s.SCALE.DAY:this.current.setDate(this.current.getDate()+this.step);break;case s.SCALE.MONTH:this.current.setMonth(this.current.getMonth()+this.step);break;case s.SCALE.YEAR:this.current.setFullYear(this.current.getFullYear()+this.step)}if(1!=this.step)switch(this.scale){case s.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},s.prototype.setAutoScale=function(t){this.autoScale=t},s.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,n=864e5,o=36e5,r=6e4,a=1e3,h=1;1e3*e>t&&(this.scale=s.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=s.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=s.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=s.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=s.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=s.SCALE.YEAR,this.step=5),e>t&&(this.scale=s.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=s.SCALE.MONTH,this.step=3),i>t&&(this.scale=s.SCALE.MONTH,this.step=1),5*n>t&&(this.scale=s.SCALE.DAY,this.step=5),2*n>t&&(this.scale=s.SCALE.DAY,this.step=2),n>t&&(this.scale=s.SCALE.DAY,this.step=1),n/2>t&&(this.scale=s.SCALE.WEEKDAY,this.step=1),4*o>t&&(this.scale=s.SCALE.HOUR,this.step=4),o>t&&(this.scale=s.SCALE.HOUR,this.step=1),15*r>t&&(this.scale=s.SCALE.MINUTE,this.step=15),10*r>t&&(this.scale=s.SCALE.MINUTE,this.step=10),5*r>t&&(this.scale=s.SCALE.MINUTE,this.step=5),r>t&&(this.scale=s.SCALE.MINUTE,this.step=1),15*a>t&&(this.scale=s.SCALE.SECOND,this.step=15),10*a>t&&(this.scale=s.SCALE.SECOND,this.step=10),5*a>t&&(this.scale=s.SCALE.SECOND,this.step=5),a>t&&(this.scale=s.SCALE.SECOND,this.step=1),200*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=200),100*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=100),50*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=50),10*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=10),5*h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=5),h>t&&(this.scale=s.SCALE.MILLISECOND,this.step=1)}},s.prototype.snap=function(t){var e=new Date(t.valueOf());if(this.scale==s.SCALE.YEAR){var i=e.getFullYear()+Math.round(e.getMonth()/12);e.setFullYear(Math.round(i/this.step)*this.step),e.setMonth(0),e.setDate(0),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MONTH)e.getDate()>15?(e.setDate(1),e.setMonth(e.getMonth()+1)):e.setDate(1),e.setHours(0),e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0);else if(this.scale==s.SCALE.DAY){switch(this.step){case 5:case 2:e.setHours(24*Math.round(e.getHours()/24));break;default:e.setHours(12*Math.round(e.getHours()/12))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.WEEKDAY){switch(this.step){case 5:case 2:e.setHours(12*Math.round(e.getHours()/12));break;default:e.setHours(6*Math.round(e.getHours()/6))}e.setMinutes(0),e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.HOUR){switch(this.step){case 4:e.setMinutes(60*Math.round(e.getMinutes()/60));break;default:e.setMinutes(30*Math.round(e.getMinutes()/30))}e.setSeconds(0),e.setMilliseconds(0)}else if(this.scale==s.SCALE.MINUTE){switch(this.step){case 15:case 10:e.setMinutes(5*Math.round(e.getMinutes()/5)),e.setSeconds(0);break;case 5:e.setSeconds(60*Math.round(e.getSeconds()/60));break;default:e.setSeconds(30*Math.round(e.getSeconds()/30))}e.setMilliseconds(0)}else if(this.scale==s.SCALE.SECOND)switch(this.step){case 15:case 10:e.setSeconds(5*Math.round(e.getSeconds()/5)),e.setMilliseconds(0);break;case 5:e.setMilliseconds(1e3*Math.round(e.getMilliseconds()/1e3));break;default:e.setMilliseconds(500*Math.round(e.getMilliseconds()/500))}else if(this.scale==s.SCALE.MILLISECOND){var n=this.step>5?this.step/2:1;e.setMilliseconds(Math.round(e.getMilliseconds()/n)*n)}return e},s.prototype.isMajor=function(){switch(this.scale){case s.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case s.SCALE.SECOND:return 0==this.current.getSeconds();case s.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case s.SCALE.HOUR:return 0==this.current.getHours();case s.SCALE.WEEKDAY:case s.SCALE.DAY:return 1==this.current.getDate();case s.SCALE.MONTH:return 0==this.current.getMonth();case s.SCALE.YEAR:return!1;default:return!1}},s.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return n(t).format("SSS");case s.SCALE.SECOND:return n(t).format("s");case s.SCALE.MINUTE:return n(t).format("HH:mm");case s.SCALE.HOUR:return n(t).format("HH:mm");case s.SCALE.WEEKDAY:return n(t).format("ddd D");case s.SCALE.DAY:return n(t).format("D");case s.SCALE.MONTH:return n(t).format("MMM");case s.SCALE.YEAR:return n(t).format("YYYY");default:return""}},s.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case s.SCALE.MILLISECOND:return n(t).format("HH:mm:ss");case s.SCALE.SECOND:return n(t).format("D MMMM HH:mm");case s.SCALE.MINUTE:case s.SCALE.HOUR:return n(t).format("ddd D MMMM");case s.SCALE.WEEKDAY:case s.SCALE.DAY:return n(t).format("MMMM YYYY");case s.SCALE.MONTH:return n(t).format("YYYY");case s.SCALE.YEAR:return"";default:return""}},t.exports=s},function(t){function e(){this.options=null,this.props=null}e.prototype.setOptions=function(t){t&&util.extend(this.options,t)},e.prototype.redraw=function(){return!1},e.prototype.destroy=function(){},e.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=e},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCurrentTime:!0},this.options=n.extend({},this.defaultOptions),this._create(),this.setOptions(e)}var n=i(1),o=i(12);s.prototype=new o,s.prototype._create=function(){var t=document.createElement("div");t.className="currenttime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},s.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},s.prototype.setOptions=function(t){t&&n.selectiveExtend(["showCurrentTime"],this.options,t)},s.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=new Date,i=this.body.util.toScreen(e);this.bar.style.left=i+"px",this.bar.title="Current time: "+e}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},s.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,s=1/i/10;30>s&&(s=30),s>1e3&&(s=1e3),e.redraw(),e.currentTimeTimer=setTimeout(t,s)}var e=this;t()},s.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},t.exports=s},function(t,e,i){function s(t,e){this.body=t,this.defaultOptions={showCustomTime:!1},this.options=o.extend({},this.defaultOptions),this.customTime=new Date,this.eventParams={},this._create(),this.setOptions(e)}var n=i(49),o=i(1),r=i(12);s.prototype=new r,s.prototype.setOptions=function(t){t&&o.selectiveExtend(["showCustomTime"],this.options,t)},s.prototype._create=function(){var t=document.createElement("div");t.className="customtime",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t;var e=document.createElement("div");e.style.position="relative",e.style.top="0px",e.style.left="-10px",e.style.height="100%",e.style.width="20px",t.appendChild(e),this.hammer=n(t,{prevent_default:!0}),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this))},s.prototype.destroy=function(){this.options.showCustomTime=!1,this.redraw(),this.hammer.enable(!1),this.hammer=null,this.body=null},s.prototype.redraw=function(){if(this.options.showCustomTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar));var e=this.body.util.toScreen(this.customTime);this.bar.style.left=e+"px",this.bar.title="Time: "+this.customTime}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar);return!1},s.prototype.setCustomTime=function(t){this.customTime=new Date(t.valueOf()),this.redraw()},s.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},s.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation(),t.preventDefault()},s.prototype._onDrag=function(t){if(this.eventParams.dragging){var e=t.gesture.deltaX,i=this.body.util.toScreen(this.eventParams.customTime)+e,s=this.body.util.toTime(i);this.setCustomTime(s),this.body.emitter.emit("timechange",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault()}},s.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault())},t.exports=s},function(t,e,i){function s(t,e,i){this.id=n.randomUUID(),this.body=t,this.defaultOptions={orientation:"left",showMinorLabels:!0,showMajorLabels:!0,icons:!0,majorLinesOffset:7,minorLinesOffset:4,labelOffsetX:10,labelOffsetY:2,iconWidth:20,width:"40px",visible:!0},this.linegraphSVG=i,this.props={},this.DOMelements={lines:{},labels:{}},this.dom={},this.range={start:0,end:0},this.options=n.extend({},this.defaultOptions),this.conversionFactor=1,this.setOptions(e),this.width=Number((""+this.options.width).replace("px","")),this.minWidth=this.width,this.height=this.linegraphSVG.offsetHeight,this.stepPixels=25,this.stepPixelsForced=25,this.lineOffset=0,this.master=!0,this.svgElements={},this.groups={},this.amountOfGroups=0,this._create()}var n=i(1),o=i(2),r=i(12),a=i(8);s.prototype=new r,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype.setOptions=function(t){if(t){var e=!1;this.options.orientation!=t.orientation&&void 0!==t.orientation&&(e=!0);var i=["orientation","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","width","visible"];n.selectiveExtend(i,this.options,t),this.minWidth=Number((""+this.options.width).replace("px","")),1==e&&this.dom.frame&&(this.hide(),this.show())}},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.style.width=this.options.width,this.dom.frame.style.height=this.height,this.dom.lineContainer=document.createElement("div"),this.dom.lineContainer.style.width="100%",this.dom.lineContainer.style.height=this.height,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.height="100%",this.svg.style.width="100%",this.svg.style.display="block",this.dom.frame.appendChild(this.svg)},s.prototype._redrawGroupIcons=function(){o.prepareElements(this.svgElements);var t,e=this.options.iconWidth,i=15,s=4,n=s+.5*i;t="left"==this.options.orientation?s:this.width-e-s;for(var r in this.groups)this.groups.hasOwnProperty(r)&&(this.groups[r].drawIcon(t,n,this.svgElements,this.svg,e,i),n+=i+s);o.cleanupElements(this.svgElements)},s.prototype.show=function(){this.dom.frame.parentNode||("left"==this.options.orientation?this.body.dom.left.appendChild(this.dom.frame):this.body.dom.right.appendChild(this.dom.frame)),this.dom.lineContainer.parentNode||this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.lineContainer.parentNode&&this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer)},s.prototype.setRange=function(t,e){this.range.start=t,this.range.end=e},s.prototype.redraw=function(){var t=!1;if(0==this.amountOfGroups)this.hide();else{this.show(),this.height=Number(this.linegraphSVG.style.height.replace("px","")),this.dom.lineContainer.style.height=this.height+"px",this.width=1==this.options.visible?Number((""+this.options.width).replace("px","")):0;var e=this.props,i=this.dom.frame;i.className="dataaxis",this._calculateCharSize();var s=this.options.orientation,n=this.options.showMinorLabels,o=this.options.showMajorLabels;e.minorLabelHeight=n?e.minorCharHeight:0,e.majorLabelHeight=o?e.majorCharHeight:0,e.minorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.minorLinesOffset,e.minorLineHeight=1,e.majorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.majorLinesOffset,e.majorLineHeight=1,"left"==s?(i.style.top="0",i.style.left="0",i.style.bottom="",i.style.width=this.width+"px",i.style.height=this.height+"px"):(i.style.top="",i.style.bottom="0",i.style.left="0",i.style.width=this.width+"px",i.style.height=this.height+"px"),t=this._redrawLabels(),1==this.options.icons&&this._redrawGroupIcons()}return t},s.prototype._redrawLabels=function(){o.prepareElements(this.DOMelements);var t=this.options.orientation,e=this.master?this.props.majorCharHeight||10:this.stepPixelsForced,i=new a(this.range.start,this.range.end,e,this.dom.frame.offsetHeight);this.step=i,i.first();var s=this.dom.frame.offsetHeight/(i.marginRange/i.step+1);this.stepPixels=s;var n=this.height/s,r=0;if(0==this.master){s=this.stepPixelsForced,r=Math.round(this.height/s-n);for(var h=0;.5*r>h;h++)i.previous();n=this.height/s}this.valueAtZero=i.marginEnd;var d=0,l=1;i.next(),this.maxLabelSize=0;for(var c=0;l=0&&this._redrawLabel(c-2,i.getCurrent(),t,"yAxis major",this.props.majorCharHeight),this._redrawLine(c,t,"grid horizontal major",this.options.majorLinesOffset,this.props.majorLineWidth)):this._redrawLine(c,t,"grid horizontal minor",this.options.minorLinesOffset,this.props.minorLineWidth),i.next(),l++}this.conversionFactor=d/((n-1)*i.step);var p=1==this.options.icons?this.options.iconWidth+this.options.labelOffsetX+15:this.options.labelOffsetX+15;return this.maxLabelSize>this.width-p&&1==this.options.visible?(this.width=this.maxLabelSize+p,this.options.width=this.width+"px",o.cleanupElements(this.DOMelements),this.redraw(),!0):this.maxLabelSizethis.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+p),this.options.width=this.width+"px",o.cleanupElements(this.DOMelements),this.redraw(),!0):(o.cleanupElements(this.DOMelements),!1)},s.prototype._redrawLabel=function(t,e,i,s,n){var r=o.getDOMElement("div",this.DOMelements,this.dom.frame);r.className=s,r.innerHTML=e,"left"==i?(r.style.left="-"+this.options.labelOffsetX+"px",r.style.textAlign="right"):(r.style.right="-"+this.options.labelOffsetX+"px",r.style.textAlign="left"),r.style.top=t-.5*n+this.options.labelOffsetY+"px",e+="";var a=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSizee.axis){var c=d-e.axis;l-=c,n.forEach(h,function(t){t.top-=c})}a=l+e.item.vertical/2}else a=e.axis+e.item.vertical;a=Math.max(a,this.props.label.height);var u=this.dom.foreground;this.top=u.offsetTop,this.left=u.offsetLeft,this.width=u.offsetWidth,s=n.updateProperty(this,"height",a)||s,s=n.updateProperty(this.props.label,"width",this.dom.inner.clientWidth)||s,s=n.updateProperty(this.props.label,"height",this.dom.inner.clientHeight)||s,this.dom.background.style.height=a+"px",this.dom.foreground.style.height=a+"px",this.dom.label.style.height=a+"px";for(var p=0,m=this.visibleItems.length;m>p;p++){var _=this.visibleItems[p];_.repositionY()}return s},s.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},s.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var s=this.dom.axis;s.parentNode&&s.parentNode.removeChild(s)},s.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),t instanceof r&&-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},s.prototype.remove=function(t){delete this.items[t.id],t.setParent(this.itemSet);var e=this.visibleItems.indexOf(t);-1!=e&&this.visibleItems.splice(e,1)},s.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},s.prototype.order=function(){var t=n.toArray(this.items);this.orderedItems.byStart=t,this.orderedItems.byEnd=this._constructByEndArray(t),o.orderByStart(this.orderedItems.byStart),o.orderByEnd(this.orderedItems.byEnd) +},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0)for(o=0;o=0&&!this._checkIfInvisible(t.byStart[o],r,i);o--);for(o=s+1;o=0&&!this._checkIfInvisible(t.byEnd[o],r,i);o--);for(o=a+1;oe;e++)s=this.selection[e],n=this.items[s],n&&n.unselect();for(this.selection=[],e=0,i=t.length;i>e;e++)s=t[e],n=this.items[s],n&&(this.selection.push(s),n.select())}},s.prototype.getSelection=function(){return this.selection.concat([])},s.prototype._deselect=function(t){for(var e=this.selection,i=0,s=e.length;s>i;i++)if(e[i]==t){e.splice(i,1);break}},s.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=o.option.asSize,s=this.options,n=s.orientation,r=!1,a=this.dom.frame,h=s.editable.updateTime||s.editable.updateGroup;a.className="itemset"+(h?" editable":""),r=this._orderGroups()||r;var d=e.end-e.start,l=d!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;l&&(this.stackDirty=!0),this.lastVisibleInterval=d,this.props.lastWidth=this.props.width;var c=this.stackDirty,u=this._firstGroup(),p={item:t.item,axis:t.axis},m={item:t.item,axis:t.item.vertical/2},_=0,f=t.axis+t.item.vertical;return o.forEach(this.groups,function(t){var i=t==u?p:m,s=t.redraw(e,i,c);r=s||r,_+=t.height}),_=Math.max(_,f),this.stackDirty=!1,a.style.height=i(_),this.props.top=a.offsetTop,this.props.left=a.offsetLeft,this.props.width=a.offsetWidth,this.props.height=_,this.dom.axis.style.top=i("top"==n?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.dom.axis.style.left=this.body.domProps.border.left+"px",r=this._isResized()||r},s.prototype._firstGroup=function(){var t="top"==this.options.orientation?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[p];return i||null},s.prototype._updateUngrouped=function(){var t=this.groups[p];if(this.groupsData)t&&(t.hide(),delete this.groups[p]);else if(!t){var e=null,i=null;t=new d(e,i,this),this.groups[p]=t;for(var s in this.items)this.items.hasOwnProperty(s)&&t.add(this.items[s]);t.show()}},s.prototype.getLabelSet=function(){return this.dom.labelSet},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(o.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;o.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}},s.prototype.getItems=function(){return this.itemsData},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(o.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;o.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("change")},s.prototype.getGroups=function(){return this.groupsData},s.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},s.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i=e.itemsData.get(t,e.itemOptions),n=e.items[t],o=i.type||e.options.type||(i.end?"range":"box"),r=s.types[o];if(n&&(r&&n instanceof r?e._updateItem(n,i):(e._removeItem(n),n=null)),!n){if(!r)throw new TypeError("rangeoverflow"==o?'Item type "rangeoverflow" is deprecated. Use css styling instead: .vis.timeline .item.range .content {overflow: visible;}':'Unknown item type "'+o+'"');n=new r(i,e.conversion,e.options),n.id=t,e._addItem(n)}}),this._order(),this.stackDirty=!0,this.body.emitter.emit("change")},s.prototype._onAdd=s.prototype._onUpdate,s.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var s=i.items[t];s&&(e++,i._removeItem(s))}),e&&(this._order(),this.stackDirty=!0,this.body.emitter.emit("change"))},s.prototype._order=function(){o.forEach(this.groups,function(t){t.order()})},s.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},s.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),s=e.groups[t];if(s)s.setData(i);else{if(t==p)throw new Error("Illegal group id. "+t+" is a reserved id.");var n=Object.create(e.options);o.extend(n,{height:null}),s=new d(t,i,e),e.groups[t]=s;for(var r in e.items)if(e.items.hasOwnProperty(r)){var a=e.items[r];a.data.group==t&&s.add(a)}s.order(),s.show()}}),this.body.emitter.emit("change")},s.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("change")},s.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!o.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},s.prototype._addItem=function(t){this.items[t.id]=t;var e=this.groupsData?t.data.group:p,i=this.groups[e];i&&i.add(t)},s.prototype._updateItem=function(t,e){var i=t.data.group;if(t.data=e,t.displayed&&t.redraw(),i!=t.data.group){var s=this.groups[i];s&&s.remove(t);var n=this.groupsData?t.data.group:p,o=this.groups[n];o&&o.add(t)}},s.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1);var i=this.groupsData?t.data.group:p,s=this.groups[i];s&&s.remove(t)},s.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0||n.length>0)&&this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}},s.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.body.util.snap||null,n=s.itemFromTarget(t);if(n){var r=e.itemsData.get(n.id);this.options.onUpdate(r,function(t){t&&e.itemsData.update(t)})}else{var a=o.getAbsoluteLeft(this.dom.frame),h=t.gesture.center.pageX-a,d=this.body.util.toTime(h),l={start:i?i(d):d,content:"new item"};if("range"===this.options.type){var c=this.body.util.toTime(h+this.props.width/5);l.end=i?i(c):c}l[this.itemsData.fieldId]=o.randomUUID();var u=s.groupFromTarget(t);u&&(l.group=u.groupId),this.options.onAdd(l,function(t){t&&e.itemsData.add(l)})}}},s.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e,i=s.itemFromTarget(t);if(i){e=this.getSelection();var n=e.indexOf(i.id);-1==n?e.push(i.id):e.splice(n,1),this.setSelection(e),this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}}},s.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},s.groupFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-group"))return e["timeline-group"];e=e.parentNode}return null},s.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},t.exports=s},function(t,e,i){function s(t,e,i){this.body=t,this.defaultOptions={enabled:!0,icons:!0,iconSize:20,iconSpacing:6,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-left"}},this.side=i,this.options=n.extend({},this.defaultOptions),this.svgElements={},this.dom={},this.groups={},this.amountOfGroups=0,this._create(),this.setOptions(e)}var n=i(1),o=i(2),r=i(12);s.prototype=new r,s.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},s.prototype.updateGroup=function(t,e){this.groups[t]=e},s.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},s.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.className="legend",this.dom.frame.style.position="absolute",this.dom.frame.style.top="10px",this.dom.frame.style.display="block",this.dom.textArea=document.createElement("div"),this.dom.textArea.className="legendText",this.dom.textArea.style.position="relative",this.dom.textArea.style.top="0px",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.width=this.options.iconSize+5+"px",this.dom.frame.appendChild(this.svg),this.dom.frame.appendChild(this.dom.textArea)},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setOptions=function(t){var e=["enabled","orientation","icons","left","right"];n.selectiveDeepExtend(e,this.options,t)},s.prototype.redraw=function(){if(0==this.options[this.side].visible||0==this.amountOfGroups||0==this.options.enabled)this.hide();else{this.show(),"top-left"==this.options[this.side].position||"bottom-left"==this.options[this.side].position?(this.dom.frame.style.left="4px",this.dom.frame.style.textAlign="left",this.dom.textArea.style.textAlign="left",this.dom.textArea.style.left=this.options.iconSize+15+"px",this.dom.textArea.style.right="",this.svg.style.left="0px",this.svg.style.right=""):(this.dom.frame.style.right="4px",this.dom.frame.style.textAlign="right",this.dom.textArea.style.textAlign="right",this.dom.textArea.style.right=this.options.iconSize+15+"px",this.dom.textArea.style.left="",this.svg.style.right="0px",this.svg.style.left=""),"top-left"==this.options[this.side].position||"top-right"==this.options[this.side].position?(this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.bottom=""):(this.dom.frame.style.bottom=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.top=""),0==this.options.icons?(this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+"px",this.dom.textArea.style.right="",this.dom.textArea.style.left="",this.svg.style.width="0px"):(this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+"px",this.drawLegendIcons());var t="";for(var e in this.groups)this.groups.hasOwnProperty(e)&&(t+=this.groups[e].content+"
");this.dom.textArea.innerHTML=t,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},s.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){o.prepareElements(this.svgElements);var t=window.getComputedStyle(this.dom.frame).paddingTop,e=Number(t.replace("px","")),i=e,s=this.options.iconSize,n=.75*this.options.iconSize,r=e+.5*n+3;this.svg.style.width=s+5+e+"px";for(var a in this.groups)this.groups.hasOwnProperty(a)&&(this.groups[a].drawIcon(i,r,this.svgElements,this.svg,s,n),r+=n+this.options.iconSpacing);o.cleanupElements(this.svgElements)}},t.exports=s},function(t,e,i){function s(t,e){this.id=n.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,align:"center"},catmullRom:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:"40px",visible:!0},legend:{enabled:!1,icons:!0,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}}},this.options=n.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={};var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e){i._onAdd(e.items)},update:function(t,e){i._onUpdate(e.items)},remove:function(t,e){i._onRemove(e.items)}},this.groupListeners={add:function(t,e){i._onAddGroups(e.items)},update:function(t,e){i._onUpdateGroups(e.items)},remove:function(t,e){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechange",function(){if(0!=i.lastStart){var t=i.body.range.start-i.lastStart,e=i.body.range.end-i.body.range.start;if(0!=i.width){var s=i.width/e,n=t*s;i.svg.style.left=-i.width-n+"px"}}}),this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=n.option.asSize(-i.width),i._updateGraph.apply(i)}),this._create(),this.body.emitter.emit("change")}var n=i(1),o=i(2),r=i(3),a=i(4),h=i(12),d=i(15),l=i(16),c=i(19),u="__ungrouped__";s.prototype=new h,s.prototype._create=function(){var t=document.createElement("div");t.className="LineGraph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new d(this.body,this.options.dataAxis,this.svg),this.options.dataAxis.orientation="right",this.yAxisRight=new d(this.body,this.options.dataAxis,this.svg),delete this.options.dataAxis.orientation,this.legendLeft=new c(this.body,this.options.legend,"left"),this.legendRight=new c(this.body,this.options.legend,"right"),this.show()},s.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort"];n.selectiveDeepExtend(e,this.options,t),n.mergeOptions(this.options,t,"catmullRom"),n.mergeOptions(this.options,t,"drawPoints"),n.mergeOptions(this.options,t,"shaded"),n.mergeOptions(this.options,t,"legend"),t.catmullRom&&"object"==typeof t.catmullRom&&t.catmullRom.parametrization&&("uniform"==t.catmullRom.parametrization?this.options.catmullRom.alpha=0:"chordal"==t.catmullRom.parametrization?this.options.catmullRom.alpha=1:(this.options.catmullRom.parametrization="centripetal",this.options.catmullRom.alpha=.5)),this.yAxisLeft&&void 0!==t.dataAxis&&(this.yAxisLeft.setOptions(this.options.dataAxis),this.yAxisRight.setOptions(this.options.dataAxis)),this.legendLeft&&void 0!==t.legend&&(this.legendLeft.setOptions(this.options.legend),this.legendRight.setOptions(this.options.legend)),this.groups.hasOwnProperty(u)&&this.groups[u].setOptions(t)}this.dom.frame&&this._updateGraph()},s.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},s.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},s.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(n.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var o=this.id;n.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,o)}),e=this.itemsData.getIds(),this._onAdd(e)}this._updateUngrouped(),this._updateGraph(),this.redraw()},s.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(n.forEach(this.groupListeners,function(t,e){i.groupsData.unsubscribe(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof r||t instanceof a))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var s=this.id;n.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._onUpdate()},s.prototype._onUpdate=function(){this._updateUngrouped(),this._updateAllGroupData(),this._updateGraph(),this.redraw()},s.prototype._onAdd=function(t){this._onUpdate(t)},s.prototype._onRemove=function(t){this._onUpdate(t)},s.prototype._onUpdateGroups=function(t){for(var e=0;e0){for(s=0;sp){e.push(f);break}e.push(f)}}else for(var _=0;_u&&f.x0){for(var u=0;ui?i:a,d=s>d?s:d):(r=!0,h=h>i?i:h,l=s>l?s:l)}1==o&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}return n=this._toggleAxisVisiblity(o,this.yAxisLeft)||n,n=this._toggleAxisVisiblity(r,this.yAxisRight)||n,1==r&&1==o?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!o,0==this.yAxisRight.master?(1==r&&(this.yAxisLeft.lineOffset=this.yAxisRight.width),n=this.yAxisLeft.redraw()||n,this.yAxisRight.stepPixelsForced=this.yAxisLeft.stepPixels,n=this.yAxisRight.redraw()||n):n=this.yAxisRight.redraw()||n,n},s.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&(e.hide(),i=!0):e.dom.frame.parentNode||(e.show(),i=!0),i},s.prototype._drawBarGraph=function(t,e){if(null!=t&&t.length>0){var i,s=.1*e.options.barChart.width,n=0,r=e.options.barChart.width;"left"==e.options.barChart.align?n-=.5*r:"right"==e.options.barChart.align&&(n+=.5*r);for(var a=0;a0&&(i=Math.min(i,Math.abs(t[a-1].x-t[a].x))),r>i&&(r=s>i?s:i),o.drawBar(t[a].x+n,t[a].y,r,e.zeroPosition-t[a].y,e.className+" bar",this.svgElements,this.svg);1==e.options.drawPoints.enabled&&this._drawPoints(t,e,this.svgElements,this.svg,n)}},s.prototype._drawLineGraph=function(t,e){if(null!=t&&t.length>0){var i,s,n=Number(this.svg.style.height.replace("px",""));if(i=o.getSVGElement("path",this.svgElements,this.svg),i.setAttributeNS(null,"class",e.className),s=1==e.options.catmullRom.enabled?this._catmullRom(t,e):this._linear(t),1==e.options.shaded.enabled){var r,a=o.getSVGElement("path",this.svgElements,this.svg);r="top"==e.options.shaded.orientation?"M"+t[0].x+",0 "+s+"L"+t[t.length-1].x+",0":"M"+t[0].x+","+n+" "+s+"L"+t[t.length-1].x+","+n,a.setAttributeNS(null,"class",e.className+" fill"),a.setAttributeNS(null,"d",r)}i.setAttributeNS(null,"d","M"+s),1==e.options.drawPoints.enabled&&this._drawPoints(t,e,this.svgElements,this.svg)}},s.prototype._drawPoints=function(t,e,i,s,n){void 0===n&&(n=0);for(var r=0;ru;u+=r)i=o(t[u].x)+this.width-1,s=t[u].y,n.push({x:i,y:s}),h=h>s?s:h,d=s>d?s:d;return{min:h,max:d,data:n}},s.prototype._convertYvalues=function(t,e){var i,s,n=[],o=this.yAxisLeft,r=Number(this.svg.style.height.replace("px",""));"right"==e.options.yAxisOrientation&&(o=this.yAxisRight);for(var a=0;al;l++)e=0==l?t[0]:t[l-1],i=t[l],s=t[l+1],n=d>l+2?t[l+2]:s,o={x:(-e.x+6*i.x+s.x)*h,y:(-e.y+6*i.y+s.y)*h},r={x:(i.x+6*s.x-n.x)*h,y:(i.y+6*s.y-n.y)*h},a+="C"+o.x+","+o.y+" "+r.x+","+r.y+" "+s.x+","+s.y+" ";return a},s.prototype._catmullRom=function(t,e){var i=e.options.catmullRom.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);for(var s,n,o,r,a,h,d,l,c,u,p,m,_,f,g,y,v,M,b,w=Math.round(t[0].x)+","+Math.round(t[0].y)+" ",L=t.length,x=0;L-1>x;x++)s=0==x?t[0]:t[x-1],n=t[x],o=t[x+1],r=L>x+2?t[x+2]:o,d=Math.sqrt(Math.pow(s.x-n.x,2)+Math.pow(s.y-n.y,2)),l=Math.sqrt(Math.pow(n.x-o.x,2)+Math.pow(n.y-o.y,2)),c=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),f=Math.pow(c,i),y=Math.pow(c,2*i),g=Math.pow(l,i),v=Math.pow(l,2*i),b=Math.pow(d,i),M=Math.pow(d,2*i),u=2*M+3*b*g+v,p=2*y+3*f*g+v,m=3*b*(b+g),m>0&&(m=1/m),_=3*f*(f+g),_>0&&(_=1/_),a={x:(-v*s.x+u*n.x+M*o.x)*m,y:(-v*s.y+u*n.y+M*o.y)*m},h={x:(y*n.x+p*o.x-v*r.x)*_,y:(y*n.y+p*o.y-v*r.y)*_},0==a.x&&0==a.y&&(a=n),0==h.x&&0==h.y&&(h=o),w+="C"+a.x+","+a.y+" "+h.x+","+h.y+" "+o.x+","+o.y+" "; +return w},s.prototype._linear=function(t){for(var e="",i=0;id;){d++;var l=o.getCurrent(),c=this.body.util.toScreen(l),u=o.isMajor();this.options.showMinorLabels&&this._repaintMinorText(c,o.getLabelMinor(),t),u&&this.options.showMajorLabels?(c>0&&(void 0==h&&(h=c),this._repaintMajorText(c,o.getLabelMajor(),t)),this._repaintMajorLine(c,t)):this._repaintMinorLine(c,t),o.next()}if(this.options.showMajorLabels){var p=this.body.util.toTime(0),m=o.getLabelMajor(p),_=m.length*(this.props.majorCharWidth||10)+10;(void 0==h||h>_)&&this._repaintMajorText(0,m,t)}n.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},s.prototype._repaintMinorText=function(t,e,i){var s=this.dom.redundant.minorTexts.shift();if(!s){var n=document.createTextNode("");s=document.createElement("div"),s.appendChild(n),s.className="text minor",this.dom.foreground.appendChild(s)}this.dom.minorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?this.props.majorLabelHeight+"px":"0",s.style.left=t+"px"},s.prototype._repaintMajorText=function(t,e,i){var s=this.dom.redundant.majorTexts.shift();if(!s){var n=document.createTextNode(e);s=document.createElement("div"),s.className="text major",s.appendChild(n),this.dom.foreground.appendChild(s)}this.dom.majorTexts.push(s),s.childNodes[0].nodeValue=e,s.style.top="top"==i?"0":this.props.minorLabelHeight+"px",s.style.left=t+"px"},s.prototype._repaintMinorLine=function(t,e){var i=this.dom.redundant.minorLines.shift();i||(i=document.createElement("div"),i.className="grid vertical minor",this.dom.background.appendChild(i)),this.dom.minorLines.push(i);var s=this.props;i.style.top="top"==e?s.majorLabelHeight+"px":this.body.domProps.top.height+"px",i.style.height=s.minorLineHeight+"px",i.style.left=t-s.minorLineWidth/2+"px"},s.prototype._repaintMajorLine=function(t,e){var i=this.dom.redundant.majorLines.shift();i||(i=document.createElement("DIV"),i.className="grid vertical major",this.dom.background.appendChild(i)),this.dom.majorLines.push(i);var s=this.props;i.style.top="top"==e?"0":this.body.domProps.top.height+"px",i.style.left=t-s.majorLineWidth/2+"px",i.style.height=s.majorLineHeight+"px"},s.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="text minor measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="text minor measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth},s.prototype.snap=function(t){return this.step.snap(t)},t.exports=s},function(t,e,i){function s(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.dirty=!0,this.top=null,this.left=null,this.width=null,this.height=null}var n=i(49);s.prototype.select=function(){this.selected=!0,this.displayed&&this.redraw()},s.prototype.unselect=function(){this.selected=!1,this.displayed&&this.redraw()},s.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},s.prototype.isVisible=function(){return!1},s.prototype.show=function(){return!1},s.prototype.hide=function(){return!1},s.prototype.redraw=function(){},s.prototype.repositionX=function(){},s.prototype.repositionY=function(){},s.prototype._repaintDeleteButton=function(t){if(this.selected&&this.options.editable.remove&&!this.dom.deleteButton){var e=this,i=document.createElement("div");i.className="delete",i.title="Delete this item",n(i,{preventDefault:!0}).on("tap",function(t){e.parent.removeFromDataSet(e),t.stopPropagation()}),t.appendChild(i),this.dom.deleteButton=i}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);n.call(this,t,e,i)}var n=i(22);s.prototype=new n(null,null,null),s.prototype.isVisible=function(t){var e=(t.end-t.start)/4;return this.data.start>t.start-e&&this.data.startt.start-e&&this.data.startt.start},s.prototype.redraw=function(){var t=this.dom;if(t||(this.dom={},t=this.dom,t.box=document.createElement("div"),t.content=document.createElement("div"),t.content.className="content",t.box.appendChild(t.content),t.box["timeline-item"]=this),!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!t.box.parentNode){var e=this.parent.dom.foreground;if(!e)throw new Error("Cannot redraw time axis: parent has no foreground container element");e.appendChild(t.box)}if(this.displayed=!0,this.data.content!=this.content){if(this.content=this.data.content,this.content instanceof Element)t.content.innerHTML="",t.content.appendChild(this.content);else{if(void 0==this.data.content)throw new Error('Property "content" missing in item '+this.data.id);t.content.innerHTML=this.content}this.dirty=!0}this.data.title!=this.title&&(t.box.title=this.data.title,this.title=this.data.title);var i=(this.data.className?" "+this.data.className:"")+(this.selected?" selected":"");this.className!=i&&(this.className=i,t.box.className=this.baseClassName+i,this.dirty=!0),this.dirty&&(this.overflow="hidden"!==window.getComputedStyle(t.content).overflow,this.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dirty=!1),this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},s.prototype.show=function(){this.displayed||this.redraw()},s.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.top=null,this.left=null,this.displayed=!1}},s.prototype.repositionX=function(){var t,e=this.props,i=this.parent.width,s=this.conversion.toScreen(this.data.start),n=this.conversion.toScreen(this.data.end),o=this.options.padding;-i>s&&(s=-i),n>2*i&&(n=2*i);var r=Math.max(n-s,1);this.overflow?(t=Math.max(-s,0),this.left=s,this.width=r+this.props.content.width):(t=0>s?Math.min(-s,n-s-e.content.width-2*o):0,this.left=s,this.width=r),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=r+"px",this.dom.content.style.left=t+"px"},s.prototype.repositionY=function(){var t=this.options.orientation,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},s.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="drag-left",t.dragLeftItem=this,n(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragLeft=t}else!this.selected&&this.dom.dragLeft&&(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},s.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="drag-right",t.dragRightItem=this,n(t,{preventDefault:!0}).on("drag",function(){}),this.dom.box.appendChild(t),this.dom.dragRight=t}else!this.selected&&this.dom.dragRight&&(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=s},function(t,e,i){function s(t,e,i){if(!(this instanceof s))throw new SyntaxError("Constructor must be called with the new operator");this._initializeMixinLoaders(),this.containerElement=t,this.width="100%",this.height="100%",this.renderRefreshRate=60,this.renderTimestep=1e3/this.renderRefreshRate,this.renderTime=.5*this.renderTimestep,this.maxPhysicsTicksPerRender=3,this.physicsDiscreteStepsize=.5,this.stabilize=!0,this.selectable=!0,this.initializing=!0,this.triggerFunctions={add:null,edit:null,editEdge:null,connect:null,del:null},this.constants={nodes:{radiusMin:10,radiusMax:30,radius:10,shape:"ellipse",image:void 0,widthMin:16,widthMax:64,fixed:!1,fontColor:"black",fontSize:14,fontFace:"verdana",level:-1,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},borderColor:"#2B7CE9",backgroundColor:"#97C2FC",highlightColor:"#D2E5FF",group:void 0},edges:{widthMin:1,widthMax:15,width:1,widthSelectionMultiplier:2,hoverWidth:1.5,style:"line",color:{color:"#848484",highlight:"#848484",hover:"#848484"},fontColor:"#343434",fontSize:14,fontFace:"arial",fontFill:"white",arrowScaleFactor:1,dash:{length:10,gap:5,altLength:void 0},inheritColor:!1},configurePhysics:!1,physics:{barnesHut:{enabled:!0,theta:1/.6,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09},repulsion:{centralGravity:.1,springLength:200,springConstant:.05,nodeDistance:100,damping:.09},hierarchicalRepulsion:{enabled:!1,centralGravity:.5,springLength:150,springConstant:.01,nodeDistance:60,damping:.09},damping:null,centralGravity:null,springLength:null,springConstant:null},clustering:{enabled:!1,initialMaxNodes:100,clusterThreshold:500,reduceToNodes:300,chainThreshold:.4,clusterEdgeThreshold:20,sectorThreshold:100,screenSizeThreshold:.2,fontSizeMultiplier:4,maxFontSize:1e3,forceAmplification:.1,distanceAmplification:.1,edgeGrowth:20,nodeScaling:{width:1,height:1,radius:1},maxNodeSizeIncrements:600,activeAreaBoxSize:80,clusterLevelDifference:2},navigation:{enabled:!1},keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02}},dataManipulation:{enabled:!1,initiallyVisible:!1},hierarchicalLayout:{enabled:!1,levelSeparation:150,nodeSpacing:100,direction:"UD"},freezeForStabilization:!1,smoothCurves:{enabled:!0,dynamic:!0,type:"continuous",roundness:.5},dynamicSmoothCurves:!0,maxVelocity:10,minVelocity:.1,stabilizationIterations:1e3,labels:{add:"Add Node",edit:"Edit",link:"Add Link",del:"Delete selected",editNode:"Edit Node",editEdge:"Edit Edge",back:"Back",addDescription:"Click in an empty space to place a new node.",linkDescription:"Click on a node and drag the edge to another node to connect them.",editEdgeDescription:"Click on the control points and drag them to a node to connect to it.",addError:"The function for add does not support two arguments (data,callback).",linkError:"The function for connect does not support two arguments (data,callback).",editError:"The function for edit does not support two arguments (data, callback).",editBoundError:"No edit function has been bound to this button.",deleteError:"The function for delete does not support two arguments (data, callback).",deleteClusterError:"Clusters cannot be deleted."},tooltip:{delay:300,fontColor:"black",fontSize:14,fontFace:"verdana",color:{border:"#666",background:"#FFFFC6"}},dragNetwork:!0,dragNodes:!0,zoomable:!0,hover:!1,hideEdgesOnDrag:!1,hideNodesOnDrag:!1},this.hoverObj={nodes:{},edges:{}},this.controlNodesActive=!1;var n=this;this.groups=new c,this.images=new u,this.images.setOnloadCallback(function(){n._redraw()}),this.xIncrement=0,this.yIncrement=0,this.zoomIncrement=0,this._loadPhysicsSystem(),this._create(),this._loadSectorSystem(),this._loadClusterSystem(),this._loadSelectionSystem(),this._loadHierarchySystem(),this._setTranslation(this.frame.clientWidth/2,this.frame.clientHeight/2),this._setScale(1),this.setOptions(i),this.freezeSimulation=!1,this.cachedFunctions={},this.calculationNodes={},this.calculationNodeIndices=[],this.nodeIndices=[],this.nodes={},this.edges={},this.canvasTopLeft={x:0,y:0},this.canvasBottomRight={x:0,y:0},this.pointerPosition={x:0,y:0},this.areaCenter={},this.scale=1,this.previousScale=this.scale,this.nodesData=null,this.edgesData=null,this.nodesListeners={add:function(t,e){n._addNodes(e.items),n.start()},update:function(t,e){n._updateNodes(e.items),n.start()},remove:function(t,e){n._removeNodes(e.items),n.start()}},this.edgesListeners={add:function(t,e){n._addEdges(e.items),n.start()},update:function(t,e){n._updateEdges(e.items),n.start()},remove:function(t,e){n._removeEdges(e.items),n.start()}},this.moving=!0,this.timer=void 0,this.setData(e,this.constants.clustering.enabled||this.constants.hierarchicalLayout.enabled),this.initializing=!1,1==this.constants.hierarchicalLayout.enabled?this._setupHierarchicalLayout():0==this.stabilize&&this.zoomExtent(!0,this.constants.clustering.enabled),this.constants.clustering.enabled&&this.startWithClustering()}var n=i(41),o=i(49),r=i(42),a=i(1),h=i(3),d=i(4),l=i(32),c=i(28),u=i(29),p=i(30),m=i(27),_=i(31),f=i(40);i(37),n(s.prototype),s.prototype._getScriptPath=function(){for(var t=document.getElementsByTagName("script"),e=0;et.x&&(s=t.x),nt.y&&(e=t.y),i=this.constants.clustering.initialMaxNodes?49.07548/(n+142.05338)+91444e-8:12.662/(n+7.4147)+.0964822:1==this.constants.clustering.enabled&&n>=this.constants.clustering.initialMaxNodes?77.5271985/(n+187.266146)+476710517e-13:30.5062972/(n+19.93597763)+.08413486;var o=Math.min(this.frame.canvas.clientWidth/600,this.frame.canvas.clientHeight/600);i*=o}else{var r=1.1*(Math.abs(s.minX)+Math.abs(s.maxX)),a=1.1*(Math.abs(s.minY)+Math.abs(s.maxY)),h=this.frame.canvas.clientWidth/r,d=this.frame.canvas.clientHeight/a;i=d>=h?h:d}i>1&&(i=1),this._setScale(i),this._centerNetwork(s),0==e&&(this.moving=!0,this.start())},s.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},s.prototype.setData=function(t,e){if(void 0===e&&(e=!1),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){if(t&&t.dot){var i=l.DOTToGraph(t.dot);return void this.setData(i)}}else this._setNodes(t&&t.nodes),this._setEdges(t&&t.edges);if(this._putDataInSector(),!e)if(this.stabilize){var s=this;setTimeout(function(){s._stabilize(),s.start()},0)}else this.start()},s.prototype.setOptions=function(t){if(t){var e;if(void 0!==t.width&&(this.width=t.width),void 0!==t.height&&(this.height=t.height),void 0!==t.stabilize&&(this.stabilize=t.stabilize),void 0!==t.selectable&&(this.selectable=t.selectable),void 0!==t.freezeForStabilization&&(this.constants.freezeForStabilization=t.freezeForStabilization),void 0!==t.configurePhysics&&(this.constants.configurePhysics=t.configurePhysics),void 0!==t.stabilizationIterations&&(this.constants.stabilizationIterations=t.stabilizationIterations),void 0!==t.dragNetwork&&(this.constants.dragNetwork=t.dragNetwork),void 0!==t.dragNodes&&(this.constants.dragNodes=t.dragNodes),void 0!==t.zoomable&&(this.constants.zoomable=t.zoomable),void 0!==t.hover&&(this.constants.hover=t.hover),void 0!==t.hideEdgesOnDrag&&(this.constants.hideEdgesOnDrag=t.hideEdgesOnDrag),void 0!==t.hideNodesOnDrag&&(this.constants.hideNodesOnDrag=t.hideNodesOnDrag),void 0!==t.dragGraph)throw new Error("Option dragGraph is renamed to dragNetwork");if(void 0!==t.labels)for(e in t.labels)t.labels.hasOwnProperty(e)&&(this.constants.labels[e]=t.labels[e]);if(t.onAdd&&(this.triggerFunctions.add=t.onAdd),t.onEdit&&(this.triggerFunctions.edit=t.onEdit),t.onEditEdge&&(this.triggerFunctions.editEdge=t.onEditEdge),t.onConnect&&(this.triggerFunctions.connect=t.onConnect),t.onDelete&&(this.triggerFunctions.del=t.onDelete),t.physics){if(t.physics.barnesHut){this.constants.physics.barnesHut.enabled=!0;for(e in t.physics.barnesHut)t.physics.barnesHut.hasOwnProperty(e)&&(this.constants.physics.barnesHut[e]=t.physics.barnesHut[e])}if(t.physics.repulsion){this.constants.physics.barnesHut.enabled=!1;for(e in t.physics.repulsion)t.physics.repulsion.hasOwnProperty(e)&&(this.constants.physics.repulsion[e]=t.physics.repulsion[e])}if(t.physics.hierarchicalRepulsion){this.constants.hierarchicalLayout.enabled=!0,this.constants.physics.hierarchicalRepulsion.enabled=!0,this.constants.physics.barnesHut.enabled=!1;for(e in t.physics.hierarchicalRepulsion)t.physics.hierarchicalRepulsion.hasOwnProperty(e)&&(this.constants.physics.hierarchicalRepulsion[e]=t.physics.hierarchicalRepulsion[e])}}if(void 0!==t.smoothCurves)if("boolean"==typeof t.smoothCurves)this.constants.smoothCurves.enabled=t.smoothCurves;else{this.constants.smoothCurves.enabled=!0;for(e in t.smoothCurves)t.smoothCurves.hasOwnProperty(e)&&(this.constants.smoothCurves[e]=t.smoothCurves[e])}if(t.hierarchicalLayout){this.constants.hierarchicalLayout.enabled=!0;for(e in t.hierarchicalLayout)t.hierarchicalLayout.hasOwnProperty(e)&&(this.constants.hierarchicalLayout[e]=t.hierarchicalLayout[e])}else void 0!==t.hierarchicalLayout&&(this.constants.hierarchicalLayout.enabled=!1);if(t.clustering){this.constants.clustering.enabled=!0;for(e in t.clustering)t.clustering.hasOwnProperty(e)&&(this.constants.clustering[e]=t.clustering[e])}else void 0!==t.clustering&&(this.constants.clustering.enabled=!1);if(t.navigation){this.constants.navigation.enabled=!0;for(e in t.navigation)t.navigation.hasOwnProperty(e)&&(this.constants.navigation[e]=t.navigation[e])}else void 0!==t.navigation&&(this.constants.navigation.enabled=!1);if(t.keyboard){this.constants.keyboard.enabled=!0;for(e in t.keyboard)t.keyboard.hasOwnProperty(e)&&(this.constants.keyboard[e]=t.keyboard[e])}else void 0!==t.keyboard&&(this.constants.keyboard.enabled=!1);if(t.dataManipulation){this.constants.dataManipulation.enabled=!0;for(e in t.dataManipulation)t.dataManipulation.hasOwnProperty(e)&&(this.constants.dataManipulation[e]=t.dataManipulation[e]);this.editMode=this.constants.dataManipulation.initiallyVisible}else void 0!==t.dataManipulation&&(this.constants.dataManipulation.enabled=!1);if(t.edges){for(e in t.edges)t.edges.hasOwnProperty(e)&&"object"!=typeof t.edges[e]&&(this.constants.edges[e]=t.edges[e]);void 0!==t.edges.color&&(a.isString(t.edges.color)?(this.constants.edges.color={},this.constants.edges.color.color=t.edges.color,this.constants.edges.color.highlight=t.edges.color,this.constants.edges.color.hover=t.edges.color):(void 0!==t.edges.color.color&&(this.constants.edges.color.color=t.edges.color.color),void 0!==t.edges.color.highlight&&(this.constants.edges.color.highlight=t.edges.color.highlight),void 0!==t.edges.color.hover&&(this.constants.edges.color.hover=t.edges.color.hover))),t.edges.fontColor||void 0!==t.edges.color&&(a.isString(t.edges.color)?this.constants.edges.fontColor=t.edges.color:void 0!==t.edges.color.color&&(this.constants.edges.fontColor=t.edges.color.color)),t.edges.dash&&(void 0!==t.edges.dash.length&&(this.constants.edges.dash.length=t.edges.dash.length),void 0!==t.edges.dash.gap&&(this.constants.edges.dash.gap=t.edges.dash.gap),void 0!==t.edges.dash.altLength&&(this.constants.edges.dash.altLength=t.edges.dash.altLength))}if(t.nodes){for(e in t.nodes)t.nodes.hasOwnProperty(e)&&(this.constants.nodes[e]=t.nodes[e]);t.nodes.color&&(this.constants.nodes.color=a.parseColor(t.nodes.color))}if(t.groups)for(var i in t.groups)if(t.groups.hasOwnProperty(i)){var s=t.groups[i];this.groups.add(i,s)}if(t.tooltip){for(e in t.tooltip)t.tooltip.hasOwnProperty(e)&&(this.constants.tooltip[e]=t.tooltip[e]);t.tooltip.color&&(this.constants.tooltip.color=a.parseColor(t.tooltip.color))}}this._loadPhysicsSystem(),this._loadNavigationControls(),this._loadManipulationSystem(),this._configureSmoothCurves(),this._createKeyBinds(),this.setSize(this.width,this.height),this.moving=!0,this.start()},s.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="network-frame",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),!this.frame.canvas.getContext){var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}var e=this;this.drag={},this.pinch={},this.hammer=o(this.frame.canvas,{prevent_default:!0}),this.hammer.on("tap",e._onTap.bind(e)),this.hammer.on("doubletap",e._onDoubleTap.bind(e)),this.hammer.on("hold",e._onHold.bind(e)),this.hammer.on("pinch",e._onPinch.bind(e)),this.hammer.on("touch",e._onTouch.bind(e)),this.hammer.on("dragstart",e._onDragStart.bind(e)),this.hammer.on("drag",e._onDrag.bind(e)),this.hammer.on("dragend",e._onDragEnd.bind(e)),this.hammer.on("release",e._onRelease.bind(e)),this.hammer.on("mousewheel",e._onMouseWheel.bind(e)),this.hammer.on("DOMMouseScroll",e._onMouseWheel.bind(e)),this.hammer.on("mousemove",e._onMouseMoveTitle.bind(e)),this.containerElement.appendChild(this.frame)},s.prototype._createKeyBinds=function(){var t=this;this.mousetrap=r,this.mousetrap.reset(),1==this.constants.keyboard.enabled&&(this.mousetrap.bind("up",this._moveUp.bind(t),"keydown"),this.mousetrap.bind("up",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("down",this._moveDown.bind(t),"keydown"),this.mousetrap.bind("down",this._yStopMoving.bind(t),"keyup"),this.mousetrap.bind("left",this._moveLeft.bind(t),"keydown"),this.mousetrap.bind("left",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("right",this._moveRight.bind(t),"keydown"),this.mousetrap.bind("right",this._xStopMoving.bind(t),"keyup"),this.mousetrap.bind("=",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("=",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("-",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("-",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("[",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("[",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("]",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("]",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pageup",this._zoomIn.bind(t),"keydown"),this.mousetrap.bind("pageup",this._stopZoom.bind(t),"keyup"),this.mousetrap.bind("pagedown",this._zoomOut.bind(t),"keydown"),this.mousetrap.bind("pagedown",this._stopZoom.bind(t),"keyup")),1==this.constants.dataManipulation.enabled&&(this.mousetrap.bind("escape",this._createManipulatorBar.bind(t)),this.mousetrap.bind("del",this._deleteSelected.bind(t))) +},s.prototype._getPointer=function(t){return{x:t.pageX-a.getAbsoluteLeft(this.frame.canvas),y:t.pageY-a.getAbsoluteTop(this.frame.canvas)}},s.prototype._onTouch=function(t){this.drag.pointer=this._getPointer(t.gesture.center),this.drag.pinched=!1,this.pinch.scale=this._getScale(),this._handleTouch(this.drag.pointer)},s.prototype._onDragStart=function(){this._handleDragStart()},s.prototype._handleDragStart=function(){var t=this.drag,e=this._getNodeAt(t.pointer);if(t.dragging=!0,t.selection=[],t.translation=this._getTranslation(),t.nodeId=null,null!=e){t.nodeId=e.id,e.isSelected()||this._selectObject(e,!1);for(var i in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(i)){var s=this.selectionObj.nodes[i],n={id:s.id,node:s,x:s.x,y:s.y,xFixed:s.xFixed,yFixed:s.yFixed};s.xFixed=!0,s.yFixed=!0,t.selection.push(n)}}},s.prototype._onDrag=function(t){this._handleOnDrag(t)},s.prototype._handleOnDrag=function(t){if(!this.drag.pinched){var e=this._getPointer(t.gesture.center),i=this,s=this.drag,n=s.selection;if(n&&n.length&&1==this.constants.dragNodes){var o=e.x-s.pointer.x,r=e.y-s.pointer.y;n.forEach(function(t){var e=t.node;t.xFixed||(e.x=i._XconvertDOMtoCanvas(i._XconvertCanvasToDOM(t.x)+o)),t.yFixed||(e.y=i._YconvertDOMtoCanvas(i._YconvertCanvasToDOM(t.y)+r))}),this.moving||(this.moving=!0,this.start())}else if(1==this.constants.dragNetwork){var a=e.x-this.drag.pointer.x,h=e.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+a,this.drag.translation.y+h),this._redraw()}}},s.prototype._onDragEnd=function(){this.drag.dragging=!1;var t=this.drag.selection;t&&t.forEach(function(t){t.node.xFixed=t.xFixed,t.node.yFixed=t.yFixed}),this._redraw()},s.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},s.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},s.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},s.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},s.prototype._onPinch=function(t){var e=this._getPointer(t.gesture.center);this.drag.pinched=!0,"scale"in this.pinch||(this.pinch.scale=1);var i=this.pinch.scale*t.gesture.scale;this._zoom(i,e)},s.prototype._zoom=function(t,e){if(1==this.constants.zoomable){var i=this._getScale();1e-5>t&&(t=1e-5),t>10&&(t=10);var s=this._getTranslation(),n=t/i,o=(1-n)*e.x+s.x*n,r=(1-n)*e.y+s.y*n;return this.areaCenter={x:this._XconvertDOMtoCanvas(e.x),y:this._YconvertDOMtoCanvas(e.y)},this._setScale(t),this._setTranslation(o,r),this.updateClustersDefault(),this._redraw(),t>i?this.emit("zoom",{direction:"+"}):this.emit("zoom",{direction:"-"}),t}},s.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this._getScale(),s=e/10;0>e&&(s/=1-s),i*=1+s;var n=a.fakeGesture(this,t),o=this._getPointer(n.center);this._zoom(i,o)}t.preventDefault()},s.prototype._onMouseMoveTitle=function(t){var e=a.fakeGesture(this,t),i=this._getPointer(e.center);this.popupObj&&this._checkHidePopup(i);var s=this,n=function(){s._checkShowPopup(i)};if(this.popupTimer&&clearInterval(this.popupTimer),this.drag.dragging||(this.popupTimer=setTimeout(n,this.constants.tooltip.delay)),1==this.constants.hover){for(var o in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(o)&&(this.hoverObj.edges[o].hover=!1,delete this.hoverObj.edges[o]);var r=this._getNodeAt(i);null==r&&(r=this._getEdgeAt(i)),null!=r&&this._hoverObject(r);for(var h in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(h)&&(r instanceof p&&r.id!=h||r instanceof m||null==r)&&(this._blurObject(this.hoverObj.nodes[h]),delete this.hoverObj.nodes[h]);this.redraw()}},s.prototype._checkShowPopup=function(t){var e,i={left:this._XconvertDOMtoCanvas(t.x),top:this._YconvertDOMtoCanvas(t.y),right:this._XconvertDOMtoCanvas(t.x),bottom:this._YconvertDOMtoCanvas(t.y)},s=this.popupObj;if(void 0==this.popupObj){var n=this.nodes;for(e in n)if(n.hasOwnProperty(e)){var o=n[e];if(void 0!==o.getTitle()&&o.isOverlappingWith(i)){this.popupObj=o;break}}}if(void 0===this.popupObj){var r=this.edges;for(e in r)if(r.hasOwnProperty(e)){var a=r[e];if(a.connected&&void 0!==a.getTitle()&&a.isOverlappingWith(i)){this.popupObj=a;break}}}if(this.popupObj){if(this.popupObj!=s){var h=this;h.popup||(h.popup=new _(h.frame,h.constants.tooltip)),h.popup.setPosition(t.x-3,t.y-3),h.popup.setText(h.popupObj.getTitle()),h.popup.show()}}else this.popup&&this.popup.hide()},s.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},s.prototype.setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,void 0!==this.manipulationDiv&&(this.manipulationDiv.style.width=this.frame.canvas.clientWidth+"px"),void 0!==this.navigationDivs&&void 0!==this.navigationDivs.wrapper&&(this.navigationDivs.wrapper.style.width=this.frame.canvas.clientWidth+"px",this.navigationDivs.wrapper.style.height=this.frame.canvas.clientHeight+"px"),this.emit("resize",{width:this.frame.canvas.width,height:this.frame.canvas.height})},s.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof h||t instanceof d)this.nodesData=t;else if(t instanceof Array)this.nodesData=new h,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new h}if(e&&a.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;a.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},s.prototype._addNodes=function(t){for(var e,i=0,s=t.length;s>i;i++){e=t[i];var n=this.nodesData.get(e),o=new p(n,this.images,this.groups,this.constants);if(this.nodes[e]=o,!(0!=o.xFixed&&0!=o.yFixed||null!==o.x&&null!==o.y)){var r=1*t.length,a=2*Math.PI*Math.random();0==o.xFixed&&(o.x=r*Math.cos(a)),0==o.yFixed&&(o.y=r*Math.sin(a))}this.moving=!0}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateValueRange(this.nodes),this.updateLabels()},s.prototype._updateNodes=function(t){for(var e=this.nodes,i=this.nodesData,s=0,n=t.length;n>s;s++){var o=t[s],r=e[o],a=i.get(o);r?r.setProperties(a,this.constants):(r=new p(properties,this.images,this.groups,this.constants),e[o]=r)}this.moving=!0,1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateNodeIndexList(),this._reconnectEdges(),this._updateValueRange(e)},s.prototype._removeNodes=function(t){for(var e=this.nodes,i=0,s=t.length;s>i;i++){var n=t[i];delete e[n]}this._updateNodeIndexList(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes(),this._reconnectEdges(),this._updateSelection(),this._updateValueRange(e)},s.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof h||t instanceof d)this.edgesData=t;else if(t instanceof Array)this.edgesData=new h,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new h}if(e&&a.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;a.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},s.prototype._addEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,n=t.length;n>s;s++){var o=t[s],r=e[o];r&&r.disconnect();var a=i.get(o,{showInternalIds:!0});e[o]=new m(a,this,this.constants)}this.moving=!0,this._updateValueRange(e),this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._updateEdges=function(t){for(var e=this.edges,i=this.edgesData,s=0,n=t.length;n>s;s++){var o=t[s],r=i.get(o),a=e[o];a?(a.disconnect(),a.setProperties(r,this.constants),a.connect()):(a=new m(r,this,this.constants),this.edges[o]=a)}this._createBezierNodes(),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this.moving=!0,this._updateValueRange(e)},s.prototype._removeEdges=function(t){for(var e=this.edges,i=0,s=t.length;s>i;i++){var n=t[i],o=e[n];o&&(null!=o.via&&delete this.sectors.support.nodes[o.via.id],o.disconnect(),delete e[n])}this.moving=!0,this._updateValueRange(e),1==this.constants.hierarchicalLayout.enabled&&0==this.initializing&&(this._resetLevels(),this._setupHierarchicalLayout()),this._updateCalculationNodes()},s.prototype._reconnectEdges=function(){var t,e=this.nodes,i=this.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var s=i[t];s.from=null,s.to=null,s.connect()}},s.prototype._updateValueRange=function(t){var e,i=void 0,s=void 0;for(e in t)if(t.hasOwnProperty(e)){var n=t[e].getValue();void 0!==n&&(i=void 0===i?n:Math.min(n,i),s=void 0===s?n:Math.max(n,s))}if(void 0!==i&&void 0!==s)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,s)},s.prototype.redraw=function(){this.setSize(this.width,this.height),this._redraw()},s.prototype._redraw=function(){var t=this.frame.canvas.getContext("2d"),e=this.frame.canvas.width,i=this.frame.canvas.height;t.clearRect(0,0,e,i),t.save(),t.translate(this.translation.x,this.translation.y),t.scale(this.scale,this.scale),this.canvasTopLeft={x:this._XconvertDOMtoCanvas(0),y:this._YconvertDOMtoCanvas(0)},this.canvasBottomRight={x:this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth),y:this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight)},this._doInAllSectors("_drawAllSectorNodes",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideEdgesOnDrag)&&this._doInAllSectors("_drawEdges",t),(0==this.drag.dragging||void 0===this.drag.dragging||0==this.constants.hideNodesOnDrag)&&this._doInAllSectors("_drawNodes",t,!1),1==this.controlNodesActive&&this._doInAllSectors("_drawControlNodes",t),t.restore()},s.prototype._setTranslation=function(t,e){void 0===this.translation&&(this.translation={x:0,y:0}),void 0!==t&&(this.translation.x=t),void 0!==e&&(this.translation.y=e),this.emit("viewChanged")},s.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},s.prototype._setScale=function(t){this.scale=t},s.prototype._getScale=function(){return this.scale},s.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},s.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},s.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},s.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},s.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},s.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},s.prototype._drawNodes=function(t,e){void 0===e&&(e=!1);var i=this.nodes,s=[];for(var n in i)i.hasOwnProperty(n)&&(i[n].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight),i[n].isSelected()?s.push(n):(i[n].inArea()||e)&&i[n].draw(t));for(var o=0,r=s.length;r>o;o++)(i[s[o]].inArea()||e)&&i[s[o]].draw(t)},s.prototype._drawEdges=function(t){var e=this.edges;for(var i in e)if(e.hasOwnProperty(i)){var s=e[i];s.setScale(this.scale),s.connected&&e[i].draw(t)}},s.prototype._drawControlNodes=function(t){var e=this.edges;for(var i in e)e.hasOwnProperty(i)&&e[i]._drawControlNodes(t)},s.prototype._stabilize=function(){1==this.constants.freezeForStabilization&&this._freezeDefinedNodes();for(var t=0;this.moving&&t0)for(t in i)i.hasOwnProperty(t)&&(i[t].discreteStepLimited(e,this.constants.maxVelocity),s=!0);else for(t in i)i.hasOwnProperty(t)&&(i[t].discreteStep(e),s=!0);if(1==s){var n=this.constants.minVelocity/Math.max(this.scale,.05);this.moving=n>.5*this.constants.maxVelocity?!0:this._isMoving(n)||this.constants.configurePhysics}},s.prototype._physicsTick=function(){this.freezeSimulation||this.moving&&(this._doInAllActiveSectors("_initializeForceCalculation"),this._doInAllActiveSectors("_discreteStepNodes"),this.constants.smoothCurves&&this._doInSupportSector("_discreteStepNodes"),this._findCenter(this._getRange()))},s.prototype._animationStep=function(){this.timer=void 0,this._handleNavigation(),this.start();var t=Date.now(),e=1;this._physicsTick();for(var i=Date.now()-t;i<.9*(this.renderTimestep-this.renderTime)&&eh}return!1},s.prototype._getColor=function(){var t=this.color;return"to"==this.inheritColor?t={highlight:this.to.color.highlight.border,hover:this.to.color.hover.border,color:this.to.color.border}:("from"==this.inheritColor||1==this.inheritColor)&&(t={highlight:this.from.color.highlight.border,hover:this.from.color.hover.border,color:this.from.color.border}),1==this.selected?t.highlight:1==this.hover?t.hover:t.color},s.prototype._drawLine=function(t){if(t.strokeStyle=this._getColor(),t.lineWidth=this._getLineWidth(),this.from!=this.to){var e,i=this._line(t);if(this.label){if(1==this.smoothCurves.enabled&&null!=i){var s=.5*(.5*(this.from.x+i.x)+.5*(this.to.x+i.x)),n=.5*(.5*(this.from.y+i.y)+.5*(this.to.y+i.y));e={x:s,y:n}}else e=this._pointOnLine(.5);this._label(t,this.label,e.x,e.y)}}else{var o,r,a=this.length/4,h=this.from;h.width||h.resize(t),h.width>h.height?(o=h.x+h.width/2,r=h.y-a):(o=h.x+a,r=h.y-h.height/2),this._circle(t,o,r,a),e=this._pointOnCircle(o,r,a,.5),this._label(t,this.label,e.x,e.y)}},s.prototype._getLineWidth=function(){return 1==this.selected?Math.min(this.widthSelected,this.widthMax)*this.networkScaleInv:1==this.hover?Math.min(this.hoverWidth,this.widthMax)*this.networkScaleInv:this.width*this.networkScaleInv},s.prototype._getViaCoordinates=function(){var t=null,e=null,i=this.smoothCurves.roundness,s=this.smoothCurves.type;if(0==i)return{x:null,y:null};var n=Math.abs(this.from.x-this.to.x),o=Math.abs(this.from.y-this.to.y);return"discrete"==s||"diagonalCross"==s?Math.abs(this.from.x-this.to.x)this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o)),"discrete"==s&&(t=i*o>n?this.from.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n)),"discrete"==s&&(e=i*n>o?this.from.y:e)):"straightCross"==s?Math.abs(this.from.x-this.to.x)Math.abs(this.from.y-this.to.y)&&(t=this.to.x,e=this.from.y):"horizontal"==s?(t=this.to.x,e=this.from.y):"vertical"==s?(t=this.from.x,e=this.to.y):Math.abs(this.from.x-this.to.x)this.to.y?this.from.xthis.to.x&&(t=this.from.x-i*o,e=this.from.y-i*o,t=this.to.x>t?this.to.x:t):this.from.ythis.to.x&&(t=this.from.x-i*o,e=this.from.y+i*o,t=this.to.x>t?this.to.x:t)):Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)&&(this.from.y>this.to.y?this.from.xe?this.to.y:e):this.from.x>this.to.x&&(t=this.from.x-i*n,e=this.from.y-i*n,e=this.to.y>e?this.to.y:e):this.from.ythis.to.x&&(t=this.from.x-i*n,e=this.from.y+i*n,e=this.to.yl.height?(a=l.x+.5*l.width,h=l.y-d):(a=l.x+d,h=l.y-.5*l.height),this._circle(t,a,h,d);var s=.2*Math.PI,n=(10+5*this.width)*this.arrowScaleFactor;e=this._pointOnCircle(a,h,d,.5),t.arrow(e.x,e.y,s,n),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(a,h,d,.5),this._label(t,this.label,e.x,e.y))}},s.prototype._drawArrow=function(t){1==this.selected?(t.strokeStyle=this.color.highlight,t.fillStyle=this.color.highlight):1==this.hover?(t.strokeStyle=this.color.hover,t.fillStyle=this.color.hover):(t.strokeStyle=this.color.color,t.fillStyle=this.color.color),t.lineWidth=this._getLineWidth();var e,i;if(this.from!=this.to){e=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var s,n=this.to.x-this.from.x,o=this.to.y-this.from.y,r=Math.sqrt(n*n+o*o),a=this.from.distanceToBorder(t,e+Math.PI),h=(r-a)/r,d=h*this.from.x+(1-h)*this.to.x,l=h*this.from.y+(1-h)*this.to.y;1==this.smoothCurves.dynamic&&1==this.smoothCurves.enabled?s=this.via:1==this.smoothCurves.enabled&&(s=this._getViaCoordinates()),1==this.smoothCurves.enabled&&null!=s.x&&(e=Math.atan2(this.to.y-s.y,this.to.x-s.x),n=this.to.x-s.x,o=this.to.y-s.y,r=Math.sqrt(n*n+o*o));var c,u,p=this.to.distanceToBorder(t,e),m=(r-p)/r;if(1==this.smoothCurves.enabled&&null!=s.x?(c=(1-m)*s.x+m*this.to.x,u=(1-m)*s.y+m*this.to.y):(c=(1-m)*this.from.x+m*this.to.x,u=(1-m)*this.from.y+m*this.to.y),t.beginPath(),t.moveTo(d,l),1==this.smoothCurves.enabled&&null!=s.x?t.quadraticCurveTo(s.x,s.y,c,u):t.lineTo(c,u),t.stroke(),i=(10+5*this.width)*this.arrowScaleFactor,t.arrow(c,u,e,i),t.fill(),t.stroke(),this.label){var _;if(1==this.smoothCurves.enabled&&null!=s){var f=.5*(.5*(this.from.x+s.x)+.5*(this.to.x+s.x)),g=.5*(.5*(this.from.y+s.y)+.5*(this.to.y+s.y));_={x:f,y:g}}else _=this._pointOnLine(.5);this._label(t,this.label,_.x,_.y)}}else{var y,v,M,b=this.from,w=.25*Math.max(100,this.length);b.width||b.resize(t),b.width>b.height?(y=b.x+.5*b.width,v=b.y-w,M={x:y,y:b.y,angle:.9*Math.PI}):(y=b.x+w,v=b.y-.5*b.height,M={x:b.x,y:v,angle:.6*Math.PI}),t.beginPath(),t.arc(y,v,w,0,2*Math.PI,!1),t.stroke();var i=(10+5*this.width)*this.arrowScaleFactor;t.arrow(M.x,M.y,M.angle,i),t.fill(),t.stroke(),this.label&&(_=this._pointOnCircle(y,v,w,.5),this._label(t,this.label,_.x,_.y))}},s.prototype._getDistanceToEdge=function(t,e,i,s,n,o){if(this.from!=this.to){if(1==this.smoothCurves.enabled){var r,a;if(1==this.smoothCurves.enabled&&1==this.smoothCurves.dynamic)r=this.via.x,a=this.via.y;else{var h=this._getViaCoordinates();r=h.x,a=h.y}var d,l,c,u,p,m,_=1e9;for(d=0;10>d;d++)l=.1*d,c=Math.pow(1-l,2)*t+2*l*(1-l)*r+Math.pow(l,2)*i,u=Math.pow(1-l,2)*e+2*l*(1-l)*a+Math.pow(l,2)*s,p=Math.abs(n-c),m=Math.abs(o-u),_=Math.min(_,Math.sqrt(p*p+m*m));return _}var f=i-t,g=s-e,y=f*f+g*g,v=((n-t)*f+(o-e)*g)/y;v>1?v=1:0>v&&(v=0);var c=t+v*f,u=e+v*g,p=c-n,m=u-o;return Math.sqrt(p*p+m*m)}var c,u,p,m,M=this.length/4,b=this.from;return b.width||b.resize(ctx),b.width>b.height?(c=b.x+b.width/2,u=b.y-M):(c=b.x+M,u=b.y-b.height/2),p=c-n,m=u-o,Math.abs(Math.sqrt(p*p+m*m)-M)},s.prototype.setScale=function(t){this.networkScaleInv=1/t},s.prototype.select=function(){this.selected=!0},s.prototype.unselect=function(){this.selected=!1},s.prototype.positionBezierNode=function(){null!==this.via&&(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y))},s.prototype._drawControlNodes=function(t){if(1==this.controlNodesEnabled){if(null===this.controlNodes.from&&null===this.controlNodes.to){var e="edgeIdFrom:".concat(this.id),i="edgeIdTo:".concat(this.id),s={nodes:{group:"",radius:8},physics:{damping:0},clustering:{maxNodeSizeIncrements:0,nodeScaling:{width:0,height:0,radius:0}}};this.controlNodes.from=new o({id:e,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s),this.controlNodes.to=new o({id:i,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s)}0==this.controlNodes.from.selected&&0==this.controlNodes.to.selected&&(this.controlNodes.positions=this.getControlNodePositions(t),this.controlNodes.from.x=this.controlNodes.positions.from.x,this.controlNodes.from.y=this.controlNodes.positions.from.y,this.controlNodes.to.x=this.controlNodes.positions.to.x,this.controlNodes.to.y=this.controlNodes.positions.to.y),this.controlNodes.from.draw(t),this.controlNodes.to.draw(t)}else this.controlNodes={from:null,to:null,positions:{}}},s.prototype._enableControlNodes=function(){this.controlNodesEnabled=!0},s.prototype._disableControlNodes=function(){this.controlNodesEnabled=!1},s.prototype._getSelectedControlNode=function(t,e){var i=this.controlNodes.positions,s=Math.sqrt(Math.pow(t-i.from.x,2)+Math.pow(e-i.from.y,2)),n=Math.sqrt(Math.pow(t-i.to.x,2)+Math.pow(e-i.to.y,2)); +return 15>s?(this.connectedNode=this.from,this.from=this.controlNodes.from,this.controlNodes.from):15>n?(this.connectedNode=this.to,this.to=this.controlNodes.to,this.controlNodes.to):null},s.prototype._restoreControlNodes=function(){1==this.controlNodes.from.selected&&(this.from=this.connectedNode,this.connectedNode=null,this.controlNodes.from.unselect()),1==this.controlNodes.to.selected&&(this.to=this.connectedNode,this.connectedNode=null,this.controlNodes.to.unselect())},s.prototype.getControlNodePositions=function(t){var e,i=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x),s=this.to.x-this.from.x,n=this.to.y-this.from.y,o=Math.sqrt(s*s+n*n),r=this.from.distanceToBorder(t,i+Math.PI),a=(o-r)/o,h=a*this.from.x+(1-a)*this.to.x,d=a*this.from.y+(1-a)*this.to.y;1==this.smoothCurves.dynamic&&1==this.smoothCurves.enabled?e=this.via:1==this.smoothCurves.enabled&&(e=this._getViaCoordinates()),1==this.smoothCurves.enabled&&null!=e.x&&(i=Math.atan2(this.to.y-e.y,this.to.x-e.x),s=this.to.x-e.x,n=this.to.y-e.y,o=Math.sqrt(s*s+n*n));var l,c,u=this.to.distanceToBorder(t,i),p=(o-u)/o;return 1==this.smoothCurves.enabled&&null!=e.x?(l=(1-p)*e.x+p*this.to.x,c=(1-p)*e.y+p*this.to.y):(l=(1-p)*this.from.x+p*this.to.x,c=(1-p)*this.from.y+p*this.to.y),{from:{x:h,y:d},to:{x:l,y:c}}},t.exports=s},function(t,e,i){function s(){this.clear(),this.defaultIndex=0}var n=i(1);s.DEFAULT=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}}],s.prototype.clear=function(){this.groups={},this.groups.length=function(){var t=0;for(var e in this)this.hasOwnProperty(e)&&t++;return t}},s.prototype.get=function(t){var e=this.groups[t];if(void 0==e){var i=this.defaultIndex%s.DEFAULT.length;this.defaultIndex++,e={},e.color=s.DEFAULT[i],this.groups[t]=e}return e},s.prototype.add=function(t,e){return this.groups[t]=e,e.color&&(e.color=n.parseColor(e.color)),e},t.exports=s},function(t){function e(){this.images={},this.callback=void 0}e.prototype.setOnloadCallback=function(t){this.callback=t},e.prototype.load=function(t){var e=this.images[t];if(void 0==e){var i=this;e=new Image,this.images[t]=e,e.onload=function(){i.callback&&i.callback(this)},e.src=t}return e},t.exports=e},function(t,e,i){function s(t,e,i,s){this.selected=!1,this.hover=!1,this.edges=[],this.dynamicEdges=[],this.reroutedEdges={},this.group=s.nodes.group,this.fontSize=Number(s.nodes.fontSize),this.fontFace=s.nodes.fontFace,this.fontColor=s.nodes.fontColor,this.fontDrawThreshold=3,this.color=s.nodes.color,this.id=void 0,this.shape=s.nodes.shape,this.image=s.nodes.image,this.x=null,this.y=null,this.xFixed=!1,this.yFixed=!1,this.horizontalAlignLeft=!0,this.verticalAlignTop=!0,this.radius=s.nodes.radius,this.baseRadiusValue=s.nodes.radius,this.radiusFixed=!1,this.radiusMin=s.nodes.radiusMin,this.radiusMax=s.nodes.radiusMax,this.level=-1,this.preassignedLevel=!1,this.imagelist=e,this.grouplist=i,this.fx=0,this.fy=0,this.vx=0,this.vy=0,this.minForce=s.minForce,this.damping=s.physics.damping,this.mass=1,this.fixedData={x:null,y:null},this.setProperties(t,s),this.resetCluster(),this.dynamicEdgesLength=0,this.clusterSession=0,this.clusterSizeWidthFactor=s.clustering.nodeScaling.width,this.clusterSizeHeightFactor=s.clustering.nodeScaling.height,this.clusterSizeRadiusFactor=s.clustering.nodeScaling.radius,this.maxNodeSizeIncrements=s.clustering.maxNodeSizeIncrements,this.growthIndicator=0,this.networkScaleInv=1,this.networkScale=1,this.canvasTopLeft={x:-300,y:-300},this.canvasBottomRight={x:300,y:300},this.parentEdgeId=null}var n=i(1);s.prototype.resetCluster=function(){this.formationScale=void 0,this.clusterSize=1,this.containedNodes={},this.containedEdges={},this.clusterSessions=[]},s.prototype.attachEdge=function(t){-1==this.edges.indexOf(t)&&this.edges.push(t),-1==this.dynamicEdges.indexOf(t)&&this.dynamicEdges.push(t),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.detachEdge=function(t){var e=this.edges.indexOf(t);-1!=e&&(this.edges.splice(e,1),this.dynamicEdges.splice(e,1)),this.dynamicEdgesLength=this.dynamicEdges.length},s.prototype.setProperties=function(t,e){if(t){if(this.originalLabel=void 0,void 0!==t.id&&(this.id=t.id),void 0!==t.label&&(this.label=t.label,this.originalLabel=t.label),void 0!==t.title&&(this.title=t.title),void 0!==t.group&&(this.group=t.group),void 0!==t.x&&(this.x=t.x),void 0!==t.y&&(this.y=t.y),void 0!==t.value&&(this.value=t.value),void 0!==t.level&&(this.level=t.level,this.preassignedLevel=!0),void 0!==t.mass&&(this.mass=t.mass),void 0!==t.horizontalAlignLeft&&(this.horizontalAlignLeft=t.horizontalAlignLeft),void 0!==t.verticalAlignTop&&(this.verticalAlignTop=t.verticalAlignTop),void 0!==t.triggerFunction&&(this.triggerFunction=t.triggerFunction),void 0===this.id)throw"Node must have an id";if(this.group){var i=this.grouplist.get(this.group);for(var s in i)i.hasOwnProperty(s)&&(this[s]=i[s])}if(void 0!==t.shape&&(this.shape=t.shape),void 0!==t.image&&(this.image=t.image),void 0!==t.radius&&(this.radius=t.radius),void 0!==t.color&&(this.color=n.parseColor(t.color)),void 0!==t.fontColor&&(this.fontColor=t.fontColor),void 0!==t.fontSize&&(this.fontSize=t.fontSize),void 0!==t.fontFace&&(this.fontFace=t.fontFace),void 0!==this.image&&""!=this.image){if(!this.imagelist)throw"No imagelist provided";this.imageObj=this.imagelist.load(this.image)}switch(this.xFixed=this.xFixed||void 0!==t.x&&!t.allowedToMoveX,this.yFixed=this.yFixed||void 0!==t.y&&!t.allowedToMoveY,this.radiusFixed=this.radiusFixed||void 0!==t.radius,"image"==this.shape&&(this.radiusMin=e.nodes.widthMin,this.radiusMax=e.nodes.widthMax),this.shape){case"database":this.draw=this._drawDatabase,this.resize=this._resizeDatabase;break;case"box":this.draw=this._drawBox,this.resize=this._resizeBox;break;case"circle":this.draw=this._drawCircle,this.resize=this._resizeCircle;break;case"ellipse":this.draw=this._drawEllipse,this.resize=this._resizeEllipse;break;case"image":this.draw=this._drawImage,this.resize=this._resizeImage;break;case"text":this.draw=this._drawText,this.resize=this._resizeText;break;case"dot":this.draw=this._drawDot,this.resize=this._resizeShape;break;case"square":this.draw=this._drawSquare,this.resize=this._resizeShape;break;case"triangle":this.draw=this._drawTriangle,this.resize=this._resizeShape;break;case"triangleDown":this.draw=this._drawTriangleDown,this.resize=this._resizeShape;break;case"star":this.draw=this._drawStar,this.resize=this._resizeShape;break;default:this.draw=this._drawEllipse,this.resize=this._resizeEllipse}this._reset()}},s.prototype.select=function(){this.selected=!0,this._reset()},s.prototype.unselect=function(){this.selected=!1,this._reset()},s.prototype.clearSizeCache=function(){this._reset()},s.prototype._reset=function(){this.width=void 0,this.height=void 0},s.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},s.prototype.distanceToBorder=function(t,e){var i=1;switch(this.width||this.resize(t),this.shape){case"circle":case"dot":return this.radius+i;case"ellipse":var s=this.width/2,n=this.height/2,o=Math.sin(e)*s,r=Math.cos(e)*n;return s*n/Math.sqrt(o*o+r*r);case"box":case"image":case"text":default:return this.width?Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i:0}},s.prototype._setForce=function(t,e){this.fx=t,this.fy=e},s.prototype._addForce=function(t,e){this.fx+=t,this.fy+=e},s.prototype.discreteStep=function(t){if(!this.xFixed){var e=this.damping*this.vx,i=(this.fx-e)/this.mass;this.vx+=i*t,this.x+=this.vx*t}if(!this.yFixed){var s=this.damping*this.vy,n=(this.fy-s)/this.mass;this.vy+=n*t,this.y+=this.vy*t}},s.prototype.discreteStepLimited=function(t,e){if(this.xFixed)this.fx=0;else{var i=this.damping*this.vx,s=(this.fx-i)/this.mass;this.vx+=s*t,this.vx=Math.abs(this.vx)>e?this.vx>0?e:-e:this.vx,this.x+=this.vx*t}if(this.yFixed)this.fy=0;else{var n=this.damping*this.vy,o=(this.fy-n)/this.mass;this.vy+=o*t,this.vy=Math.abs(this.vy)>e?this.vy>0?e:-e:this.vy,this.y+=this.vy*t}},s.prototype.isFixed=function(){return this.xFixed&&this.yFixed},s.prototype.isMoving=function(t){return Math.abs(this.vx)>t||Math.abs(this.vy)>t},s.prototype.isSelected=function(){return this.selected},s.prototype.getValue=function(){return this.value},s.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},s.prototype.setValueRange=function(t,e){if(!this.radiusFixed&&void 0!==this.value)if(e==t)this.radius=(this.radiusMin+this.radiusMax)/2;else{var i=(this.radiusMax-this.radiusMin)/(e-t);this.radius=(this.value-t)*i+this.radiusMin}this.baseRadiusValue=this.radius},s.prototype.draw=function(){throw"Draw method not initialized for node"},s.prototype.resize=function(){throw"Resize method not initialized for node"},s.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},s.prototype._resizeImage=function(){if(!this.width||!this.height){var t,e;if(this.value){this.radius=this.baseRadiusValue;var i=this.imageObj.height/this.imageObj.width;void 0!==i?(t=this.radius||this.imageObj.width,e=this.radius*i||this.imageObj.height):(t=0,e=0)}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.growthIndicator=0,this.width>0&&this.height>0&&(this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t)}},s.prototype._drawImage=function(t){this._resizeImage(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e;if(0!=this.imageObj.width){if(this.clusterSize>1){var i=this.clusterSize>1?10:0;i*=this.networkScaleInv,i=Math.min(.2*this.width,i),t.globalAlpha=.5,t.drawImage(this.imageObj,this.left-i,this.top-i,this.width+2*i,this.height+2*i)}t.globalAlpha=1,t.drawImage(this.imageObj,this.left,this.top,this.width,this.height),e=this.y+this.height/2}else e=this.y;this._label(t,this.label,this.x,e,void 0,"top")},s.prototype._resizeBox=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawBox=function(t){this._resizeBox(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=2;t.strokeStyle=this.selected?this.color.highlight.border:this.hover?this.color.hover.border:this.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.roundRect(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth,this.radius),t.stroke()),t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.color.background,t.roundRect(this.left,this.top,this.width,this.height,this.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeDatabase=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=i.width+2*e;this.width=s,this.height=s,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-s}},s.prototype._drawDatabase=function(t){this._resizeDatabase(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=2;t.strokeStyle=this.selected?this.color.highlight.border:this.hover?this.color.hover.border:this.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.database(this.x-this.width/2-2*t.lineWidth,this.y-.5*this.height-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.hover?this.color.hover.background:this.color.background,t.database(this.x-this.width/2,this.y-.5*this.height,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeCircle=function(t){if(!this.width){var e=5,i=this.getTextSize(t),s=Math.max(i.width,i.height)+2*e;this.radius=s/2,this.width=s,this.height=s,this.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.radius-.5*s}},s.prototype._drawCircle=function(t){this._resizeCircle(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var e=2.5,i=2;t.strokeStyle=this.selected?this.color.highlight.border:this.hover?this.color.hover.border:this.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.circle(this.x,this.y,this.radius+2*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.hover?this.color.hover.background:this.color.background,t.circle(this.x,this.y,this.radius),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._resizeEllipse=function(t){if(!this.width){var e=this.getTextSize(t);this.width=1.5*e.width,this.height=2*e.height,this.width1&&(t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.ellipse(this.left-2*t.lineWidth,this.top-2*t.lineWidth,this.width+4*t.lineWidth,this.height+4*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?i:1)+(this.clusterSize>1?e:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.hover?this.color.hover.background:this.color.background,t.ellipse(this.left,this.top,this.width,this.height),t.fill(),t.stroke(),this._label(t,this.label,this.x,this.y)},s.prototype._drawDot=function(t){this._drawShape(t,"circle")},s.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},s.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},s.prototype._drawSquare=function(t){this._drawShape(t,"square")},s.prototype._drawStar=function(t){this._drawShape(t,"star")},s.prototype._resizeShape=function(){if(!this.width){this.radius=this.baseRadiusValue;var t=2*this.radius;this.width=t,this.height=t,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.radius+=.5*Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-t}},s.prototype._drawShape=function(t,e){this._resizeShape(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2;var i=2.5,s=2,n=2;switch(e){case"dot":n=2;break;case"square":n=2;break;case"triangle":n=3;break;case"triangleDown":n=3;break;case"star":n=4}t.strokeStyle=this.selected?this.color.highlight.border:this.hover?this.color.hover.border:this.color.border,this.clusterSize>1&&(t.lineWidth=(this.selected?s:1)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t[e](this.x,this.y,this.radius+n*t.lineWidth),t.stroke()),t.lineWidth=(this.selected?s:1)+(this.clusterSize>1?i:0),t.lineWidth*=this.networkScaleInv,t.lineWidth=Math.min(.1*this.width,t.lineWidth),t.fillStyle=this.selected?this.color.highlight.background:this.hover?this.color.hover.background:this.color.background,t[e](this.x,this.y,this.radius),t.fill(),t.stroke(),this.label&&this._label(t,this.label,this.x,this.y+this.height/2,void 0,"top",!0)},s.prototype._resizeText=function(t){if(!this.width){var e=5,i=this.getTextSize(t);this.width=i.width+2*e,this.height=i.height+2*e,this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor,this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor,this.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor,this.growthIndicator=this.width-(i.width+2*e)}},s.prototype._drawText=function(t){this._resizeText(t),this.left=this.x-this.width/2,this.top=this.y-this.height/2,this._label(t,this.label,this.x,this.y)},s.prototype._label=function(t,e,i,s,n,o,r){if(e&&this.fontSize*this.networkScale>this.fontDrawThreshold){t.font=(this.selected?"bold ":"")+this.fontSize+"px "+this.fontFace,t.fillStyle=this.fontColor||"black",t.textAlign=n||"center",t.textBaseline=o||"middle";var a=e.split("\n"),h=a.length,d=this.fontSize+4,l=s+(1-h)/2*d;1==r&&(l=s+(1-h)/(2*d));for(var c=0;h>c;c++)t.fillText(a[c],i,l),l+=d}},s.prototype.getTextSize=function(t){if(void 0!==this.label){t.font=(this.selected?"bold ":"")+this.fontSize+"px "+this.fontFace;for(var e=this.label.split("\n"),i=(this.fontSize+4)*e.length,s=0,n=0,o=e.length;o>n;n++)s=Math.max(s,t.measureText(e[n]).width);return{width:s,height:i}}return{width:0,height:0}},s.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.networkScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.networkScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.networkScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.ys&&(o=s-e-this.padding),on&&(r=n-i-this.padding),ri;i++)if(e.id===r.nodes[i].id){n=r.nodes[i];break}for(n||(n={id:e.id},t.node&&(n.attr=a(n.attr,t.node))),i=o.length-1;i>=0;i--){var h=o[i];h.nodes||(h.nodes=[]),-1==h.nodes.indexOf(n)&&h.nodes.push(n)}e.attr&&(n.attr=a(n.attr,e.attr))}function l(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=a({},t.edge);e.attr=a(i,e.attr)}}function c(t,e,i,s,n){var o={from:e,to:i,type:s};return t.edge&&(o.attr=a({},t.edge)),o.attr=a(o.attr||{},n),o}function u(){for(C=D.NULL,E="";" "==k||" "==k||"\n"==k||"\r"==k;)n();do{var t=!1;if("#"==k){for(var e=S-1;" "==Y.charAt(e)||" "==Y.charAt(e);)e--;if("\n"==Y.charAt(e)||""==Y.charAt(e)){for(;""!=k&&"\n"!=k;)n();t=!0}}if("/"==k&&"/"==o()){for(;""!=k&&"\n"!=k;)n();t=!0}if("/"==k&&"*"==o()){for(;""!=k;){if("*"==k&&"/"==o()){n(),n();break}n()}t=!0}for(;" "==k||" "==k||"\n"==k||"\r"==k;)n()}while(t);if(""==k)return void(C=D.DELIMITER);var i=k+o();if(T[i])return C=D.DELIMITER,E=i,n(),void n();if(T[k])return C=D.DELIMITER,E=k,void n();if(r(k)||"-"==k){for(E+=k,n();r(k);)E+=k,n();return"false"==E?E=!1:"true"==E?E=!0:isNaN(Number(E))||(E=Number(E)),void(C=D.IDENTIFIER)}if('"'==k){for(n();""!=k&&('"'!=k||'"'==k&&'"'==o());)E+=k,'"'==k&&n(),n();if('"'!=k)throw b('End of string " expected');return n(),void(C=D.IDENTIFIER)}for(C=D.UNKNOWN;""!=k;)E+=k,n();throw new SyntaxError('Syntax error in part "'+w(E,30)+'"')}function p(){var t={};if(s(),u(),"strict"==E&&(t.strict=!0,u()),("graph"==E||"digraph"==E)&&(t.type=E,u()),C==D.IDENTIFIER&&(t.id=E,u()),"{"!=E)throw b("Angle bracket { expected");if(u(),m(t),"}"!=E)throw b("Angle bracket } expected");if(u(),""!==E)throw b("End of file expected");return u(),delete t.node,delete t.edge,delete t.graph,t}function m(t){for(;""!==E&&"}"!=E;)_(t),";"==E&&u()}function _(t){var e=f(t);if(e)return void v(t,e);var i=g(t);if(!i){if(C!=D.IDENTIFIER)throw b("Identifier expected");var s=E;if(u(),"="==E){if(u(),C!=D.IDENTIFIER)throw b("Identifier expected");t[s]=E,u()}else y(t,s)}}function f(t){var e=null;if("subgraph"==E&&(e={},e.type="subgraph",u(),C==D.IDENTIFIER&&(e.id=E,u())),"{"==E){if(u(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,m(e),"}"!=E)throw b("Angle bracket } expected");u(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function g(t){return"node"==E?(u(),t.node=M(),"node"):"edge"==E?(u(),t.edge=M(),"edge"):"graph"==E?(u(),t.graph=M(),"graph"):null}function y(t,e){var i={id:e},s=M();s&&(i.attr=s),d(t,i),v(t,e)}function v(t,e){for(;"->"==E||"--"==E;){var i,s=E;u();var n=f(t);if(n)i=n;else{if(C!=D.IDENTIFIER)throw b("Identifier or subgraph expected");i=E,d(t,{id:i}),u()}var o=M(),r=c(t,e,i,s,o);l(t,r),e=i}}function M(){for(var t=null;"["==E;){for(u(),t={};""!==E&&"]"!=E;){if(C!=D.IDENTIFIER)throw b("Attribute name expected");var e=E;if(u(),"="!=E)throw b("Equal sign = expected");if(u(),C!=D.IDENTIFIER)throw b("Attribute value expected");var i=E;h(t,e,i),u(),","==E&&u()}if("]"!=E)throw b("Bracket ] expected");u()}return t}function b(t){return new SyntaxError(t+', got "'+w(E,30)+'" (char '+S+")")}function w(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function L(t,e,i){t instanceof Array?t.forEach(function(t){e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}):e instanceof Array?e.forEach(function(e){i(t,e)}):i(t,e)}function x(t){function e(t){var e={from:t.from,to:t.to};return a(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var s=i(t),n={nodes:[],edges:[],options:{}};return s.nodes&&s.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};a(e,t.attr),e.image&&(e.shape="image"),n.nodes.push(e)}),s.edges&&s.edges.forEach(function(t){var i,s;i=t.from instanceof Object?t.from.nodes:{id:t.from},s=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var i=e(t);n.edges.push(i)}),L(i,s,function(i,s){var o=c(n,i.id,s.id,t.type,t.attr),r=e(o);n.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var i=e(t);n.edges.push(i)})}),s.attr&&(n.options=s.attr),n}var D={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},T={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},Y="",S=0,k="",E="",C=D.NULL,N=/[a-zA-Z_0-9.:#]/;e.parseDOT=i,e.DOTToGraph=x},function(t){function e(t,e,i){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0,this.z=void 0!==i?i:0}e.subtract=function(t,i){var s=new e;return s.x=t.x-i.x,s.y=t.y-i.y,s.z=t.z-i.z,s},e.add=function(t,i){var s=new e;return s.x=t.x+i.x,s.y=t.y+i.y,s.z=t.z+i.z,s},e.avg=function(t,i){return new e((t.x+i.x)/2,(t.y+i.y)/2,(t.z+i.z)/2)},e.crossProduct=function(t,i){var s=new e;return s.x=t.y*i.z-t.z*i.y,s.y=t.z*i.x-t.x*i.z,s.z=t.x*i.y-t.y*i.x,s},e.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},t.exports=e},function(t){Point2d=function(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0},t.exports=Point2d},function(t,e,i){function s(t,e,i){this.data=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=i.getDistinctValues(t.get(),this.column),this.values.sort(function(t,e){return t>e?1:e>t?-1:0}),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var n=i(4);s.prototype.isLoaded=function(){return this.loaded},s.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},s.prototype.getLabel=function(){return this.graph.filterLabel},s.prototype.getColumn=function(){return this.column},s.prototype.getSelectedValue=function(){return void 0===this.index?void 0:this.values[this.index]},s.prototype.getValues=function(){return this.values},s.prototype.getValue=function(t){if(t>=this.values.length)throw"Error: index out of range";return this.values[t]},s.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var s=new n(this.data,{filter:function(t){return t[i.column]==i.value}}).get();e=this.graph._getDataPoints(s),this.dataPoints[t]=e}return e},s.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},s.prototype.selectValue=function(t){if(t>=this.values.length)throw"Error: index out of range";this.index=t,this.value=this.values[t]},s.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t=t||(void 0!==i&&(this.prettyStep=i),this._step=this.prettyStep===!0?e.calculatePrettyStep(t):t)},e.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),s=2*Math.pow(10,Math.round(e(t/2))),n=5*Math.pow(10,Math.round(e(t/5))),o=i;return Math.abs(s-t)<=Math.abs(o-t)&&(o=s),Math.abs(n-t)<=Math.abs(o-t)&&(o=n),0>=o&&(o=1),o},e.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},e.prototype.getStep=function(){return this._step},e.prototype.start=function(){this._current=this._start-this._start%this._step},e.prototype.next=function(){this._current+=this._step},e.prototype.end=function(){return this._current>this._end},t.exports=e},function(){"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1)},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i)},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath();var s=2*i,n=s/2,o=Math.sqrt(3)/6*s,r=Math.sqrt(s*s-n*n);this.moveTo(t,e-(r-o)),this.lineTo(t+n,e+o),this.lineTo(t-n,e+o),this.lineTo(t,e-(r-o)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath();var s=2*i,n=s/2,o=Math.sqrt(3)/6*s,r=Math.sqrt(s*s-n*n);this.moveTo(t,e+(r-o)),this.lineTo(t+n,e-o),this.lineTo(t-n,e-o),this.lineTo(t,e+(r-o)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath();for(var s=0;10>s;s++){var n=s%2===0?1.3*i:.5*i;this.lineTo(t+n*Math.sin(2*s*Math.PI/10),e-n*Math.cos(2*s*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,s,n){var o=Math.PI/180;0>i-2*n&&(n=i/2),0>s-2*n&&(n=s/2),this.beginPath(),this.moveTo(t+n,e),this.lineTo(t+i-n,e),this.arc(t+i-n,e+n,n,270*o,360*o,!1),this.lineTo(t+i,e+s-n),this.arc(t+i-n,e+s-n,n,0,90*o,!1),this.lineTo(t+n,e+s),this.arc(t+n,e+s-n,n,90*o,180*o,!1),this.lineTo(t,e+n),this.arc(t+n,e+n,n,180*o,270*o,!1) +},CanvasRenderingContext2D.prototype.ellipse=function(t,e,i,s){var n=.5522848,o=i/2*n,r=s/2*n,a=t+i,h=e+s,d=t+i/2,l=e+s/2;this.beginPath(),this.moveTo(t,l),this.bezierCurveTo(t,l-r,d-o,e,d,e),this.bezierCurveTo(d+o,e,a,l-r,a,l),this.bezierCurveTo(a,l+r,d+o,h,d,h),this.bezierCurveTo(d-o,h,t,l+r,t,l)},CanvasRenderingContext2D.prototype.database=function(t,e,i,s){var n=1/3,o=i,r=s*n,a=.5522848,h=o/2*a,d=r/2*a,l=t+o,c=e+r,u=t+o/2,p=e+r/2,m=e+(s-r/2),_=e+s;this.beginPath(),this.moveTo(l,p),this.bezierCurveTo(l,p+d,u+h,c,u,c),this.bezierCurveTo(u-h,c,t,p+d,t,p),this.bezierCurveTo(t,p-d,u-h,e,u,e),this.bezierCurveTo(u+h,e,l,p-d,l,p),this.lineTo(l,m),this.bezierCurveTo(l,m+d,u+h,_,u,_),this.bezierCurveTo(u-h,_,t,m+d,t,m),this.lineTo(t,p)},CanvasRenderingContext2D.prototype.arrow=function(t,e,i,s){var n=t-s*Math.cos(i),o=e-s*Math.sin(i),r=t-.9*s*Math.cos(i),a=e-.9*s*Math.sin(i),h=n+s/3*Math.cos(i+.5*Math.PI),d=o+s/3*Math.sin(i+.5*Math.PI),l=n+s/3*Math.cos(i-.5*Math.PI),c=o+s/3*Math.sin(i-.5*Math.PI);this.beginPath(),this.moveTo(t,e),this.lineTo(h,d),this.lineTo(r,a),this.lineTo(l,c),this.closePath()},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,s,n){n||(n=[10,5]),0==u&&(u=.001);var o=n.length;this.moveTo(t,e);for(var r=i-t,a=s-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,c=!0;d>=.1;){var u=n[l++%o];u>d&&(u=d);var p=Math.sqrt(u*u/(1+h*h));0>r&&(p=-p),t+=p,e+=h*p,this[c?"lineTo":"moveTo"](t,e),d-=u,c=!c}})},function(t,e,i){t.exports="undefined"!=typeof window?window.Hammer||i(49):function(){throw Error("hammer.js is only available in a browser, not in node.js.")}},function(t,e,i){t.exports="undefined"!=typeof window&&window.moment||i(51)},function(t,e,i){var s=i(50),n=i(43),o=i(44),r=i(45),a=i(46),h=i(47),d=i(48);e._loadMixin=function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},e._clearMixin=function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=void 0)},e._loadPhysicsSystem=function(){this._loadMixin(s),this._loadSelectedForceSolver(),1==this.constants.configurePhysics&&this._loadPhysicsConfiguration()},e._loadClusterSystem=function(){this.clusterSession=0,this.hubThreshold=5,this._loadMixin(n)},e._loadSectorSystem=function(){this.sectors={},this.activeSector=["default"],this.sectors.active={},this.sectors.active["default"]={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:void 0},this.sectors.frozen={},this.sectors.support={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:void 0},this.nodeIndices=this.sectors.active["default"].nodeIndices,this._loadMixin(o)},e._loadSelectionSystem=function(){this.selectionObj={nodes:{},edges:{}},this._loadMixin(r)},e._loadManipulationSystem=function(){this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,1==this.constants.dataManipulation.enabled?(void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="network-manipulationDiv",this.manipulationDiv.id="network-manipulationDiv",this.manipulationDiv.style.display=1==this.editMode?"block":"none",this.containerElement.insertBefore(this.manipulationDiv,this.frame)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="network-manipulation-editMode",this.editModeDiv.id="network-manipulation-editMode",this.editModeDiv.style.display=1==this.editMode?"none":"block",this.containerElement.insertBefore(this.editModeDiv,this.frame)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="network-manipulation-closeDiv",this.closeDiv.id="network-manipulation-closeDiv",this.closeDiv.style.display=this.manipulationDiv.style.display,this.containerElement.insertBefore(this.closeDiv,this.frame)),this._loadMixin(a),this._createManipulatorBar()):void 0!==this.manipulationDiv&&(this._createManipulatorBar(),this.containerElement.removeChild(this.manipulationDiv),this.containerElement.removeChild(this.editModeDiv),this.containerElement.removeChild(this.closeDiv),this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0,this._clearMixin(a))},e._loadNavigationControls=function(){this._loadMixin(h),this._cleanNavigation(),1==this.constants.navigation.enabled&&this._loadNavigationElements()},e._loadHierarchySystem=function(){this._loadMixin(d)}},function(t){function e(t){return t?i(t):void 0}function i(t){for(var i in e.prototype)t[i]=e.prototype[i];return t}t.exports=e,e.prototype.on=e.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},e.prototype.once=function(t,e){function i(){s.off(t,i),e.apply(this,arguments)}var s=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},e.prototype.off=e.prototype.removeListener=e.prototype.removeAllListeners=e.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var s,n=0;ns;++s)i[s].apply(this,e)}return this},e.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},e.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t){function e(t,e,i){return t.addEventListener?t.addEventListener(e,i,!1):void t.attachEvent("on"+e,i)}function i(t){return"keypress"==t.type?String.fromCharCode(t.which):M[t.which]?M[t.which]:b[t.which]?b[t.which]:String.fromCharCode(t.which).toLowerCase()}function s(t){var e=t.target||t.srcElement,i=e.tagName;return(" "+e.className+" ").indexOf(" mousetrap ")>-1?!1:"INPUT"==i||"SELECT"==i||"TEXTAREA"==i||e.contentEditable&&"true"==e.contentEditable}function n(t,e){return t.sort().join(",")===e.sort().join(",")}function o(t){t=t||{};var e,i=!1;for(e in T)t[e]?i=!0:T[e]=0;i||(S=!1)}function r(t,e,i,s,o){var r,a,h=[];if(!x[t])return[];for("keyup"==i&&c(t)&&(e=[t]),r=0;r95&&112>t||M.hasOwnProperty(t)&&(y[M[t]]=t)}return y}function m(t,e,i){return i||(i=p()[t]?"keydown":"keypress"),"keypress"==i&&e.length&&(i="keydown"),i}function _(t,e,s,n){T[t]=0,n||(n=m(e[0],[]));var r,a=function(){S=n,++T[t],u()},d=function(t){h(s,t),"keyup"!==n&&(Y=i(t)),setTimeout(o,10)};for(r=0;r1)return _(t,d,e,i);for(h="+"===t?["+"]:t.split("+"),o=0;o":".","?":"/","|":"\\"},L={option:"alt",command:"meta","return":"enter",escape:"esc"},x={},D={},T={},Y=!1,S=!1,k=1;20>k;++k)M[111+k]="f"+k;for(k=0;9>=k;++k)M[k+96]=k;e(document,"keypress",l),e(document,"keydown",l),e(document,"keyup",l);var E={bind:function(t,e,i){return g(t instanceof Array?t:[t],e,i),D[t+":"+i]=e,this},unbind:function(t,e){return D[t+":"+e]&&(delete D[t+":"+e],this.bind(t,function(){},e)),this},trigger:function(t,e){return D[t+":"+e](),this},reset:function(){return x={},D={},this}};t.exports=E},function(t,e){e.startWithClustering=function(){this.clusterToFit(this.constants.clustering.initialMaxNodes,!0),this.updateLabels(),this.stabilize&&this._stabilize(),this.start()},e.clusterToFit=function(t,e){for(var i=this.nodeIndices.length,s=50,n=0;i>t&&s>n;)n%3==0?(this.forceAggregateHubs(!0),this.normalizeClusterLevels()):this.increaseClusterLevel(),i=this.nodeIndices.length,n+=1;n>0&&1==e&&this.repositionNodes(),this._updateCalculationNodes()},e.openCluster=function(t){var e=this.moving;if(t.clusterSize>this.constants.clustering.sectorThreshold&&this._nodeInActiveArea(t)&&("default"!=this._sector()||1!=this.nodeIndices.length)){this._addSector(t);for(var i=0;this.nodeIndices.lengthi;)this.decreaseClusterLevel(),i+=1}else this._expandClusterNode(t,!1,!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this._updateCalculationNodes(),this.updateLabels();this.moving!=e&&this.start()},e.updateClustersDefault=function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},e.increaseClusterLevel=function(){this.updateClusters(-1,!1,!0)},e.decreaseClusterLevel=function(){this.updateClusters(1,!1,!0)},e.updateClusters=function(t,e,i,s){var n=this.moving,o=this.nodeIndices.length;this.previousScale>this.scale&&0==t&&this._collapseSector(),this.previousScale>this.scale||-1==t?this._formClusters(i):(this.previousScalethis.scale||-1==t)&&(this._aggregateHubs(i),this._updateNodeIndexList()),(this.previousScale>this.scale||-1==t)&&(this.handleChains(),this._updateNodeIndexList()),this.previousScale=this.scale,this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.lengththis.constants.clustering.chainThreshold&&this._reduceAmountOfChains(1-this.constants.clustering.chainThreshold/t)},e._aggregateHubs=function(t){this._getHubSize(),this._formClustersByHub(t,!1)},e.forceAggregateHubs=function(t){var e=this.moving,i=this.nodeIndices.length;this._aggregateHubs(!0),this._updateNodeIndexList(),this._updateDynamicEdges(),this.updateLabels(),this.nodeIndices.length!=i&&(this.clusterSession+=1),(0==t||void 0===t)&&this.moving!=e&&this.start()},e._openClustersBySize=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];1==e.inView()&&(e.width*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||e.height*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight)&&this.openCluster(e)}},e._openClusters=function(t,e){for(var i=0;i1&&(t.clusterSizei)){var r=o.from,a=o.to;o.to.mass>o.from.mass&&(r=o.to,a=o.from),1==a.dynamicEdgesLength?this._addToCluster(r,a,!1):1==r.dynamicEdgesLength&&this._addToCluster(a,r,!1)}}},e._forceClustersByZoom=function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];if(1==e.dynamicEdgesLength&&0!=e.dynamicEdges.length){var i=e.dynamicEdges[0],s=i.toId==e.id?this.nodes[i.fromId]:this.nodes[i.toId];e.id!=s.id&&(s.mass>e.mass?this._addToCluster(s,e,!0):this._addToCluster(e,s,!0))}}},e._clusterToSmallestNeighbour=function(t){for(var e=-1,i=null,s=0;sn.clusterSessions.length&&(e=n.clusterSessions.length,i=n)}null!=n&&void 0!==this.nodes[n.id]&&this._addToCluster(n,t,!0)},e._formClustersByHub=function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,e)},e._formClusterFromHub=function(t,e,i,s){if(void 0===s&&(s=0),t.dynamicEdgesLength>=this.hubThreshold&&0==i||t.dynamicEdgesLength==this.hubThreshold&&1==i){for(var n,o,r,a=this.constants.clustering.clusterEdgeThreshold/this.scale,h=!1,d=[],l=t.dynamicEdges.length,c=0;l>c;c++)d.push(t.dynamicEdges[c].id);if(0==e)for(h=!1,c=0;l>c;c++){var u=this.edges[d[c]];if(void 0!==u&&u.connected&&u.toId!=u.fromId&&(n=u.to.x-u.from.x,o=u.to.y-u.from.y,r=Math.sqrt(n*n+o*o),a>r)){h=!0;break}}if(!e&&h||e)for(c=0;l>c;c++)if(u=this.edges[d[c]],void 0!==u){var p=this.nodes[u.fromId==t.id?u.toId:u.fromId];p.dynamicEdges.length<=this.hubThreshold+s&&p.id!=t.id&&this._addToCluster(t,p,e)}}},e._addToCluster=function(t,e,i){t.containedNodes[e.id]=e;for(var s=0;s1)for(var s=0;s1&&(e.label="[".concat(String(e.clusterSize),"]"))}for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(e=this.nodes[t],1==e.clusterSize&&(e.label=void 0!==e.originalLabel?e.originalLabel:String(e.id)))},e.normalizeClusterLevels=function(){var t,e=0,i=1e9,s=0;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&(s=this.nodes[t].clusterSessions.length,s>e&&(e=s),i>s&&(i=s));if(e-i>this.constants.clustering.clusterLevelDifference){var n=this.nodeIndices.length,o=e-this.constants.clustering.clusterLevelDifference;for(t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodes[t].clusterSessions.lengths&&(s=o.dynamicEdgesLength),t+=o.dynamicEdgesLength,e+=Math.pow(o.dynamicEdgesLength,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r);this.hubThreshold=Math.floor(t+2*a),this.hubThreshold>s&&(this.hubThreshold=s)},e._reduceAmountOfChains=function(t){this.hubThreshold=2;var e=Math.floor(this.nodeIndices.length*t);for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&e>0&&(this._formClusterFromHub(this.nodes[i],!0,!0,1),e-=1)},e._getChainFraction=function(){var t=0,e=0;for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&(2==this.nodes[i].dynamicEdgesLength&&this.nodes[i].dynamicEdges.length>=2&&(t+=1),e+=1);return t/e}},function(t,e,i){var s=i(1);e._putDataInSector=function(){this.sectors.active[this._sector()].nodes=this.nodes,this.sectors.active[this._sector()].edges=this.edges,this.sectors.active[this._sector()].nodeIndices=this.nodeIndices},e._switchToSector=function(t,e){void 0===e||"active"==e?this._switchToActiveSector(t):this._switchToFrozenSector(t)},e._switchToActiveSector=function(t){this.nodeIndices=this.sectors.active[t].nodeIndices,this.nodes=this.sectors.active[t].nodes,this.edges=this.sectors.active[t].edges},e._switchToSupportSector=function(){this.nodeIndices=this.sectors.support.nodeIndices,this.nodes=this.sectors.support.nodes,this.edges=this.sectors.support.edges},e._switchToFrozenSector=function(t){this.nodeIndices=this.sectors.frozen[t].nodeIndices,this.nodes=this.sectors.frozen[t].nodes,this.edges=this.sectors.frozen[t].edges},e._loadLatestSector=function(){this._switchToSector(this._sector())},e._sector=function(){return this.activeSector[this.activeSector.length-1]},e._previousSector=function(){if(this.activeSector.length>1)return this.activeSector[this.activeSector.length-2];throw new TypeError("there are not enough sectors in the this.activeSector array.")},e._setActiveSector=function(t){this.activeSector.push(t)},e._forgetLastSector=function(){this.activeSector.pop()},e._createNewSector=function(t){this.sectors.active[t]={nodes:{},edges:{},nodeIndices:[],formationScale:this.scale,drawingNode:void 0},this.sectors.active[t].drawingNode=new Node({id:t,color:{background:"#eaefef",border:"495c5e"}},{},{},this.constants),this.sectors.active[t].drawingNode.clusterSize=2},e._deleteActiveSector=function(t){delete this.sectors.active[t]},e._deleteFrozenSector=function(t){delete this.sectors.frozen[t]},e._freezeSector=function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},e._activateSector=function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},e._mergeThisWithFrozen=function(t){for(var e in this.nodes)this.nodes.hasOwnProperty(e)&&(this.sectors.frozen[t].nodes[e]=this.nodes[e]);for(var i in this.edges)this.edges.hasOwnProperty(i)&&(this.sectors.frozen[t].edges[i]=this.edges[i]);for(var s=0;s1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInSupportSector=function(t,e){if(void 0===e)this._switchToSupportSector(),this[t]();else{this._switchToSupportSector();var i=Array.prototype.splice.call(arguments,1);i.length>1?this[t](i[0],i[1]):this[t](e)}this._loadLatestSector()},e._doInAllFrozenSectors=function(t,e){if(void 0===e)for(var i in this.sectors.frozen)this.sectors.frozen.hasOwnProperty(i)&&(this._switchToFrozenSector(i),this[t]());else for(var i in this.sectors.frozen)if(this.sectors.frozen.hasOwnProperty(i)){this._switchToFrozenSector(i);var s=Array.prototype.splice.call(arguments,1);s.length>1?this[t](s[0],s[1]):this[t](e)}this._loadLatestSector()},e._doInAllSectors=function(t,e){var i=Array.prototype.splice.call(arguments,1);void 0===e?(this._doInAllActiveSectors(t),this._doInAllFrozenSectors(t)):i.length>1?(this._doInAllActiveSectors(t,i[0],i[1]),this._doInAllFrozenSectors(t,i[0],i[1])):(this._doInAllActiveSectors(t,e),this._doInAllFrozenSectors(t,e))},e._clearNodeIndexList=function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},e._drawSectorNodes=function(t,e){var i,s=1e9,n=-1e9,o=1e9,r=-1e9;for(var a in this.sectors[e])if(this.sectors[e].hasOwnProperty(a)&&void 0!==this.sectors[e][a].drawingNode){this._switchToSector(a,e),s=1e9,n=-1e9,o=1e9,r=-1e9;for(var h in this.nodes)this.nodes.hasOwnProperty(h)&&(i=this.nodes[h],i.resize(t),o>i.x-.5*i.width&&(o=i.x-.5*i.width),ri.y-.5*i.height&&(s=i.y-.5*i.height),n0?this.nodes[i[i.length-1]]:null},e._getEdgesOverlappingWith=function(t,e){var i=this.edges;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},e._getAllEdgesOverlappingWith=function(t){var e=[];return this._doInAllActiveSectors("_getEdgesOverlappingWith",t,e),e},e._getEdgeAt=function(t){var e=this._pointerToPositionObject(t),i=this._getAllEdgesOverlappingWith(e);return i.length>0?this.edges[i[i.length-1]]:null},e._addToSelection=function(t){t instanceof s?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t},e._addToHover=function(t){t instanceof s?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t},e._removeFromSelection=function(t){t instanceof s?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]},e._unselectAll=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].unselect();for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&this.selectionObj.edges[i].unselect();this.selectionObj={nodes:{},edges:{}},0==t&&this.emit("select",this.getSelection())},e._unselectClusters=function(t){void 0===t&&(t=!1);for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&this.selectionObj.nodes[e].clusterSize>1&&(this.selectionObj.nodes[e].unselect(),this._removeFromSelection(this.selectionObj.nodes[e]));0==t&&this.emit("select",this.getSelection())},e._getSelectedNodeCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedNode=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return null},e._getSelectedEdge=function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t];return null},e._getSelectedEdgeCount=function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t},e._getSelectedObjectCount=function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t},e._selectionIsEmpty=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0},e._clusterInSelection=function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1},e._selectConnectedEdges=function(t){for(var e=0;ee;e++){s=t[e];var n=this.nodes[s];if(!n)throw new RangeError('Node with id "'+s+'" not found');this._selectObject(n,!0,!0)}console.log("setSelection is deprecated. Please use selectNodes instead."),this.redraw()},e.selectNodes=function(t,e){var i,s,n;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),i=0,s=t.length;s>i;i++){n=t[i];var o=this.nodes[n];if(!o)throw new RangeError('Node with id "'+n+'" not found'); +this._selectObject(o,!0,!0,e)}this.redraw()},e.selectEdges=function(t){var e,i,s;if(!t||void 0==t.length)throw"Selection must be an array with ids";for(this._unselectAll(!0),e=0,i=t.length;i>e;e++){s=t[e];var n=this.edges[s];if(!n)throw new RangeError('Edge with id "'+s+'" not found');this._selectObject(n,!0,!0,highlightEdges)}this.redraw()},e._updateSelection=function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},function(t,e,i){var s=i(1),n=i(30),o=i(27);e._clearManipulatorBar=function(){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild)},e._restoreOverloadedFunctions=function(){for(var t in this.cachedFunctions)this.cachedFunctions.hasOwnProperty(t)&&(this[t]=this.cachedFunctions[t])},e._toggleEditMode=function(){this.editMode=!this.editMode;var t=document.getElementById("network-manipulationDiv"),e=document.getElementById("network-manipulation-closeDiv"),i=document.getElementById("network-manipulation-editMode");1==this.editMode?(t.style.display="block",e.style.display="block",i.style.display="none",e.onclick=this._toggleEditMode.bind(this)):(t.style.display="none",e.style.display="none",i.style.display="block",e.onclick=null),this._createManipulatorBar()},e._createManipulatorBar=function(){if(this.boundFunction&&this.off("select",this.boundFunction),void 0!==this.edgeBeingEdited&&(this.edgeBeingEdited._disableControlNodes(),this.edgeBeingEdited=void 0,this.selectedControlNode=null,this.controlNodesActive=!1),this._restoreOverloadedFunctions(),this.freezeSimulation=!1,this.blockConnectingEdgeSelection=!1,this.forceAppendSelection=!1,1==this.editMode){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild);this.manipulationDiv.innerHTML=""+this.constants.labels.add+"
"+this.constants.labels.link+"",1==this._getSelectedNodeCount()&&this.triggerFunctions.edit?this.manipulationDiv.innerHTML+="
"+this.constants.labels.editNode+"":1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()&&(this.manipulationDiv.innerHTML+="
"+this.constants.labels.editEdge+""),0==this._selectionIsEmpty()&&(this.manipulationDiv.innerHTML+="
"+this.constants.labels.del+"");var t=document.getElementById("network-manipulate-addNode");t.onclick=this._createAddNodeToolbar.bind(this);var e=document.getElementById("network-manipulate-connectNode");if(e.onclick=this._createAddEdgeToolbar.bind(this),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit){var i=document.getElementById("network-manipulate-editNode");i.onclick=this._editNode.bind(this)}else if(1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()){var i=document.getElementById("network-manipulate-editEdge");i.onclick=this._createEditEdgeToolbar.bind(this)}if(0==this._selectionIsEmpty()){var s=document.getElementById("network-manipulate-delete");s.onclick=this._deleteSelected.bind(this)}var n=document.getElementById("network-manipulation-closeDiv");n.onclick=this._toggleEditMode.bind(this),this.boundFunction=this._createManipulatorBar.bind(this),this.on("select",this.boundFunction)}else{this.editModeDiv.innerHTML=""+this.constants.labels.edit+"";var o=document.getElementById("network-manipulate-editModeButton");o.onclick=this._toggleEditMode.bind(this)}},e._createAddNodeToolbar=function(){this._clearManipulatorBar(),this.boundFunction&&this.off("select",this.boundFunction),this.manipulationDiv.innerHTML=""+this.constants.labels.back+"
"+this.constants.labels.addDescription+"";var t=document.getElementById("network-manipulate-back");t.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._addNode.bind(this),this.on("select",this.boundFunction)},e._createAddEdgeToolbar=function(){this._clearManipulatorBar(),this._unselectAll(!0),this.freezeSimulation=!0,this.boundFunction&&this.off("select",this.boundFunction),this._unselectAll(),this.forceAppendSelection=!1,this.blockConnectingEdgeSelection=!0,this.manipulationDiv.innerHTML=""+this.constants.labels.back+"
"+this.constants.labels.linkDescription+"";var t=document.getElementById("network-manipulate-back");t.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._handleConnect.bind(this),this.on("select",this.boundFunction),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this._handleTouch=this._handleConnect,this._handleOnRelease=this._finishConnect,this._redraw()},e._createEditEdgeToolbar=function(){this._clearManipulatorBar(),this.controlNodesActive=!0,this.boundFunction&&this.off("select",this.boundFunction),this.edgeBeingEdited=this._getSelectedEdge(),this.edgeBeingEdited._enableControlNodes(),this.manipulationDiv.innerHTML=""+this.constants.labels.back+"
"+this.constants.labels.editEdgeDescription+"";var t=document.getElementById("network-manipulate-back");t.onclick=this._createManipulatorBar.bind(this),this.cachedFunctions._handleTouch=this._handleTouch,this.cachedFunctions._handleOnRelease=this._handleOnRelease,this.cachedFunctions._handleTap=this._handleTap,this.cachedFunctions._handleDragStart=this._handleDragStart,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleTouch=this._selectControlNode,this._handleTap=function(){},this._handleOnDrag=this._controlNodeDrag,this._handleDragStart=function(){},this._handleOnRelease=this._releaseControlNode,this._redraw()},e._selectControlNode=function(t){this.edgeBeingEdited.controlNodes.from.unselect(),this.edgeBeingEdited.controlNodes.to.unselect(),this.selectedControlNode=this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(t.x),this._YconvertDOMtoCanvas(t.y)),null!==this.selectedControlNode&&(this.selectedControlNode.select(),this.freezeSimulation=!0),this._redraw()},e._controlNodeDrag=function(t){var e=this._getPointer(t.gesture.center);null!==this.selectedControlNode&&void 0!==this.selectedControlNode&&(this.selectedControlNode.x=this._XconvertDOMtoCanvas(e.x),this.selectedControlNode.y=this._YconvertDOMtoCanvas(e.y)),this._redraw()},e._releaseControlNode=function(t){var e=this._getNodeAt(t);null!=e?(1==this.edgeBeingEdited.controlNodes.from.selected&&(this._editEdge(e.id,this.edgeBeingEdited.to.id),this.edgeBeingEdited.controlNodes.from.unselect()),1==this.edgeBeingEdited.controlNodes.to.selected&&(this._editEdge(this.edgeBeingEdited.from.id,e.id),this.edgeBeingEdited.controlNodes.to.unselect())):this.edgeBeingEdited._restoreControlNodes(),this.freezeSimulation=!1,this._redraw()},e._handleConnect=function(t){if(0==this._getSelectedNodeCount()){var e=this._getNodeAt(t);null!=e&&(e.clusterSize>1?alert("Cannot create edges to a cluster."):(this._selectObject(e,!1),this.sectors.support.nodes.targetNode=new n({id:"targetNode"},{},{},this.constants),this.sectors.support.nodes.targetNode.x=e.x,this.sectors.support.nodes.targetNode.y=e.y,this.sectors.support.nodes.targetViaNode=new n({id:"targetViaNode"},{},{},this.constants),this.sectors.support.nodes.targetViaNode.x=e.x,this.sectors.support.nodes.targetViaNode.y=e.y,this.sectors.support.nodes.targetViaNode.parentEdgeId="connectionEdge",this.edges.connectionEdge=new o({id:"connectionEdge",from:e.id,to:this.sectors.support.nodes.targetNode.id},this,this.constants),this.edges.connectionEdge.from=e,this.edges.connectionEdge.connected=!0,this.edges.connectionEdge.smooth=!0,this.edges.connectionEdge.selected=!0,this.edges.connectionEdge.to=this.sectors.support.nodes.targetNode,this.edges.connectionEdge.via=this.sectors.support.nodes.targetViaNode,this.cachedFunctions._handleOnDrag=this._handleOnDrag,this._handleOnDrag=function(t){var e=this._getPointer(t.gesture.center);this.sectors.support.nodes.targetNode.x=this._XconvertDOMtoCanvas(e.x),this.sectors.support.nodes.targetNode.y=this._YconvertDOMtoCanvas(e.y),this.sectors.support.nodes.targetViaNode.x=.5*(this._XconvertDOMtoCanvas(e.x)+this.edges.connectionEdge.from.x),this.sectors.support.nodes.targetViaNode.y=this._YconvertDOMtoCanvas(e.y)},this.moving=!0,this.start()))}},e._finishConnect=function(t){if(1==this._getSelectedNodeCount()){this._handleOnDrag=this.cachedFunctions._handleOnDrag,delete this.cachedFunctions._handleOnDrag;var e=this.edges.connectionEdge.fromId;delete this.edges.connectionEdge,delete this.sectors.support.nodes.targetNode,delete this.sectors.support.nodes.targetViaNode;var i=this._getNodeAt(t);null!=i&&(i.clusterSize>1?alert("Cannot create edges to a cluster."):(this._createEdge(e,i.id),this._createManipulatorBar())),this._unselectAll()}},e._addNode=function(){if(this._selectionIsEmpty()&&1==this.editMode){var t=this._pointerToPositionObject(this.pointerPosition),e={id:s.randomUUID(),x:t.left,y:t.top,label:"new",allowedToMoveX:!0,allowedToMoveY:!0};if(this.triggerFunctions.add)if(2==this.triggerFunctions.add.length){var i=this;this.triggerFunctions.add(e,function(t){i.nodesData.add(t),i._createManipulatorBar(),i.moving=!0,i.start()})}else alert(this.constants.labels.addError),this._createManipulatorBar(),this.moving=!0,this.start();else this.nodesData.add(e),this._createManipulatorBar(),this.moving=!0,this.start()}},e._createEdge=function(t,e){if(1==this.editMode){var i={from:t,to:e};if(this.triggerFunctions.connect)if(2==this.triggerFunctions.connect.length){var s=this;this.triggerFunctions.connect(i,function(t){s.edgesData.add(t),s.moving=!0,s.start()})}else alert(this.constants.labels.linkError),this.moving=!0,this.start();else this.edgesData.add(i),this.moving=!0,this.start()}},e._editEdge=function(t,e){if(1==this.editMode){var i={id:this.edgeBeingEdited.id,from:t,to:e};if(this.triggerFunctions.editEdge)if(2==this.triggerFunctions.editEdge.length){var s=this;this.triggerFunctions.editEdge(i,function(t){s.edgesData.update(t),s.moving=!0,s.start()})}else alert(this.constants.labels.linkError),this.moving=!0,this.start();else this.edgesData.update(i),this.moving=!0,this.start()}},e._editNode=function(){if(this.triggerFunctions.edit&&1==this.editMode){var t=this._getSelectedNode(),e={id:t.id,label:t.label,group:t.group,shape:t.shape,color:{background:t.color.background,border:t.color.border,highlight:{background:t.color.highlight.background,border:t.color.highlight.border}}};if(2==this.triggerFunctions.edit.length){var i=this;this.triggerFunctions.edit(e,function(t){i.nodesData.update(t),i._createManipulatorBar(),i.moving=!0,i.start()})}else alert(this.constants.labels.editError)}else alert(this.constants.labels.editBoundError)},e._deleteSelected=function(){if(!this._selectionIsEmpty()&&1==this.editMode)if(this._clusterInSelection())alert(this.constants.labels.deleteClusterError);else{var t=this.getSelectedNodes(),e=this.getSelectedEdges();if(this.triggerFunctions.del){var i=this,s={nodes:t,edges:e};(this.triggerFunctions.del.length=2)?this.triggerFunctions.del(s,function(t){i.edgesData.remove(t.edges),i.nodesData.remove(t.nodes),i._unselectAll(),i.moving=!0,i.start()}):alert(this.constants.labels.deleteError)}else this.edgesData.remove(e),this.nodesData.remove(t),this._unselectAll(),this.moving=!0,this.start()}}},function(t,e){e._cleanNavigation=function(){var t=document.getElementById("network-navigation_wrapper");null!=t&&this.containerElement.removeChild(t),document.onmouseup=null},e._loadNavigationElements=function(){this._cleanNavigation(),this.navigationDivs={};var t=["up","down","left","right","zoomIn","zoomOut","zoomExtends"],e=["_moveUp","_moveDown","_moveLeft","_moveRight","_zoomIn","_zoomOut","zoomExtent"];this.navigationDivs.wrapper=document.createElement("div"),this.navigationDivs.wrapper.id="network-navigation_wrapper",this.navigationDivs.wrapper.style.position="absolute",this.navigationDivs.wrapper.style.width=this.frame.canvas.clientWidth+"px",this.navigationDivs.wrapper.style.height=this.frame.canvas.clientHeight+"px",this.containerElement.insertBefore(this.navigationDivs.wrapper,this.frame);for(var i=0;i0){"RL"==this.constants.hierarchicalLayout.direction||"DU"==this.constants.hierarchicalLayout.direction?this.constants.hierarchicalLayout.levelSeparation*=-1:this.constants.hierarchicalLayout.levelSeparation=Math.abs(this.constants.hierarchicalLayout.levelSeparation),"RL"==this.constants.hierarchicalLayout.direction||"LR"==this.constants.hierarchicalLayout.direction?1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="vertical"):1==this.constants.smoothCurves.enabled&&(this.constants.smoothCurves.type="horizontal");var t,e,i=0,s=!1,n=!1;for(e in this.nodes)this.nodes.hasOwnProperty(e)&&(t=this.nodes[e],-1!=t.level?s=!0:n=!0,is&&(o.xFixed=!1,o.x=i[o.level].minPos,r=!0):o.yFixed&&o.level>s&&(o.yFixed=!1,o.y=i[o.level].minPos,r=!0),1==r&&(i[o.level].minPos+=i[o.level].nodeSpacing,o.edges.length>1&&this._placeBranchNodes(o.edges,o.id,i,o.level))}},e._setLevel=function(t,e,i){for(var s=0;st)&&(n.level=t,e.length>1&&this._setLevel(t+1,n.edges,n.id))}},e._restoreNodes=function(){for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.nodes[t].xFixed=!1,this.nodes[t].yFixed=!1)}},function(t){!function(e,i){"use strict";function s(){if(!n.READY){n.event.determineEventTypes();for(var t in n.gestures)n.gestures.hasOwnProperty(t)&&n.detection.register(n.gestures[t]);n.event.onTouch(n.DOCUMENT,n.EVENT_MOVE,n.detection.detect),n.event.onTouch(n.DOCUMENT,n.EVENT_END,n.detection.detect),n.READY=!0}}var n=function(t,e){return new n.Instance(t,e||{})};n.defaults={stop_browser_behavior:{userSelect:"none",touchAction:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},n.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled,n.HAS_TOUCHEVENTS="ontouchstart"in e,n.MOBILE_REGEX=/mobile|tablet|ip(ad|hone|od)|android/i,n.NO_MOUSEEVENTS=n.HAS_TOUCHEVENTS&&navigator.userAgent.match(n.MOBILE_REGEX),n.EVENT_TYPES={},n.DIRECTION_DOWN="down",n.DIRECTION_LEFT="left",n.DIRECTION_UP="up",n.DIRECTION_RIGHT="right",n.POINTER_MOUSE="mouse",n.POINTER_TOUCH="touch",n.POINTER_PEN="pen",n.EVENT_START="start",n.EVENT_MOVE="move",n.EVENT_END="end",n.DOCUMENT=document,n.plugins={},n.READY=!1,n.Instance=function(t,e){var i=this;return s(),this.element=t,this.enabled=!0,this.options=n.utils.extend(n.utils.extend({},n.defaults),e||{}),this.options.stop_browser_behavior&&n.utils.stopDefaultBrowserBehavior(this.element,this.options.stop_browser_behavior),n.event.onTouch(t,n.EVENT_START,function(t){i.enabled&&n.detection.startDetect(i,t)}),this},n.Instance.prototype={on:function(t,e){for(var i=t.split(" "),s=0;s0&&e==n.EVENT_END?e=n.EVENT_MOVE:l||(e=n.EVENT_END),l||null===o?o=h:h=o,i.call(n.detection,s.collectEventData(t,e,h)),n.HAS_POINTEREVENTS&&e==n.EVENT_END&&(l=n.PointerEvent.updatePointer(e,h))),l||(o=null,r=!1,a=!1,n.PointerEvent.reset())}})},determineEventTypes:function(){var t;t=n.HAS_POINTEREVENTS?n.PointerEvent.getEvents():n.NO_MOUSEEVENTS?["touchstart","touchmove","touchend touchcancel"]:["touchstart mousedown","touchmove mousemove","touchend touchcancel mouseup"],n.EVENT_TYPES[n.EVENT_START]=t[0],n.EVENT_TYPES[n.EVENT_MOVE]=t[1],n.EVENT_TYPES[n.EVENT_END]=t[2]},getTouchList:function(t){return n.HAS_POINTEREVENTS?n.PointerEvent.getTouchList():t.touches?t.touches:[{identifier:1,pageX:t.pageX,pageY:t.pageY,target:t.target}]},collectEventData:function(t,e,i){var s=this.getTouchList(i,e),o=n.POINTER_TOUCH;return(i.type.match(/mouse/)||n.PointerEvent.matchType(n.POINTER_MOUSE,i))&&(o=n.POINTER_MOUSE),{center:n.utils.getCenter(s),timeStamp:(new Date).getTime(),target:i.target,touches:s,eventType:e,pointerType:o,srcEvent:i,preventDefault:function(){this.srcEvent.preventManipulation&&this.srcEvent.preventManipulation(),this.srcEvent.preventDefault&&this.srcEvent.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return n.detection.stopDetect()}}}},n.PointerEvent={pointers:{},getTouchList:function(){var t=this,e=[];return Object.keys(t.pointers).sort().forEach(function(i){e.push(t.pointers[i])}),e},updatePointer:function(t,e){return t==n.EVENT_END?this.pointers={}:(e.identifier=e.pointerId,this.pointers[e.pointerId]=e),Object.keys(this.pointers).length},matchType:function(t,e){if(!e.pointerType)return!1;var i={};return i[n.POINTER_MOUSE]=e.pointerType==e.MSPOINTER_TYPE_MOUSE||e.pointerType==n.POINTER_MOUSE,i[n.POINTER_TOUCH]=e.pointerType==e.MSPOINTER_TYPE_TOUCH||e.pointerType==n.POINTER_TOUCH,i[n.POINTER_PEN]=e.pointerType==e.MSPOINTER_TYPE_PEN||e.pointerType==n.POINTER_PEN,i[t]},getEvents:function(){return["pointerdown MSPointerDown","pointermove MSPointerMove","pointerup pointercancel MSPointerUp MSPointerCancel"]},reset:function(){this.pointers={}}},n.utils={extend:function(t,e,s){for(var n in e)t[n]!==i&&s||(t[n]=e[n]);return t},hasParent:function(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1},getCenter:function(t){for(var e=[],i=[],s=0,n=t.length;n>s;s++)e.push(t[s].pageX),i.push(t[s].pageY);return{pageX:(Math.min.apply(Math,e)+Math.max.apply(Math,e))/2,pageY:(Math.min.apply(Math,i)+Math.max.apply(Math,i))/2}},getVelocity:function(t,e,i){return{x:Math.abs(e/t)||0,y:Math.abs(i/t)||0}},getAngle:function(t,e){var i=e.pageY-t.pageY,s=e.pageX-t.pageX;return 180*Math.atan2(i,s)/Math.PI},getDirection:function(t,e){var i=Math.abs(t.pageX-e.pageX),s=Math.abs(t.pageY-e.pageY);return i>=s?t.pageX-e.pageX>0?n.DIRECTION_LEFT:n.DIRECTION_RIGHT:t.pageY-e.pageY>0?n.DIRECTION_UP:n.DIRECTION_DOWN},getDistance:function(t,e){var i=e.pageX-t.pageX,s=e.pageY-t.pageY;return Math.sqrt(i*i+s*s)},getScale:function(t,e){return t.length>=2&&e.length>=2?this.getDistance(e[0],e[1])/this.getDistance(t[0],t[1]):1},getRotation:function(t,e){return t.length>=2&&e.length>=2?this.getAngle(e[1],e[0])-this.getAngle(t[1],t[0]):0},isVertical:function(t){return t==n.DIRECTION_UP||t==n.DIRECTION_DOWN},stopDefaultBrowserBehavior:function(t,e){var i,s=["webkit","khtml","moz","ms","o",""];if(e&&t.style){for(var n=0;ni;i++){var o=this.gestures[i];if(!this.stopped&&e[o.name]!==!1&&o.handler.call(o,t,this.current.inst)===!1){this.stopDetect();break}}return this.current&&(this.current.lastEvent=t),t.eventType==n.EVENT_END&&!t.touches.length-1&&this.stopDetect(),t}},stopDetect:function(){this.previous=n.utils.extend({},this.current),this.current=null,this.stopped=!0},extendEventData:function(t){var e=this.current.startEvent;if(e&&(t.touches.length!=e.touches.length||t.touches===e.touches)){e.touches=[];for(var i=0,s=t.touches.length;s>i;i++)e.touches.push(n.utils.extend({},t.touches[i]))}var o=t.timeStamp-e.timeStamp,r=t.center.pageX-e.center.pageX,a=t.center.pageY-e.center.pageY,h=n.utils.getVelocity(o,r,a);return n.utils.extend(t,{deltaTime:o,deltaX:r,deltaY:a,velocityX:h.x,velocityY:h.y,distance:n.utils.getDistance(e.center,t.center),angle:n.utils.getAngle(e.center,t.center),direction:n.utils.getDirection(e.center,t.center),scale:n.utils.getScale(e.touches,t.touches),rotation:n.utils.getRotation(e.touches,t.touches),startEvent:e}),t},register:function(t){var e=t.defaults||{};return e[t.name]===i&&(e[t.name]=!0),n.utils.extend(n.defaults,e,!0),t.index=t.index||1e3,this.gestures.push(t),this.gestures.sort(function(t,e){return t.indexe.index?1:0}),this.gestures}},n.gestures=n.gestures||{},n.gestures.Hold={name:"hold",index:10,defaults:{hold_timeout:500,hold_threshold:1},timer:null,handler:function(t,e){switch(t.eventType){case n.EVENT_START:clearTimeout(this.timer),n.detection.current.name=this.name,this.timer=setTimeout(function(){"hold"==n.detection.current.name&&e.trigger("hold",t)},e.options.hold_timeout);break;case n.EVENT_MOVE:t.distance>e.options.hold_threshold&&clearTimeout(this.timer);break;case n.EVENT_END:clearTimeout(this.timer)}}},n.gestures.Tap={name:"tap",index:100,defaults:{tap_max_touchtime:250,tap_max_distance:10,tap_always:!0,doubletap_distance:20,doubletap_interval:300},handler:function(t,e){if(t.eventType==n.EVENT_END){var i=n.detection.previous,s=!1;if(t.deltaTime>e.options.tap_max_touchtime||t.distance>e.options.tap_max_distance)return;i&&"tap"==i.name&&t.timeStamp-i.lastEvent.timeStamp0&&t.touches.length>e.options.swipe_max_touches)return;(t.velocityX>e.options.swipe_velocity||t.velocityY>e.options.swipe_velocity)&&(e.trigger(this.name,t),e.trigger(this.name+t.direction,t))}}},n.gestures.Drag={name:"drag",index:50,defaults:{drag_min_distance:10,drag_max_touches:1,drag_block_horizontal:!1,drag_block_vertical:!1,drag_lock_to_axis:!1,drag_lock_min_distance:25},triggered:!1,handler:function(t,e){if(n.detection.current.name!=this.name&&this.triggered)return e.trigger(this.name+"end",t),void(this.triggered=!1);if(!(e.options.drag_max_touches>0&&t.touches.length>e.options.drag_max_touches))switch(t.eventType){case n.EVENT_START:this.triggered=!1;break;case n.EVENT_MOVE:if(t.distancee.options.transform_min_rotation&&e.trigger("rotate",t),i>e.options.transform_min_scale&&(e.trigger("pinch",t),e.trigger("pinch"+(t.scale<1?"in":"out"),t));break;case n.EVENT_END:this.triggered&&e.trigger(this.name+"end",t),this.triggered=!1}}},n.gestures.Touch={name:"touch",index:-1/0,defaults:{prevent_default:!1,prevent_mouseevents:!1},handler:function(t,e){return e.options.prevent_mouseevents&&t.pointerType==n.POINTER_MOUSE?void t.stopDetect():(e.options.prevent_default&&t.preventDefault(),void(t.eventType==n.EVENT_START&&e.trigger(this.name,t)))}},n.gestures.Release={name:"release",index:1/0,handler:function(t,e){t.eventType==n.EVENT_END&&e.trigger(this.name,t) +}},"object"==typeof t&&"object"==typeof t.exports?t.exports=n:(e.Hammer=n,"function"==typeof e.define&&e.define.amd&&e.define("hammer",[],function(){return n}))}(this)},function(t,e,i){function s(){this.constants.smoothCurves.enabled=!this.constants.smoothCurves.enabled;var t=document.getElementById("graph_toggleSmooth");t.style.background=1==this.constants.smoothCurves.enabled?"#A4FF56":"#FF8532",this._configureSmoothCurves(!1)}function n(){for(var t in this.calculationNodes)this.calculationNodes.hasOwnProperty(t)&&(this.calculationNodes[t].vx=0,this.calculationNodes[t].vy=0,this.calculationNodes[t].fx=0,this.calculationNodes[t].fy=0);1==this.constants.hierarchicalLayout.enabled?this._setupHierarchicalLayout():this.repositionNodes(),this.moving=!0,this.start()}function o(){var t="No options are required, default values used.",e=[],i=document.getElementById("graph_physicsMethod1"),s=document.getElementById("graph_physicsMethod2");if(1==i.checked){if(this.constants.physics.barnesHut.gravitationalConstant!=this.backupConstants.physics.barnesHut.gravitationalConstant&&e.push("gravitationalConstant: "+this.constants.physics.barnesHut.gravitationalConstant),this.constants.physics.centralGravity!=this.backupConstants.physics.barnesHut.centralGravity&&e.push("centralGravity: "+this.constants.physics.centralGravity),this.constants.physics.springLength!=this.backupConstants.physics.barnesHut.springLength&&e.push("springLength: "+this.constants.physics.springLength),this.constants.physics.springConstant!=this.backupConstants.physics.barnesHut.springConstant&&e.push("springConstant: "+this.constants.physics.springConstant),this.constants.physics.damping!=this.backupConstants.physics.barnesHut.damping&&e.push("damping: "+this.constants.physics.damping),0!=e.length){t="var options = {",t+="physics: {barnesHut: {";for(var n=0;nthis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},e._calculateForces=function(){this._calculateGravitationalForces(),this._calculateNodeForces(),this.constants.springConstant>0&&(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic?this._calculateSpringForcesWithSupport():1==this.constants.physics.hierarchicalRepulsion.enabled?this._calculateHierarchicalSpringForces():this._calculateSpringForces())},e._updateCalculationNodes=function(){if(1==this.constants.smoothCurves.enabled&&1==this.constants.smoothCurves.dynamic){this.calculationNodes={},this.calculationNodeIndices=[];for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&(this.calculationNodes[t]=this.nodes[t]);var e=this.sectors.support.nodes;for(var i in e)e.hasOwnProperty(i)&&(this.edges.hasOwnProperty(e[i].parentEdgeId)?this.calculationNodes[i]=e[i]:e[i]._setForce(0,0));for(var s in this.calculationNodes)this.calculationNodes.hasOwnProperty(s)&&this.calculationNodeIndices.push(s)}else this.calculationNodes=this.nodes,this.calculationNodeIndices=this.nodeIndices},e._calculateGravitationalForces=function(){var t,e,i,s,n,o=this.calculationNodes,r=this.constants.physics.centralGravity,a=0;for(n=0;nSimulation Mode:Barnes HutRepulsionHierarchical
Options:
',this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement),this.optionsDiv=document.createElement("div"),this.optionsDiv.style.fontSize="14px",this.optionsDiv.style.fontFamily="verdana",this.containerElement.parentElement.insertBefore(this.optionsDiv,this.containerElement);var e;e=document.getElementById("graph_BH_gc"),e.onchange=a.bind(this,"graph_BH_gc",-1,"physics_barnesHut_gravitationalConstant"),e=document.getElementById("graph_BH_cg"),e.onchange=a.bind(this,"graph_BH_cg",1,"physics_centralGravity"),e=document.getElementById("graph_BH_sc"),e.onchange=a.bind(this,"graph_BH_sc",1,"physics_springConstant"),e=document.getElementById("graph_BH_sl"),e.onchange=a.bind(this,"graph_BH_sl",1,"physics_springLength"),e=document.getElementById("graph_BH_damp"),e.onchange=a.bind(this,"graph_BH_damp",1,"physics_damping"),e=document.getElementById("graph_R_nd"),e.onchange=a.bind(this,"graph_R_nd",1,"physics_repulsion_nodeDistance"),e=document.getElementById("graph_R_cg"),e.onchange=a.bind(this,"graph_R_cg",1,"physics_centralGravity"),e=document.getElementById("graph_R_sc"),e.onchange=a.bind(this,"graph_R_sc",1,"physics_springConstant"),e=document.getElementById("graph_R_sl"),e.onchange=a.bind(this,"graph_R_sl",1,"physics_springLength"),e=document.getElementById("graph_R_damp"),e.onchange=a.bind(this,"graph_R_damp",1,"physics_damping"),e=document.getElementById("graph_H_nd"),e.onchange=a.bind(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),e=document.getElementById("graph_H_cg"),e.onchange=a.bind(this,"graph_H_cg",1,"physics_centralGravity"),e=document.getElementById("graph_H_sc"),e.onchange=a.bind(this,"graph_H_sc",1,"physics_springConstant"),e=document.getElementById("graph_H_sl"),e.onchange=a.bind(this,"graph_H_sl",1,"physics_springLength"),e=document.getElementById("graph_H_damp"),e.onchange=a.bind(this,"graph_H_damp",1,"physics_damping"),e=document.getElementById("graph_H_direction"),e.onchange=a.bind(this,"graph_H_direction",t,"hierarchicalLayout_direction"),e=document.getElementById("graph_H_levsep"),e.onchange=a.bind(this,"graph_H_levsep",1,"hierarchicalLayout_levelSeparation"),e=document.getElementById("graph_H_nspac"),e.onchange=a.bind(this,"graph_H_nspac",1,"hierarchicalLayout_nodeSpacing");var i=document.getElementById("graph_physicsMethod1"),d=document.getElementById("graph_physicsMethod2"),l=document.getElementById("graph_physicsMethod3");d.checked=!0,this.constants.physics.barnesHut.enabled&&(i.checked=!0),this.constants.hierarchicalLayout.enabled&&(l.checked=!0);var c=document.getElementById("graph_toggleSmooth"),u=document.getElementById("graph_repositionNodes"),p=document.getElementById("graph_generateOptions");c.onclick=s.bind(this),u.onclick=n.bind(this),p.onclick=o.bind(this),c.style.background=1==this.constants.smoothCurves&&0==this.constants.dynamicSmoothCurves?"#A4FF56":"#FF8532",r.apply(this),i.onchange=r.bind(this),d.onchange=r.bind(this),l.onchange=r.bind(this)}},e._overWriteGraphConstants=function(t,e){var i=t.split("_");1==i.length?this.constants[i[0]]=e:2==i.length?this.constants[i[0]][i[1]]=e:3==i.length&&(this.constants[i[0]][i[1]][i[2]]=e)}},function(t,e,i){var s;(function(t,n){(function(o){function r(t,e,i){switch(arguments.length){case 2:return null!=t?t:e;case 3:return null!=t?t:null!=e?e:i;default:throw new Error("Implement me")}}function a(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function h(t,e){function i(){ge.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}var s=!0;return m(function(){return s&&(i(),s=!1),e.apply(this,arguments)},e)}function d(t,e){return function(i){return g(t.call(this,i),e)}}function l(t,e){return function(i){return this.lang().ordinal(t.call(this,i),e)}}function c(){}function u(t){E(t),m(this,t)}function p(t){var e=L(t),i=e.year||0,s=e.quarter||0,n=e.month||0,o=e.week||0,r=e.day||0,a=e.hour||0,h=e.minute||0,d=e.second||0,l=e.millisecond||0;this._milliseconds=+l+1e3*d+6e4*h+36e5*a,this._days=+r+7*o,this._months=+n+3*s+12*i,this._data={},this._bubble()}function m(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return e.hasOwnProperty("toString")&&(t.toString=e.toString),e.hasOwnProperty("valueOf")&&(t.valueOf=e.valueOf),t}function _(t){var e,i={};for(e in t)t.hasOwnProperty(e)&&Ce.hasOwnProperty(e)&&(i[e]=t[e]);return i}function f(t){return 0>t?Math.ceil(t):Math.floor(t)}function g(t,e,i){for(var s=""+Math.abs(t),n=t>=0;s.lengths;s++)(i&&t[s]!==e[s]||!i&&D(t[s])!==D(e[s]))&&r++;return r+o}function w(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=ri[t]||ai[e]||e}return t}function L(t){var e,i,s={};for(i in t)t.hasOwnProperty(i)&&(e=w(i),e&&(s[e]=t[i]));return s}function x(t){var e,i;if(0===t.indexOf("week"))e=7,i="day";else{if(0!==t.indexOf("month"))return;e=12,i="month"}ge[t]=function(s,n){var r,a,h=ge.fn._lang[t],d=[];if("number"==typeof s&&(n=s,s=o),a=function(t){var e=ge().utc().set(i,t);return h.call(ge.fn._lang,e,s||"")},null!=n)return a(n);for(r=0;e>r;r++)d.push(a(r));return d}}function D(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function T(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function Y(t,e,i){return re(ge([t,11,31+e-i]),e,i).week}function S(t){return k(t)?366:365}function k(t){return t%4===0&&t%100!==0||t%400===0}function E(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[xe]<0||t._a[xe]>11?xe:t._a[De]<1||t._a[De]>T(t._a[Le],t._a[xe])?De:t._a[Te]<0||t._a[Te]>23?Te:t._a[Ye]<0||t._a[Ye]>59?Ye:t._a[Se]<0||t._a[Se]>59?Se:t._a[ke]<0||t._a[ke]>999?ke:-1,t._pf._overflowDayOfYear&&(Le>e||e>De)&&(e=De),t._pf.overflow=e)}function C(t){return null==t._isValid&&(t._isValid=!isNaN(t._d.getTime())&&t._pf.overflow<0&&!t._pf.empty&&!t._pf.invalidMonth&&!t._pf.nullInput&&!t._pf.invalidFormat&&!t._pf.userInvalidated,t._strict&&(t._isValid=t._isValid&&0===t._pf.charsLeftOver&&0===t._pf.unusedTokens.length)),t._isValid}function N(t){return t?t.toLowerCase().replace("_","-"):t}function O(t,e){return e._isUTC?ge(t).zone(e._offset||0):ge(t).local()}function z(t,e){return e.abbr=t,Ee[t]||(Ee[t]=new c),Ee[t].set(e),Ee[t]}function I(t){delete Ee[t]}function A(t){var e,s,n,o,r=0,a=function(t){if(!Ee[t]&&Ne)try{i(55)("./"+t)}catch(e){}return Ee[t]};if(!t)return ge.fn._lang;if(!v(t)){if(s=a(t))return s;t=[t]}for(;r0;){if(s=a(o.slice(0,e).join("-")))return s;if(n&&n.length>=e&&b(o,n,!0)>=e-1)break;e--}r++}return ge.fn._lang}function P(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function F(t){var e,i,s=t.match(Ae);for(e=0,i=s.length;i>e;e++)s[e]=ui[s[e]]?ui[s[e]]:P(s[e]);return function(n){var o="";for(e=0;i>e;e++)o+=s[e]instanceof Function?s[e].call(n,t):s[e];return o}}function j(t,e){return t.isValid()?(e=H(e,t.lang()),hi[e]||(hi[e]=F(e)),hi[e](t)):t.lang().invalidDate()}function H(t,e){function i(t){return e.longDateFormat(t)||t}var s=5;for(Pe.lastIndex=0;s>=0&&Pe.test(t);)t=t.replace(Pe,i),Pe.lastIndex=0,s-=1;return t}function R(t,e){var i,s=e._strict;switch(t){case"Q":return qe;case"DDDD":return Ze;case"YYYY":case"GGGG":case"gggg":return s?Ke:He;case"Y":case"G":case"g":return Qe;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?$e:Re;case"S":if(s)return qe;case"SS":if(s)return Je;case"SSS":if(s)return Ze;case"DDD":return je;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Be;case"a":case"A":return A(e._l)._meridiemParse;case"X":return Ue;case"Z":case"ZZ":return Ge;case"T":return Ve;case"SSSS":return We;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?Je:Fe;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Fe;case"Do":return Xe;default:return i=new RegExp(Z(J(t.replace("\\","")),"i"))}}function W(t){t=t||"";var e=t.match(Ge)||[],i=e[e.length-1]||[],s=(i+"").match(ni)||["-",0,0],n=+(60*s[1])+D(s[2]);return"+"===s[0]?-n:n}function B(t,e,i){var s,n=i._a;switch(t){case"Q":null!=e&&(n[xe]=3*(D(e)-1));break;case"M":case"MM":null!=e&&(n[xe]=D(e)-1);break;case"MMM":case"MMMM":s=A(i._l).monthsParse(e),null!=s?n[xe]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(n[De]=D(e));break;case"Do":null!=e&&(n[De]=D(parseInt(e,10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=D(e));break;case"YY":n[Le]=ge.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":n[Le]=D(e);break;case"a":case"A":i._isPm=A(i._l).isPM(e);break;case"H":case"HH":case"h":case"hh":n[Te]=D(e);break;case"m":case"mm":n[Ye]=D(e);break;case"s":case"ss":n[Se]=D(e);break;case"S":case"SS":case"SSS":case"SSSS":n[ke]=D(1e3*("0."+e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=W(e);break;case"dd":case"ddd":case"dddd":s=A(i._l).weekdaysParse(e),null!=s?(i._w=i._w||{},i._w.d=s):i._pf.invalidWeekday=e;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":t=t.substr(0,1);case"gggg":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=D(e));break;case"gg":case"GG":i._w=i._w||{},i._w[t]=ge.parseTwoDigitYear(e)}}function G(t){var e,i,s,n,o,a,h,d;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(o=1,a=4,i=r(e.GG,t._a[Le],re(ge(),1,4).year),s=r(e.W,1),n=r(e.E,1)):(d=A(t._l),o=d._week.dow,a=d._week.doy,i=r(e.gg,t._a[Le],re(ge(),o,a).year),s=r(e.w,1),null!=e.d?(n=e.d,o>n&&++s):n=null!=e.e?e.e+o:o),h=ae(i,s,n,a,o),t._a[Le]=h.year,t._dayOfYear=h.dayOfYear}function V(t){var e,i,s,n,o=[];if(!t._d){for(s=X(t),t._w&&null==t._a[De]&&null==t._a[xe]&&G(t),t._dayOfYear&&(n=r(t._a[Le],s[Le]),t._dayOfYear>S(n)&&(t._pf._overflowDayOfYear=!0),i=ie(n,0,t._dayOfYear),t._a[xe]=i.getUTCMonth(),t._a[De]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=o[e]=s[e];for(;7>e;e++)t._a[e]=o[e]=null==t._a[e]?2===e?1:0:t._a[e];t._d=(t._useUTC?ie:ee).apply(null,o),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm)}}function U(t){var e;t._d||(e=L(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],V(t))}function X(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function q(t){if(t._f===ge.ISO_8601)return void $(t);t._a=[],t._pf.empty=!0;var e,i,s,n,o,r=A(t._l),a=""+t._i,h=a.length,d=0;for(s=H(t._f,r).match(Ae)||[],e=0;e0&&t._pf.unusedInput.push(o),a=a.slice(a.indexOf(i)+i.length),d+=i.length),ui[n]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(n),B(n,i,t)):t._strict&&!i&&t._pf.unusedTokens.push(n);t._pf.charsLeftOver=h-d,a.length>0&&t._pf.unusedInput.push(a),t._isPm&&t._a[Te]<12&&(t._a[Te]+=12),t._isPm===!1&&12===t._a[Te]&&(t._a[Te]=0),V(t),E(t)}function J(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,n){return e||i||s||n})}function Z(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function K(t){var e,i,s,n,o;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(n=0;no)&&(s=o,i=e));m(t,i||e)}function $(t){var e,i,s=t._i,n=ti.exec(s);if(n){for(t._pf.iso=!0,e=0,i=ii.length;i>e;e++)if(ii[e][1].exec(s)){t._f=ii[e][0]+(n[6]||" ");break}for(e=0,i=si.length;i>e;e++)if(si[e][1].exec(s)){t._f+=si[e][0];break}s.match(Ge)&&(t._f+="Z"),q(t)}else t._isValid=!1}function Q(t){$(t),t._isValid===!1&&(delete t._isValid,ge.createFromInputFallback(t))}function te(t){var e=t._i,i=Oe.exec(e);e===o?t._d=new Date:i?t._d=new Date(+i[1]):"string"==typeof e?Q(t):v(e)?(t._a=e.slice(0),V(t)):M(e)?t._d=new Date(+e):"object"==typeof e?U(t):"number"==typeof e?t._d=new Date(e):ge.createFromInputFallback(t)}function ee(t,e,i,s,n,o,r){var a=new Date(t,e,i,s,n,o,r);return 1970>t&&a.setFullYear(t),a}function ie(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function se(t,e){if("string"==typeof t)if(isNaN(t)){if(t=e.weekdaysParse(t),"number"!=typeof t)return null}else t=parseInt(t,10);return t}function ne(t,e,i,s,n){return n.relativeTime(e||1,!!i,t,s)}function oe(t,e,i){var s=we(Math.abs(t)/1e3),n=we(s/60),o=we(n/60),r=we(o/24),a=we(r/365),h=s0,h[4]=i,ne.apply({},h)}function re(t,e,i){var s,n=i-e,o=i-t.day();return o>n&&(o-=7),n-7>o&&(o+=7),s=ge(t).add("d",o),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function ae(t,e,i,s,n){var o,r,a=ie(t,0,1).getUTCDay();return a=0===a?7:a,i=null!=i?i:n,o=n-a+(a>s?7:0)-(n>a?7:0),r=7*(e-1)+(i-n)+o+1,{year:r>0?t:t-1,dayOfYear:r>0?r:S(t-1)+r} +}function he(t){var e=t._i,i=t._f;return null===e||i===o&&""===e?ge.invalid({nullInput:!0}):("string"==typeof e&&(t._i=e=A().preparse(e)),ge.isMoment(e)?(t=_(e),t._d=new Date(+e._d)):i?v(i)?K(t):q(t):te(t),new u(t))}function de(t,e){var i,s;if(1===e.length&&v(e[0])&&(e=e[0]),!e.length)return ge();for(i=e[0],s=1;s=0?"+":"-";return e+g(Math.abs(t),6)},gg:function(){return g(this.weekYear()%100,2)},gggg:function(){return g(this.weekYear(),4)},ggggg:function(){return g(this.weekYear(),5)},GG:function(){return g(this.isoWeekYear()%100,2)},GGGG:function(){return g(this.isoWeekYear(),4)},GGGGG:function(){return g(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return D(this.milliseconds()/100)},SS:function(){return g(D(this.milliseconds()/10),2)},SSS:function(){return g(this.milliseconds(),3)},SSSS:function(){return g(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+g(D(t/60),2)+":"+g(D(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+g(D(t/60),2)+g(D(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},pi=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];li.length;)ve=li.pop(),ui[ve+"o"]=l(ui[ve],ve);for(;ci.length;)ve=ci.pop(),ui[ve+ve]=d(ui[ve],2);for(ui.DDDD=d(ui.DDD,3),m(c.prototype,{set:function(t){var e,i;for(i in t)e=t[i],"function"==typeof e?this[i]=e:this["_"+i]=e},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(t){return this._months[t.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(t){return this._monthsShort[t.month()]},monthsParse:function(t){var e,i,s;for(this._monthsParse||(this._monthsParse=[]),e=0;12>e;e++)if(this._monthsParse[e]||(i=ge.utc([2e3,e]),s="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[e]=new RegExp(s.replace(".",""),"i")),this._monthsParse[e].test(t))return e},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(t){return this._weekdays[t.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(t){return this._weekdaysShort[t.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(t){return this._weekdaysMin[t.day()]},weekdaysParse:function(t){var e,i,s;for(this._weekdaysParse||(this._weekdaysParse=[]),e=0;7>e;e++)if(this._weekdaysParse[e]||(i=ge([2e3,1]).day(e),s="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[e]=new RegExp(s.replace(".",""),"i")),this._weekdaysParse[e].test(t))return e},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(t){var e=this._longDateFormat[t];return!e&&this._longDateFormat[t.toUpperCase()]&&(e=this._longDateFormat[t.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t]=e),e},isPM:function(t){return"p"===(t+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(t,e){var i=this._calendar[t];return"function"==typeof i?i.apply(e):i},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(t,e,i,s){var n=this._relativeTime[i];return"function"==typeof n?n(t,e,i,s):n.replace(/%d/i,t)},pastFuture:function(t,e){var i=this._relativeTime[t>0?"future":"past"];return"function"==typeof i?i(e):i.replace(/%s/i,e)},ordinal:function(t){return this._ordinal.replace("%d",t)},_ordinal:"%d",preparse:function(t){return t},postformat:function(t){return t},week:function(t){return re(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),ge=function(t,e,i,s){var n;return"boolean"==typeof i&&(s=i,i=o),n={},n._isAMomentObject=!0,n._i=t,n._f=e,n._l=i,n._strict=s,n._isUTC=!1,n._pf=a(),he(n)},ge.suppressDeprecationWarnings=!1,ge.createFromInputFallback=h("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i)}),ge.min=function(){var t=[].slice.call(arguments,0);return de("isBefore",t)},ge.max=function(){var t=[].slice.call(arguments,0);return de("isAfter",t)},ge.utc=function(t,e,i,s){var n;return"boolean"==typeof i&&(s=i,i=o),n={},n._isAMomentObject=!0,n._useUTC=!0,n._isUTC=!0,n._l=i,n._i=t,n._f=e,n._strict=s,n._pf=a(),he(n).utc()},ge.unix=function(t){return ge(1e3*t)},ge.duration=function(t,e){var i,s,n,o=t,r=null;return ge.isDuration(t)?o={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(o={},e?o[e]=t:o.milliseconds=t):(r=ze.exec(t))?(i="-"===r[1]?-1:1,o={y:0,d:D(r[De])*i,h:D(r[Te])*i,m:D(r[Ye])*i,s:D(r[Se])*i,ms:D(r[ke])*i}):(r=Ie.exec(t))&&(i="-"===r[1]?-1:1,n=function(t){var e=t&&parseFloat(t.replace(",","."));return(isNaN(e)?0:e)*i},o={y:n(r[2]),M:n(r[3]),d:n(r[4]),h:n(r[5]),m:n(r[6]),s:n(r[7]),w:n(r[8])}),s=new p(o),ge.isDuration(t)&&t.hasOwnProperty("_lang")&&(s._lang=t._lang),s},ge.version=Me,ge.defaultFormat=ei,ge.ISO_8601=function(){},ge.momentProperties=Ce,ge.updateOffset=function(){},ge.relativeTimeThreshold=function(t,e){return di[t]===o?!1:(di[t]=e,!0)},ge.lang=function(t,e){var i;return t?(e?z(N(t),e):null===e?(I(t),t="en"):Ee[t]||A(t),i=ge.duration.fn._lang=ge.fn._lang=A(t),i._abbr):ge.fn._lang._abbr},ge.langData=function(t){return t&&t._lang&&t._lang._abbr&&(t=t._lang._abbr),A(t)},ge.isMoment=function(t){return t instanceof u||null!=t&&t.hasOwnProperty("_isAMomentObject")},ge.isDuration=function(t){return t instanceof p},ve=pi.length-1;ve>=0;--ve)x(pi[ve]);ge.normalizeUnits=function(t){return w(t)},ge.invalid=function(t){var e=ge.utc(0/0);return null!=t?m(e._pf,t):e._pf.userInvalidated=!0,e},ge.parseZone=function(){return ge.apply(null,arguments).parseZone()},ge.parseTwoDigitYear=function(t){return D(t)+(D(t)>68?1900:2e3)},m(ge.fn=u.prototype,{clone:function(){return ge(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var t=ge(this).utc();return 00:!1},parsingFlags:function(){return m({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(t){var e=j(this,t||ge.defaultFormat);return this.lang().postformat(e)},add:function(t,e){var i;return i="string"==typeof t&&"string"==typeof e?ge.duration(isNaN(+e)?+t:+e,isNaN(+e)?e:t):"string"==typeof t?ge.duration(+e,t):ge.duration(t,e),y(this,i,1),this},subtract:function(t,e){var i;return i="string"==typeof t&&"string"==typeof e?ge.duration(isNaN(+e)?+t:+e,isNaN(+e)?e:t):"string"==typeof t?ge.duration(+e,t):ge.duration(t,e),y(this,i,-1),this},diff:function(t,e,i){var s,n,o=O(t,this),r=6e4*(this.zone()-o.zone());return e=w(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+o.daysInMonth()),n=12*(this.year()-o.year())+(this.month()-o.month()),n+=(this-ge(this).startOf("month")-(o-ge(o).startOf("month")))/s,n-=6e4*(this.zone()-ge(this).startOf("month").zone()-(o.zone()-ge(o).startOf("month").zone()))/s,"year"===e&&(n/=12)):(s=this-o,n="second"===e?s/1e3:"minute"===e?s/6e4:"hour"===e?s/36e5:"day"===e?(s-r)/864e5:"week"===e?(s-r)/6048e5:s),i?n:f(n)},from:function(t,e){return ge.duration(this.diff(t)).lang(this.lang()._abbr).humanize(!e)},fromNow:function(t){return this.from(ge(),t)},calendar:function(t){var e=t||ge(),i=O(e,this).startOf("day"),s=this.diff(i,"days",!0),n=-6>s?"sameElse":-1>s?"lastWeek":0>s?"lastDay":1>s?"sameDay":2>s?"nextDay":7>s?"nextWeek":"sameElse";return this.format(this.lang().calendar(n,this))},isLeapYear:function(){return k(this.year())},isDST:function(){return this.zone()+ge(t).startOf(e)},isBefore:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)<+ge(t).startOf(e)},isSame:function(t,e){return e=e||"ms",+this.clone().startOf(e)===+O(t,this).startOf(e)},min:h("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(t){return t=ge.apply(null,arguments),this>t?this:t}),max:h("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(t){return t=ge.apply(null,arguments),t>this?this:t}),zone:function(t,e){var i=this._offset||0;return null==t?this._isUTC?i:this._d.getTimezoneOffset():("string"==typeof t&&(t=W(t)),Math.abs(t)<16&&(t=60*t),this._offset=t,this._isUTC=!0,i!==t&&(!e||this._changeInProgress?y(this,ge.duration(i-t,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,ge.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(t){return t=t?ge(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return T(this.year(),this.month())},dayOfYear:function(t){var e=we((ge(this).startOf("day")-ge(this).startOf("year"))/864e5)+1;return null==t?e:this.add("d",t-e)},quarter:function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},weekYear:function(t){var e=re(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==t?e:this.add("y",t-e)},isoWeekYear:function(t){var e=re(this,1,4).year;return null==t?e:this.add("y",t-e)},week:function(t){var e=this.lang().week(this);return null==t?e:this.add("d",7*(t-e))},isoWeek:function(t){var e=re(this,1,4).week;return null==t?e:this.add("d",7*(t-e))},weekday:function(t){var e=(this.day()+7-this.lang()._week.dow)%7;return null==t?e:this.add("d",t-e)},isoWeekday:function(t){return null==t?this.day()||7:this.day(this.day()%7?t:t-7)},isoWeeksInYear:function(){return Y(this.year(),1,4)},weeksInYear:function(){var t=this._lang._week;return Y(this.year(),t.dow,t.doy)},get:function(t){return t=w(t),this[t]()},set:function(t,e){return t=w(t),"function"==typeof this[t]&&this[t](e),this},lang:function(t){return t===o?this._lang:(this._lang=A(t),this)}}),ge.fn.millisecond=ge.fn.milliseconds=pe("Milliseconds",!1),ge.fn.second=ge.fn.seconds=pe("Seconds",!1),ge.fn.minute=ge.fn.minutes=pe("Minutes",!1),ge.fn.hour=ge.fn.hours=pe("Hours",!0),ge.fn.date=pe("Date",!0),ge.fn.dates=h("dates accessor is deprecated. Use date instead.",pe("Date",!0)),ge.fn.year=pe("FullYear",!0),ge.fn.years=h("years accessor is deprecated. Use year instead.",pe("FullYear",!0)),ge.fn.days=ge.fn.day,ge.fn.months=ge.fn.month,ge.fn.weeks=ge.fn.week,ge.fn.isoWeeks=ge.fn.isoWeek,ge.fn.quarters=ge.fn.quarter,ge.fn.toJSON=ge.fn.toISOString,m(ge.duration.fn=p.prototype,{_bubble:function(){var t,e,i,s,n=this._milliseconds,o=this._days,r=this._months,a=this._data;a.milliseconds=n%1e3,t=f(n/1e3),a.seconds=t%60,e=f(t/60),a.minutes=e%60,i=f(e/60),a.hours=i%24,o+=f(i/24),a.days=o%30,r+=f(o/30),a.months=r%12,s=f(r/12),a.years=s},weeks:function(){return f(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*D(this._months/12)},humanize:function(t){var e=+this,i=oe(e,!t,this.lang());return t&&(i=this.lang().pastFuture(e,i)),this.lang().postformat(i)},add:function(t,e){var i=ge.duration(t,e);return this._milliseconds+=i._milliseconds,this._days+=i._days,this._months+=i._months,this._bubble(),this},subtract:function(t,e){var i=ge.duration(t,e);return this._milliseconds-=i._milliseconds,this._days-=i._days,this._months-=i._months,this._bubble(),this},get:function(t){return t=w(t),this[t.toLowerCase()+"s"]()},as:function(t){return t=w(t),this["as"+t.charAt(0).toUpperCase()+t.slice(1)+"s"]()},lang:ge.fn.lang,toIsoString:function(){var t=Math.abs(this.years()),e=Math.abs(this.months()),i=Math.abs(this.days()),s=Math.abs(this.hours()),n=Math.abs(this.minutes()),o=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(t?t+"Y":"")+(e?e+"M":"")+(i?i+"D":"")+(s||n||o?"T":"")+(s?s+"H":"")+(n?n+"M":"")+(o?o+"S":""):"P0D"}});for(ve in oi)oi.hasOwnProperty(ve)&&(_e(ve,oi[ve]),me(ve.toLowerCase()));_e("Weeks",6048e5),ge.duration.fn.asMonths=function(){return(+this-31536e6*this.years())/2592e6+12*this.years()},ge.lang("en",{ordinal:function(t){var e=t%10,i=1===D(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),Ne?n.exports=ge:(s=function(t,e,i){return i.config&&i.config()&&i.config().noGlobal===!0&&(be.moment=ye),ge}.call(e,i,e,n),!(s!==o&&(n.exports=s)),fe(!0))}).call(this)}).call(e,function(){return this}(),i(130)(t))},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,n,o,r,a,h,d,l,c=this.calculationNodes,u=this.calculationNodeIndices,p=-2/3,m=4/3,_=this.constants.physics.repulsion.nodeDistance,f=_;for(d=0;di&&(r=.5*f>i?1:g*i+m,r*=0==o?1:1+o*this.constants.clustering.forceAmplification,r/=i,s=t*r,n=e*r,a.fx-=s,a.fy-=n,h.fx+=s,h.fy+=n)}}},function(t,e){e._calculateNodeForces=function(){var t,e,i,s,n,o,r,a,h,d,l=this.calculationNodes,c=this.calculationNodeIndices,u=5,p=.5*-u,m=this.constants.physics.hierarchicalRepulsion.nodeDistance,_=m,f=p/_;for(h=0;hi)){o=f*i+u;var g=.05,y=2*_*2*g;o=g*Math.pow(i,2)-y*i+y*y/(4*g),0==i?i=.01:o/=i,s=t*o,n=e*o,r.fx-=s,r.fy-=n,a.fx+=s,a.fy+=n}},e._calculateHierarchicalSpringForces=function(){var t,e,i,s,n,o,r,a,h,d=this.edges;for(i in d)if(d.hasOwnProperty(i)&&(e=d[i],e.connected&&this.nodes.hasOwnProperty(e.toId)&&this.nodes.hasOwnProperty(e.fromId))){t=e.customLength?e.length:this.constants.physics.springLength,t+=(e.to.clusterSize+e.from.clusterSize-2)*this.constants.clustering.edgeGrowth,s=e.from.x-e.to.x,n=e.from.y-e.to.y,h=Math.sqrt(s*s+n*n),0==h&&(h=.01),h=Math.max(.8*t,Math.min(5*t,h)),a=this.constants.physics.springConstant*(t-h)/h,o=s*a,r=n*a,e.to.fx-=o,e.to.fy-=r,e.from.fx+=o,e.from.fy+=r;var l=5;h>t&&(l=25),e.from.level>e.to.level?(e.to.fx-=l*o,e.to.fy-=l*r):e.from.levelo;o++)t=e[i[o]],this._getForceContribution(n.root.children.NW,t),this._getForceContribution(n.root.children.NE,t),this._getForceContribution(n.root.children.SW,t),this._getForceContribution(n.root.children.SE,t)}},e._getForceContribution=function(t,e){if(t.childrenCount>0){var i,s,n;if(i=t.centerOfMass.x-e.x,s=t.centerOfMass.y-e.y,n=Math.sqrt(i*i+s*s),n*t.calcSize>this.constants.physics.barnesHut.theta){0==n&&(n=.1*Math.random(),i=n);var o=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.mass/(n*n*n),r=i*o,a=s*o;e.fx+=r,e.fy+=a}else if(4==t.childrenCount)this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e);else if(t.children.data.id!=e.id){0==n&&(n=.5*Math.random(),i=n);var o=this.constants.physics.barnesHut.gravitationalConstant*t.mass*e.mass/(n*n*n),r=i*o,a=s*o;e.fx+=r,e.fy+=a}}},e._formBarnesHutTree=function(t,e){for(var i,s=e.length,n=Number.MAX_VALUE,o=Number.MAX_VALUE,r=-Number.MAX_VALUE,a=-Number.MAX_VALUE,h=0;s>h;h++){var d=t[e[h]].x,l=t[e[h]].y;n>d&&(n=d),d>r&&(r=d),o>l&&(o=l),l>a&&(a=l)}var c=Math.abs(r-n)-Math.abs(a-o);c>0?(o-=.5*c,a+=.5*c):(n+=.5*c,r-=.5*c);var u=1e-5,p=Math.max(u,Math.abs(r-n)),m=.5*p,_=.5*(n+r),f=.5*(o+a),g={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:_-m,maxX:_+m,minY:f-m,maxY:f+m},size:p,calcSize:1/p,children:{data:null},maxWidth:0,level:0,childrenCount:4}};for(this._splitBranch(g.root),h=0;s>h;h++)i=t[e[h]],this._placeInTree(g.root,i);this.barnesHutTree=g},e._updateBranchMass=function(t,e){var i=t.mass+e.mass,s=1/i;t.centerOfMass.x=t.centerOfMass.x*t.mass+e.x*e.mass,t.centerOfMass.x*=s,t.centerOfMass.y=t.centerOfMass.y*t.mass+e.y*e.mass,t.centerOfMass.y*=s,t.mass=i;var n=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidthe.x?t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NW"):this._placeInRegion(t,e,"SW"):t.children.NW.range.maxY>e.y?this._placeInRegion(t,e,"NE"):this._placeInRegion(t,e,"SE")},e._placeInRegion=function(t,e,i){switch(t.children[i].childrenCount){case 0:t.children[i].children.data=e,t.children[i].childrenCount=1,this._updateBranchMass(t.children[i],e);break;case 1:t.children[i].children.data.x==e.x&&t.children[i].children.data.y==e.y?(e.x+=Math.random(),e.y+=Math.random()):(this._splitBranch(t.children[i]),this._placeInTree(t.children[i],e));break;case 4:this._placeInTree(t.children[i],e)}},e._splitBranch=function(t){var e=null;1==t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)},e._insertRegion=function(t,e){var i,s,n,o,r=.5*t.size;switch(e){case"NW":i=t.range.minX,s=t.range.minX+r,n=t.range.minY,o=t.range.minY+r;break;case"NE":i=t.range.minX+r,s=t.range.maxX,n=t.range.minY,o=t.range.minY+r;break;case"SW":i=t.range.minX,s=t.range.minX+r,n=t.range.minY+r,o=t.range.maxY;break;case"SE":i=t.range.minX+r,s=t.range.maxX,n=t.range.minY+r,o=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:s,minY:n,maxY:o},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}},e._drawTree=function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))},e._drawBranch=function(t,e,i){void 0===i&&(i="#FF0000"),4==t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}},function(t,e,i){function s(t){return i(n(t))}function n(t){return o[t]||function(){throw new Error("Cannot find module '"+t+"'.")}()}var o={"./ar":58,"./ar-ma":56,"./ar-ma.js":56,"./ar-sa":57,"./ar-sa.js":57,"./ar.js":58,"./az":59,"./az.js":59,"./bg":60,"./bg.js":60,"./bn":61,"./bn.js":61,"./br":62,"./br.js":62,"./bs":63,"./bs.js":63,"./ca":64,"./ca.js":64,"./cs":65,"./cs.js":65,"./cv":66,"./cv.js":66,"./cy":67,"./cy.js":67,"./da":68,"./da.js":68,"./de":70,"./de-at":69,"./de-at.js":69,"./de.js":70,"./el":71,"./el.js":71,"./en-au":72,"./en-au.js":72,"./en-ca":73,"./en-ca.js":73,"./en-gb":74,"./en-gb.js":74,"./eo":75,"./eo.js":75,"./es":76,"./es.js":76,"./et":77,"./et.js":77,"./eu":78,"./eu.js":78,"./fa":79,"./fa.js":79,"./fi":80,"./fi.js":80,"./fo":81,"./fo.js":81,"./fr":83,"./fr-ca":82,"./fr-ca.js":82,"./fr.js":83,"./gl":84,"./gl.js":84,"./he":85,"./he.js":85,"./hi":86,"./hi.js":86,"./hr":87,"./hr.js":87,"./hu":88,"./hu.js":88,"./hy-am":89,"./hy-am.js":89,"./id":90,"./id.js":90,"./is":91,"./is.js":91,"./it":92,"./it.js":92,"./ja":93,"./ja.js":93,"./ka":94,"./ka.js":94,"./km":95,"./km.js":95,"./ko":96,"./ko.js":96,"./lb":97,"./lb.js":97,"./lt":98,"./lt.js":98,"./lv":99,"./lv.js":99,"./mk":100,"./mk.js":100,"./ml":101,"./ml.js":101,"./mr":102,"./mr.js":102,"./ms-my":103,"./ms-my.js":103,"./nb":104,"./nb.js":104,"./ne":105,"./ne.js":105,"./nl":106,"./nl.js":106,"./nn":107,"./nn.js":107,"./pl":108,"./pl.js":108,"./pt":110,"./pt-br":109,"./pt-br.js":109,"./pt.js":110,"./ro":111,"./ro.js":111,"./ru":112,"./ru.js":112,"./sk":113,"./sk.js":113,"./sl":114,"./sl.js":114,"./sq":115,"./sq.js":115,"./sr":117,"./sr-cyrl":116,"./sr-cyrl.js":116,"./sr.js":117,"./sv":118,"./sv.js":118,"./ta":119,"./ta.js":119,"./th":120,"./th.js":120,"./tl-ph":121,"./tl-ph.js":121,"./tr":122,"./tr.js":122,"./tzm":124,"./tzm-latn":123,"./tzm-latn.js":123,"./tzm.js":124,"./uk":125,"./uk.js":125,"./uz":126,"./uz.js":126,"./vi":127,"./vi.js":127,"./zh-cn":128,"./zh-cn.js":128,"./zh-tw":129,"./zh-tw.js":129};s.keys=function(){return Object.keys(o)},s.resolve=n,t.exports=s},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},i={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};return t.lang("ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(t){return 12>t?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return i[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},week:{dow:6,doy:12}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},i={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};return t.lang("ar",{months:"يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),monthsShort:"يناير/ كانون الثاني_فبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوفمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},meridiem:function(t){return 12>t?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return i[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},week:{dow:6,doy:12}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-üncü",4:"-üncü",100:"-üncü",6:"-ncı",9:"-uncu",10:"-uncu",30:"-uncu",60:"-ıncı",90:"-ıncı"};return t.lang("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə".split("_"),weekdaysShort:"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən".split("_"),weekdaysMin:"Bz_BE_ÇA_Çə_CA_Cü_Şə".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[gələn həftə] dddd [saat] LT",lastDay:"[dünən] LT",lastWeek:"[keçən həftə] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s əvvəl",s:"birneçə saniyyə",m:"bir dəqiqə",mm:"%d dəqiqə",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiem:function(t){return 4>t?"gecə":12>t?"səhər":17>t?"gündüz":"axşam"},ordinal:function(t){if(0===t)return t+"-ıncı";var i=t%10,s=t%100-i,n=t>=100?100:null;return t+(e[i]||e[s]||e[n])},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT"; +case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},ordinal:function(t){var e=t%10,i=t%100;return 0===t?t+"-ев":0===i?t+"-ен":i>10&&20>i?t+"-ти":1===e?t+"-ви":2===e?t+"-ри":7===e||8===e?t+"-ми":t+"-ти"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"১",2:"২",3:"৩",4:"৪",5:"৫",6:"৬",7:"৭",8:"৮",9:"৯",0:"০"},i={"১":"1","২":"2","৩":"3","৪":"4","৫":"5","৬":"6","৭":"7","৮":"8","৯":"9","০":"0"};return t.lang("bn",{months:"জানুয়ারী_ফেবুয়ারী_মার্চ_এপ্রিল_মে_জুন_জুলাই_অগাস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর".split("_"),monthsShort:"জানু_ফেব_মার্চ_এপর_মে_জুন_জুল_অগ_সেপ্ট_অক্টো_নভ_ডিসেম্".split("_"),weekdays:"রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পত্তিবার_শুক্রুবার_শনিবার".split("_"),weekdaysShort:"রবি_সোম_মঙ্গল_বুধ_বৃহস্পত্তি_শুক্রু_শনি".split("_"),weekdaysMin:"রব_সম_মঙ্গ_বু_ব্রিহ_শু_শনি".split("_"),longDateFormat:{LT:"A h:mm সময়",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[আজ] LT",nextDay:"[আগামীকাল] LT",nextWeek:"dddd, LT",lastDay:"[গতকাল] LT",lastWeek:"[গত] dddd, LT",sameElse:"L"},relativeTime:{future:"%s পরে",past:"%s আগে",s:"কএক সেকেন্ড",m:"এক মিনিট",mm:"%d মিনিট",h:"এক ঘন্টা",hh:"%d ঘন্টা",d:"এক দিন",dd:"%d দিন",M:"এক মাস",MM:"%d মাস",y:"এক বছর",yy:"%d বছর"},preparse:function(t){return t.replace(/[১২৩৪৫৬৭৮৯০]/g,function(t){return i[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiem:function(t){return 4>t?"রাত":10>t?"শকাল":17>t?"দুপুর":20>t?"বিকেল":"রাত"},week:{dow:0,doy:6}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s={mm:"munutenn",MM:"miz",dd:"devezh"};return t+" "+n(s[i],t)}function i(t){switch(s(t)){case 1:case 3:case 4:case 5:case 9:return t+" bloaz";default:return t+" vloaz"}}function s(t){return t>9?s(t%10):t}function n(t,e){return 2===e?o(t):t}function o(t){var e={m:"v",b:"v",d:"z"};return void 0===e[t.charAt(0)]?t:e[t.charAt(0)]+t.substring(1)}return t.lang("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),longDateFormat:{LT:"h[e]mm A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY LT",LLLL:"dddd, D [a viz] MMMM YYYY LT"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:e,h:"un eur",hh:"%d eur",d:"un devezh",dd:e,M:"ur miz",MM:e,y:"ur bloaz",yy:i},ordinal:function(t){var e=1===t?"añ":"vet";return t+e},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s=t+" ";switch(i){case"m":return e?"jedna minuta":"jedne minute";case"mm":return s+=1===t?"minuta":2===t||3===t||4===t?"minute":"minuta";case"h":return e?"jedan sat":"jednog sata";case"hh":return s+=1===t?"sat":2===t||3===t||4===t?"sata":"sati";case"dd":return s+=1===t?"dan":"dana";case"MM":return s+=1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci";case"yy":return s+=1===t?"godina":2===t||3===t||4===t?"godine":"godina"}}return t.lang("bs",{months:"januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinal:"%dº",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t){return t>1&&5>t&&1!==~~(t/10)}function i(t,i,s,n){var o=t+" ";switch(s){case"s":return i||n?"pár sekund":"pár sekundami";case"m":return i?"minuta":n?"minutu":"minutou";case"mm":return i||n?o+(e(t)?"minuty":"minut"):o+"minutami";case"h":return i?"hodina":n?"hodinu":"hodinou";case"hh":return i||n?o+(e(t)?"hodiny":"hodin"):o+"hodinami";case"d":return i||n?"den":"dnem";case"dd":return i||n?o+(e(t)?"dny":"dní"):o+"dny";case"M":return i||n?"měsíc":"měsícem";case"MM":return i||n?o+(e(t)?"měsíce":"měsíců"):o+"měsíci";case"y":return i||n?"rok":"rokem";case"yy":return i||n?o+(e(t)?"roky":"let"):o+"lety"}}var s="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),n="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");return t.lang("cs",{months:s,monthsShort:n,monthsParse:function(t,e){var i,s=[];for(i=0;12>i;i++)s[i]=new RegExp("^"+t[i]+"$|^"+e[i]+"$","i");return s}(s,n),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H.mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("cv",{months:"кăрлач_нарăс_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),monthsShort:"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),weekdays:"вырсарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_эрнекун_шăматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кĕç_эрн_шăм".split("_"),weekdaysMin:"вр_тн_ыт_юн_кç_эр_шм".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",LLL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",LLLL:"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"},calendar:{sameDay:"[Паян] LT [сехетре]",nextDay:"[Ыран] LT [сехетре]",lastDay:"[Ĕнер] LT [сехетре]",nextWeek:"[Çитес] dddd LT [сехетре]",lastWeek:"[Иртнĕ] dddd LT [сехетре]",sameElse:"L"},relativeTime:{future:function(t){var e=/сехет$/i.exec(t)?"рен":/çул$/i.exec(t)?"тан":"ран";return t+e},past:"%s каялла",s:"пĕр-ик çеккунт",m:"пĕр минут",mm:"%d минут",h:"пĕр сехет",hh:"%d сехет",d:"пĕр кун",dd:"%d кун",M:"пĕр уйăх",MM:"%d уйăх",y:"пĕр çул",yy:"%d çул"},ordinal:"%d-мĕш",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn ôl",s:"ychydig eiliadau",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},ordinal:function(t){var e=t,i="",s=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"];return e>20?i=40===e||50===e||60===e||80===e||100===e?"fed":"ain":e>0&&(i=s[e]),t+i},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I går kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?s[i][0]:s[i][1]}return t.lang("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?s[i][0]:s[i][1]}return t.lang("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(t,e){return/D/.test(e.substring(0,e.indexOf("MMMM")))?this._monthsGenitiveEl[t.month()]:this._monthsNominativeEl[t.month()]},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(t,e,i){return t>11?i?"μμ":"ΜΜ":i?"πμ":"ΠΜ"},longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(t,e){var i=this._calendarEl[t],s=e&&e.hours();return"function"==typeof i&&(i=i.apply(e)),i.replace("{}",s%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},ordinal:function(t){return t+"η"},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(t){var e=t%10,i=1===~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(t){var e=t%10,i=1===~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(t){var e=t%10,i=1===~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aŭg_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ĵaŭ_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ĵa_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY LT",LLLL:"dddd, [la] D[-an de] MMMM, YYYY LT"},meridiem:function(t,e,i){return t>11?i?"p.t.m.":"P.T.M.":i?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodiaŭ je] LT",nextDay:"[Morgaŭ je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hieraŭ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaŭ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinal:"%da",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),i="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");return t.lang("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,s){return/-MMM-/.test(s)?i[t.month()]:e[t.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [del] YYYY",LLL:"D [de] MMMM [del] YYYY LT",LLLL:"dddd, D [de] MMMM [del] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:"%dº",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i,s){var n={s:["mõne sekundi","mõni sekund","paar sekundit"],m:["ühe minuti","üks minut"],mm:[t+" minuti",t+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[t+" tunni",t+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[t+" kuu",t+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[t+" aasta",t+" aastat"]};return e?n[i][2]?n[i][2]:n[i][1]:s?n[i][0]:n[i][1]}return t.lang("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:"%d päeva",M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] LT",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] LT",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] LT",llll:"ddd, YYYY[ko] MMM D[a] LT"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},i={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};return t.lang("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiem:function(t){return 12>t?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(t){return t.replace(/[۰-۹]/g,function(t){return i[t]}).replace(/،/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"،")},ordinal:"%dم",week:{dow:6,doy:12}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,s,n){var o="";switch(s){case"s":return n?"muutaman sekunnin":"muutama sekunti";case"m":return n?"minuutin":"minuutti";case"mm":o=n?"minuutin":"minuuttia";break;case"h":return n?"tunnin":"tunti";case"hh":o=n?"tunnin":"tuntia";break;case"d":return n?"päivän":"päivä";case"dd":o=n?"päivän":"päivää";break;case"M":return n?"kuukauden":"kuukausi";case"MM":o=n?"kuukauden":"kuukautta";break;case"y":return n?"vuoden":"vuosi";case"yy":o=n?"vuoden":"vuotta"}return o=i(t,n)+" "+o}function i(t,e){return 10>t?e?n[t]:s[t]:t}var s="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),n=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",s[7],s[8],s[9]];return t.lang("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("fo",{months:"januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),weekdaysShort:"sun_mán_týs_mik_hós_frí_ley".split("_"),weekdaysMin:"su_má_tý_mi_hó_fr_le".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D. MMMM, YYYY LT"},calendar:{sameDay:"[Í dag kl.] LT",nextDay:"[Í morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[Í gjár kl.] LT",lastWeek:"[síðstu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s síðani",s:"fá sekund",m:"ein minutt",mm:"%d minuttir",h:"ein tími",hh:"%d tímar",d:"ein dagur",dd:"%d dagar",M:"ein mánaði",MM:"%d mánaðir",y:"eitt ár",yy:"%d ár"},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(t){return t+(1===t?"er":"")}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(t){return t+(1===t?"er":"")},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("gl",{months:"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),monthsShort:"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),weekdays:"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(t){return"uns segundos"===t?"nuns segundos":"en "+t},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY LT",LLLL:"dddd, D [ב]MMMM YYYY LT",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(t){return 2===t?"שעתיים":t+" שעות" +},d:"יום",dd:function(t){return 2===t?"יומיים":t+" ימים"},M:"חודש",MM:function(t){return 2===t?"חודשיים":t+" חודשים"},y:"שנה",yy:function(t){return 2===t?"שנתיים":t+" שנים"}}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},i={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return t.lang("hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(t){return t.replace(/[१२३४५६७८९०]/g,function(t){return i[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiem:function(t){return 4>t?"रात":10>t?"सुबह":17>t?"दोपहर":20>t?"शाम":"रात"},week:{dow:0,doy:6}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s=t+" ";switch(i){case"m":return e?"jedna minuta":"jedne minute";case"mm":return s+=1===t?"minuta":2===t||3===t||4===t?"minute":"minuta";case"h":return e?"jedan sat":"jednog sata";case"hh":return s+=1===t?"sat":2===t||3===t||4===t?"sata":"sati";case"dd":return s+=1===t?"dan":"dana";case"MM":return s+=1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci";case"yy":return s+=1===t?"godina":2===t||3===t||4===t?"godine":"godina"}}return t.lang("hr",{months:"sječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i,s){var n=t;switch(i){case"s":return s||e?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(s||e?" perc":" perce");case"mm":return n+(s||e?" perc":" perce");case"h":return"egy"+(s||e?" óra":" órája");case"hh":return n+(s||e?" óra":" órája");case"d":return"egy"+(s||e?" nap":" napja");case"dd":return n+(s||e?" nap":" napja");case"M":return"egy"+(s||e?" hónap":" hónapja");case"MM":return n+(s||e?" hónap":" hónapja");case"y":return"egy"+(s||e?" év":" éve");case"yy":return n+(s||e?" év":" éve")}return""}function i(t){return(t?"":"[múlt] ")+"["+s[this.day()]+"] LT[-kor]"}var s="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");return t.lang("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiem:function(t,e,i){return 12>t?i===!0?"de":"DE":i===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return i.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return i.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e){var i={nominative:"հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր".split("_"),accusative:"հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի".split("_")},s=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(e)?"accusative":"nominative";return i[s][t.month()]}function i(t){var e="հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ".split("_");return e[t.month()]}function s(t){var e="կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ".split("_");return e[t.day()]}return t.lang("hy-am",{months:e,monthsShort:i,weekdays:s,weekdaysShort:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),weekdaysMin:"կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY թ.",LLL:"D MMMM YYYY թ., LT",LLLL:"dddd, D MMMM YYYY թ., LT"},calendar:{sameDay:"[այսօր] LT",nextDay:"[վաղը] LT",lastDay:"[երեկ] LT",nextWeek:function(){return"dddd [օրը ժամը] LT"},lastWeek:function(){return"[անցած] dddd [օրը ժամը] LT"},sameElse:"L"},relativeTime:{future:"%s հետո",past:"%s առաջ",s:"մի քանի վայրկյան",m:"րոպե",mm:"%d րոպե",h:"ժամ",hh:"%d ժամ",d:"օր",dd:"%d օր",M:"ամիս",MM:"%d ամիս",y:"տարի",yy:"%d տարի"},meridiem:function(t){return 4>t?"գիշերվա":12>t?"առավոտվա":17>t?"ցերեկվա":"երեկոյան"},ordinal:function(t,e){switch(e){case"DDD":case"w":case"W":case"DDDo":return 1===t?t+"-ին":t+"-րդ";default:return t}},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(t){return 11>t?"pagi":15>t?"siang":19>t?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t){return t%100===11?!0:t%10===1?!1:!0}function i(t,i,s,n){var o=t+" ";switch(s){case"s":return i||n?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return i?"mínúta":"mínútu";case"mm":return e(t)?o+(i||n?"mínútur":"mínútum"):i?o+"mínúta":o+"mínútu";case"hh":return e(t)?o+(i||n?"klukkustundir":"klukkustundum"):o+"klukkustund";case"d":return i?"dagur":n?"dag":"degi";case"dd":return e(t)?i?o+"dagar":o+(n?"daga":"dögum"):i?o+"dagur":o+(n?"dag":"degi");case"M":return i?"mánuður":n?"mánuð":"mánuði";case"MM":return e(t)?i?o+"mánuðir":o+(n?"mánuði":"mánuðum"):i?o+"mánuður":o+(n?"mánuð":"mánuði");case"y":return i||n?"ár":"ári";case"yy":return e(t)?o+(i||n?"ár":"árum"):o+(i||n?"ár":"ári")}}return t.lang("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:i,m:i,mm:i,h:"klukkustund",hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:"[lo scorso] dddd [alle] LT",sameElse:"L"},relativeTime:{future:function(t){return(/^[0-9].+$/.test(t)?"tra":"in")+" "+t},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinal:"%dº",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日LT",LLLL:"YYYY年M月D日LT dddd"},meridiem:function(t){return 12>t?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e){var i={nominative:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი".split("_"),accusative:"იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს".split("_")},s=/D[oD] *MMMM?/.test(e)?"accusative":"nominative";return i[s][t.month()]}function i(t,e){var i={nominative:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი".split("_"),accusative:"კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს".split("_")},s=/(წინა|შემდეგ)/.test(e)?"accusative":"nominative";return i[s][t.day()]}return t.lang("ka",{months:e,monthsShort:"იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),weekdays:i,weekdaysShort:"კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),weekdaysMin:"კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვალ] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინა] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(t){return/(წამი|წუთი|საათი|წელი)/.test(t)?t.replace(/ი$/,"ში"):t+"ში"},past:function(t){return/(წამი|წუთი|საათი|დღე|თვე)/.test(t)?t.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(t)?t.replace(/წელი$/,"წლის წინ"):void 0},s:"რამდენიმე წამი",m:"წუთი",mm:"%d წუთი",h:"საათი",hh:"%d საათი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinal:function(t){return 0===t?t:1===t?t+"-ლი":20>t||100>=t&&t%20===0||t%100===0?"მე-"+t:t+"-ე"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("km",{months:"មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),monthsShort:"មករា_កុម្ភៈ_មិនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ".split("_"),weekdays:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysShort:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),weekdaysMin:"អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[ថ្ងៃនៈ ម៉ោង] LT",nextDay:"[ស្អែក ម៉ោង] LT",nextWeek:"dddd [ម៉ោង] LT",lastDay:"[ម្សិលមិញ ម៉ោង] LT",lastWeek:"dddd [សប្តាហ៍មុន] [ម៉ោង] LT",sameElse:"L"},relativeTime:{future:"%sទៀត",past:"%sមុន",s:"ប៉ុន្មានវិនាទី",m:"មួយនាទី",mm:"%d នាទី",h:"មួយម៉ោង",hh:"%d ម៉ោង",d:"មួយថ្ងៃ",dd:"%d ថ្ងៃ",M:"មួយខែ",MM:"%d ខែ",y:"មួយឆ្នាំ",yy:"%d ឆ្នាំ"},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h시 mm분",L:"YYYY.MM.DD",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 LT",LLLL:"YYYY년 MMMM D일 dddd LT"},meridiem:function(t){return 12>t?"오전":"오후"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇초",ss:"%d초",m:"일분",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한달",MM:"%d달",y:"일년",yy:"%d년"},ordinal:"%d일",meridiemParse:/(오전|오후)/,isPM:function(t){return"오후"===t}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],dd:[t+" Deeg",t+" Deeg"],M:["ee Mount","engem Mount"],MM:[t+" Méint",t+" Méint"],y:["ee Joer","engem Joer"],yy:[t+" Joer",t+" Joer"]};return e?s[i][0]:s[i][1]}function i(t){var e=t.substr(0,t.indexOf(" "));return r(e)?"a "+t:"an "+t}function s(t){var e=t.substr(0,t.indexOf(" "));return r(e)?"viru "+t:"virun "+t}function n(){var t=this.format("d");return o(t)?"[Leschte] dddd [um] LT":"[Leschten] dddd [um] LT"}function o(t){switch(t=parseInt(t,10)){case 0:case 1:case 3:case 5:case 6:return!0;default:return!1}}function r(t){if(t=parseInt(t,10),isNaN(t))return!1;if(0>t)return!0;if(10>t)return t>=4&&7>=t?!0:!1;if(100>t){var e=t%10,i=t/10;return r(0===e?i:e)}if(1e4>t){for(;t>=10;)t/=10;return r(t)}return t/=1e3,r(t)}return t.lang("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),longDateFormat:{LT:"H:mm [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:n},relativeTime:{future:i,past:s,s:"e puer Sekonnen",m:e,mm:"%d Minutten",h:e,hh:"%d Stonnen",d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i,s){return e?"kelios sekundės":s?"kelių sekundžių":"kelias sekundes"}function i(t,e,i,s){return e?n(i)[0]:s?n(i)[1]:n(i)[2]}function s(t){return t%10===0||t>10&&20>t}function n(t){return a[t].split("_")}function o(t,e,o,r){var a=t+" ";return 1===t?a+i(t,e,o[0],r):e?a+(s(t)?n(o)[1]:n(o)[0]):r?a+n(o)[1]:a+(s(t)?n(o)[1]:n(o)[2])}function r(t,e){var i=-1===e.indexOf("dddd HH:mm"),s=h[t.day()];return i?s:s.substring(0,s.length-2)+"į"}var a={m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"},h="sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_");return t.lang("lt",{months:"sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:r,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:e,m:i,mm:o,h:i,hh:o,d:i,dd:o,M:i,MM:o,y:i,yy:o},ordinal:function(t){return t+"-oji"},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s=t.split("_");return i?e%10===1&&11!==e?s[2]:s[3]:e%10===1&&11!==e?s[0]:s[1]}function i(t,i,n){return t+" "+e(s[n],t,i)}var s={mm:"minūti_minūtes_minūte_minūtes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mēnesi_mēnešus_mēnesis_mēneši",yy:"gadu_gadus_gads_gadi"};return t.lang("lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vēlāk",past:"%s agrāk",s:"dažas sekundes",m:"minūti",mm:i,h:"stundu",hh:i,d:"dienu",dd:i,M:"mēnesi",MM:i,y:"gadu",yy:i},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),weekdaysShort:"нед_пон_вто_сре_чет_пет_саб".split("_"),weekdaysMin:"нe_пo_вт_ср_че_пе_сa".split("_"),longDateFormat:{LT:"H:mm",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Денес во] LT",nextDay:"[Утре во] LT",nextWeek:"dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Во изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Во изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"после %s",past:"пред %s",s:"неколку секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",M:"месец",MM:"%d месеци",y:"година",yy:"%d години"},ordinal:function(t){var e=t%10,i=t%100;return 0===t?t+"-ев":0===i?t+"-ен":i>10&&20>i?t+"-ти":1===e?t+"-ви":2===e?t+"-ри":7===e||8===e?t+"-ми":t+"-ти"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ml",{months:"ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.".split("_"),weekdays:"ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച".split("_"),weekdaysShort:"ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി".split("_"),weekdaysMin:"ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ".split("_"),longDateFormat:{LT:"A h:mm -നു",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[ഇന്ന്] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇന്നലെ] LT",lastWeek:"[കഴിഞ്ഞ] dddd, LT",sameElse:"L"},relativeTime:{future:"%s കഴിഞ്ഞ്",past:"%s മുൻപ്",s:"അൽപ നിമിഷങ്ങൾ",m:"ഒരു മിനിറ്റ്",mm:"%d മിനിറ്റ്",h:"ഒരു മണിക്കൂർ",hh:"%d മണിക്കൂർ",d:"ഒരു ദിവസം",dd:"%d ദിവസം",M:"ഒരു മാസം",MM:"%d മാസം",y:"ഒരു വർഷം",yy:"%d വർഷം"},meridiem:function(t){return 4>t?"രാത്രി":12>t?"രാവിലെ":17>t?"ഉച്ച കഴിഞ്ഞ്":20>t?"വൈകുന്നേരം":"രാത്രി"}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},i={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return t.lang("mr",{months:"जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर".split("_"),monthsShort:"जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.".split("_"),weekdays:"रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[उद्या] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%s नंतर",past:"%s पूर्वी",s:"सेकंद",m:"एक मिनिट",mm:"%d मिनिटे",h:"एक तास",hh:"%d तास",d:"एक दिवस",dd:"%d दिवस",M:"एक महिना",MM:"%d महिने",y:"एक वर्ष",yy:"%d वर्षे"},preparse:function(t){return t.replace(/[१२३४५६७८९०]/g,function(t){return i[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiem:function(t){return 4>t?"रात्री":10>t?"सकाळी":17>t?"दुपारी":20>t?"सायंकाळी":"रात्री"},week:{dow:0,doy:6}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(t){return 11>t?"pagi":15>t?"tengahari":19>t?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},i={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return t.lang("ne",{months:"जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर".split("_"),monthsShort:"जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.".split("_"),weekdays:"आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.".split("_"),weekdaysMin:"आइ._सो._मङ्_बु._बि._शु._श.".split("_"),longDateFormat:{LT:"Aको h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},preparse:function(t){return t.replace(/[१२३४५६७८९०]/g,function(t){return i[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiem:function(t){return 3>t?"राती":10>t?"बिहान":15>t?"दिउँसो":18>t?"बेलुका":20>t?"साँझ":"राती"},calendar:{sameDay:"[आज] LT",nextDay:"[भोली] LT",nextWeek:"[आउँदो] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गएको] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडी",s:"केही समय",m:"एक मिनेट",mm:"%d मिनेट",h:"एक घण्टा",hh:"%d घण्टा",d:"एक दिन",dd:"%d दिन",M:"एक महिना",MM:"%d महिना",y:"एक बर्ष",yy:"%d बर्ष"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),i="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");return t.lang("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,s){return/-MMM-/.test(s)?i[t.month()]:e[t.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mån_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_må_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I går klokka] LT",lastWeek:"[Føregåande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein månad",MM:"%d månader",y:"eit år",yy:"%d år"},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t){return 5>t%10&&t%10>1&&~~(t/10)%10!==1}function i(t,i,s){var n=t+" ";switch(s){case"m":return i?"minuta":"minutę";case"mm":return n+(e(t)?"minuty":"minut");case"h":return i?"godzina":"godzinę";case"hh":return n+(e(t)?"godziny":"godzin");case"MM":return n+(e(t)?"miesiące":"miesięcy");case"yy":return n+(e(t)?"lata":"lat")}}var s="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),n="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");return t.lang("pl",{months:function(t,e){return/D MMMM/.test(e)?n[t.month()]:s[t.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:i,mm:i,h:i,hh:i,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:i,y:"rok",yy:i},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº"})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT" +},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},n=" ";return(t%100>=20||t>=100&&t%100===0)&&(n=" de "),t+n+s[i]}return t.lang("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:e,h:"o oră",hh:e,d:"o zi",dd:e,M:"o lună",MM:e,y:"un an",yy:e},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e){var i=t.split("_");return e%10===1&&e%100!==11?i[0]:e%10>=2&&4>=e%10&&(10>e%100||e%100>=20)?i[1]:i[2]}function i(t,i,s){var n={mm:i?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===s?i?"минута":"минуту":t+" "+e(n[s],+t)}function s(t,e){var i={nominative:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),accusative:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_")},s=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(e)?"accusative":"nominative";return i[s][t.month()]}function n(t,e){var i={nominative:"янв_фев_мар_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),accusative:"янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек".split("_")},s=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(e)?"accusative":"nominative";return i[s][t.month()]}function o(t,e){var i={nominative:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),accusative:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_")},s=/\[ ?[Вв] ?(?:прошлую|следующую)? ?\] ?dddd/.test(e)?"accusative":"nominative";return i[s][t.day()]}return t.lang("ru",{months:s,monthsShort:n,weekdays:o,weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|я]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i],longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT"},lastWeek:function(){switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:i,mm:i,h:"час",hh:i,d:"день",dd:i,M:"месяц",MM:i,y:"год",yy:i},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(t){return/^(дня|вечера)$/.test(t)},meridiem:function(t){return 4>t?"ночи":12>t?"утра":17>t?"дня":"вечера"},ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":return t+"-й";case"D":return t+"-го";case"w":case"W":return t+"-я";default:return t}},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t){return t>1&&5>t}function i(t,i,s,n){var o=t+" ";switch(s){case"s":return i||n?"pár sekúnd":"pár sekundami";case"m":return i?"minúta":n?"minútu":"minútou";case"mm":return i||n?o+(e(t)?"minúty":"minút"):o+"minútami";case"h":return i?"hodina":n?"hodinu":"hodinou";case"hh":return i||n?o+(e(t)?"hodiny":"hodín"):o+"hodinami";case"d":return i||n?"deň":"dňom";case"dd":return i||n?o+(e(t)?"dni":"dní"):o+"dňami";case"M":return i||n?"mesiac":"mesiacom";case"MM":return i||n?o+(e(t)?"mesiace":"mesiacov"):o+"mesiacmi";case"y":return i||n?"rok":"rokom";case"yy":return i||n?o+(e(t)?"roky":"rokov"):o+"rokmi"}}var s="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),n="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return t.lang("sk",{months:s,monthsShort:n,monthsParse:function(t,e){var i,s=[];for(i=0;12>i;i++)s[i]=new RegExp("^"+t[i]+"$|^"+e[i]+"$","i");return s}(s,n),weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e,i){var s=t+" ";switch(i){case"m":return e?"ena minuta":"eno minuto";case"mm":return s+=1===t?"minuta":2===t?"minuti":3===t||4===t?"minute":"minut";case"h":return e?"ena ura":"eno uro";case"hh":return s+=1===t?"ura":2===t?"uri":3===t||4===t?"ure":"ur";case"dd":return s+=1===t?"dan":"dni";case"MM":return s+=1===t?"mesec":2===t?"meseca":3===t||4===t?"mesece":"mesecev";case"yy":return s+=1===t?"leto":2===t?"leti":3===t||4===t?"leta":"let"}}return t.lang("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejšnja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"%s nazaj",s:"nekaj sekund",m:e,mm:e,h:e,hh:e,d:"en dan",dd:e,M:"en mesec",MM:e,y:"eno leto",yy:e},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),meridiem:function(t){return 12>t?"PD":"MD"},longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinal:"%d.",week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&4>=t?e[1]:e[2]},translate:function(t,i,s){var n=e.words[s];return 1===s.length?i?n[0]:n[1]:t+" "+e.correctGrammaticalCase(t,n)}};return t.lang("sr-cyrl",{months:["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],monthsShort:["јан.","феб.","мар.","апр.","мај","јун","јул","авг.","сеп.","окт.","нов.","дец."],weekdays:["недеља","понедељак","уторак","среда","четвртак","петак","субота"],weekdaysShort:["нед.","пон.","уто.","сре.","чет.","пет.","суб."],weekdaysMin:["не","по","ут","ср","че","пе","су"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var t=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"];return t[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"дан",dd:e.translate,M:"месец",MM:e.translate,y:"годину",yy:e.translate},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&4>=t?e[1]:e[2]},translate:function(t,i,s){var n=e.words[s];return 1===s.length?i?n[0]:n[1]:t+" "+e.correctGrammaticalCase(t,n)}};return t.lang("sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","čet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","če","pe","su"],longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var t=["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return t[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mesec",MM:e.translate,y:"godinu",yy:e.translate},ordinal:"%d.",week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},ordinal:function(t){var e=t%10,i=1===~~(t%100/10)?"e":1===e?"a":2===e?"a":3===e?"e":"e";return t+i},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("ta",{months:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),monthsShort:"ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்".split("_"),weekdays:"ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை".split("_"),weekdaysShort:"ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி".split("_"),weekdaysMin:"ஞா_தி_செ_பு_வி_வெ_ச".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[இன்று] LT",nextDay:"[நாளை] LT",nextWeek:"dddd, LT",lastDay:"[நேற்று] LT",lastWeek:"[கடந்த வாரம்] dddd, LT",sameElse:"L"},relativeTime:{future:"%s இல்",past:"%s முன்",s:"ஒரு சில விநாடிகள்",m:"ஒரு நிமிடம்",mm:"%d நிமிடங்கள்",h:"ஒரு மணி நேரம்",hh:"%d மணி நேரம்",d:"ஒரு நாள்",dd:"%d நாட்கள்",M:"ஒரு மாதம்",MM:"%d மாதங்கள்",y:"ஒரு வருடம்",yy:"%d ஆண்டுகள்"},ordinal:function(t){return t+"வது"},meridiem:function(t){return t>=6&&10>=t?" காலை":t>=10&&14>=t?" நண்பகல்":t>=14&&18>=t?" எற்பாடு":t>=18&&20>=t?" மாலை":t>=20&&24>=t?" இரவு":t>=0&&6>=t?" வைகறை":void 0},week:{dow:0,doy:6}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิกา m นาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiem:function(t){return 12>t?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM DD, YYYY LT"},calendar:{sameDay:"[Ngayon sa] LT",nextDay:"[Bukas sa] LT",nextWeek:"dddd [sa] LT",lastDay:"[Kahapon sa] LT",lastWeek:"dddd [huling linggo] LT",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},ordinal:function(t){return t},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){var e={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return t.lang("tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(t){if(0===t)return t+"'ıncı";var i=t%10,s=t%100-i,n=t>=100?100:null;return t+(e[i]||e[s]||e[n])},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("tzm-latn",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuḍ",mm:"%d minuḍ",h:"saɛa",hh:"%d tassaɛin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("tzm",{months:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),monthsShort:"ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ⴰⵙⴷⵅ ⴴ] LT",nextDay:"[ⴰⵙⴽⴰ ⴴ] LT",nextWeek:"dddd [ⴴ] LT",lastDay:"[ⴰⵚⴰⵏⵜ ⴴ] LT",lastWeek:"dddd [ⴴ] LT",sameElse:"L"},relativeTime:{future:"ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s",past:"ⵢⴰⵏ %s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉⵏⵓⴺ",mm:"%d ⵎⵉⵏⵓⴺ",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉⵏ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰⵏ",M:"ⴰⵢoⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔⵏ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙⵏ"},week:{dow:6,doy:12}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){function e(t,e){var i=t.split("_");return e%10===1&&e%100!==11?i[0]:e%10>=2&&4>=e%10&&(10>e%100||e%100>=20)?i[1]:i[2]}function i(t,i,s){var n={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===s?i?"хвилина":"хвилину":"h"===s?i?"година":"годину":t+" "+e(n[s],+t)}function s(t,e){var i={nominative:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_"),accusative:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_")},s=/D[oD]? *MMMM?/.test(e)?"accusative":"nominative";return i[s][t.month()]}function n(t,e){var i={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")},s=/(\[[ВвУу]\]) ?dddd/.test(e)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(e)?"genitive":"nominative";return i[s][t.day()]}function o(t){return function(){return t+"о"+(11===this.hours()?"б":"")+"] LT"}}return t.lang("uk",{months:s,monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:n,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., LT",LLLL:"dddd, D MMMM YYYY р., LT"},calendar:{sameDay:o("[Сьогодні "),nextDay:o("[Завтра "),lastDay:o("[Вчора "),nextWeek:o("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return o("[Минулої] dddd [").call(this);case 1:case 2:case 4:return o("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",m:i,mm:i,h:"годину",hh:i,d:"день",dd:i,M:"місяць",MM:i,y:"рік",yy:i},meridiem:function(t){return 4>t?"ночі":12>t?"ранку":17>t?"дня":"вечора"},ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t+"-й";case"D":return t+"-го";default:return t}},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("uz",{months:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),monthsShort:"янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"D MMMM YYYY, dddd LT"},calendar:{sameDay:"[Бугун соат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни соат] LT [да]",lastDay:"[Кеча соат] LT [да]",lastWeek:"[Утган] dddd [куни соат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурсат",m:"бир дакика",mm:"%d дакика",h:"бир соат",hh:"%d соат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},ordinal:function(t){return t},week:{dow:1,doy:4}})})},function(t,e,i){var s,n;!function(e){s=[i(51)],n=e.apply(null,s),!(void 0!==n&&(t.exports=n))}(function(t){return t.lang("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日LT",LLLL:"YYYY年MMMD日ddddLT",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日LT",llll:"YYYY年MMMD日ddddLT"},meridiem:function(t,e){var i=100*t+e;return 600>i?"凌晨":900>i?"早上":1130>i?"上午":1230>i?"中午":1800>i?"下午":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var e,i;return e=t().startOf("week"),i=this.unix()-e.unix()>=604800?"[下]":"[本]",0===this.minutes()?i+"dddAh点整":i+"dddAh点mm"},lastWeek:function(){var e,i;return e=t().startOf("week"),i=this.unix()i?"早上":1130>i?"上午":1230>i?"中午":1800>i?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"日";case"M":return t+"月";case"w":case"W":return t+"週";default:return t}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",m:"一分鐘",mm:"%d分鐘",h:"一小時",hh:"%d小時",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%d年"}})})},function(t){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}}])}); //# sourceMappingURL=vis.map \ No newline at end of file diff --git a/docs/timeline.html b/docs/timeline.html index c280eb56..ca5b8042 100644 --- a/docs/timeline.html +++ b/docs/timeline.html @@ -449,7 +449,21 @@ var options = { margin.item Number 10 - The minimal margin in pixels between items. + The minimal margin in pixels between items in both horizontal and vertical direction. + + + + margin.item.horizontal + Number + 10 + The minimal horizontal margin in pixels between items. + + + + margin.item.vertical + Number + 10 + The minimal vertical margin in pixels between items. diff --git a/lib/timeline/Stack.js b/lib/timeline/Stack.js index 9d46738d..35cc90e9 100644 --- a/lib/timeline/Stack.js +++ b/lib/timeline/Stack.js @@ -30,7 +30,7 @@ exports.orderByEnd = function(items) { * other. * @param {Item[]} items * All visible items - * @param {{item: number, axis: number}} margin + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin * Margins between items and between items and the axis. * @param {boolean} [force=false] * If true, all items will be repositioned. If false (default), only @@ -67,7 +67,7 @@ exports.stack = function(items, margin, force) { if (collidingItem != null) { // There is a collision. Reposition the items above the colliding element - item.top = collidingItem.top + collidingItem.height + margin.item; + item.top = collidingItem.top + collidingItem.height + margin.item.vertical; } } while (collidingItem); } @@ -78,7 +78,7 @@ exports.stack = function(items, margin, force) { * Adjust vertical positions of the items without stacking them * @param {Item[]} items * All visible items - * @param {{item: number, axis: number}} margin + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin * Margins between items and between items and the axis. */ exports.nostack = function(items, margin) { @@ -95,16 +95,14 @@ exports.nostack = function(items, margin) { * The items must have parameters left, width, top, and height. * @param {Item} a The first item * @param {Item} b The second item - * @param {Number} margin A minimum required margin. - * If margin is provided, the two items will be - * marked colliding when they overlap or - * when the margin between the two is smaller than - * the requested margin. + * @param {{horizontal: number, vertical: number}} margin + * An object containing a horizontal and vertical + * minimum required margin. * @return {boolean} true if a and b collide, else false */ exports.collision = function(a, b, margin) { - return ((a.left - margin + EPSILON) < (b.left + b.width) && - (a.left + a.width + margin - EPSILON) > b.left && - (a.top - margin + EPSILON) < (b.top + b.height) && - (a.top + a.height + margin - EPSILON) > b.top); + return ((a.left - margin.horizontal + EPSILON) < (b.left + b.width) && + (a.left + a.width + margin.horizontal - EPSILON) > b.left && + (a.top - margin.vertical + EPSILON) < (b.top + b.height) && + (a.top + a.height + margin.vertical - EPSILON) > b.top); }; diff --git a/lib/timeline/component/Group.js b/lib/timeline/component/Group.js index ce80eeb2..e23d8f06 100644 --- a/lib/timeline/component/Group.js +++ b/lib/timeline/component/Group.js @@ -123,7 +123,7 @@ Group.prototype.getLabelWidth = function() { /** * Repaint this group * @param {{start: number, end: number}} range - * @param {{item: number, axis: number}} margin + * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin * @param {boolean} [restack=false] Force restacking of all items * @return {boolean} Returns true if the group is resized */ @@ -172,10 +172,10 @@ Group.prototype.redraw = function(range, margin, restack) { item.top -= offset; }); } - height = max + margin.item / 2; + height = max + margin.item.vertical / 2; } else { - height = margin.axis + margin.item; + height = margin.axis + margin.item.vertical; } height = Math.max(height, this.props.label.height); diff --git a/lib/timeline/component/ItemSet.js b/lib/timeline/component/ItemSet.js index d2df6670..1ab36263 100644 --- a/lib/timeline/component/ItemSet.js +++ b/lib/timeline/component/ItemSet.js @@ -52,7 +52,10 @@ function ItemSet(body, options) { }, margin: { - item: 10, + item: { + horizontal: 10, + vertical: 10 + }, axis: 20 }, padding: 5 @@ -211,8 +214,15 @@ ItemSet.prototype._create = function(){ * {Number} margin.axis * Margin between the axis and the items in pixels. * Default is 20. + * {Number} margin.item.horizontal + * Horizontal margin between items in pixels. + * Default is 10. + * {Number} margin.item.vertical + * Vertical Margin between items in pixels. + * Default is 10. * {Number} margin.item - * Margin between items in pixels. Default is 10. + * Margin between items in pixels in both horizontal + * and vertical direction. Default is 10. * {Number} margin * Set margin for both axis and items in pixels. * {Number} padding @@ -254,10 +264,20 @@ ItemSet.prototype.setOptions = function(options) { if ('margin' in options) { if (typeof options.margin === 'number') { this.options.margin.axis = options.margin; - this.options.margin.item = options.margin; + this.options.margin.item.horizontal = options.margin; + this.options.margin.item.vertical = options.margin; } - else if (typeof options.margin === 'object'){ - util.selectiveExtend(['axis', 'item'], this.options.margin, options.margin); + else if (typeof options.margin === 'object') { + util.selectiveExtend(['axis'], this.options.margin, options.margin); + if ('item' in options.margin) { + if (typeof options.margin.item === 'number') { + this.options.margin.item.horizontal = options.margin.item; + this.options.margin.item.vertical = options.margin.item; + } + else if (typeof options.margin.item === 'object') { + util.selectiveExtend(['horizontal', 'vertical'], this.options.margin.item, options.margin.item); + } + } } } @@ -448,10 +468,10 @@ ItemSet.prototype.redraw = function() { }, nonFirstMargin = { item: margin.item, - axis: margin.item / 2 + axis: margin.item.vertical / 2 }, height = 0, - minHeight = margin.axis + margin.item; + minHeight = margin.axis + margin.item.vertical; util.forEach(this.groups, function (group) { var groupMargin = (group == firstGroup) ? firstMargin : nonFirstMargin; var groupResized = group.redraw(range, groupMargin, restack);