From 2265a751f9a90356a7b0f8a2395126e312895ef5 Mon Sep 17 00:00:00 2001 From: Alex de Mulder Date: Thu, 19 Jun 2014 17:49:24 +0200 Subject: [PATCH] released version 2.0.0 --- .gitignore | 2 + dist/vis.css | 185 +- dist/vis.js | 4031 +++++++++-------- dist/vis.min.css | 2 +- dist/vis.min.js | 25 +- docs/dataset.html | 10 +- docs/graph.html | 12 + docs/img/vis_overview.odg | Bin 17762 -> 16920 bytes docs/img/vis_overview.png | Bin 64008 -> 66220 bytes docs/index.html | 26 +- docs/timeline.html | 42 +- download/vis.zip | Bin 1325892 -> 1333788 bytes examples/timeline/01_basic.html | 11 +- examples/timeline/02_interactive.html | 10 +- examples/timeline/03_a_lot_of_data.html | 5 +- examples/timeline/04_html_data.html | 4 +- examples/timeline/06_event_listeners.html | 8 +- examples/timeline/07_custom_time_bar.html | 2 +- examples/timeline/10_limit_move_and_zoom.html | 4 +- examples/timeline/11_points.html | 4 +- examples/timeline/12_custom_styling.html | 6 +- examples/timeline/15_item_class_names.html | 4 +- examples/timeline/16_navigation_menu.html | 4 +- examples/timeline/17_data_serialization.html | 120 + examples/timeline/index.html | 1 + examples/timeline/requirejs/scripts/main.js | 4 +- index.html | 2 +- 27 files changed, 2579 insertions(+), 1945 deletions(-) create mode 100644 examples/timeline/17_data_serialization.html diff --git a/.gitignore b/.gitignore index 485dee64..ce1e679d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .idea +node_modules +.settings \ No newline at end of file diff --git a/dist/vis.css b/dist/vis.css index 1f2c2de7..ff815c72 100644 --- a/dist/vis.css +++ b/dist/vis.css @@ -2,34 +2,76 @@ } -.vis.timeline.rootpanel { +.vis.timeline.root { position: relative; + border: 1px solid #bfbfbf; + overflow: hidden; + padding: 0; + margin: 0; - border: 1px solid #bfbfbf; box-sizing: border-box; - - /* FIXME: there is an issue with the height of the items when panel height is animated - -webkit-transition: height 4s ease-in-out; - transition: height 4s ease-in-out; - /**/ } -.vis.timeline .vpanel { +.vis.timeline .vispanel { position: absolute; - overflow: hidden; + + padding: 0; + margin: 0; box-sizing: border-box; } -.vis.timeline .vpanel.side { - border-right: 1px solid #bfbfbf; +.vis.timeline .vispanel.center, +.vis.timeline .vispanel.left, +.vis.timeline .vispanel.right, +.vis.timeline .vispanel.top, +.vis.timeline .vispanel.bottom { + border: 1px #bfbfbf; +} + +.vis.timeline .vispanel.center, +.vis.timeline .vispanel.left, +.vis.timeline .vispanel.right { + border-top-style: solid; + border-bottom-style: solid; + overflow: hidden; +} + +.vis.timeline .vispanel.center, +.vis.timeline .vispanel.top, +.vis.timeline .vispanel.bottom { + border-left-style: solid; + border-right-style: solid; +} + +.vis.timeline .background { + overflow: hidden; +} + +.vis.timeline .vispanel > .content { + position: relative; +} + +.vis.timeline .vispanel .shadow { + position: absolute; + width: 100%; + height: 1px; + box-shadow: 0 0 10px rgba(0,0,0,0.8); + /* TODO: find a nice way to ensure shadows are drawn on top of items + z-index: 1; + */ } -.vis.timeline .vpanel.side.hidden { - display: none; +.vis.timeline .vispanel .shadow.top { + top: -1px; + left: 0; } +.vis.timeline .vispanel .shadow.bottom { + bottom: -1px; + left: 0; +} .vis.timeline .labelset { position: relative; @@ -50,14 +92,12 @@ box-sizing: border-box; } -.vis.timeline.top .labelset .vlabel { - border-top: 1px solid #bfbfbf; - border-bottom: none; +.vis.timeline .labelset .vlabel { + border-bottom: 1px solid #bfbfbf; } -.vis.timeline.bottom .labelset .vlabel { - border-top: none; - border-bottom: 1px solid #bfbfbf; +.vis.timeline .labelset .vlabel:last-child { + border-bottom: none; } .vis.timeline .labelset .vlabel .inner { @@ -65,6 +105,10 @@ padding: 5px; } +.vis.timeline .labelset .vlabel .inner.hidden { + padding: 0; +} + .vis.timeline .itemset { position: relative; @@ -72,38 +116,33 @@ margin: 0; box-sizing: border-box; - - /* FIXME: get transition working for rootpanel and itemset - -webkit-transition: height 4s ease-in-out; - transition: height 4s ease-in-out; - /**/ } -.vis.timeline .background { -} - -.vis.timeline .foreground { +.vis.timeline .itemset .background, +.vis.timeline .itemset .foreground { + position: absolute; + width: 100%; + height: 100%; } .vis.timeline .axis { - overflow: visible; + position: absolute; + width: 100%; + height: 0; + left: 1px; + z-index: 1; } -.vis.timeline .group { +.vis.timeline .foreground .group { position: relative; box-sizing: border-box; + border-bottom: 1px solid #bfbfbf; } -.vis.timeline.top .group { - border-top: 1px solid #bfbfbf; +.vis.timeline .foreground .group:last-child { border-bottom: none; } -.vis.timeline.bottom .group { - border-top: none; - border-bottom: 1px solid #bfbfbf; -} - .vis.timeline .item { position: absolute; @@ -113,11 +152,6 @@ background-color: #D5DDF6; display: inline-block; padding: 5px; - - /* TODO: enable css transitions - -webkit-transition: top .4s ease-in-out, bottom .4s ease-in-out; - transition: top .4s ease-in-out, bottom .4s ease-in-out; - /**/ } .vis.timeline .item.selected { @@ -126,7 +160,7 @@ z-index: 999; } -.vis.timeline.editable .item.selected { +.vis.timeline .editable .item.selected { cursor: move; } @@ -176,11 +210,6 @@ width: 0; border-left-width: 1px; border-left-style: solid; - - /* TODO: enable css transitions - -webkit-transition: height .4s ease-in-out, top .4s ease-in-out; - transition: height .4s ease-in-out, top .4s ease-in-out; - /**/ } .vis.timeline .item .content { @@ -223,7 +252,22 @@ } .vis.timeline .timeaxis { + position: relative; + overflow: hidden; +} + +.vis.timeline .timeaxis.foreground { + top: 0; + left: 0; + width: 100%; +} + +.vis.timeline .timeaxis.background { position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; } .vis.timeline .timeaxis .text { @@ -248,14 +292,6 @@ border-right: 1px solid; } -.vis.timeline .timeaxis .grid.horizontal { - position: absolute; - left: 0; - width: 100%; - height: 0; - border-bottom: 1px solid; -} - .vis.timeline .timeaxis .grid.minor { border-color: #e5e5e5; } @@ -267,14 +303,47 @@ .vis.timeline .currenttime { background-color: #FF7F6E; width: 2px; - z-index: 9; + z-index: 1; } .vis.timeline .customtime { background-color: #6E94FF; width: 2px; cursor: move; - z-index: 9; + z-index: 1; +} +.vis.timeline.root { + /* + -webkit-transition: height .4s ease-in-out; + transition: height .4s ease-in-out; + */ +} + +.vis.timeline .vispanel { + /* + -webkit-transition: height .4s ease-in-out, top .4s ease-in-out; + transition: height .4s ease-in-out, top .4s ease-in-out; + */ +} + +.vis.timeline .axis { + /* + -webkit-transition: top .4s ease-in-out; + transition: top .4s ease-in-out; + */ +} + +/* TODO: get animation working nicely + +.vis.timeline .item { + -webkit-transition: top .4s ease-in-out; + transition: top .4s ease-in-out; +} + +.vis.timeline .item.line { + -webkit-transition: height .4s ease-in-out, top .4s ease-in-out; + transition: height .4s ease-in-out, top .4s ease-in-out; } +/**/ div.graph-manipulationDiv { border-width:0px; border-bottom: 1px; diff --git a/dist/vis.js b/dist/vis.js index 0ac9259e..71d48208 100644 --- a/dist/vis.js +++ b/dist/vis.js @@ -4,8 +4,8 @@ * * A dynamic, browser-based visualization library. * - * @version 1.1.0 - * @date 2014-06-06 + * @version 2.0.0 + * @date 2014-06-19 * * @license * Copyright (C) 2011-2014 Almende B.V, http://almende.com @@ -318,7 +318,7 @@ var util = {}; * @param {*} object * @return {Boolean} isNumber */ -util.isNumber = function isNumber(object) { +util.isNumber = function(object) { return (object instanceof Number || typeof object == 'number'); }; @@ -327,7 +327,7 @@ util.isNumber = function isNumber(object) { * @param {*} object * @return {Boolean} isString */ -util.isString = function isString(object) { +util.isString = function(object) { return (object instanceof String || typeof object == 'string'); }; @@ -336,7 +336,7 @@ util.isString = function isString(object) { * @param {Date | String} object * @return {Boolean} isDate */ -util.isDate = function isDate(object) { +util.isDate = function(object) { if (object instanceof Date) { return true; } @@ -359,7 +359,7 @@ util.isDate = function isDate(object) { * @param {*} object * @return {Boolean} isDataTable */ -util.isDataTable = function isDataTable(object) { +util.isDataTable = function(object) { return (typeof (google) !== 'undefined') && (google.visualization) && (google.visualization.DataTable) && @@ -371,7 +371,7 @@ util.isDataTable = function isDataTable(object) { * source: http://stackoverflow.com/a/105074/1262753 * @return {String} uuid */ -util.randomUUID = function randomUUID () { +util.randomUUID = function() { var S4 = function () { return Math.floor( Math.random() * 0x10000 /* 65536 */ @@ -398,7 +398,34 @@ util.extend = function (a, b) { for (var i = 1, len = arguments.length; i < len; i++) { var other = arguments[i]; for (var prop in other) { - if (other.hasOwnProperty(prop) && other[prop] !== undefined) { + if (other.hasOwnProperty(prop)) { + a[prop] = other[prop]; + } + } + } + + return a; +}; + +/** + * Extend object a with selected properties of object b or a series of objects + * Only properties with defined values are copied + * @param {Array.} props + * @param {Object} a + * @param {... Object} b + * @return {Object} a + */ +util.selectiveExtend = function (props, a, b) { + if (!Array.isArray(props)) { + throw new Error('Array with property names expected as first argument'); + } + + for (var i = 1, len = arguments.length; i < len; i++) { + var other = arguments[i]; + + for (var p = 0, pp = props.length; p < pp; p++) { + var prop = props[p]; + if (other.hasOwnProperty(prop)) { a[prop] = other[prop]; } } @@ -413,7 +440,7 @@ util.extend = function (a, b) { * @param {Object} b * @returns {Object} */ -util.deepExtend = function deepExtend (a, b) { +util.deepExtend = function(a, b) { // TODO: add support for Arrays to deepExtend if (Array.isArray(b)) { throw new TypeError('Arrays are not supported by deepExtend'); @@ -426,7 +453,7 @@ util.deepExtend = function deepExtend (a, b) { a[prop] = {}; } if (a[prop].constructor === Object) { - deepExtend(a[prop], b[prop]); + util.deepExtend(a[prop], b[prop]); } else { a[prop] = b[prop]; @@ -467,7 +494,7 @@ util.equalArray = function (a, b) { * @return {*} object * @throws Error */ -util.convert = function convert(object, type) { +util.convert = function(object, type) { var match; if (object === undefined) { @@ -602,8 +629,7 @@ util.convert = function convert(object, type) { } default: - throw new Error('Cannot convert object of type ' + util.getType(object) + - ' to type "' + type + '"'); + throw new Error('Unknown type "' + type + '"'); } }; @@ -617,7 +643,7 @@ var ASPDateRegex = /^\/?Date\((\-?\d+)/i; * @param {*} object * @return {String} type */ -util.getType = function getType(object) { +util.getType = function(object) { var type = typeof object; if (type == 'object') { @@ -660,7 +686,7 @@ util.getType = function getType(object) { * @return {number} left The absolute left position of this element * in the browser page. */ -util.getAbsoluteLeft = function getAbsoluteLeft (elem) { +util.getAbsoluteLeft = function(elem) { var doc = document.documentElement; var body = document.body; @@ -680,7 +706,7 @@ util.getAbsoluteLeft = function getAbsoluteLeft (elem) { * @return {number} top The absolute top position of this element * in the browser page. */ -util.getAbsoluteTop = function getAbsoluteTop (elem) { +util.getAbsoluteTop = function(elem) { var doc = document.documentElement; var body = document.body; @@ -699,7 +725,7 @@ util.getAbsoluteTop = function getAbsoluteTop (elem) { * @param {Event} event * @return {Number} pageY */ -util.getPageY = function getPageY (event) { +util.getPageY = function(event) { if ('pageY' in event) { return event.pageY; } @@ -725,7 +751,7 @@ util.getPageY = function getPageY (event) { * @param {Event} event * @return {Number} pageX */ -util.getPageX = function getPageX (event) { +util.getPageX = function(event) { if ('pageY' in event) { return event.pageX; } @@ -751,7 +777,7 @@ util.getPageX = function getPageX (event) { * @param {Element} elem * @param {String} className */ -util.addClassName = function addClassName(elem, className) { +util.addClassName = function(elem, className) { var classes = elem.className.split(' '); if (classes.indexOf(className) == -1) { classes.push(className); // add the class to the array @@ -764,7 +790,7 @@ util.addClassName = function addClassName(elem, className) { * @param {Element} elem * @param {String} className */ -util.removeClassName = function removeClassname(elem, className) { +util.removeClassName = function(elem, className) { var classes = elem.className.split(' '); var index = classes.indexOf(className); if (index != -1) { @@ -782,7 +808,7 @@ util.removeClassName = function removeClassname(elem, className) { * the object or array with three parameters: * callback(value, index, object) */ -util.forEach = function forEach (object, callback) { +util.forEach = function(object, callback) { var i, len; if (object instanceof Array) { @@ -807,7 +833,7 @@ util.forEach = function forEach (object, callback) { * @param {Object} object * @param {Array} array */ -util.toArray = function toArray(object) { +util.toArray = function(object) { var array = []; for (var prop in object) { @@ -824,7 +850,7 @@ util.toArray = function toArray(object) { * @param {*} value * @return {Boolean} changed */ -util.updateProperty = function updateProperty (object, key, value) { +util.updateProperty = function(object, key, value) { if (object[key] !== value) { object[key] = value; return true; @@ -842,7 +868,7 @@ util.updateProperty = function updateProperty (object, key, value) { * @param {function} listener The callback function to be executed * @param {boolean} [useCapture] */ -util.addEventListener = function addEventListener(element, action, listener, useCapture) { +util.addEventListener = function(element, action, listener, useCapture) { if (element.addEventListener) { if (useCapture === undefined) useCapture = false; @@ -864,7 +890,7 @@ util.addEventListener = function addEventListener(element, action, listener, use * @param {function} listener The listener function * @param {boolean} [useCapture] */ -util.removeEventListener = function removeEventListener(element, action, listener, useCapture) { +util.removeEventListener = function(element, action, listener, useCapture) { if (element.removeEventListener) { // non-IE browsers if (useCapture === undefined) @@ -887,7 +913,7 @@ util.removeEventListener = function removeEventListener(element, action, listene * @param {Event} event * @return {Element} target element */ -util.getTarget = function getTarget(event) { +util.getTarget = function(event) { // code from http://www.quirksmode.org/js/events_properties.html if (!event) { event = window.event; @@ -915,7 +941,7 @@ util.getTarget = function getTarget(event) { * @param {Element} element * @param {Event} event */ -util.fakeGesture = function fakeGesture (element, event) { +util.fakeGesture = function(element, event) { var eventType = null; // for hammer.js 1.0.5 @@ -1031,7 +1057,7 @@ util.option.asElement = function (value, defaultValue) { -util.GiveDec = function GiveDec(Hex) { +util.GiveDec = function(Hex) { var Value; if (Hex == "A") @@ -1052,7 +1078,7 @@ util.GiveDec = function GiveDec(Hex) { return Value; }; -util.GiveHex = function GiveHex(Dec) { +util.GiveHex = function(Dec) { var Value; if(Dec == 10) @@ -1156,7 +1182,7 @@ util.parseColor = function(color) { * @param {String} hex * @returns {{r: *, g: *, b: *}} */ -util.hexToRGB = function hexToRGB(hex) { +util.hexToRGB = function(hex) { hex = hex.replace("#","").toUpperCase(); var a = util.GiveDec(hex.substring(0, 1)); @@ -1173,7 +1199,7 @@ util.hexToRGB = function hexToRGB(hex) { return {r:r,g:g,b:b}; }; -util.RGBToHex = function RGBToHex(red,green,blue) { +util.RGBToHex = function(red,green,blue) { var a = util.GiveHex(Math.floor(red / 16)); var b = util.GiveHex(red % 16); var c = util.GiveHex(Math.floor(green / 16)); @@ -1195,7 +1221,7 @@ util.RGBToHex = function RGBToHex(red,green,blue) { * @returns {*} * @constructor */ -util.RGBToHSV = function RGBToHSV (red,green,blue) { +util.RGBToHSV = function(red,green,blue) { red=red/255; green=green/255; blue=blue/255; var minRGB = Math.min(red,Math.min(green,blue)); var maxRGB = Math.max(red,Math.max(green,blue)); @@ -1223,7 +1249,7 @@ util.RGBToHSV = function RGBToHSV (red,green,blue) { * @returns {{r: number, g: number, b: number}} * @constructor */ -util.HSVToRGB = function HSVToRGB(h, s, v) { +util.HSVToRGB = function(h, s, v) { var r, g, b; var i = Math.floor(h * 6); @@ -1244,22 +1270,22 @@ util.HSVToRGB = function HSVToRGB(h, s, v) { return {r:Math.floor(r * 255), g:Math.floor(g * 255), b:Math.floor(b * 255) }; }; -util.HSVToHex = function HSVToHex(h, s, v) { +util.HSVToHex = function(h, s, v) { var rgb = util.HSVToRGB(h, s, v); return util.RGBToHex(rgb.r, rgb.g, rgb.b); }; -util.hexToHSV = function hexToHSV(hex) { +util.hexToHSV = function(hex) { var rgb = util.hexToRGB(hex); return util.RGBToHSV(rgb.r, rgb.g, rgb.b); }; -util.isValidHex = function isValidHex(hex) { +util.isValidHex = function(hex) { var isOk = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(hex); return isOk; }; -util.copyObject = function copyObject(objectFrom, objectTo) { +util.copyObject = function(objectFrom, objectTo) { for (var i in objectFrom) { if (objectFrom.hasOwnProperty(i)) { if (typeof objectFrom[i] == "object") { @@ -1279,7 +1305,7 @@ util.copyObject = function copyObject(objectFrom, objectTo) { * Usage: * var dataSet = new DataSet({ * fieldId: '_id', - * convert: { + * type: { * // ... * } * }); @@ -1305,43 +1331,46 @@ util.copyObject = function copyObject(objectFrom, objectTo) { * @param {Object} [options] Available options: * {String} fieldId Field name of the id in the * items, 'id' by default. - * {Object.} [convert] + * {String} [returnType] Type of data to be + * returned. Can be 'DataTable' or 'Array' (default) + * {Object.} [type] * {String[]} [fields] field names to be returned * {function} [filter] filter items * {String | function} [order] Order the items by @@ -1567,7 +1596,6 @@ DataSet.prototype.update = function (data, senderId) { */ DataSet.prototype.get = function (args) { var me = this; - var globalShowInternalIds = this.showInternalIds; // parse the arguments var id, ids, options, data; @@ -1591,42 +1619,35 @@ DataSet.prototype.get = function (args) { } // determine the return type - var type; - if (options && options.type) { - type = (options.type == 'DataTable') ? 'DataTable' : 'Array'; + var returnType; + if (options && options.returnType) { + returnType = (options.returnType == 'DataTable') ? 'DataTable' : 'Array'; - if (data && (type != util.getType(data))) { + if (data && (returnType != util.getType(data))) { throw new Error('Type of parameter "data" (' + util.getType(data) + ') ' + 'does not correspond with specified options.type (' + options.type + ')'); } - if (type == 'DataTable' && !util.isDataTable(data)) { + if (returnType == 'DataTable' && !util.isDataTable(data)) { throw new Error('Parameter "data" must be a DataTable ' + 'when options.type is "DataTable"'); } } else if (data) { - type = (util.getType(data) == 'DataTable') ? 'DataTable' : 'Array'; + returnType = (util.getType(data) == 'DataTable') ? 'DataTable' : 'Array'; } else { - type = 'Array'; - } - - // we allow the setting of this value for a single get request. - if (options != undefined) { - if (options.showInternalIds != undefined) { - this.showInternalIds = options.showInternalIds; - } + returnType = 'Array'; } // build options - var convert = options && options.convert || this.options.convert; + var type = options && options.type || this._options.type; var filter = options && options.filter; var items = [], item, itemId, i, len; // convert items if (id != undefined) { // return a single item - item = me._getItem(id, convert); + item = me._getItem(id, type); if (filter && !filter(item)) { item = null; } @@ -1634,7 +1655,7 @@ DataSet.prototype.get = function (args) { else if (ids != undefined) { // return a subset of items for (i = 0, len = ids.length; i < len; i++) { - item = me._getItem(ids[i], convert); + item = me._getItem(ids[i], type); if (!filter || filter(item)) { items.push(item); } @@ -1642,9 +1663,9 @@ DataSet.prototype.get = function (args) { } else { // return all items - for (itemId in this.data) { - if (this.data.hasOwnProperty(itemId)) { - item = me._getItem(itemId, convert); + for (itemId in this._data) { + if (this._data.hasOwnProperty(itemId)) { + item = me._getItem(itemId, type); if (!filter || filter(item)) { items.push(item); } @@ -1652,9 +1673,6 @@ DataSet.prototype.get = function (args) { } } - // restore the global value of showInternalIds - this.showInternalIds = globalShowInternalIds; - // order the results if (options && options.order && id == undefined) { this._sort(items, options.order); @@ -1674,7 +1692,7 @@ DataSet.prototype.get = function (args) { } // return the results - if (type == 'DataTable') { + if (returnType == 'DataTable') { var columns = this._getColumnNames(data); if (id != undefined) { // append a single item to the data table @@ -1720,10 +1738,10 @@ DataSet.prototype.get = function (args) { * @return {Array} ids */ DataSet.prototype.getIds = function (options) { - var data = this.data, + var data = this._data, filter = options && options.filter, order = options && options.order, - convert = options && options.convert || this.options.convert, + type = options && options.type || this._options.type, i, len, id, @@ -1738,7 +1756,7 @@ DataSet.prototype.getIds = function (options) { items = []; for (id in data) { if (data.hasOwnProperty(id)) { - item = this._getItem(id, convert); + item = this._getItem(id, type); if (filter(item)) { items.push(item); } @@ -1748,16 +1766,16 @@ DataSet.prototype.getIds = function (options) { this._sort(items, order); for (i = 0, len = items.length; i < len; i++) { - ids[i] = items[i][this.fieldId]; + ids[i] = items[i][this._fieldId]; } } else { // create unordered list for (id in data) { if (data.hasOwnProperty(id)) { - item = this._getItem(id, convert); + item = this._getItem(id, type); if (filter(item)) { - ids.push(item[this.fieldId]); + ids.push(item[this._fieldId]); } } } @@ -1777,7 +1795,7 @@ DataSet.prototype.getIds = function (options) { this._sort(items, order); for (i = 0, len = items.length; i < len; i++) { - ids[i] = items[i][this.fieldId]; + ids[i] = items[i][this._fieldId]; } } else { @@ -1785,7 +1803,7 @@ DataSet.prototype.getIds = function (options) { for (id in data) { if (data.hasOwnProperty(id)) { item = data[id]; - ids.push(item[this.fieldId]); + ids.push(item[this._fieldId]); } } } @@ -1798,7 +1816,7 @@ DataSet.prototype.getIds = function (options) { * Execute a callback function for every item in the dataset. * @param {function} callback * @param {Object} [options] Available options: - * {Object.} [convert] + * {Object.} [type] * {String[]} [fields] filter fields * {function} [filter] filter items * {String | function} [order] Order the items by @@ -1806,8 +1824,8 @@ DataSet.prototype.getIds = function (options) { */ DataSet.prototype.forEach = function (callback, options) { var filter = options && options.filter, - convert = options && options.convert || this.options.convert, - data = this.data, + type = options && options.type || this._options.type, + data = this._data, item, id; @@ -1817,7 +1835,7 @@ DataSet.prototype.forEach = function (callback, options) { for (var i = 0, len = items.length; i < len; i++) { item = items[i]; - id = item[this.fieldId]; + id = item[this._fieldId]; callback(item, id); } } @@ -1825,7 +1843,7 @@ DataSet.prototype.forEach = function (callback, options) { // unordered for (id in data) { if (data.hasOwnProperty(id)) { - item = this._getItem(id, convert); + item = this._getItem(id, type); if (!filter || filter(item)) { callback(item, id); } @@ -1838,7 +1856,7 @@ DataSet.prototype.forEach = function (callback, options) { * Map every item in the dataset. * @param {function} callback * @param {Object} [options] Available options: - * {Object.} [convert] + * {Object.} [type] * {String[]} [fields] filter fields * {function} [filter] filter items * {String | function} [order] Order the items by @@ -1847,15 +1865,15 @@ DataSet.prototype.forEach = function (callback, options) { */ DataSet.prototype.map = function (callback, options) { var filter = options && options.filter, - convert = options && options.convert || this.options.convert, + type = options && options.type || this._options.type, mappedItems = [], - data = this.data, + data = this._data, item; // convert and filter items for (var id in data) { if (data.hasOwnProperty(id)) { - item = this._getItem(id, convert); + item = this._getItem(id, type); if (!filter || filter(item)) { mappedItems.push(callback(item, id)); } @@ -1927,7 +1945,7 @@ DataSet.prototype.remove = function (id, senderId) { var removedIds = [], i, len, removedId; - if (id instanceof Array) { + if (Array.isArray(id)) { for (i = 0, len = id.length; i < len; i++) { removedId = this._remove(id[i]); if (removedId != null) { @@ -1957,17 +1975,15 @@ DataSet.prototype.remove = function (id, senderId) { */ DataSet.prototype._remove = function (id) { if (util.isNumber(id) || util.isString(id)) { - if (this.data[id]) { - delete this.data[id]; - delete this.internalIds[id]; + if (this._data[id]) { + delete this._data[id]; return id; } } else if (id instanceof Object) { - var itemId = id[this.fieldId]; - if (itemId && this.data[itemId]) { - delete this.data[itemId]; - delete this.internalIds[itemId]; + var itemId = id[this._fieldId]; + if (itemId && this._data[itemId]) { + delete this._data[itemId]; return itemId; } } @@ -1980,10 +1996,9 @@ DataSet.prototype._remove = function (id) { * @return {Array} removedIds The ids of all removed items */ DataSet.prototype.clear = function (senderId) { - var ids = Object.keys(this.data); + var ids = Object.keys(this._data); - this.data = {}; - this.internalIds = {}; + this._data = {}; this._trigger('remove', {items: ids}, senderId); @@ -1996,7 +2011,7 @@ DataSet.prototype.clear = function (senderId) { * @return {Object | null} item Item containing max value, or null if no items */ DataSet.prototype.max = function (field) { - var data = this.data, + var data = this._data, max = null, maxField = null; @@ -2020,7 +2035,7 @@ DataSet.prototype.max = function (field) { * @return {Object | null} item Item containing max value, or null if no items */ DataSet.prototype.min = function (field) { - var data = this.data, + var data = this._data, min = null, minField = null; @@ -2046,17 +2061,18 @@ DataSet.prototype.min = function (field) { * The returned array is unordered. */ DataSet.prototype.distinct = function (field) { - var data = this.data, - values = [], - fieldType = this.options.convert[field], - count = 0; + var data = this._data; + var values = []; + var fieldType = this._options.type && this._options.type[field] || null; + var count = 0; + var i; for (var prop in data) { if (data.hasOwnProperty(prop)) { var item = data[prop]; - var value = util.convert(item[field], fieldType); + var value = item[field]; var exists = false; - for (var i = 0; i < count; i++) { + for (i = 0; i < count; i++) { if (values[i] == value) { exists = true; break; @@ -2069,6 +2085,12 @@ DataSet.prototype.distinct = function (field) { } } + if (fieldType) { + for (i = 0; i < values.length; i++) { + values[i] = util.convert(values[i], fieldType); + } + } + return values; }; @@ -2079,11 +2101,11 @@ DataSet.prototype.distinct = function (field) { * @private */ DataSet.prototype._addItem = function (item) { - var id = item[this.fieldId]; + var id = item[this._fieldId]; if (id != undefined) { // check whether this id is already taken - if (this.data[id]) { + if (this._data[id]) { // item already exists throw new Error('Cannot add item: item with id ' + id + ' already exists'); } @@ -2091,18 +2113,17 @@ DataSet.prototype._addItem = function (item) { else { // generate an id id = util.randomUUID(); - item[this.fieldId] = id; - this.internalIds[id] = item; + item[this._fieldId] = id; } var d = {}; for (var field in item) { if (item.hasOwnProperty(field)) { - var fieldType = this.convert[field]; // type may be undefined + var fieldType = this._type[field]; // type may be undefined d[field] = util.convert(item[field], fieldType); } } - this.data[id] = d; + this._data[id] = d; return id; }; @@ -2110,31 +2131,26 @@ DataSet.prototype._addItem = function (item) { /** * Get an item. Fields can be converted to a specific type * @param {String} id - * @param {Object.} [convert] field types to convert + * @param {Object.} [types] field types to convert * @return {Object | null} item * @private */ -DataSet.prototype._getItem = function (id, convert) { +DataSet.prototype._getItem = function (id, types) { var field, value; // get the item from the dataset - var raw = this.data[id]; + var raw = this._data[id]; if (!raw) { return null; } // convert the items field types - var converted = {}, - fieldId = this.fieldId, - internalIds = this.internalIds; - if (convert) { + var converted = {}; + if (types) { for (field in raw) { if (raw.hasOwnProperty(field)) { value = raw[field]; - // output all fields, except internal ids - if ((field != fieldId) || (!(value in internalIds) || this.showInternalIds)) { - converted[field] = util.convert(value, convert[field]); - } + converted[field] = util.convert(value, types[field]); } } } @@ -2143,10 +2159,7 @@ DataSet.prototype._getItem = function (id, convert) { for (field in raw) { if (raw.hasOwnProperty(field)) { value = raw[field]; - // output all fields, except internal ids - if ((field != fieldId) || (!(value in internalIds) || this.showInternalIds)) { - converted[field] = value; - } + converted[field] = value; } } } @@ -2162,11 +2175,11 @@ DataSet.prototype._getItem = function (id, convert) { * @private */ DataSet.prototype._updateItem = function (item) { - var id = item[this.fieldId]; + var id = item[this._fieldId]; if (id == undefined) { throw new Error('Cannot update item: item has no id (item: ' + JSON.stringify(item) + ')'); } - var d = this.data[id]; + var d = this._data[id]; if (!d) { // item doesn't exist throw new Error('Cannot update item: no item with id ' + id + ' found'); @@ -2175,7 +2188,7 @@ DataSet.prototype._updateItem = function (item) { // merge with current item for (var field in item) { if (item.hasOwnProperty(field)) { - var fieldType = this.convert[field]; // type may be undefined + var fieldType = this._type[field]; // type may be undefined d[field] = util.convert(item[field], fieldType); } } @@ -2183,17 +2196,6 @@ DataSet.prototype._updateItem = function (item) { return id; }; -/** - * check if an id is an internal or external id - * @param id - * @returns {boolean} - * @private - */ -DataSet.prototype.isInternalId = function(id) { - return (id in this.internalIds); -}; - - /** * Get an array with the column names of a Google DataTable * @param {DataTable} dataTable @@ -2235,13 +2237,11 @@ DataSet.prototype._appendRow = function (dataTable, columns, item) { * @constructor DataView */ function DataView (data, options) { - this.id = util.randomUUID(); - - this.data = null; - this.ids = {}; // ids of the items currently in memory (just contains a boolean true) - this.options = options || {}; - this.fieldId = 'id'; // name of the field containing id - this.subscribers = {}; // event subscribers + this._data = null; + this._ids = {}; // ids of the items currently in memory (just contains a boolean true) + this._options = options || {}; + this._fieldId = 'id'; // name of the field containing id + this._subscribers = {}; // event subscribers var me = this; this.listener = function () { @@ -2259,44 +2259,44 @@ function DataView (data, options) { * @param {DataSet | DataView} data */ DataView.prototype.setData = function (data) { - var ids, dataItems, i, len; + var ids, i, len; - if (this.data) { + if (this._data) { // unsubscribe from current dataset - if (this.data.unsubscribe) { - this.data.unsubscribe('*', this.listener); + if (this._data.unsubscribe) { + this._data.unsubscribe('*', this.listener); } // trigger a remove of all items in memory ids = []; - for (var id in this.ids) { - if (this.ids.hasOwnProperty(id)) { + for (var id in this._ids) { + if (this._ids.hasOwnProperty(id)) { ids.push(id); } } - this.ids = {}; + this._ids = {}; this._trigger('remove', {items: ids}); } - this.data = data; + this._data = data; - if (this.data) { + if (this._data) { // update fieldId - this.fieldId = this.options.fieldId || - (this.data && this.data.options && this.data.options.fieldId) || + this._fieldId = this._options.fieldId || + (this._data && this._data.options && this._data.options.fieldId) || 'id'; // trigger an add of all added items - ids = this.data.getIds({filter: this.options && this.options.filter}); + ids = this._data.getIds({filter: this._options && this._options.filter}); for (i = 0, len = ids.length; i < len; i++) { id = ids[i]; - this.ids[id] = true; + this._ids[id] = true; } this._trigger('add', {items: ids}); // subscribe to new dataset - if (this.data.on) { - this.data.on('*', this.listener); + if (this._data.on) { + this._data.on('*', this.listener); } } }; @@ -2354,12 +2354,12 @@ DataView.prototype.get = function (args) { } // extend the options with the default options and provided options - var viewOptions = util.extend({}, this.options, options); + var viewOptions = util.extend({}, this._options, options); // create a combined filter method when needed - if (this.options.filter && options && options.filter) { + if (this._options.filter && options && options.filter) { viewOptions.filter = function (item) { - return me.options.filter(item) && options.filter(item); + return me._options.filter(item) && options.filter(item); } } @@ -2371,7 +2371,7 @@ DataView.prototype.get = function (args) { getArguments.push(viewOptions); getArguments.push(data); - return this.data && this.data.get.apply(this.data, getArguments); + return this._data && this._data.get.apply(this._data, getArguments); }; /** @@ -2385,8 +2385,8 @@ DataView.prototype.get = function (args) { DataView.prototype.getIds = function (options) { var ids; - if (this.data) { - var defaultFilter = this.options.filter; + if (this._data) { + var defaultFilter = this._options.filter; var filter; if (options && options.filter) { @@ -2403,7 +2403,7 @@ DataView.prototype.getIds = function (options) { filter = defaultFilter; } - ids = this.data.getIds({ + ids = this._data.getIds({ filter: filter, order: options && options.order }); @@ -2427,7 +2427,7 @@ DataView.prototype.getIds = function (options) { DataView.prototype._onEvent = function (event, params, senderId) { var i, len, id, item, ids = params && params.items, - data = this.data, + data = this._data, added = [], updated = [], removed = []; @@ -2440,7 +2440,7 @@ DataView.prototype._onEvent = function (event, params, senderId) { id = ids[i]; item = this.get(id); if (item) { - this.ids[id] = true; + this._ids[id] = true; added.push(id); } } @@ -2455,17 +2455,17 @@ DataView.prototype._onEvent = function (event, params, senderId) { item = this.get(id); if (item) { - if (this.ids[id]) { + if (this._ids[id]) { updated.push(id); } else { - this.ids[id] = true; + this._ids[id] = true; added.push(id); } } else { - if (this.ids[id]) { - delete this.ids[id]; + if (this._ids[id]) { + delete this._ids[id]; removed.push(id); } else { @@ -2480,8 +2480,8 @@ DataView.prototype._onEvent = function (event, params, senderId) { // filter the ids of the removed items for (i = 0, len = ids.length; i < len; i++) { id = ids[i]; - if (this.ids[id]) { - delete this.ids[id]; + if (this._ids[id]) { + delete this._ids[id]; removed.push(id); } } @@ -2519,7 +2519,7 @@ var stack = {}; * Order items by their start data * @param {Item[]} items */ -stack.orderByStart = function orderByStart(items) { +stack.orderByStart = function(items) { items.sort(function (a, b) { return a.data.start - b.data.start; }); @@ -2530,7 +2530,7 @@ stack.orderByStart = function orderByStart(items) { * is used. * @param {Item[]} items */ -stack.orderByEnd = function orderByEnd(items) { +stack.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; @@ -2550,7 +2550,7 @@ stack.orderByEnd = function orderByEnd(items) { * If true, all items will be repositioned. If false (default), only * items having a top===null will be re-stacked */ -stack.stack = function _stack (items, margin, force) { +stack.stack = function(items, margin, force) { var i, iMax; if (force) { @@ -2595,7 +2595,7 @@ stack.stack = function _stack (items, margin, force) { * @param {{item: number, axis: number}} margin * Margins between items and between items and the axis. */ -stack.nostack = function nostack (items, margin) { +stack.nostack = function(items, margin) { var i, iMax; // reset top position of all items @@ -2616,7 +2616,7 @@ stack.nostack = function nostack (items, margin) { * the requested margin. * @return {boolean} true if a and b collide, else false */ -stack.collision = function collision (a, b, margin) { +stack.collision = function(a, b, margin) { return ((a.left - margin) < (b.left + b.width) && (a.left + a.width + margin) > b.left && (a.top - margin) < (b.top + b.height) && @@ -3095,57 +3095,81 @@ TimeStep.prototype.getLabelMajor = function(date) { * 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 {RootPanel} root Root panel, used to subscribe to events - * @param {Panel} parent Parent panel, used to attach to the DOM + * @param {{dom: Object, domProps: Object, emitter: Emitter}} body * @param {Object} [options] See description at Range.setOptions */ -function Range(root, parent, options) { - this.id = util.randomUUID(); - this.start = null; // Number - this.end = null; // Number +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 - this.root = root; - this.parent = parent; - this.options = options || {}; + this.body = body; + + // 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.props = { + touch: {} + }; // drag listeners for dragging - this.root.on('dragstart', this._onDragStart.bind(this)); - this.root.on('drag', this._onDrag.bind(this)); - this.root.on('dragend', this._onDragEnd.bind(this)); + 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)); // ignore dragging when holding - this.root.on('hold', this._onHold.bind(this)); + this.body.emitter.on('hold', this._onHold.bind(this)); // mouse wheel for zooming - this.root.on('mousewheel', this._onMouseWheel.bind(this)); - this.root.on('DOMMouseScroll', this._onMouseWheel.bind(this)); // For FF + this.body.emitter.on('mousewheel', this._onMouseWheel.bind(this)); + this.body.emitter.on('DOMMouseScroll', this._onMouseWheel.bind(this)); // For FF // pinch to zoom - this.root.on('touch', this._onTouch.bind(this)); - this.root.on('pinch', this._onPinch.bind(this)); + this.body.emitter.on('touch', this._onTouch.bind(this)); + this.body.emitter.on('pinch', this._onPinch.bind(this)); this.setOptions(options); } -// turn Range into an event emitter -Emitter(Range.prototype); +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) { - util.extend(this.options, options); + if (options) { + // copy the options that we know + var fields = ['direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable']; + util.selectiveExtend(fields, this.options, options); - // re-apply range with new limitations - if (this.start !== null && this.end !== null) { - this.setRange(this.start, this.end); + if ('start' in options || 'end' in options) { + // apply a new range. both start and end are optional + this.setRange(options.start, options.end); + } } }; @@ -3172,8 +3196,8 @@ Range.prototype.setRange = function(start, end) { start: new Date(this.start), end: new Date(this.end) }; - this.emit('rangechange', params); - this.emit('rangechanged', params); + this.body.emitter.emit('rangechange', params); + this.body.emitter.emit('rangechanged', params); } }; @@ -3332,77 +3356,75 @@ Range.conversion = function (start, end, width) { } }; -// global (private) object to store drag params -var touchParams = {}; - /** * 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; + // 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 (touchParams.ignore) return; - - // TODO: reckon with option movable + if (!this.props.touch.allowDragging) return; - touchParams.start = this.start; - touchParams.end = this.end; + this.props.touch.start = this.start; + this.props.touch.end = this.end; - var frame = this.parent.frame; - if (frame) { - frame.style.cursor = 'move'; + if (this.body.dom.root) { + this.body.dom.root.style.cursor = 'move'; } }; /** - * Perform dragging operating. + * 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); - // TODO: reckon with option movable - - // 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 (touchParams.ignore) return; + if (!this.props.touch.allowDragging) return; var delta = (direction == 'horizontal') ? event.gesture.deltaX : event.gesture.deltaY, - interval = (touchParams.end - touchParams.start), - width = (direction == 'horizontal') ? this.parent.width : this.parent.height, + 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(touchParams.start + diffRange, touchParams.end + diffRange); + this._applyRange(this.props.touch.start + diffRange, this.props.touch.end + diffRange); - this.emit('rangechange', { + this.body.emitter.emit('rangechange', { start: new Date(this.start), end: new Date(this.end) }); }; /** - * Stop dragging operating. + * Stop dragging operation * @param {event} event * @private */ 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 (touchParams.ignore) return; + if (!this.props.touch.allowDragging) return; - // TODO: reckon with option movable - - if (this.parent.frame) { - this.parent.frame.style.cursor = 'auto'; + if (this.body.dom.root) { + this.body.dom.root.style.cursor = 'auto'; } // fire a rangechanged event - this.emit('rangechanged', { + this.body.emitter.emit('rangechanged', { start: new Date(this.start), end: new Date(this.end) }); @@ -3415,7 +3437,8 @@ Range.prototype._onDragEnd = function (event) { * @private */ Range.prototype._onMouseWheel = function(event) { - // TODO: reckon with option zoomable + // only allow zooming when configured as zoomable and moveable + if (!(this.options.zoomable && this.options.moveable)) return; // retrieve delta var delta = 0; @@ -3445,7 +3468,7 @@ Range.prototype._onMouseWheel = function(event) { // calculate center, the date to zoom around var gesture = util.fakeGesture(this, event), - pointer = getPointer(gesture.center, this.parent.frame), + pointer = getPointer(gesture.center, this.body.dom.center), pointerDate = this._pointerToDate(pointer); this.zoom(scale, pointerDate); @@ -3461,17 +3484,10 @@ Range.prototype._onMouseWheel = function(event) { * @private */ Range.prototype._onTouch = function (event) { - touchParams.start = this.start; - touchParams.end = this.end; - touchParams.ignore = false; - touchParams.center = null; - - // don't move the range when dragging a selected event - // TODO: it's not so neat to have to know about the state of the ItemSet - var item = ItemSet.itemFromTarget(event); - if (item && item.selected && this.options.editable) { - touchParams.ignore = true; - } + this.props.touch.start = this.start; + this.props.touch.end = this.end; + this.props.touch.allowDragging = true; + this.props.touch.center = null; }; /** @@ -3479,7 +3495,7 @@ Range.prototype._onTouch = function (event) { * @private */ Range.prototype._onHold = function () { - touchParams.ignore = true; + this.props.touch.allowDragging = false; }; /** @@ -3488,25 +3504,22 @@ Range.prototype._onHold = function () { * @private */ Range.prototype._onPinch = function (event) { - var direction = this.options.direction; - touchParams.ignore = true; + // only allow zooming when configured as zoomable and moveable + if (!(this.options.zoomable && this.options.moveable)) return; - // TODO: reckon with option zoomable + this.props.touch.allowDragging = false; if (event.gesture.touches.length > 1) { - if (!touchParams.center) { - touchParams.center = getPointer(event.gesture.center, this.parent.frame); + if (!this.props.touch.center) { + this.props.touch.center = getPointer(event.gesture.center, this.body.dom.center); } var scale = 1 / event.gesture.scale, - initDate = this._pointerToDate(touchParams.center), - center = getPointer(event.gesture.center, this.parent.frame), - date = this._pointerToDate(this.parent, center), - delta = date - initDate; // TODO: utilize delta + initDate = this._pointerToDate(this.props.touch.center); // calculate new start and end - var newStart = parseInt(initDate + (touchParams.start - initDate) * scale); - var newEnd = parseInt(initDate + (touchParams.end - initDate) * scale); + var newStart = parseInt(initDate + (this.props.touch.start - initDate) * scale); + var newEnd = parseInt(initDate + (this.props.touch.end - initDate) * scale); // apply new range this.setRange(newStart, newEnd); @@ -3526,12 +3539,12 @@ Range.prototype._pointerToDate = function (pointer) { validateDirection(direction); if (direction == 'horizontal') { - var width = this.parent.width; + var width = this.body.domProps.center.width; conversion = this.conversion(width); return pointer.x / conversion.scale + conversion.offset; } else { - var height = this.parent.height; + var height = this.body.domProps.center.height; conversion = this.conversion(height); return pointer.y / conversion.scale + conversion.offset; } @@ -3612,74 +3625,39 @@ Range.prototype.moveTo = function(moveTo) { /** * Prototype for visual components + * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} [body] + * @param {Object} [options] */ -function Component () { - this.id = null; - this.parent = null; - this.childs = null; +function Component (body, options) { this.options = null; - - this.top = 0; - this.left = 0; - this.width = 0; - this.height = 0; + this.props = null; } -// Turn the Component into an event emitter -Emitter(Component.prototype); - /** - * Set parameters for the frame. Parameters will be merged in current parameter - * set. - * @param {Object} options Available parameters: - * {String | function} [className] - * {String | Number | function} [left] - * {String | Number | function} [top] - * {String | Number | function} [width] - * {String | Number | function} [height] + * Set options for the component. The new options will be merged into the + * current options. + * @param {Object} options */ -Component.prototype.setOptions = function setOptions(options) { +Component.prototype.setOptions = function(options) { if (options) { util.extend(this.options, options); - - this.repaint(); - } -}; - -/** - * Get an option value by name - * The function will first check this.options object, and else will check - * this.defaultOptions. - * @param {String} name - * @return {*} value - */ -Component.prototype.getOption = function getOption(name) { - var value; - if (this.options) { - value = this.options[name]; - } - if (value === undefined && this.defaultOptions) { - value = this.defaultOptions[name]; } - return value; }; /** - * Get the frame element of the component, the outer HTML DOM element. - * @returns {HTMLElement | null} frame + * Repaint the component + * @return {boolean} Returns true if the component is resized */ -Component.prototype.getFrame = function getFrame() { +Component.prototype.redraw = function() { // should be implemented by the component - return null; + return false; }; /** - * Repaint the component - * @return {boolean} Returns true if the component is resized + * Destroy the component. Cleanup DOM and event listeners */ -Component.prototype.repaint = function repaint() { +Component.prototype.destroy = function() { // should be implemented by the component - return false; }; /** @@ -3688,523 +3666,179 @@ Component.prototype.repaint = function repaint() { * @return {Boolean} Returns true if the component is resized * @protected */ -Component.prototype._isResized = function _isResized() { - var resized = (this._previousWidth !== this.width || this._previousHeight !== this.height); +Component.prototype._isResized = function() { + var resized = (this.props._previousWidth !== this.props.width || + this.props._previousHeight !== this.props.height); - this._previousWidth = this.width; - this._previousHeight = this.height; + this.props._previousWidth = this.props.width; + this.props._previousHeight = this.props.height; return resized; }; /** - * A panel can contain components - * @param {Object} [options] Available parameters: - * {String | Number | function} [left] - * {String | Number | function} [top] - * {String | Number | function} [width] - * {String | Number | function} [height] - * {String | function} [className] - * @constructor Panel + * A horizontal time axis + * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body + * @param {Object} [options] See TimeAxis.setOptions for the available + * options. + * @constructor TimeAxis * @extends Component */ -function Panel(options) { - this.id = util.randomUUID(); - this.parent = null; - this.childs = []; +function TimeAxis (body, options) { + this.dom = { + foreground: null, + majorLines: [], + majorTexts: [], + minorLines: [], + minorTexts: [], + redundant: { + majorLines: [], + majorTexts: [], + minorLines: [], + minorTexts: [] + } + }; + this.props = { + range: { + start: 0, + end: 0, + minimumStep: 0 + }, + lineTop: 0 + }; - this.options = options || {}; + this.defaultOptions = { + orientation: 'bottom', // supported: 'top', 'bottom' + // TODO: implement timeaxis orientations 'left' and 'right' + showMinorLabels: true, + showMajorLabels: true + }; + this.options = util.extend({}, this.defaultOptions); - // create frame - this.frame = (typeof document !== 'undefined') ? document.createElement('div') : null; -} + this.body = body; -Panel.prototype = new Component(); + // create the HTML DOM + this._create(); -/** - * Set options. Will extend the current options. - * @param {Object} [options] Available parameters: - * {String | function} [className] - * {String | Number | function} [left] - * {String | Number | function} [top] - * {String | Number | function} [width] - * {String | Number | function} [height] - */ -Panel.prototype.setOptions = Component.prototype.setOptions; + this.setOptions(options); +} -/** - * Get the outer frame of the panel - * @returns {HTMLElement} frame - */ -Panel.prototype.getFrame = function () { - return this.frame; -}; +TimeAxis.prototype = new Component(); /** - * Append a child to the panel - * @param {Component} child + * Set options for the TimeAxis. + * Parameters will be merged in current options. + * @param {Object} options Available options: + * {string} [orientation] + * {boolean} [showMinorLabels] + * {boolean} [showMajorLabels] */ -Panel.prototype.appendChild = function (child) { - this.childs.push(child); - child.parent = this; - - // attach to the DOM - var frame = child.getFrame(); - if (frame) { - if (frame.parentNode) { - frame.parentNode.removeChild(frame); - } - this.frame.appendChild(frame); +TimeAxis.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + util.selectiveExtend(['orientation', 'showMinorLabels', 'showMajorLabels'], this.options, options); } }; /** - * Insert a child to the panel - * @param {Component} child - * @param {Component} beforeChild + * Create the HTML DOM for the TimeAxis */ -Panel.prototype.insertBefore = function (child, beforeChild) { - var index = this.childs.indexOf(beforeChild); - if (index != -1) { - this.childs.splice(index, 0, child); - child.parent = this; - - // attach to the DOM - var frame = child.getFrame(); - if (frame) { - if (frame.parentNode) { - frame.parentNode.removeChild(frame); - } +TimeAxis.prototype._create = function() { + this.dom.foreground = document.createElement('div'); + this.dom.background = document.createElement('div'); - var beforeFrame = beforeChild.getFrame(); - if (beforeFrame) { - this.frame.insertBefore(frame, beforeFrame); - } - else { - this.frame.appendChild(frame); - } - } - } + this.dom.foreground.className = 'timeaxis foreground'; + this.dom.background.className = 'timeaxis background'; }; /** - * Remove a child from the panel - * @param {Component} child + * Destroy the TimeAxis */ -Panel.prototype.removeChild = function (child) { - var index = this.childs.indexOf(child); - if (index != -1) { - this.childs.splice(index, 1); - child.parent = null; - - // remove from the DOM - var frame = child.getFrame(); - if (frame && frame.parentNode) { - this.frame.removeChild(frame); - } +TimeAxis.prototype.destroy = function() { + // remove from DOM + if (this.dom.foreground.parentNode) { + this.dom.foreground.parentNode.removeChild(this.dom.foreground); + } + if (this.dom.background.parentNode) { + this.dom.background.parentNode.removeChild(this.dom.background); } -}; -/** - * Test whether the panel contains given child - * @param {Component} child - */ -Panel.prototype.hasChild = function (child) { - var index = this.childs.indexOf(child); - return (index != -1); + this.body = null; }; /** * Repaint the component - * @return {boolean} Returns true if the component was resized since previous repaint - */ -Panel.prototype.repaint = function () { - var asString = util.option.asString, - options = this.options, - frame = this.getFrame(); - - // update className - frame.className = 'vpanel' + (options.className ? (' ' + asString(options.className)) : ''); - - // repaint the child components - var childsResized = this._repaintChilds(); - - // update frame size - this._updateSize(); - - return this._isResized() || childsResized; -}; - -/** - * Repaint all childs of the panel * @return {boolean} Returns true if the component is resized - * @private - */ -Panel.prototype._repaintChilds = function () { - var resized = false; - for (var i = 0, ii = this.childs.length; i < ii; i++) { - resized = this.childs[i].repaint() || resized; - } - return resized; -}; - -/** - * Apply the size from options to the panel, and recalculate it's actual size. - * @private - */ -Panel.prototype._updateSize = function () { - // apply size - this.frame.style.top = util.option.asSize(this.options.top); - this.frame.style.bottom = util.option.asSize(this.options.bottom); - this.frame.style.left = util.option.asSize(this.options.left); - this.frame.style.right = util.option.asSize(this.options.right); - this.frame.style.width = util.option.asSize(this.options.width, '100%'); - this.frame.style.height = util.option.asSize(this.options.height, ''); - - // get actual size - this.top = this.frame.offsetTop; - this.left = this.frame.offsetLeft; - this.width = this.frame.offsetWidth; - this.height = this.frame.offsetHeight; -}; - -/** - * A root panel can hold components. The root panel must be initialized with - * a DOM element as container. - * @param {HTMLElement} container - * @param {Object} [options] Available parameters: see RootPanel.setOptions. - * @constructor RootPanel - * @extends Panel */ -function RootPanel(container, options) { - this.id = util.randomUUID(); - this.container = container; - - this.options = options || {}; - this.defaultOptions = { - autoResize: true - }; - - // create the HTML DOM - this._create(); - - // attach the root panel to the provided container - if (!this.container) throw new Error('Cannot repaint root panel: no container attached'); - this.container.appendChild(this.getFrame()); +TimeAxis.prototype.redraw = function () { + var options = this.options, + props = this.props, + foreground = this.dom.foreground, + background = this.dom.background; + // determine the correct parent DOM element (depending on option orientation) + var parent = (options.orientation == 'top') ? this.body.dom.top : this.body.dom.bottom; + var parentChanged = (foreground.parentNode !== parent); - this._initWatch(); -} + // calculate character width and height + this._calculateCharSize(); -RootPanel.prototype = new Panel(); + // TODO: recalculate sizes only needed when parent is resized or options is changed + var orientation = this.options.orientation, + showMinorLabels = this.options.showMinorLabels, + showMajorLabels = this.options.showMajorLabels; -/** - * Create the HTML DOM for the root panel - */ -RootPanel.prototype._create = function _create() { - // create frame - this.frame = document.createElement('div'); + // determine the width and height of the elemens for the axis + props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; + props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; + props.height = props.minorLabelHeight + props.majorLabelHeight; + props.width = foreground.offsetWidth; - // create event listeners for all interesting events, these events will be - // emitted via emitter - this.hammer = Hammer(this.frame, { - prevent_default: true - }); - this.listeners = {}; + props.minorLineHeight = this.body.domProps.root.height - props.majorLabelHeight - + (options.orientation == 'top' ? this.body.domProps.bottom.height : this.body.domProps.top.height); + props.minorLineWidth = 1; // TODO: really calculate width + props.majorLineHeight = props.minorLineHeight + props.majorLabelHeight; + props.majorLineWidth = 1; // TODO: really calculate width - var me = this; - var events = [ - 'touch', 'pinch', 'tap', 'doubletap', 'hold', - 'dragstart', 'drag', 'dragend', - 'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is 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; - }); -}; + // take foreground and background offline while updating (is almost twice as fast) + var foregroundNextSibling = foreground.nextSibling; + var backgroundNextSibling = background.nextSibling; + foreground.parentNode && foreground.parentNode.removeChild(foreground); + background.parentNode && background.parentNode.removeChild(background); -/** - * Set options. Will extend the current options. - * @param {Object} [options] Available parameters: - * {String | function} [className] - * {String | Number | function} [left] - * {String | Number | function} [top] - * {String | Number | function} [width] - * {String | Number | function} [height] - * {Boolean | function} [autoResize] - */ -RootPanel.prototype.setOptions = function setOptions(options) { - if (options) { - util.extend(this.options, options); + foreground.style.height = this.props.height + 'px'; - this.repaint(); + this._repaintLabels(); - this._initWatch(); + // put DOM online again (at the same place) + if (foregroundNextSibling) { + parent.insertBefore(foreground, foregroundNextSibling); } -}; - -/** - * Get the frame of the root panel - */ -RootPanel.prototype.getFrame = function getFrame() { - return this.frame; -}; - -/** - * Repaint the root panel - */ -RootPanel.prototype.repaint = function repaint() { - // update class name - var options = this.options; - var editable = options.editable.updateTime || options.editable.updateGroup; - var className = 'vis timeline rootpanel ' + options.orientation + (editable ? ' editable' : ''); - if (options.className) className += ' ' + util.option.asString(className); - this.frame.className = className; - - // repaint the child components - var childsResized = this._repaintChilds(); - - // update frame size - this.frame.style.maxHeight = util.option.asSize(this.options.maxHeight, ''); - this.frame.style.minHeight = util.option.asSize(this.options.minHeight, ''); - this._updateSize(); - - // if the root panel or any of its childs is resized, repaint again, - // as other components may need to be resized accordingly - var resized = this._isResized() || childsResized; - if (resized) { - setTimeout(this.repaint.bind(this), 0); + else { + parent.appendChild(foreground) } -}; - -/** - * Initialize watching when option autoResize is true - * @private - */ -RootPanel.prototype._initWatch = function _initWatch() { - var autoResize = this.getOption('autoResize'); - if (autoResize) { - this._watch(); + if (backgroundNextSibling) { + this.body.dom.backgroundVertical.insertBefore(background, backgroundNextSibling); } else { - this._unwatch(); + this.body.dom.backgroundVertical.appendChild(background) } + + return this._isResized() || parentChanged; }; /** - * Watch for changes in the size of the frame. On resize, the Panel will - * automatically redraw itself. + * Repaint major and minor text labels and vertical grid lines * @private */ -RootPanel.prototype._watch = function _watch() { - var me = this; - - this._unwatch(); - - var checkSize = function checkSize() { - var autoResize = me.getOption('autoResize'); - if (!autoResize) { - // stop watching when the option autoResize is changed to false - me._unwatch(); - return; - } - - if (me.frame) { - // check whether the frame is resized - if ((me.frame.clientWidth != me.lastWidth) || - (me.frame.clientHeight != me.lastHeight)) { - me.lastWidth = me.frame.clientWidth; - me.lastHeight = me.frame.clientHeight; - me.repaint(); - // TODO: emit a resize event instead? - } - } - }; - - // TODO: automatically cleanup the event listener when the frame is deleted - util.addEventListener(window, 'resize', checkSize); - - this.watchTimer = setInterval(checkSize, 1000); -}; - -/** - * Stop watching for a resize of the frame. - * @private - */ -RootPanel.prototype._unwatch = function _unwatch() { - if (this.watchTimer) { - clearInterval(this.watchTimer); - this.watchTimer = undefined; - } - - // TODO: remove event listener on window.resize -}; - -/** - * A horizontal time axis - * @param {Object} [options] See TimeAxis.setOptions for the available - * options. - * @constructor TimeAxis - * @extends Component - */ -function TimeAxis (options) { - this.id = util.randomUUID(); - - this.dom = { - majorLines: [], - majorTexts: [], - minorLines: [], - minorTexts: [], - redundant: { - majorLines: [], - majorTexts: [], - minorLines: [], - minorTexts: [] - } - }; - this.props = { - range: { - start: 0, - end: 0, - minimumStep: 0 - }, - lineTop: 0 - }; - - this.options = options || {}; - this.defaultOptions = { - orientation: 'bottom', // supported: 'top', 'bottom' - // TODO: implement timeaxis orientations 'left' and 'right' - showMinorLabels: true, - showMajorLabels: true - }; - - this.range = null; - - // create the HTML DOM - this._create(); -} - -TimeAxis.prototype = new Component(); - -// TODO: comment options -TimeAxis.prototype.setOptions = Component.prototype.setOptions; - -/** - * Create the HTML DOM for the TimeAxis - */ -TimeAxis.prototype._create = function _create() { - this.frame = document.createElement('div'); -}; - -/** - * Set a range (start and end) - * @param {Range | Object} range A Range or an object containing start and end. - */ -TimeAxis.prototype.setRange = function (range) { - if (!(range instanceof Range) && (!range || !range.start || !range.end)) { - throw new TypeError('Range must be an instance of Range, ' + - 'or an object containing start and end.'); - } - this.range = range; -}; - -/** - * Get the outer frame of the time axis - * @return {HTMLElement} frame - */ -TimeAxis.prototype.getFrame = function getFrame() { - return this.frame; -}; - -/** - * Repaint the component - * @return {boolean} Returns true if the component is resized - */ -TimeAxis.prototype.repaint = function () { - var asSize = util.option.asSize, - options = this.options, - props = this.props, - frame = this.frame; - - // update classname - frame.className = 'timeaxis'; // TODO: add className from options if defined - - var parent = frame.parentNode; - if (parent) { - // calculate character width and height - this._calculateCharSize(); - - // TODO: recalculate sizes only needed when parent is resized or options is changed - var orientation = this.getOption('orientation'), - showMinorLabels = this.getOption('showMinorLabels'), - showMajorLabels = this.getOption('showMajorLabels'); - - // determine the width and height of the elemens for the axis - var parentHeight = this.parent.height; - props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; - props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; - this.height = props.minorLabelHeight + props.majorLabelHeight; - this.width = frame.offsetWidth; // TODO: only update the width when the frame is resized? - - props.minorLineHeight = parentHeight + props.minorLabelHeight; - props.minorLineWidth = 1; // TODO: really calculate width - props.majorLineHeight = parentHeight + this.height; - props.majorLineWidth = 1; // TODO: really calculate width - - // take frame offline while updating (is almost twice as fast) - var beforeChild = frame.nextSibling; - parent.removeChild(frame); - - // TODO: top/bottom positioning should be determined by options set in the Timeline, not here - if (orientation == 'top') { - frame.style.top = '0'; - frame.style.left = '0'; - frame.style.bottom = ''; - frame.style.width = asSize(options.width, '100%'); - frame.style.height = this.height + 'px'; - } - else { // bottom - frame.style.top = ''; - frame.style.bottom = '0'; - frame.style.left = '0'; - frame.style.width = asSize(options.width, '100%'); - frame.style.height = this.height + 'px'; - } - - this._repaintLabels(); - - this._repaintLine(); - - // put frame online again - if (beforeChild) { - parent.insertBefore(frame, beforeChild); - } - else { - parent.appendChild(frame) - } - } - - return this._isResized(); -}; - -/** - * Repaint major and minor text labels and vertical grid lines - * @private - */ -TimeAxis.prototype._repaintLabels = function () { - var orientation = this.getOption('orientation'); +TimeAxis.prototype._repaintLabels = function () { + var orientation = this.options.orientation; // calculate range and step (step such that we have space for 7 characters per label) - var start = util.convert(this.range.start, 'Number'), - end = util.convert(this.range.end, 'Number'), - minimumStep = this.options.toTime((this.props.minorCharWidth || 10) * 7).valueOf() - -this.options.toTime(0).valueOf(); + var start = util.convert(this.body.range.start, 'Number'), + end = util.convert(this.body.range.end, 'Number'), + minimumStep = this.body.util.toTime((this.props.minorCharWidth || 10) * 7).valueOf() + -this.body.util.toTime(0).valueOf(); var step = new TimeStep(new Date(start), new Date(end), minimumStep); this.step = step; @@ -4227,16 +3861,16 @@ TimeAxis.prototype._repaintLabels = function () { while (step.hasNext() && max < 1000) { max++; var cur = step.getCurrent(), - x = this.options.toScreen(cur), + x = this.body.util.toScreen(cur), isMajor = step.isMajor(); // TODO: lines must have a width, such that we can create css backgrounds - if (this.getOption('showMinorLabels')) { + if (this.options.showMinorLabels) { this._repaintMinorText(x, step.getLabelMinor(), orientation); } - if (isMajor && this.getOption('showMajorLabels')) { + if (isMajor && this.options.showMajorLabels) { if (x > 0) { if (xFirstMajorLabel == undefined) { xFirstMajorLabel = x; @@ -4253,8 +3887,8 @@ TimeAxis.prototype._repaintLabels = function () { } // create a major label on the left when needed - if (this.getOption('showMajorLabels')) { - var leftTime = this.options.toTime(0), + if (this.options.showMajorLabels) { + var leftTime = this.body.util.toTime(0), leftText = step.getLabelMajor(leftTime), widthText = leftText.length * (this.props.majorCharWidth || 10) + 10; // upper bound estimation @@ -4291,20 +3925,13 @@ TimeAxis.prototype._repaintMinorText = function (x, text, orientation) { label = document.createElement('div'); label.appendChild(content); label.className = 'text minor'; - this.frame.appendChild(label); + this.dom.foreground.appendChild(label); } this.dom.minorTexts.push(label); label.childNodes[0].nodeValue = text; - if (orientation == 'top') { - label.style.top = this.props.majorLabelHeight + 'px'; - label.style.bottom = ''; - } - else { - label.style.top = ''; - label.style.bottom = this.props.majorLabelHeight + 'px'; - } + label.style.top = (orientation == 'top') ? (this.props.majorLabelHeight + 'px') : '0'; label.style.left = x + 'px'; //label.title = title; // TODO: this is a heavy operation }; @@ -4326,21 +3953,14 @@ TimeAxis.prototype._repaintMajorText = function (x, text, orientation) { label = document.createElement('div'); label.className = 'text major'; label.appendChild(content); - this.frame.appendChild(label); + this.dom.foreground.appendChild(label); } this.dom.majorTexts.push(label); label.childNodes[0].nodeValue = text; //label.title = title; // TODO: this is a heavy operation - if (orientation == 'top') { - label.style.top = '0px'; - label.style.bottom = ''; - } - else { - label.style.top = ''; - label.style.bottom = '0px'; - } + label.style.top = (orientation == 'top') ? '0' : (this.props.minorLabelHeight + 'px'); label.style.left = x + 'px'; }; @@ -4358,18 +3978,16 @@ TimeAxis.prototype._repaintMinorLine = function (x, orientation) { // create vertical line line = document.createElement('div'); line.className = 'grid vertical minor'; - this.frame.appendChild(line); + this.dom.background.appendChild(line); } this.dom.minorLines.push(line); var props = this.props; if (orientation == 'top') { - line.style.top = this.props.majorLabelHeight + 'px'; - line.style.bottom = ''; + line.style.top = props.majorLabelHeight + 'px'; } else { - line.style.top = ''; - line.style.bottom = this.props.majorLabelHeight + 'px'; + line.style.top = this.body.domProps.top.height + 'px'; } line.style.height = props.minorLineHeight + 'px'; line.style.left = (x - props.minorLineWidth / 2) + 'px'; @@ -4389,72 +4007,28 @@ TimeAxis.prototype._repaintMajorLine = function (x, orientation) { // create vertical line line = document.createElement('DIV'); line.className = 'grid vertical major'; - this.frame.appendChild(line); + this.dom.background.appendChild(line); } this.dom.majorLines.push(line); var props = this.props; if (orientation == 'top') { - line.style.top = '0px'; - line.style.bottom = ''; + line.style.top = '0'; } else { - line.style.top = ''; - line.style.bottom = '0px'; + line.style.top = this.body.domProps.top.height + 'px'; } line.style.left = (x - props.majorLineWidth / 2) + 'px'; line.style.height = props.majorLineHeight + 'px'; }; - -/** - * Repaint the horizontal line for the axis - * @private - */ -TimeAxis.prototype._repaintLine = function() { - var line = this.dom.line, - frame = this.frame, - orientation = this.getOption('orientation'); - - // line before all axis elements - if (this.getOption('showMinorLabels') || this.getOption('showMajorLabels')) { - if (line) { - // put this line at the end of all childs - frame.removeChild(line); - frame.appendChild(line); - } - else { - // create the axis line - line = document.createElement('div'); - line.className = 'grid horizontal major'; - frame.appendChild(line); - this.dom.line = line; - } - - if (orientation == 'top') { - line.style.top = this.height + 'px'; - line.style.bottom = ''; - } - else { - line.style.top = ''; - line.style.bottom = this.height + 'px'; - } - } - else { - if (line && line.parentNode) { - line.parentNode.removeChild(line); - delete this.dom.line; - } - } -}; - /** * Determine the size of text on the axis (both major and minor axis). * The size is calculated only once and then cached in this.props. * @private */ TimeAxis.prototype._calculateCharSize = function () { - // Note: We calculate char size with every repaint. Size may change, for + // Note: We calculate char size with every redraw. Size may change, for // example when any of the timelines parents had display:none for example. // determine the char width and height on the minor axis @@ -4464,7 +4038,7 @@ TimeAxis.prototype._calculateCharSize = function () { this.dom.measureCharMinor.style.position = 'absolute'; this.dom.measureCharMinor.appendChild(document.createTextNode('0')); - this.frame.appendChild(this.dom.measureCharMinor); + this.dom.foreground.appendChild(this.dom.measureCharMinor); } this.props.minorCharHeight = this.dom.measureCharMinor.clientHeight; this.props.minorCharWidth = this.dom.measureCharMinor.clientWidth; @@ -4476,7 +4050,7 @@ TimeAxis.prototype._calculateCharSize = function () { this.dom.measureCharMajor.style.position = 'absolute'; this.dom.measureCharMajor.appendChild(document.createTextNode('0')); - this.frame.appendChild(this.dom.measureCharMajor); + this.dom.foreground.appendChild(this.dom.measureCharMajor); } this.props.majorCharHeight = this.dom.measureCharMajor.clientHeight; this.props.majorCharWidth = this.dom.measureCharMajor.clientWidth; @@ -4488,40 +4062,40 @@ TimeAxis.prototype._calculateCharSize = function () { * @param {Date} date the date to be snapped. * @return {Date} snappedDate */ -TimeAxis.prototype.snap = function snap (date) { +TimeAxis.prototype.snap = function(date) { return this.step.snap(date); }; /** * A current time bar - * @param {Range} range + * @param {{range: Range, dom: Object, domProps: Object}} body * @param {Object} [options] Available parameters: * {Boolean} [showCurrentTime] * @constructor CurrentTime * @extends Component */ -function CurrentTime (range, options) { - this.id = util.randomUUID(); +function CurrentTime (body, options) { + this.body = body; - this.range = range; - this.options = options || {}; + // default options this.defaultOptions = { - showCurrentTime: false + showCurrentTime: true }; + this.options = util.extend({}, this.defaultOptions); this._create(); + + this.setOptions(options); } CurrentTime.prototype = new Component(); -CurrentTime.prototype.setOptions = Component.prototype.setOptions; - /** * Create the HTML DOM for the current time bar * @private */ -CurrentTime.prototype._create = function _create () { +CurrentTime.prototype._create = function() { var bar = document.createElement('div'); bar.className = 'currenttime'; bar.style.position = 'absolute'; @@ -4532,25 +4106,57 @@ CurrentTime.prototype._create = function _create () { }; /** - * Get the frame element of the current time bar - * @returns {HTMLElement} frame + * Destroy the CurrentTime bar + */ +CurrentTime.prototype.destroy = function () { + this.options.showCurrentTime = false; + this.redraw(); // will remove the bar from the DOM and stop refreshing + + this.body = null; +}; + +/** + * Set options for the component. Options will be merged in current options. + * @param {Object} options Available parameters: + * {boolean} [showCurrentTime] */ -CurrentTime.prototype.getFrame = function getFrame() { - return this.bar; +CurrentTime.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + util.selectiveExtend(['showCurrentTime'], this.options, options); + } }; /** * Repaint the component * @return {boolean} Returns true if the component is resized */ -CurrentTime.prototype.repaint = function repaint() { - var parent = this.parent; +CurrentTime.prototype.redraw = function() { + if (this.options.showCurrentTime) { + var parent = this.body.dom.backgroundVertical; + if (this.bar.parentNode != parent) { + // attach to the dom + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + parent.appendChild(this.bar); - var now = new Date(); - var x = this.options.toScreen(now); + this.start(); + } - this.bar.style.left = x + 'px'; - this.bar.title = 'Current time: ' + now; + var now = new Date(); + var x = this.body.util.toScreen(now); + + this.bar.style.left = x + 'px'; + this.bar.title = 'Current time: ' + now; + } + else { + // remove the line from the DOM + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + this.stop(); + } return false; }; @@ -4558,19 +4164,19 @@ CurrentTime.prototype.repaint = function repaint() { /** * Start auto refreshing the current time bar */ -CurrentTime.prototype.start = function start() { +CurrentTime.prototype.start = function() { var me = this; function update () { me.stop(); // determine interval to refresh - var scale = me.range.conversion(me.parent.width).scale; + var scale = me.body.range.conversion(me.body.domProps.center.width).scale; var interval = 1 / scale / 10; if (interval < 30) interval = 30; if (interval > 1000) interval = 1000; - me.repaint(); + me.redraw(); // start a timer to adjust for the new time me.currentTimeTimer = setTimeout(update, interval); @@ -4582,7 +4188,7 @@ CurrentTime.prototype.start = function start() { /** * Stop auto refreshing the current time bar */ -CurrentTime.prototype.stop = function stop() { +CurrentTime.prototype.stop = function() { if (this.currentTimeTimer !== undefined) { clearTimeout(this.currentTimeTimer); delete this.currentTimeTimer; @@ -4591,36 +4197,50 @@ CurrentTime.prototype.stop = function stop() { /** * A custom time bar + * @param {{range: Range, dom: Object}} body * @param {Object} [options] Available parameters: * {Boolean} [showCustomTime] * @constructor CustomTime * @extends Component */ -function CustomTime (options) { - this.id = util.randomUUID(); +function CustomTime (body, options) { + this.body = body; - this.options = options || {}; + // default options this.defaultOptions = { showCustomTime: false }; + this.options = util.extend({}, this.defaultOptions); this.customTime = new Date(); this.eventParams = {}; // stores state parameters while dragging the bar // create the DOM this._create(); + + this.setOptions(options); } CustomTime.prototype = new Component(); -CustomTime.prototype.setOptions = Component.prototype.setOptions; +/** + * Set options for the component. Options will be merged in current options. + * @param {Object} options Available parameters: + * {boolean} [showCustomTime] + */ +CustomTime.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + util.selectiveExtend(['showCustomTime'], this.options, options); + } +}; /** * Create the DOM for the custom time * @private */ -CustomTime.prototype._create = function _create () { +CustomTime.prototype._create = function() { var bar = document.createElement('div'); bar.className = 'customtime'; bar.style.position = 'absolute'; @@ -4646,22 +4266,44 @@ CustomTime.prototype._create = function _create () { }; /** - * Get the frame element of the custom time bar - * @returns {HTMLElement} frame + * Destroy the CustomTime bar */ -CustomTime.prototype.getFrame = function getFrame() { - return this.bar; +CustomTime.prototype.destroy = function () { + this.options.showCustomTime = false; + this.redraw(); // will remove the bar from the DOM + + this.hammer.enable(false); + this.hammer = null; + + this.body = null; }; /** * Repaint the component * @return {boolean} Returns true if the component is resized */ -CustomTime.prototype.repaint = function () { - var x = this.options.toScreen(this.customTime); +CustomTime.prototype.redraw = function () { + if (this.options.showCustomTime) { + var parent = this.body.dom.backgroundVertical; + if (this.bar.parentNode != parent) { + // attach to the dom + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + parent.appendChild(this.bar); + } + + var x = this.body.util.toScreen(this.customTime); - this.bar.style.left = x + 'px'; - this.bar.title = 'Time: ' + this.customTime; + this.bar.style.left = x + 'px'; + this.bar.title = 'Time: ' + this.customTime; + } + else { + // remove the line from the DOM + if (this.bar.parentNode) { + this.bar.parentNode.removeChild(this.bar); + } + } return false; }; @@ -4672,7 +4314,7 @@ CustomTime.prototype.repaint = function () { */ CustomTime.prototype.setCustomTime = function(time) { this.customTime = new Date(time.valueOf()); - this.repaint(); + this.redraw(); }; /** @@ -4705,13 +4347,13 @@ CustomTime.prototype._onDrag = function (event) { if (!this.eventParams.dragging) return; var deltaX = event.gesture.deltaX, - x = this.options.toScreen(this.eventParams.customTime) + deltaX, - time = this.options.toTime(x); + x = this.body.util.toScreen(this.eventParams.customTime) + deltaX, + time = this.body.util.toTime(x); this.setCustomTime(time); // fire a timechange event - this.emit('timechange', { + this.body.emitter.emit('timechange', { time: new Date(this.customTime.valueOf()) }); @@ -4728,7 +4370,7 @@ CustomTime.prototype._onDragEnd = function (event) { if (!this.eventParams.dragging) return; // fire a timechanged event - this.emit('timechanged', { + this.body.emitter.emit('timechanged', { time: new Date(this.customTime.valueOf()) }); @@ -4742,55 +4384,92 @@ var UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items * An ItemSet holds a set of items and ranges which can be displayed in a * range. The width is determined by the parent of the ItemSet, and the height * is determined by the size of the items. - * @param {Panel} backgroundPanel Panel which can be used to display the - * vertical lines of box items. - * @param {Panel} axisPanel Panel on the axis where the dots of box-items - * can be displayed. - * @param {Panel} sidePanel Left side panel holding labels + * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body * @param {Object} [options] See ItemSet.setOptions for the available options. * @constructor ItemSet - * @extends Panel + * @extends Component */ -function ItemSet(backgroundPanel, axisPanel, sidePanel, options) { - this.id = util.randomUUID(); +function ItemSet(body, options) { + this.body = body; - // one options object is shared by this itemset and all its items - this.options = options || {}; - this.backgroundPanel = backgroundPanel; - this.axisPanel = axisPanel; - this.sidePanel = sidePanel; - this.itemOptions = Object.create(this.options); + this.defaultOptions = { + type: 'box', + orientation: 'bottom', // 'top' or 'bottom' + align: 'center', // alignment of box items + stack: true, + groupOrder: null, + + selectable: true, + editable: { + updateTime: false, + updateGroup: false, + add: false, + remove: false + }, + + onAdd: function (item, callback) { + callback(item); + }, + onUpdate: function (item, callback) { + callback(item); + }, + onMove: function (item, callback) { + callback(item); + }, + onRemove: function (item, callback) { + callback(item); + }, + + margin: { + item: 10, + axis: 20 + }, + padding: 5 + }; + + // options is shared by this ItemSet and all its items + this.options = util.extend({}, this.defaultOptions); + + // options for getting items from the DataSet with the correct type + this.itemOptions = { + type: {start: 'Date', end: 'Date'} + }; + + this.conversion = { + toScreen: body.util.toScreen, + toTime: body.util.toTime + }; this.dom = {}; + this.props = {}; this.hammer = null; var me = this; this.itemsData = null; // DataSet this.groupsData = null; // DataSet - this.range = null; // Range or Object {start: number, end: number} // listeners for the DataSet of the items this.itemListeners = { 'add': function (event, params, senderId) { - if (senderId != me.id) me._onAdd(params.items); + me._onAdd(params.items); }, 'update': function (event, params, senderId) { - if (senderId != me.id) me._onUpdate(params.items); + me._onUpdate(params.items); }, 'remove': function (event, params, senderId) { - if (senderId != me.id) me._onRemove(params.items); + me._onRemove(params.items); } }; // listeners for the DataSet of the groups this.groupListeners = { 'add': function (event, params, senderId) { - if (senderId != me.id) me._onAddGroups(params.items); + me._onAddGroups(params.items); }, 'update': function (event, params, senderId) { - if (senderId != me.id) me._onUpdateGroups(params.items); + me._onUpdateGroups(params.items); }, 'remove': function (event, params, senderId) { - if (senderId != me.id) me._onRemoveGroups(params.items); + me._onRemoveGroups(params.items); } }; @@ -4799,15 +4478,17 @@ function ItemSet(backgroundPanel, axisPanel, sidePanel, options) { this.groupIds = []; this.selection = []; // list with the ids of all selected nodes - this.stackDirty = true; // if true, all items will be restacked on next repaint + this.stackDirty = true; // if true, all items will be restacked on next redraw this.touchParams = {}; // stores properties while dragging // create the HTML DOM this._create(); + + this.setOptions(options); } -ItemSet.prototype = new Panel(); +ItemSet.prototype = new Component(); // available item types will be registered here ItemSet.types = { @@ -4820,15 +4501,16 @@ ItemSet.types = { /** * Create the HTML DOM for the ItemSet */ -ItemSet.prototype._create = function _create(){ +ItemSet.prototype._create = function(){ var frame = document.createElement('div'); + frame.className = 'itemset'; frame['timeline-itemset'] = this; - this.frame = frame; + this.dom.frame = frame; // create background panel var background = document.createElement('div'); background.className = 'background'; - this.backgroundPanel.frame.appendChild(background); + frame.appendChild(background); this.dom.background = background; // create foreground panel @@ -4841,33 +4523,46 @@ ItemSet.prototype._create = function _create(){ var axis = document.createElement('div'); axis.className = 'axis'; this.dom.axis = axis; - this.axisPanel.frame.appendChild(axis); // create labelset var labelSet = document.createElement('div'); labelSet.className = 'labelset'; this.dom.labelSet = labelSet; - this.sidePanel.frame.appendChild(labelSet); // create ungrouped Group this._updateUngrouped(); // attach event listeners - // TODO: use event listeners from the rootpanel to improve performance? - this.hammer = Hammer(frame, { + // Note: we bind to the centerContainer for the case where the height + // of the center container is larger than of the ItemSet, so we + // can click in the empty area to create a new item or deselect an item. + this.hammer = Hammer(this.body.dom.centerContainer, { prevent_default: true }); + + // drag items when selected + this.hammer.on('touch', this._onTouch.bind(this)); this.hammer.on('dragstart', this._onDragStart.bind(this)); this.hammer.on('drag', this._onDrag.bind(this)); this.hammer.on('dragend', this._onDragEnd.bind(this)); + + // single select (or unselect) when tapping an item + this.hammer.on('tap', this._onSelectItem.bind(this)); + + // multi select when holding mouse/touch, or on ctrl+click + this.hammer.on('hold', this._onMultiSelectItem.bind(this)); + + // add item on doubletap + this.hammer.on('doubletap', this._onAddItem.bind(this)); + + // attach to the DOM + this.show(); }; /** * Set options for the ItemSet. Existing options will be extended/overwritten. * @param {Object} [options] The following options are available: - * {String | function} [className] - * class name for the itemset - * {String} [type] + * {String} type * Default type for the items. Choose from 'box' * (default), 'point', or 'range'. The default * Style can be overwritten by individual items. @@ -4878,44 +4573,129 @@ ItemSet.prototype._create = function _create(){ * {String} orientation * Orientation of the item set. Choose 'top' or * 'bottom' (default). + * {Function} groupOrder + * A sorting function for ordering groups + * {Boolean} stack + * If true (deafult), items will be stacked on + * top of each other. * {Number} margin.axis * Margin between the axis and the items in pixels. * Default is 20. * {Number} margin.item * Margin between items in pixels. Default is 10. + * {Number} margin + * Set margin for both axis and items in pixels. * {Number} padding * Padding of the contents of an item in pixels. * Must correspond with the items css. Default is 5. - * {Function} snap - * Function to let items snap to nice dates when - * dragging items. - */ -ItemSet.prototype.setOptions = function setOptions(options) { - Component.prototype.setOptions.call(this, options); + * {Boolean} selectable + * If true (default), items can be selected. + * {Boolean} editable + * Set all editable options to true or false + * {Boolean} editable.updateTime + * Allow dragging an item to an other moment in time + * {Boolean} editable.updateGroup + * Allow dragging an item to an other group + * {Boolean} editable.add + * Allow creating new items on double tap + * {Boolean} editable.remove + * Allow removing items by clicking the delete button + * top right of a selected item. + * {Function(item: Item, callback: Function)} onAdd + * Callback function triggered when an item is about to be added: + * when the user double taps an empty space in the Timeline. + * {Function(item: Item, callback: Function)} onUpdate + * Callback function fired when an item is about to be updated. + * This function typically has to show a dialog where the user + * change the item. If not implemented, nothing happens. + * {Function(item: Item, callback: Function)} onMove + * Fired when an item has been moved. If not implemented, + * the move action will be accepted. + * {Function(item: Item, callback: Function)} onRemove + * Fired when an item is about to be deleted. + * If not implemented, the item will be always removed. + */ +ItemSet.prototype.setOptions = function(options) { + if (options) { + // copy all options that we know + var fields = ['type', 'align', 'orientation', 'padding', 'stack', 'selectable', 'groupOrder']; + util.selectiveExtend(fields, this.options, options); + + 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); + } + } + + if ('editable' in options) { + if (typeof options.editable === 'boolean') { + this.options.editable.updateTime = options.editable; + this.options.editable.updateGroup = options.editable; + this.options.editable.add = options.editable; + this.options.editable.remove = options.editable; + } + else if (typeof options.editable === 'object') { + util.selectiveExtend(['updateTime', 'updateGroup', 'add', 'remove'], this.options.editable, options.editable); + } + } + + // callback functions + var addCallback = (function (name) { + if (name in options) { + var fn = options[name]; + if (!(fn instanceof Function) || fn.length != 2) { + throw new Error('option ' + name + ' must be a function ' + name + '(item, callback)'); + } + this.options[name] = fn; + } + }).bind(this); + ['onAdd', 'onUpdate', 'onRemove', 'onMove'].forEach(addCallback); + + // force the itemSet to refresh: options like orientation and margins may be changed + this.markDirty(); + } }; /** - * Mark the ItemSet dirty so it will refresh everything with next repaint + * Mark the ItemSet dirty so it will refresh everything with next redraw */ -ItemSet.prototype.markDirty = function markDirty() { +ItemSet.prototype.markDirty = function() { this.groupIds = []; this.stackDirty = true; }; +/** + * Destroy the ItemSet + */ +ItemSet.prototype.destroy = function() { + this.hide(); + this.setItems(null); + this.setGroups(null); + + this.hammer = null; + + this.body = null; + this.conversion = null; +}; + /** * Hide the component from the DOM */ -ItemSet.prototype.hide = function hide() { +ItemSet.prototype.hide = function() { + // remove the frame containing the items + if (this.dom.frame.parentNode) { + this.dom.frame.parentNode.removeChild(this.dom.frame); + } + // remove the axis with dots if (this.dom.axis.parentNode) { this.dom.axis.parentNode.removeChild(this.dom.axis); } - // remove the background with vertical lines - if (this.dom.background.parentNode) { - this.dom.background.parentNode.removeChild(this.dom.background); - } - // remove the labelset containing all group labels if (this.dom.labelSet.parentNode) { this.dom.labelSet.parentNode.removeChild(this.dom.labelSet); @@ -4926,33 +4706,21 @@ ItemSet.prototype.hide = function hide() { * Show the component in the DOM (when not already visible). * @return {Boolean} changed */ -ItemSet.prototype.show = function show() { - // show axis with dots - if (!this.dom.axis.parentNode) { - this.axisPanel.frame.appendChild(this.dom.axis); +ItemSet.prototype.show = function() { + // show frame containing the items + if (!this.dom.frame.parentNode) { + this.body.dom.center.appendChild(this.dom.frame); } - // show background with vertical lines - if (!this.dom.background.parentNode) { - this.backgroundPanel.frame.appendChild(this.dom.background); + // show axis with dots + if (!this.dom.axis.parentNode) { + this.body.dom.backgroundVertical.appendChild(this.dom.axis); } // show labelset containing labels if (!this.dom.labelSet.parentNode) { - this.sidePanel.frame.appendChild(this.dom.labelSet); - } -}; - -/** - * Set range (start and end). - * @param {Range | Object} range A Range or an object containing start and end. - */ -ItemSet.prototype.setRange = function setRange(range) { - if (!(range instanceof Range) && (!range || !range.start || !range.end)) { - throw new TypeError('Range must be an instance of Range, ' + - 'or an object containing start and end.'); + this.body.dom.left.appendChild(this.dom.labelSet); } - this.range = range; }; /** @@ -4962,7 +4730,7 @@ ItemSet.prototype.setRange = function setRange(range) { * selected. If ids is an empty array, all items will be * unselected. */ -ItemSet.prototype.setSelection = function setSelection(ids) { +ItemSet.prototype.setSelection = function(ids) { var i, ii, id, item; if (ids) { @@ -4994,7 +4762,7 @@ ItemSet.prototype.setSelection = function setSelection(ids) { * Get the selected items by their id * @return {Array} ids The ids of the selected items */ -ItemSet.prototype.getSelection = function getSelection() { +ItemSet.prototype.getSelection = function() { return this.selection.concat([]); }; @@ -5003,7 +4771,7 @@ ItemSet.prototype.getSelection = function getSelection() { * @param {String | Number} id * @private */ -ItemSet.prototype._deselect = function _deselect(id) { +ItemSet.prototype._deselect = function(id) { var selection = this.selection; for (var i = 0, ii = selection.length; i < ii; i++) { if (selection[i] == id) { // non-strict comparison! @@ -5013,51 +4781,35 @@ ItemSet.prototype._deselect = function _deselect(id) { } }; -/** - * Return the item sets frame - * @returns {HTMLElement} frame - */ -ItemSet.prototype.getFrame = function getFrame() { - return this.frame; -}; - /** * Repaint the component * @return {boolean} Returns true if the component is resized */ -ItemSet.prototype.repaint = function repaint() { +ItemSet.prototype.redraw = function() { var margin = this.options.margin, - range = this.range, + range = this.body.range, asSize = util.option.asSize, - asString = util.option.asString, options = this.options, - orientation = this.getOption('orientation'), + orientation = options.orientation, resized = false, - frame = this.frame; - - // TODO: document this feature to specify one margin for both item and axis distance - if (typeof margin === 'number') { - margin = { - item: margin, - axis: margin - }; - } + frame = this.dom.frame, + editable = options.editable.updateTime || options.editable.updateGroup; - // update className - frame.className = 'itemset' + (options.className ? (' ' + asString(options.className)) : ''); + // update class name + frame.className = 'itemset' + (editable ? ' editable' : ''); // reorder the groups (if needed) resized = this._orderGroups() || resized; // check whether zoomed (in that case we need to re-stack everything) // TODO: would be nicer to get this as a trigger from Range - var visibleInterval = this.range.end - this.range.start; - var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.width != this.lastWidth); + var visibleInterval = range.end - range.start; + var zoomed = (visibleInterval != this.lastVisibleInterval) || (this.props.width != this.props.lastWidth); if (zoomed) this.stackDirty = true; this.lastVisibleInterval = visibleInterval; - this.lastWidth = this.width; + this.props.lastWidth = this.props.width; - // repaint all groups + // redraw all groups var restack = this.stackDirty, firstGroup = this._firstGroup(), firstMargin = { @@ -5072,34 +4824,27 @@ ItemSet.prototype.repaint = function repaint() { minHeight = margin.axis + margin.item; util.forEach(this.groups, function (group) { var groupMargin = (group == firstGroup) ? firstMargin : nonFirstMargin; - resized = group.repaint(range, groupMargin, restack) || resized; + var groupResized = group.redraw(range, groupMargin, restack); + resized = groupResized || resized; height += group.height; }); height = Math.max(height, minHeight); this.stackDirty = false; - // reposition frame - frame.style.left = asSize(options.left, ''); - frame.style.right = asSize(options.right, ''); - frame.style.top = asSize((orientation == 'top') ? '0' : ''); - frame.style.bottom = asSize((orientation == 'top') ? '' : '0'); - frame.style.width = asSize(options.width, '100%'); + // update frame height frame.style.height = asSize(height); - //frame.style.height = asSize('height' in options ? options.height : height); // TODO: reckon with height // calculate actual size and position - this.top = frame.offsetTop; - this.left = frame.offsetLeft; - this.width = frame.offsetWidth; - this.height = height; + this.props.top = frame.offsetTop; + this.props.left = frame.offsetLeft; + this.props.width = frame.offsetWidth; + this.props.height = height; // reposition axis - this.dom.axis.style.left = asSize(options.left, '0'); - this.dom.axis.style.right = asSize(options.right, ''); - this.dom.axis.style.width = asSize(options.width, '100%'); - this.dom.axis.style.height = asSize(0); - this.dom.axis.style.top = asSize((orientation == 'top') ? '0' : ''); - this.dom.axis.style.bottom = asSize((orientation == 'top') ? '' : '0'); + this.dom.axis.style.top = asSize((orientation == 'top') ? + (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'; // check if this component is resized resized = this._isResized() || resized; @@ -5112,7 +4857,7 @@ ItemSet.prototype.repaint = function repaint() { * @return {Group | null} firstGroup * @private */ -ItemSet.prototype._firstGroup = function _firstGroup() { +ItemSet.prototype._firstGroup = function() { var firstGroupIndex = (this.options.orientation == 'top') ? 0 : (this.groupIds.length - 1); var firstGroupId = this.groupIds[firstGroupIndex]; var firstGroup = this.groups[firstGroupId] || this.groups[UNGROUPED]; @@ -5125,7 +4870,7 @@ ItemSet.prototype._firstGroup = function _firstGroup() { * there are no groups specified. * @protected */ -ItemSet.prototype._updateUngrouped = function _updateUngrouped() { +ItemSet.prototype._updateUngrouped = function() { var ungrouped = this.groups[UNGROUPED]; if (this.groupsData) { @@ -5149,40 +4894,16 @@ ItemSet.prototype._updateUngrouped = function _updateUngrouped() { } } - ungrouped.show(); - } - } -}; - -/** - * Get the foreground container element - * @return {HTMLElement} foreground - */ -ItemSet.prototype.getForeground = function getForeground() { - return this.dom.foreground; -}; - -/** - * Get the background container element - * @return {HTMLElement} background - */ -ItemSet.prototype.getBackground = function getBackground() { - return this.dom.background; -}; - -/** - * Get the axis container element - * @return {HTMLElement} axis - */ -ItemSet.prototype.getAxis = function getAxis() { - return this.dom.axis; + ungrouped.show(); + } + } }; /** * Get the element for the labelset * @return {HTMLElement} labelSet */ -ItemSet.prototype.getLabelSet = function getLabelSet() { +ItemSet.prototype.getLabelSet = function() { return this.dom.labelSet; }; @@ -5190,7 +4911,7 @@ ItemSet.prototype.getLabelSet = function getLabelSet() { * Set items * @param {vis.DataSet | null} items */ -ItemSet.prototype.setItems = function setItems(items) { +ItemSet.prototype.setItems = function(items) { var me = this, ids, oldItemsData = this.itemsData; @@ -5209,7 +4930,7 @@ ItemSet.prototype.setItems = function setItems(items) { if (oldItemsData) { // unsubscribe from old dataset util.forEach(this.itemListeners, function (callback, event) { - oldItemsData.unsubscribe(event, callback); + oldItemsData.off(event, callback); }); // remove all drawn items @@ -5237,7 +4958,7 @@ ItemSet.prototype.setItems = function setItems(items) { * Get the current items * @returns {vis.DataSet | null} */ -ItemSet.prototype.getItems = function getItems() { +ItemSet.prototype.getItems = function() { return this.itemsData; }; @@ -5245,7 +4966,7 @@ ItemSet.prototype.getItems = function getItems() { * Set groups * @param {vis.DataSet} groups */ -ItemSet.prototype.setGroups = function setGroups(groups) { +ItemSet.prototype.setGroups = function(groups) { var me = this, ids; @@ -5258,7 +4979,7 @@ ItemSet.prototype.setGroups = function setGroups(groups) { // remove all drawn groups ids = this.groupsData.getIds(); this.groupsData = null; - this._onRemoveGroups(ids); // note: this will cause a repaint + this._onRemoveGroups(ids); // note: this will cause a redraw } // replace the dataset @@ -5290,14 +5011,14 @@ ItemSet.prototype.setGroups = function setGroups(groups) { // update the order of all items in each group this._order(); - this.emit('change'); + this.body.emitter.emit('change'); }; /** * Get the current groups * @returns {vis.DataSet | null} groups */ -ItemSet.prototype.getGroups = function getGroups() { +ItemSet.prototype.getGroups = function() { return this.groupsData; }; @@ -5305,7 +5026,7 @@ ItemSet.prototype.getGroups = function getGroups() { * Remove an item by its id * @param {String | Number} id */ -ItemSet.prototype.removeItem = function removeItem (id) { +ItemSet.prototype.removeItem = function(id) { var item = this.itemsData.get(id), dataset = this._myDataSet(); @@ -5326,14 +5047,12 @@ ItemSet.prototype.removeItem = function removeItem (id) { * @param {Number[]} ids * @protected */ -ItemSet.prototype._onUpdate = function _onUpdate(ids) { - var me = this, - items = this.items, - itemOptions = this.itemOptions; +ItemSet.prototype._onUpdate = function(ids) { + var me = this; ids.forEach(function (id) { - var itemData = me.itemsData.get(id), - item = items[id], + var itemData = me.itemsData.get(id, me.itemOptions), + item = me.items[id], type = itemData.type || (itemData.start && itemData.end && 'range') || me.options.type || @@ -5356,7 +5075,7 @@ ItemSet.prototype._onUpdate = function _onUpdate(ids) { if (!item) { // create item if (constructor) { - item = new constructor(itemData, me.options, itemOptions); + item = new constructor(itemData, me.conversion, me.options); item.id = id; // TODO: not so nice setting id afterwards me._addItem(item); } @@ -5367,8 +5086,8 @@ ItemSet.prototype._onUpdate = function _onUpdate(ids) { }); this._order(); - this.stackDirty = true; // force re-stacking of all items next repaint - this.emit('change'); + this.stackDirty = true; // force re-stacking of all items next redraw + this.body.emitter.emit('change'); }; /** @@ -5383,7 +5102,7 @@ ItemSet.prototype._onAdd = ItemSet.prototype._onUpdate; * @param {Number[]} ids * @protected */ -ItemSet.prototype._onRemove = function _onRemove(ids) { +ItemSet.prototype._onRemove = function(ids) { var count = 0; var me = this; ids.forEach(function (id) { @@ -5397,8 +5116,8 @@ ItemSet.prototype._onRemove = function _onRemove(ids) { if (count) { // update order this._order(); - this.stackDirty = true; // force re-stacking of all items next repaint - this.emit('change'); + this.stackDirty = true; // force re-stacking of all items next redraw + this.body.emitter.emit('change'); } }; @@ -5406,7 +5125,7 @@ ItemSet.prototype._onRemove = function _onRemove(ids) { * Update the order of item in all groups * @private */ -ItemSet.prototype._order = function _order() { +ItemSet.prototype._order = function() { // reorder the items in all groups // TODO: optimization: only reorder groups affected by the changed items util.forEach(this.groups, function (group) { @@ -5419,7 +5138,7 @@ ItemSet.prototype._order = function _order() { * @param {Number[]} ids * @private */ -ItemSet.prototype._onUpdateGroups = function _onUpdateGroups(ids) { +ItemSet.prototype._onUpdateGroups = function(ids) { this._onAddGroups(ids); }; @@ -5428,7 +5147,7 @@ ItemSet.prototype._onUpdateGroups = function _onUpdateGroups(ids) { * @param {Number[]} ids * @private */ -ItemSet.prototype._onAddGroups = function _onAddGroups(ids) { +ItemSet.prototype._onAddGroups = function(ids) { var me = this; ids.forEach(function (id) { @@ -5468,7 +5187,7 @@ ItemSet.prototype._onAddGroups = function _onAddGroups(ids) { } }); - this.emit('change'); + this.body.emitter.emit('change'); }; /** @@ -5476,7 +5195,7 @@ ItemSet.prototype._onAddGroups = function _onAddGroups(ids) { * @param {Number[]} ids * @private */ -ItemSet.prototype._onRemoveGroups = function _onRemoveGroups(ids) { +ItemSet.prototype._onRemoveGroups = function(ids) { var groups = this.groups; ids.forEach(function (id) { var group = groups[id]; @@ -5489,7 +5208,7 @@ ItemSet.prototype._onRemoveGroups = function _onRemoveGroups(ids) { this.markDirty(); - this.emit('change'); + this.body.emitter.emit('change'); }; /** @@ -5532,7 +5251,7 @@ ItemSet.prototype._orderGroups = function () { * @param {Item} item * @private */ -ItemSet.prototype._addItem = function _addItem(item) { +ItemSet.prototype._addItem = function(item) { this.items[item.id] = item; // add to group @@ -5547,12 +5266,12 @@ ItemSet.prototype._addItem = function _addItem(item) { * @param {Object} itemData * @private */ -ItemSet.prototype._updateItem = function _updateItem(item, itemData) { +ItemSet.prototype._updateItem = function(item, itemData) { var oldGroupId = item.data.group; item.data = itemData; if (item.displayed) { - item.repaint(); + item.redraw(); } // update group @@ -5572,7 +5291,7 @@ ItemSet.prototype._updateItem = function _updateItem(item, itemData) { * @param {Item} item * @private */ -ItemSet.prototype._removeItem = function _removeItem(item) { +ItemSet.prototype._removeItem = function(item) { // remove from DOM item.hide(); @@ -5595,7 +5314,7 @@ ItemSet.prototype._removeItem = function _removeItem(item) { * @returns {Array} * @private */ -ItemSet.prototype._constructByEndArray = function _constructByEndArray(array) { +ItemSet.prototype._constructByEndArray = function(array) { var endArray = []; for (var i = 0; i < array.length; i++) { @@ -5607,25 +5326,17 @@ ItemSet.prototype._constructByEndArray = function _constructByEndArray(array) { }; /** - * Get the width of the group labels - * @return {Number} width - */ -ItemSet.prototype.getLabelsWidth = function getLabelsWidth() { - var width = 0; - - util.forEach(this.groups, function (group) { - width = Math.max(width, group.getLabelWidth()); - }); - - return width; -}; - -/** - * Get the height of the itemsets background - * @return {Number} height + * Register the clicked item on touch, before dragStart is initiated. + * + * dragStart is initiated from a mousemove event, which can have left the item + * already resulting in an item == null + * + * @param {Event} event + * @private */ -ItemSet.prototype.getBackgroundHeight = function getBackgroundHeight() { - return this.height; +ItemSet.prototype._onTouch = function (event) { + // store the touched item, used in _onDragStart + this.touchParams.item = ItemSet.itemFromTarget(event); }; /** @@ -5638,7 +5349,7 @@ ItemSet.prototype._onDragStart = function (event) { return; } - var item = ItemSet.itemFromTarget(event), + var item = this.touchParams.item || null, me = this, props; @@ -5704,9 +5415,10 @@ ItemSet.prototype._onDragStart = function (event) { */ ItemSet.prototype._onDrag = function (event) { if (this.touchParams.itemProps) { - var snap = this.options.snap || null, + var range = this.body.range, + snap = this.body.util.snap || null, deltaX = event.gesture.deltaX, - scale = (this.width / (this.range.end - this.range.start)), + scale = (this.props.width / (range.end - range.start)), offset = deltaX / scale; // move @@ -5738,8 +5450,8 @@ ItemSet.prototype._onDrag = function (event) { // TODO: implement onMoving handler - this.stackDirty = true; // force re-stacking of all items next repaint - this.emit('change'); + this.stackDirty = true; // force re-stacking of all items next redraw + this.body.emitter.emit('change'); event.stopPropagation(); } @@ -5759,16 +5471,18 @@ ItemSet.prototype._onDragEnd = function (event) { this.touchParams.itemProps.forEach(function (props) { var id = props.item.id, - itemData = me.itemsData.get(id); + itemData = me.itemsData.get(id, me.itemOptions); var changed = false; if ('start' in props.item.data) { changed = (props.start != props.item.data.start.valueOf()); - itemData.start = util.convert(props.item.data.start, dataset.convert['start']); + itemData.start = util.convert(props.item.data.start, + dataset._options.type && dataset._options.type.start || 'Date'); } if ('end' in props.item.data) { changed = changed || (props.end != props.item.data.end.valueOf()); - itemData.end = util.convert(props.item.data.end, dataset.convert['end']); + itemData.end = util.convert(props.item.data.end, + dataset._options.type && dataset._options.type.end || 'Date'); } if ('group' in props.item.data) { changed = changed || (props.group != props.item.data.group); @@ -5780,7 +5494,7 @@ ItemSet.prototype._onDragEnd = function (event) { me.options.onMove(itemData, function (itemData) { if (itemData) { // apply changes - itemData[dataset.fieldId] = id; // ensure the item contains its id (can be undefined) + itemData[dataset._fieldId] = id; // ensure the item contains its id (can be undefined) changes.push(itemData); } else { @@ -5788,8 +5502,8 @@ ItemSet.prototype._onDragEnd = function (event) { if ('start' in props) props.item.data.start = props.start; if ('end' in props) props.item.data.end = props.end; - me.stackDirty = true; // force re-stacking of all items next repaint - me.emit('change'); + me.stackDirty = true; // force re-stacking of all items next redraw + me.body.emitter.emit('change'); } }); } @@ -5805,13 +5519,137 @@ ItemSet.prototype._onDragEnd = function (event) { } }; +/** + * Handle selecting/deselecting an item when tapping it + * @param {Event} event + * @private + */ +ItemSet.prototype._onSelectItem = function (event) { + if (!this.options.selectable) return; + + var ctrlKey = event.gesture.srcEvent && event.gesture.srcEvent.ctrlKey; + var shiftKey = event.gesture.srcEvent && event.gesture.srcEvent.shiftKey; + if (ctrlKey || shiftKey) { + this._onMultiSelectItem(event); + return; + } + + var oldSelection = this.getSelection(); + + var item = ItemSet.itemFromTarget(event); + var selection = item ? [item.id] : []; + this.setSelection(selection); + + var newSelection = this.getSelection(); + + // emit a select event, + // except when old selection is empty and new selection is still empty + if (newSelection.length > 0 || oldSelection.length > 0) { + this.body.emitter.emit('select', { + items: this.getSelection() + }); + } + + event.stopPropagation(); +}; + +/** + * Handle creation and updates of an item on double tap + * @param event + * @private + */ +ItemSet.prototype._onAddItem = function (event) { + if (!this.options.selectable) return; + if (!this.options.editable.add) return; + + var me = this, + snap = this.body.util.snap || null, + item = ItemSet.itemFromTarget(event); + + if (item) { + // update item + + // execute async handler to update the item (or cancel it) + var itemData = me.itemsData.get(item.id); // get a clone of the data from the dataset + this.options.onUpdate(itemData, function (itemData) { + if (itemData) { + me.itemsData.update(itemData); + } + }); + } + else { + // add item + var xAbs = vis.util.getAbsoluteLeft(this.dom.frame); + var x = event.gesture.center.pageX - xAbs; + var start = this.body.util.toTime(x); + var newItem = { + start: snap ? snap(start) : start, + content: 'new item' + }; + + // when default type is a range, add a default end date to the new item + if (this.options.type === 'range' || this.options.type == 'rangeoverflow') { + var end = this.body.util.toTime(x + this.props.width / 5); + newItem.end = snap ? snap(end) : end; + } + + newItem[this.itemsData.fieldId] = util.randomUUID(); + + var group = ItemSet.groupFromTarget(event); + if (group) { + newItem.group = group.groupId; + } + + // execute async handler to customize (or cancel) adding an item + this.options.onAdd(newItem, function (item) { + if (item) { + me.itemsData.add(newItem); + // TODO: need to trigger a redraw? + } + }); + } +}; + +/** + * Handle selecting/deselecting multiple items when holding an item + * @param {Event} event + * @private + */ +ItemSet.prototype._onMultiSelectItem = function (event) { + if (!this.options.selectable) return; + + var selection, + item = ItemSet.itemFromTarget(event); + + if (item) { + // multi select items + selection = this.getSelection(); // current selection + var index = selection.indexOf(item.id); + if (index == -1) { + // item is not yet selected -> select it + selection.push(item.id); + } + else { + // item is already selected -> deselect it + selection.splice(index, 1); + } + this.setSelection(selection); + + this.body.emitter.emit('select', { + items: this.getSelection() + }); + + event.stopPropagation(); + } +}; + /** * Find an item from an event target: * searches for the attribute 'timeline-item' in the event target's element tree * @param {Event} event * @return {Item | null} item */ -ItemSet.itemFromTarget = function itemFromTarget (event) { +ItemSet.itemFromTarget = function(event) { var target = event.target; while (target) { if (target.hasOwnProperty('timeline-item')) { @@ -5829,7 +5667,7 @@ ItemSet.itemFromTarget = function itemFromTarget (event) { * @param {Event} event * @return {Group | null} group */ -ItemSet.groupFromTarget = function groupFromTarget (event) { +ItemSet.groupFromTarget = function(event) { var target = event.target; while (target) { if (target.hasOwnProperty('timeline-group')) { @@ -5847,7 +5685,7 @@ ItemSet.groupFromTarget = function groupFromTarget (event) { * @param {Event} event * @return {ItemSet | null} item */ -ItemSet.itemSetFromTarget = function itemSetFromTarget (event) { +ItemSet.itemSetFromTarget = function(event) { var target = event.target; while (target) { if (target.hasOwnProperty('timeline-itemset')) { @@ -5864,7 +5702,7 @@ ItemSet.itemSetFromTarget = function itemSetFromTarget (event) { * @returns {null | DataSet} dataset * @private */ -ItemSet.prototype._myDataSet = function _myDataSet() { +ItemSet.prototype._myDataSet = function() { // find the root DataSet var dataset = this.itemsData; while (dataset instanceof DataView) { @@ -5876,17 +5714,18 @@ ItemSet.prototype._myDataSet = function _myDataSet() { * @constructor Item * @param {Object} data Object containing (optional) parameters type, * start, end, content, group, className. - * @param {Object} [options] Options to set initial property values - * @param {Object} [defaultOptions] default options + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} options Configuration options * // TODO: describe available options */ -function Item (data, options, defaultOptions) { +function Item (data, conversion, options) { this.id = null; this.parent = null; this.data = data; this.dom = null; + this.conversion = conversion || {}; this.options = options || {}; - this.defaultOptions = defaultOptions || {}; this.selected = false; this.displayed = false; @@ -5901,24 +5740,24 @@ function Item (data, options, defaultOptions) { /** * Select current item */ -Item.prototype.select = function select() { +Item.prototype.select = function() { this.selected = true; - if (this.displayed) this.repaint(); + if (this.displayed) this.redraw(); }; /** * Unselect current item */ -Item.prototype.unselect = function unselect() { +Item.prototype.unselect = function() { this.selected = false; - if (this.displayed) this.repaint(); + if (this.displayed) this.redraw(); }; /** * Set a parent for the item * @param {ItemSet | Group} parent */ -Item.prototype.setParent = function setParent(parent) { +Item.prototype.setParent = function(parent) { if (this.displayed) { this.hide(); this.parent = parent; @@ -5936,7 +5775,7 @@ Item.prototype.setParent = function setParent(parent) { * @returns {{start: Number, end: Number}} range with a timestamp for start and end * @returns {boolean} True if visible */ -Item.prototype.isVisible = function isVisible (range) { +Item.prototype.isVisible = function(range) { // Should be implemented by Item implementations return false; }; @@ -5945,7 +5784,7 @@ Item.prototype.isVisible = function isVisible (range) { * Show the Item in the DOM (when not already visible) * @return {Boolean} changed */ -Item.prototype.show = function show() { +Item.prototype.show = function() { return false; }; @@ -5953,28 +5792,28 @@ Item.prototype.show = function show() { * Hide the Item from the DOM (when visible) * @return {Boolean} changed */ -Item.prototype.hide = function hide() { +Item.prototype.hide = function() { return false; }; /** * Repaint the item */ -Item.prototype.repaint = function repaint() { +Item.prototype.redraw = function() { // should be implemented by the item }; /** * Reposition the Item horizontally */ -Item.prototype.repositionX = function repositionX() { +Item.prototype.repositionX = function() { // should be implemented by the item }; /** * Reposition the Item vertically */ -Item.prototype.repositionY = function repositionY() { +Item.prototype.repositionY = function() { // should be implemented by the item }; @@ -6016,11 +5855,12 @@ Item.prototype._repaintDeleteButton = function (anchor) { * @extends Item * @param {Object} data Object containing parameters start * content, className. - * @param {Object} [options] Options to set initial property values - * @param {Object} [defaultOptions] default options + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options * // TODO: describe available options */ -function ItemBox (data, options, defaultOptions) { +function ItemBox (data, conversion, options) { this.props = { dot: { width: 0, @@ -6039,17 +5879,17 @@ function ItemBox (data, options, defaultOptions) { } } - Item.call(this, data, options, defaultOptions); + Item.call(this, data, conversion, options); } -ItemBox.prototype = new Item (null); +ItemBox.prototype = new Item (null, null, null); /** * Check whether this item is visible inside given range * @returns {{start: Number, end: Number}} range with a timestamp for start and end * @returns {boolean} True if visible */ -ItemBox.prototype.isVisible = function isVisible (range) { +ItemBox.prototype.isVisible = function(range) { // determine visibility // TODO: account for the real width of the item. Right now we just add 1/4 to the window var interval = (range.end - range.start) / 4; @@ -6059,7 +5899,7 @@ ItemBox.prototype.isVisible = function isVisible (range) { /** * Repaint the item */ -ItemBox.prototype.repaint = function repaint() { +ItemBox.prototype.redraw = function() { var dom = this.dom; if (!dom) { // create DOM @@ -6088,21 +5928,21 @@ ItemBox.prototype.repaint = function repaint() { // append DOM to parent DOM if (!this.parent) { - throw new Error('Cannot repaint item: no parent attached'); + throw new Error('Cannot redraw item: no parent attached'); } if (!dom.box.parentNode) { - var foreground = this.parent.getForeground(); - if (!foreground) throw new Error('Cannot repaint time axis: parent has no foreground container element'); + var foreground = this.parent.dom.foreground; + if (!foreground) throw new Error('Cannot redraw time axis: parent has no foreground container element'); foreground.appendChild(dom.box); } if (!dom.line.parentNode) { - var background = this.parent.getBackground(); - if (!background) throw new Error('Cannot repaint time axis: parent has no background container element'); + var background = this.parent.dom.background; + if (!background) throw new Error('Cannot redraw time axis: parent has no background container element'); background.appendChild(dom.line); } if (!dom.dot.parentNode) { - var axis = this.parent.getAxis(); - if (!background) throw new Error('Cannot repaint time axis: parent has no axis container element'); + var axis = this.parent.dom.axis; + if (!background) throw new Error('Cannot redraw time axis: parent has no axis container element'); axis.appendChild(dom.dot); } this.displayed = true; @@ -6154,16 +5994,16 @@ ItemBox.prototype.repaint = function repaint() { * Show the item in the DOM (when not already displayed). The items DOM will * be created when needed. */ -ItemBox.prototype.show = function show() { +ItemBox.prototype.show = function() { if (!this.displayed) { - this.repaint(); + this.redraw(); } }; /** * Hide the item from the DOM (when visible) */ -ItemBox.prototype.hide = function hide() { +ItemBox.prototype.hide = function() { if (this.displayed) { var dom = this.dom; @@ -6182,9 +6022,9 @@ ItemBox.prototype.hide = function hide() { * Reposition the item horizontally * @Override */ -ItemBox.prototype.repositionX = function repositionX() { - var start = this.defaultOptions.toScreen(this.data.start), - align = this.options.align || this.defaultOptions.align, +ItemBox.prototype.repositionX = function() { + var start = this.conversion.toScreen(this.data.start), + align = this.options.align, left, box = this.dom.box, line = this.dom.line, @@ -6216,27 +6056,26 @@ ItemBox.prototype.repositionX = function repositionX() { * Reposition the item vertically * @Override */ -ItemBox.prototype.repositionY = function repositionY () { - var orientation = this.options.orientation || this.defaultOptions.orientation, +ItemBox.prototype.repositionY = function() { + var orientation = this.options.orientation, box = this.dom.box, line = this.dom.line, dot = this.dom.dot; if (orientation == 'top') { - box.style.top = (this.top || 0) + 'px'; - box.style.bottom = ''; + box.style.top = (this.top || 0) + 'px'; - line.style.top = '0'; - line.style.bottom = ''; + line.style.top = '0'; line.style.height = (this.parent.top + this.top + 1) + 'px'; + line.style.bottom = ''; } else { // orientation 'bottom' - box.style.top = ''; - box.style.bottom = (this.top || 0) + 'px'; + var itemSetHeight = this.parent.itemSet.props.height; // TODO: this is nasty + var lineHeight = itemSetHeight - this.parent.top - this.parent.height + this.top; - line.style.top = (this.parent.top + this.parent.height - this.top - 1) + 'px'; + box.style.top = (this.parent.height - this.top - this.height || 0) + 'px'; + line.style.top = (itemSetHeight - lineHeight) + 'px'; line.style.bottom = '0'; - line.style.height = ''; } dot.style.top = (-this.props.dot.height / 2) + 'px'; @@ -6247,11 +6086,12 @@ ItemBox.prototype.repositionY = function repositionY () { * @extends Item * @param {Object} data Object containing parameters start * content, className. - * @param {Object} [options] Options to set initial property values - * @param {Object} [defaultOptions] default options + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options * // TODO: describe available options */ -function ItemPoint (data, options, defaultOptions) { +function ItemPoint (data, conversion, options) { this.props = { dot: { top: 0, @@ -6271,17 +6111,17 @@ function ItemPoint (data, options, defaultOptions) { } } - Item.call(this, data, options, defaultOptions); + Item.call(this, data, conversion, options); } -ItemPoint.prototype = new Item (null); +ItemPoint.prototype = new Item (null, null, null); /** * Check whether this item is visible inside given range * @returns {{start: Number, end: Number}} range with a timestamp for start and end * @returns {boolean} True if visible */ -ItemPoint.prototype.isVisible = function isVisible (range) { +ItemPoint.prototype.isVisible = function(range) { // determine visibility // TODO: account for the real width of the item. Right now we just add 1/4 to the window var interval = (range.end - range.start) / 4; @@ -6291,7 +6131,7 @@ ItemPoint.prototype.isVisible = function isVisible (range) { /** * Repaint the item */ -ItemPoint.prototype.repaint = function repaint() { +ItemPoint.prototype.redraw = function() { var dom = this.dom; if (!dom) { // create DOM @@ -6300,7 +6140,7 @@ ItemPoint.prototype.repaint = function repaint() { // background box dom.point = document.createElement('div'); - // className is updated in repaint() + // className is updated in redraw() // contents box, right from the dot dom.content = document.createElement('div'); @@ -6317,12 +6157,12 @@ ItemPoint.prototype.repaint = function repaint() { // append DOM to parent DOM if (!this.parent) { - throw new Error('Cannot repaint item: no parent attached'); + throw new Error('Cannot redraw item: no parent attached'); } if (!dom.point.parentNode) { - var foreground = this.parent.getForeground(); + var foreground = this.parent.dom.foreground; if (!foreground) { - throw new Error('Cannot repaint time axis: parent has no foreground container element'); + throw new Error('Cannot redraw time axis: parent has no foreground container element'); } foreground.appendChild(dom.point); } @@ -6381,16 +6221,16 @@ ItemPoint.prototype.repaint = function repaint() { * Show the item in the DOM (when not already visible). The items DOM will * be created when needed. */ -ItemPoint.prototype.show = function show() { +ItemPoint.prototype.show = function() { if (!this.displayed) { - this.repaint(); + this.redraw(); } }; /** * Hide the item from the DOM (when visible) */ -ItemPoint.prototype.hide = function hide() { +ItemPoint.prototype.hide = function() { if (this.displayed) { if (this.dom.point.parentNode) { this.dom.point.parentNode.removeChild(this.dom.point); @@ -6407,8 +6247,8 @@ ItemPoint.prototype.hide = function hide() { * Reposition the item horizontally * @Override */ -ItemPoint.prototype.repositionX = function repositionX() { - var start = this.defaultOptions.toScreen(this.data.start); +ItemPoint.prototype.repositionX = function() { + var start = this.conversion.toScreen(this.data.start); this.left = start - this.props.dot.width; @@ -6420,17 +6260,15 @@ ItemPoint.prototype.repositionX = function repositionX() { * Reposition the item vertically * @Override */ -ItemPoint.prototype.repositionY = function repositionY () { - var orientation = this.options.orientation || this.defaultOptions.orientation, +ItemPoint.prototype.repositionY = function() { + var orientation = this.options.orientation, point = this.dom.point; if (orientation == 'top') { point.style.top = this.top + 'px'; - point.style.bottom = ''; } else { - point.style.top = ''; - point.style.bottom = this.top + 'px'; + point.style.top = (this.parent.height - this.top - this.height) + 'px'; } }; @@ -6439,11 +6277,12 @@ ItemPoint.prototype.repositionY = function repositionY () { * @extends Item * @param {Object} data Object containing parameters start, end * content, className. - * @param {Object} [options] Options to set initial property values - * @param {Object} [defaultOptions] default options - * // TODO: describe available options + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe options */ -function ItemRange (data, options, defaultOptions) { +function ItemRange (data, conversion, options) { this.props = { content: { width: 0 @@ -6460,10 +6299,10 @@ function ItemRange (data, options, defaultOptions) { } } - Item.call(this, data, options, defaultOptions); + Item.call(this, data, conversion, options); } -ItemRange.prototype = new Item (null); +ItemRange.prototype = new Item (null, null, null); ItemRange.prototype.baseClassName = 'item range'; @@ -6472,7 +6311,7 @@ ItemRange.prototype.baseClassName = 'item range'; * @returns {{start: Number, end: Number}} range with a timestamp for start and end * @returns {boolean} True if visible */ -ItemRange.prototype.isVisible = function isVisible (range) { +ItemRange.prototype.isVisible = function(range) { // determine visibility return (this.data.start < range.end) && (this.data.end > range.start); }; @@ -6480,7 +6319,7 @@ ItemRange.prototype.isVisible = function isVisible (range) { /** * Repaint the item */ -ItemRange.prototype.repaint = function repaint() { +ItemRange.prototype.redraw = function() { var dom = this.dom; if (!dom) { // create DOM @@ -6489,7 +6328,7 @@ ItemRange.prototype.repaint = function repaint() { // background box dom.box = document.createElement('div'); - // className is updated in repaint() + // className is updated in redraw() // contents box dom.content = document.createElement('div'); @@ -6502,12 +6341,12 @@ ItemRange.prototype.repaint = function repaint() { // append DOM to parent DOM if (!this.parent) { - throw new Error('Cannot repaint item: no parent attached'); + throw new Error('Cannot redraw item: no parent attached'); } if (!dom.box.parentNode) { - var foreground = this.parent.getForeground(); + var foreground = this.parent.dom.foreground; if (!foreground) { - throw new Error('Cannot repaint time axis: parent has no foreground container element'); + throw new Error('Cannot redraw time axis: parent has no foreground container element'); } foreground.appendChild(dom.box); } @@ -6557,9 +6396,9 @@ ItemRange.prototype.repaint = function repaint() { * Show the item in the DOM (when not already visible). The items DOM will * be created when needed. */ -ItemRange.prototype.show = function show() { +ItemRange.prototype.show = function() { if (!this.displayed) { - this.repaint(); + this.redraw(); } }; @@ -6567,7 +6406,7 @@ ItemRange.prototype.show = function show() { * Hide the item from the DOM (when visible) * @return {Boolean} changed */ -ItemRange.prototype.hide = function hide() { +ItemRange.prototype.hide = function() { if (this.displayed) { var box = this.dom.box; @@ -6586,12 +6425,12 @@ ItemRange.prototype.hide = function hide() { * Reposition the item horizontally * @Override */ -ItemRange.prototype.repositionX = function repositionX() { +ItemRange.prototype.repositionX = function() { var props = this.props, parentWidth = this.parent.width, - start = this.defaultOptions.toScreen(this.data.start), - end = this.defaultOptions.toScreen(this.data.end), - padding = 'padding' in this.options ? this.options.padding : this.defaultOptions.padding, + start = this.conversion.toScreen(this.data.start), + end = this.conversion.toScreen(this.data.end), + padding = this.options.padding, contentLeft; // limit the width of the this, as browsers cannot draw very wide divs @@ -6624,17 +6463,15 @@ ItemRange.prototype.repositionX = function repositionX() { * Reposition the item vertically * @Override */ -ItemRange.prototype.repositionY = function repositionY() { - var orientation = this.options.orientation || this.defaultOptions.orientation, +ItemRange.prototype.repositionY = function() { + var orientation = this.options.orientation, box = this.dom.box; if (orientation == 'top') { box.style.top = this.top + 'px'; - box.style.bottom = ''; } else { - box.style.top = ''; - box.style.bottom = this.top + 'px'; + box.style.top = (this.parent.height - this.top - this.height) + 'px'; } }; @@ -6703,11 +6540,12 @@ ItemRange.prototype._repaintDragRight = function () { * @extends ItemRange * @param {Object} data Object containing parameters start, end * content, className. - * @param {Object} [options] Options to set initial property values - * @param {Object} [defaultOptions] default options - * // TODO: describe available options + * @param {{toScreen: function, toTime: function}} conversion + * Conversion functions from time to screen and vice versa + * @param {Object} [options] Configuration options + * // TODO: describe options */ -function ItemRangeOverflow (data, options, defaultOptions) { +function ItemRangeOverflow (data, conversion, options) { this.props = { content: { left: 0, @@ -6715,10 +6553,10 @@ function ItemRangeOverflow (data, options, defaultOptions) { } }; - ItemRange.call(this, data, options, defaultOptions); + ItemRange.call(this, data, conversion, options); } -ItemRangeOverflow.prototype = new ItemRange (null); +ItemRangeOverflow.prototype = new ItemRange (null, null, null); ItemRangeOverflow.prototype.baseClassName = 'item rangeoverflow'; @@ -6726,11 +6564,10 @@ ItemRangeOverflow.prototype.baseClassName = 'item rangeoverflow'; * Reposition the item horizontally * @Override */ -ItemRangeOverflow.prototype.repositionX = function repositionX() { +ItemRangeOverflow.prototype.repositionX = function() { var parentWidth = this.parent.width, - start = this.defaultOptions.toScreen(this.data.start), - end = this.defaultOptions.toScreen(this.data.end), - padding = 'padding' in this.options ? this.options.padding : this.defaultOptions.padding, + start = this.conversion.toScreen(this.data.start), + end = this.conversion.toScreen(this.data.end), contentLeft; // limit the width of the this, as browsers cannot draw very wide divs @@ -6774,6 +6611,7 @@ function Group (groupId, data, itemSet) { height: 0 } }; + this.className = null; this.items = {}; // items filtered by groupId of this group this.visibleItems = []; // items currently visible in window @@ -6807,8 +6645,10 @@ Group.prototype._create = function() { this.dom.foreground = foreground; this.dom.background = document.createElement('div'); + this.dom.background.className = 'group'; this.dom.axis = document.createElement('div'); + this.dom.axis.className = 'group'; // create a hidden marker to detect when the Timelines container is attached // to the DOM, or the style of a parent of the Timeline is changed from @@ -6823,7 +6663,7 @@ Group.prototype._create = function() { * Set the group data for this group * @param {Object} data Group data, can contain properties content and className */ -Group.prototype.setData = function setData(data) { +Group.prototype.setData = function(data) { // update contents var content = data && data.content; if (content instanceof Element) { @@ -6836,42 +6676,34 @@ Group.prototype.setData = function setData(data) { this.dom.inner.innerHTML = this.groupId; } + if (!this.dom.inner.firstChild) { + util.addClassName(this.dom.inner, 'hidden'); + } + else { + util.removeClassName(this.dom.inner, 'hidden'); + } + // update className - var className = data && data.className; - if (className) { + var className = data && data.className || null; + if (className != this.className) { + if (this.className) { + util.removeClassName(this.dom.label, className); + util.removeClassName(this.dom.foreground, className); + util.removeClassName(this.dom.background, className); + util.removeClassName(this.dom.axis, className); + } util.addClassName(this.dom.label, className); + util.addClassName(this.dom.foreground, className); + util.addClassName(this.dom.background, className); + util.addClassName(this.dom.axis, className); } }; -/** - * Get the foreground container element - * @return {HTMLElement} foreground - */ -Group.prototype.getForeground = function getForeground() { - return this.dom.foreground; -}; - -/** - * Get the background container element - * @return {HTMLElement} background - */ -Group.prototype.getBackground = function getBackground() { - return this.dom.background; -}; - -/** - * Get the axis container element - * @return {HTMLElement} axis - */ -Group.prototype.getAxis = function getAxis() { - return this.dom.axis; -}; - /** * Get the width of the group label * @return {number} width */ -Group.prototype.getLabelWidth = function getLabelWidth() { +Group.prototype.getLabelWidth = function() { return this.props.label.width; }; @@ -6883,7 +6715,7 @@ Group.prototype.getLabelWidth = function getLabelWidth() { * @param {boolean} [restack=false] Force restacking of all items * @return {boolean} Returns true if the group is resized */ -Group.prototype.repaint = function repaint(range, margin, restack) { +Group.prototype.redraw = function(range, margin, restack) { var resized = false; this.visibleItems = this._updateVisibleItems(this.orderedItems, this.visibleItems, range); @@ -6896,7 +6728,7 @@ Group.prototype.repaint = function repaint(range, margin, restack) { util.forEach(this.items, function (item) { item.dirty = true; - if (item.displayed) item.repaint(); + if (item.displayed) item.redraw(); }); restack = true; @@ -6909,10 +6741,6 @@ Group.prototype.repaint = function repaint(range, margin, restack) { else { // no stacking stack.nostack(this.visibleItems, margin); } - for (var i = 0, ii = this.visibleItems.length; i < ii; i++) { - var item = this.visibleItems[i]; - item.repositionY(); - } // recalculate the height of the group var height; @@ -6946,34 +6774,40 @@ Group.prototype.repaint = function repaint(range, margin, restack) { foreground.style.height = height + 'px'; this.dom.label.style.height = height + 'px'; + // update vertical position of items after they are re-stacked and the height of the group is calculated + for (var i = 0, ii = this.visibleItems.length; i < ii; i++) { + var item = this.visibleItems[i]; + item.repositionY(); + } + return resized; }; /** * Show this group: attach to the DOM */ -Group.prototype.show = function show() { +Group.prototype.show = function() { if (!this.dom.label.parentNode) { - this.itemSet.getLabelSet().appendChild(this.dom.label); + this.itemSet.dom.labelSet.appendChild(this.dom.label); } if (!this.dom.foreground.parentNode) { - this.itemSet.getForeground().appendChild(this.dom.foreground); + this.itemSet.dom.foreground.appendChild(this.dom.foreground); } if (!this.dom.background.parentNode) { - this.itemSet.getBackground().appendChild(this.dom.background); + this.itemSet.dom.background.appendChild(this.dom.background); } if (!this.dom.axis.parentNode) { - this.itemSet.getAxis().appendChild(this.dom.axis); + this.itemSet.dom.axis.appendChild(this.dom.axis); } }; /** * Hide this group: remove from the DOM */ -Group.prototype.hide = function hide() { +Group.prototype.hide = function() { var label = this.dom.label; if (label.parentNode) { label.parentNode.removeChild(label); @@ -6999,12 +6833,12 @@ Group.prototype.hide = function hide() { * Add an item to the group * @param {Item} item */ -Group.prototype.add = function add(item) { +Group.prototype.add = function(item) { this.items[item.id] = item; item.setParent(this); if (item instanceof ItemRange && this.visibleItems.indexOf(item) == -1) { - var range = this.itemSet.range; // TODO: not nice accessing the range like this + var range = this.itemSet.body.range; // TODO: not nice accessing the range like this this._checkIfVisible(item, this.visibleItems, range); } }; @@ -7013,7 +6847,7 @@ Group.prototype.add = function add(item) { * Remove an item from the group * @param {Item} item */ -Group.prototype.remove = function remove(item) { +Group.prototype.remove = function(item) { delete this.items[item.id]; item.setParent(this.itemSet); @@ -7028,14 +6862,14 @@ Group.prototype.remove = function remove(item) { * Remove an item from the corresponding DataSet * @param {Item} item */ -Group.prototype.removeFromDataSet = function removeFromDataSet(item) { +Group.prototype.removeFromDataSet = function(item) { this.itemSet.removeItem(item.id); }; /** * Reorder the items */ -Group.prototype.order = function order() { +Group.prototype.order = function() { var array = util.toArray(this.items); this.orderedItems.byStart = array; this.orderedItems.byEnd = this._constructByEndArray(array); @@ -7050,7 +6884,7 @@ Group.prototype.order = function order() { * @returns {ItemRange[]} * @private */ -Group.prototype._constructByEndArray = function _constructByEndArray(array) { +Group.prototype._constructByEndArray = function(array) { var endArray = []; for (var i = 0; i < array.length; i++) { @@ -7069,7 +6903,7 @@ Group.prototype._constructByEndArray = function _constructByEndArray(array) { * @return {Item[]} visibleItems The new visible items. * @private */ -Group.prototype._updateVisibleItems = function _updateVisibleItems(orderedItems, visibleItems, range) { +Group.prototype._updateVisibleItems = function(orderedItems, visibleItems, range) { var initialPosByStart, newVisibleItems = [], i; @@ -7132,7 +6966,7 @@ Group.prototype._updateVisibleItems = function _updateVisibleItems(orderedItems, * @returns {number} * @private */ -Group.prototype._binarySearch = function _binarySearch(orderedItems, range, byEnd) { +Group.prototype._binarySearch = function(orderedItems, range, byEnd) { var array = []; var byTime = byEnd ? 'end' : 'start'; if (byEnd == true) {array = orderedItems.byEnd; } @@ -7193,7 +7027,7 @@ Group.prototype._binarySearch = function _binarySearch(orderedItems, range, byEn * @returns {boolean} * @private */ -Group.prototype._checkIfInvisible = function _checkIfInvisible(item, visibleItems, range) { +Group.prototype._checkIfInvisible = function(item, visibleItems, range) { if (item.isVisible(range)) { if (!item.displayed) item.show(); item.repositionX(); @@ -7218,7 +7052,7 @@ Group.prototype._checkIfInvisible = function _checkIfInvisible(item, visibleItem * @param {{start:number, end:number}} range * @private */ -Group.prototype._checkIfVisible = function _checkIfVisible(item, visibleItems, range) { +Group.prototype._checkIfVisible = function(item, visibleItems, range) { if (item.isVisible(range)) { if (!item.displayed) item.show(); // reposition item horizontally @@ -7238,271 +7072,64 @@ Group.prototype._checkIfVisible = function _checkIfVisible(item, visibleItems, r * @constructor */ function Timeline (container, items, options) { - // validate arguments - if (!container) throw new Error('No container element provided'); - var me = this; - var now = moment().hours(0).minutes(0).seconds(0).milliseconds(0); this.defaultOptions = { - orientation: 'bottom', - direction: 'horizontal', // 'horizontal' or 'vertical' - autoResize: true, - stack: true, - - editable: { - updateTime: false, - updateGroup: false, - add: false, - remove: false - }, - - selectable: true, - start: null, - end: null, - min: null, - max: null, - zoomMin: 10, // milliseconds - zoomMax: 1000 * 60 * 60 * 24 * 365 * 10000, // milliseconds - // moveable: true, // TODO: option moveable - // zoomable: true, // TODO: option zoomable + end: null, - showMinorLabels: true, - showMajorLabels: true, - showCurrentTime: false, - showCustomTime: false, - - groupOrder: null, + autoResize: true, + orientation: 'bottom', width: null, height: null, maxHeight: null, - minHeight: null, - - type: 'box', - align: 'center', - margin: { - axis: 20, - item: 10 - }, - padding: 5, - - onAdd: function (item, callback) { - callback(item); - }, - onUpdate: function (item, callback) { - callback(item); - }, - onMove: function (item, callback) { - callback(item); - }, - onRemove: function (item, callback) { - callback(item); - } + minHeight: null }; + this.options = util.deepExtend({}, this.defaultOptions); - this.options = {}; - util.deepExtend(this.options, this.defaultOptions); - util.deepExtend(this.options, { - snap: null, // will be specified after timeaxis is created - - toScreen: me._toScreen.bind(me), - toTime: me._toTime.bind(me) - }); - - // root panel - var rootOptions = util.extend(Object.create(this.options), { - height: function () { - if (me.options.height) { - // fixed height - return me.options.height; - } - else { - // auto height - // TODO: implement a css based solution to automatically have the right hight - return (me.timeAxis.height + me.contentPanel.height) + 'px'; - } - } - }); - this.rootPanel = new RootPanel(container, rootOptions); - - // single select (or unselect) when tapping an item - this.rootPanel.on('tap', this._onSelectItem.bind(this)); - - // multi select when holding mouse/touch, or on ctrl+click - this.rootPanel.on('hold', this._onMultiSelectItem.bind(this)); + // Create the DOM, props, and emitter + this._create(container); - // add item on doubletap - this.rootPanel.on('doubletap', this._onAddItem.bind(this)); + // all components listed here will be repainted automatically + this.components = []; - // side panel - var sideOptions = util.extend(Object.create(this.options), { - top: function () { - return (sideOptions.orientation == 'top') ? '0' : ''; - }, - bottom: function () { - return (sideOptions.orientation == 'top') ? '' : '0'; - }, - left: '0', - right: null, - height: '100%', - width: function () { - if (me.itemSet) { - return me.itemSet.getLabelsWidth(); - } - else { - return 0; - } + this.body = { + dom: this.dom, + domProps: this.props, + emitter: { + on: this.on.bind(this), + off: this.off.bind(this), + emit: this.emit.bind(this) }, - className: function () { - return 'side' + (me.groupsData ? '' : ' hidden'); + util: { + snap: null, // will be specified after TimeAxis is created + toScreen: me._toScreen.bind(me), + toTime: me._toTime.bind(me) } - }); - this.sidePanel = new Panel(sideOptions); - this.rootPanel.appendChild(this.sidePanel); - - // main panel (contains time axis and itemsets) - var mainOptions = util.extend(Object.create(this.options), { - left: function () { - // we align left to enable a smooth resizing of the window - return me.sidePanel.width; - }, - right: null, - height: '100%', - width: function () { - return me.rootPanel.width - me.sidePanel.width; - }, - className: 'main' - }); - this.mainPanel = new Panel(mainOptions); - this.rootPanel.appendChild(this.mainPanel); + }; // range - // TODO: move range inside rootPanel? - var rangeOptions = Object.create(this.options); - this.range = new Range(this.rootPanel, this.mainPanel, rangeOptions); - this.range.setRange( - now.clone().add('days', -3).valueOf(), - now.clone().add('days', 4).valueOf() - ); - this.range.on('rangechange', function (properties) { - me.rootPanel.repaint(); - me.emit('rangechange', properties); - }); - this.range.on('rangechanged', function (properties) { - me.rootPanel.repaint(); - me.emit('rangechanged', properties); - }); - - // panel with time axis - var timeAxisOptions = util.extend(Object.create(rootOptions), { - range: this.range, - left: null, - top: null, - width: null, - height: null - }); - this.timeAxis = new TimeAxis(timeAxisOptions); - this.timeAxis.setRange(this.range); - this.options.snap = this.timeAxis.snap.bind(this.timeAxis); - this.mainPanel.appendChild(this.timeAxis); - - // content panel (contains itemset(s)) - var contentOptions = util.extend(Object.create(this.options), { - top: function () { - return (me.options.orientation == 'top') ? (me.timeAxis.height + 'px') : ''; - }, - bottom: function () { - return (me.options.orientation == 'top') ? '' : (me.timeAxis.height + 'px'); - }, - left: null, - right: null, - height: null, - width: null, - className: 'content' - }); - this.contentPanel = new Panel(contentOptions); - this.mainPanel.appendChild(this.contentPanel); - - // content panel (contains the vertical lines of box items) - var backgroundOptions = util.extend(Object.create(this.options), { - top: function () { - return (me.options.orientation == 'top') ? (me.timeAxis.height + 'px') : ''; - }, - bottom: function () { - return (me.options.orientation == 'top') ? '' : (me.timeAxis.height + 'px'); - }, - left: null, - right: null, - height: function () { - return me.contentPanel.height; - }, - width: null, - className: 'background' - }); - this.backgroundPanel = new Panel(backgroundOptions); - this.mainPanel.insertBefore(this.backgroundPanel, this.contentPanel); - - // panel with axis holding the dots of item boxes - var axisPanelOptions = util.extend(Object.create(rootOptions), { - left: 0, - top: function () { - return (me.options.orientation == 'top') ? (me.timeAxis.height + 'px') : ''; - }, - bottom: function () { - return (me.options.orientation == 'top') ? '' : (me.timeAxis.height + 'px'); - }, - width: '100%', - height: 0, - className: 'axis' - }); - this.axisPanel = new Panel(axisPanelOptions); - this.mainPanel.appendChild(this.axisPanel); - - // content panel (contains itemset(s)) - var sideContentOptions = util.extend(Object.create(this.options), { - top: function () { - return (me.options.orientation == 'top') ? (me.timeAxis.height + 'px') : ''; - }, - bottom: function () { - return (me.options.orientation == 'top') ? '' : (me.timeAxis.height + 'px'); - }, - left: null, - right: null, - height: null, - width: null, - className: 'side-content' - }); - this.sideContentPanel = new Panel(sideContentOptions); - this.sidePanel.appendChild(this.sideContentPanel); + this.range = new Range(this.body); + this.components.push(this.range); + this.body.range = this.range; + + // time axis + this.timeAxis = new TimeAxis(this.body); + this.components.push(this.timeAxis); + this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); // current time bar - // Note: time bar will be attached in this.setOptions when selected - this.currentTime = new CurrentTime(this.range, rootOptions); + this.currentTime = new CurrentTime(this.body); + this.components.push(this.currentTime); // custom time bar // Note: time bar will be attached in this.setOptions when selected - this.customTime = new CustomTime(rootOptions); - this.customTime.on('timechange', function (time) { - me.emit('timechange', time); - }); - this.customTime.on('timechanged', function (time) { - me.emit('timechanged', time); - }); + this.customTime = new CustomTime(this.body); + this.components.push(this.customTime); - // itemset containing items and groups - var itemOptions = util.extend(Object.create(this.options), { - left: null, - right: null, - top: null, - bottom: null, - width: null, - height: null - }); - this.itemSet = new ItemSet(this.backgroundPanel, this.axisPanel, this.sideContentPanel, itemOptions); - this.itemSet.setRange(this.range); - this.itemSet.on('change', me.rootPanel.repaint.bind(me.rootPanel)); - this.contentPanel.appendChild(this.itemSet); + // item set + this.itemSet = new ItemSet(this.body); + this.components.push(this.itemSet); this.itemsData = null; // DataSet this.groupsData = null; // DataSet @@ -7516,88 +7143,217 @@ function Timeline (container, items, options) { if (items) { this.setItems(items); } + else { + this.redraw(); + } } // turn Timeline into an event emitter Emitter(Timeline.prototype); /** - * Set options - * @param {Object} options TODO: describe the available options + * 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 */ -Timeline.prototype.setOptions = function (options) { - util.deepExtend(this.options, options); +Timeline.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.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)); - if ('editable' in options) { - var isBoolean = typeof options.editable === 'boolean'; + // 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 = {}; - this.options.editable = { - updateTime: isBoolean ? options.editable : (options.editable.updateTime || false), - updateGroup: isBoolean ? options.editable : (options.editable.updateGroup || false), - add: isBoolean ? options.editable : (options.editable.add || false), - remove: isBoolean ? options.editable : (options.editable.remove || false) + 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 - // force update of range (apply new min/max etc.) - // both start and end are optional - this.range.setRange(options.start, options.end); + // attach the root panel to the provided container + if (!container) throw new Error('No container provided'); + container.appendChild(this.dom.root); +}; - if ('editable' in options || 'selectable' in options) { - if (this.options.selectable) { - // force update of selection - this.setSelection(this.getSelection()); - } - else { - // remove selection - this.setSelection([]); - } - } +/** + * Destroy the Timeline, clean up all DOM elements and event listeners. + */ +Timeline.prototype.destroy = function () { + // unbind datasets + this.clear(); - // force the itemSet to refresh: options like orientation and margins may be changed - this.itemSet.markDirty(); + // remove all event listeners + this.off(); - // validate the callback functions - var validateCallback = (function (fn) { - if (!(this.options[fn] instanceof Function) || this.options[fn].length != 2) { - throw new Error('option ' + fn + ' must be a function ' + fn + '(item, callback)'); - } - }).bind(this); - ['onAdd', 'onUpdate', 'onRemove', 'onMove'].forEach(validateCallback); + // stop checking for changed size + this._stopAutoResize(); - // add/remove the current time bar - if (this.options.showCurrentTime) { - if (!this.mainPanel.hasChild(this.currentTime)) { - this.mainPanel.appendChild(this.currentTime); - this.currentTime.start(); - } - } - else { - if (this.mainPanel.hasChild(this.currentTime)) { - this.currentTime.stop(); - this.mainPanel.removeChild(this.currentTime); - } + // remove from DOM + if (this.dom.root.parentNode) { + this.dom.root.parentNode.removeChild(this.dom.root); } + this.dom = null; - // add/remove the custom time bar - if (this.options.showCustomTime) { - if (!this.mainPanel.hasChild(this.customTime)) { - this.mainPanel.appendChild(this.customTime); + // cleanup hammer touch events + for (var event in this.listeners) { + if (this.listeners.hasOwnProperty(event)) { + delete this.listeners[event]; } } - else { - if (this.mainPanel.hasChild(this.customTime)) { - this.mainPanel.removeChild(this.customTime); - } + this.listeners = null; + this.hammer = null; + + // give all components the opportunity to cleanup + this.components.forEach(function (component) { + component.destroy(); + }); + + this.body = null; +}; + +/** + * 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 + */ +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); + + // enable/disable autoResize + this._initAutoResize(); } + // 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.'); } - // repaint everything - this.rootPanel.repaint(); + // redraw everything + this.redraw(); }; /** @@ -7642,7 +7398,7 @@ Timeline.prototype.setItems = function(items) { else { // turn an array into a dataset newDataSet = new DataSet(items, { - convert: { + type: { start: 'Date', end: 'Date' } @@ -7651,13 +7407,13 @@ Timeline.prototype.setItems = function(items) { // set items this.itemsData = newDataSet; - this.itemSet.setItems(newDataSet); + this.itemSet && this.itemSet.setItems(newDataSet); - if (initialLoad && (this.options.start == undefined || this.options.end == undefined)) { + if (initialLoad && ('start' in this.options || 'end' in this.options)) { this.fit(); - var start = (this.options.start != undefined) ? util.convert(this.options.start, 'Date') : null; - var end = (this.options.end != undefined) ? util.convert(this.options.end, 'Date') : null; + 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); } @@ -7667,7 +7423,7 @@ Timeline.prototype.setItems = function(items) { * Set groups * @param {vis.DataSet | Array | google.visualization.DataTable} groups */ -Timeline.prototype.setGroups = function setGroups(groups) { +Timeline.prototype.setGroups = function(groups) { // convert to type DataSet when needed var newDataSet; if (!groups) { @@ -7695,7 +7451,7 @@ Timeline.prototype.setGroups = function setGroups(groups) { * @param {Object} [what] Optionally specify what to clear. By default: * {items: true, groups: true, options: true} */ -Timeline.prototype.clear = function clear(what) { +Timeline.prototype.clear = function(what) { // clear items if (!what || what.items) { this.setItems(null); @@ -7706,16 +7462,20 @@ Timeline.prototype.clear = function clear(what) { this.setGroups(null); } - // clear options + // clear options of timeline and of each of the components if (!what || what.options) { - this.setOptions(this.defaultOptions); + 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 fit() { +Timeline.prototype.fit = function() { // apply the data range as range var dataRange = this.getItemRange(); @@ -7746,7 +7506,7 @@ Timeline.prototype.fit = function fit() { * When no minimum is found, min==null * When no maximum is found, max==null */ -Timeline.prototype.getItemRange = function getItemRange() { +Timeline.prototype.getItemRange = function() { // calculate min from start filed var itemsData = this.itemsData, min = null, @@ -7755,20 +7515,22 @@ Timeline.prototype.getItemRange = function getItemRange() { if (itemsData) { // calculate the minimum value of the field 'start' var minItem = itemsData.min('start'); - min = minItem ? minItem.start.valueOf() : null; + 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 // calculate maximum value of fields 'start' and 'end' var maxStartItem = itemsData.max('start'); if (maxStartItem) { - max = maxStartItem.start.valueOf(); + max = util.convert(maxStartItem.start, 'Date').valueOf(); } var maxEndItem = itemsData.max('end'); if (maxEndItem) { if (max == null) { - max = maxEndItem.end.valueOf(); + max = util.convert(maxEndItem.end, 'Date').valueOf(); } else { - max = Math.max(max, maxEndItem.end.valueOf()); + max = Math.max(max, util.convert(maxEndItem.end, 'Date').valueOf()); } } } @@ -7786,16 +7548,16 @@ Timeline.prototype.getItemRange = function getItemRange() { * selected. If ids is an empty array, all items will be * unselected. */ -Timeline.prototype.setSelection = function setSelection (ids) { - this.itemSet.setSelection(ids); +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 getSelection() { - return this.itemSet.getSelection(); +Timeline.prototype.getSelection = function() { + return this.itemSet && this.itemSet.getSelection() || []; }; /** @@ -7811,7 +7573,7 @@ Timeline.prototype.getSelection = function getSelection() { * @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 setWindow(start, end) { +Timeline.prototype.setWindow = function(start, end) { if (arguments.length == 1) { var range = arguments[0]; this.range.setRange(range.start, range.end); @@ -7825,7 +7587,7 @@ Timeline.prototype.setWindow = function setWindow(start, end) { * Get the visible window * @return {{start: Date, end: Date}} Visible range */ -Timeline.prototype.getWindow = function setWindow() { +Timeline.prototype.getWindow = function() { var range = this.range.getRange(); return { start: new Date(range.start), @@ -7837,160 +7599,321 @@ Timeline.prototype.getWindow = function setWindow() { * Force a redraw of the Timeline. Can be useful to manually redraw when * option autoResize=false */ -Timeline.prototype.redraw = function redraw() { - this.rootPanel.repaint(); +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; + + // 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'; + + 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'; + + // 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'; + + // 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, 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'; + + // 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(); + } }; // TODO: deprecated since version 1.1.0, remove some day -Timeline.prototype.repaint = function repaint() { +Timeline.prototype.repaint = function () { throw new Error('Function repaint is deprecated. Use redraw instead.'); }; /** - * Handle selecting/deselecting an item when tapping it - * @param {Event} event + * 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 ItemSet -Timeline.prototype._onSelectItem = function (event) { - if (!this.options.selectable) return; - - var ctrlKey = event.gesture.srcEvent && event.gesture.srcEvent.ctrlKey; - var shiftKey = event.gesture.srcEvent && event.gesture.srcEvent.shiftKey; - if (ctrlKey || shiftKey) { - this._onMultiSelectItem(event); - return; - } - - var oldSelection = this.getSelection(); - - var item = ItemSet.itemFromTarget(event); - var selection = item ? [item.id] : []; - this.setSelection(selection); +// 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); +}; - var newSelection = this.getSelection(); +/** + * 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 +Timeline.prototype._toScreen = function(time) { + var conversion = this.range.conversion(this.props.center.width); + return (time.valueOf() - conversion.offset) * conversion.scale; +}; - // emit a select event, - // except when old selection is empty and new selection is still empty - if (newSelection.length > 0 || oldSelection.length > 0) { - this.emit('select', { - items: this.getSelection() - }); +/** + * Initialize watching when option autoResize is true + * @private + */ +Timeline.prototype._initAutoResize = function () { + if (this.options.autoResize == true) { + this._startAutoResize(); + } + else { + this._stopAutoResize(); } - - event.stopPropagation(); }; /** - * Handle creation and updates of an item on double tap - * @param event + * Watch for changes in the size of the container. On resize, the Panel will + * automatically redraw itself. * @private */ -Timeline.prototype._onAddItem = function (event) { - if (!this.options.selectable) return; - if (!this.options.editable.add) return; +Timeline.prototype._startAutoResize = function () { + var me = this; - var me = this, - item = ItemSet.itemFromTarget(event); + this._stopAutoResize(); - if (item) { - // update item + this._onResize = function() { + if (me.options.autoResize != true) { + // stop watching when the option autoResize is changed to false + me._stopAutoResize(); + return; + } - // execute async handler to update the item (or cancel it) - var itemData = me.itemsData.get(item.id); // get a clone of the data from the dataset - this.options.onUpdate(itemData, function (itemData) { - if (itemData) { - me.itemsData.update(itemData); - } - }); - } - else { - // add item - var xAbs = vis.util.getAbsoluteLeft(this.contentPanel.frame); - var x = event.gesture.center.pageX - xAbs; - var newItem = { - start: this.timeAxis.snap(this._toTime(x)), - content: 'new item' - }; + 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; - // when default type is a range, add a default end date to the new item - if (this.options.type === 'range' || this.options.type == 'rangeoverflow') { - newItem.end = this.timeAxis.snap(this._toTime(x + this.rootPanel.width / 5)); + me.emit('change'); + } } + }; - var id = util.randomUUID(); - newItem[this.itemsData.fieldId] = id; + // add event listener to window resize + util.addEventListener(window, 'resize', this._onResize); - var group = ItemSet.groupFromTarget(event); - if (group) { - newItem.group = group.groupId; - } + this.watchTimer = setInterval(this._onResize, 1000); +}; - // execute async handler to customize (or cancel) adding an item - this.options.onAdd(newItem, function (item) { - if (item) { - me.itemsData.add(newItem); - // TODO: need to trigger a redraw? - } - }); +/** + * Stop watching for a resize of the frame. + * @private + */ +Timeline.prototype._stopAutoResize = function () { + if (this.watchTimer) { + clearInterval(this.watchTimer); + this.watchTimer = undefined; } + + // remove event listener on window.resize + util.removeEventListener(window, 'resize', this._onResize); + this._onResize = null; }; /** - * Handle selecting/deselecting multiple items when holding an item + * Start moving the timeline vertically * @param {Event} event * @private */ -// TODO: move this function to ItemSet -Timeline.prototype._onMultiSelectItem = function (event) { - if (!this.options.selectable) return; +Timeline.prototype._onTouch = function (event) { + this.touch.allowDragging = true; +}; - var selection, - item = ItemSet.itemFromTarget(event); +/** + * Start moving the timeline vertically + * @param {Event} event + * @private + */ +Timeline.prototype._onPinch = function (event) { + this.touch.allowDragging = false; +}; - if (item) { - // multi select items - selection = this.getSelection(); // current selection - var index = selection.indexOf(item.id); - if (index == -1) { - // item is not yet selected -> select it - selection.push(item.id); - } - else { - // item is already selected -> deselect it - selection.splice(index, 1); - } - this.setSelection(selection); +/** + * Start moving the timeline vertically + * @param {Event} event + * @private + */ +Timeline.prototype._onDragStart = function (event) { + this.touch.initialScrollTop = this.props.scrollTop; +}; - this.emit('select', { - items: this.getSelection() - }); +/** + * 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; - event.stopPropagation(); + var delta = event.gesture.deltaY; + + 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 } }; /** - * 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 + * Apply a scrollTop + * @param {Number} scrollTop + * @returns {Number} scrollTop Returns the applied scrollTop * @private */ -Timeline.prototype._toTime = function _toTime(x) { - var conversion = this.range.conversion(this.mainPanel.width); - return new Date(x / conversion.scale + conversion.offset); +Timeline.prototype._setScrollTop = function (scrollTop) { + this.props.scrollTop = scrollTop; + this._updateScrollTop(); + return this.props.scrollTop; }; /** - * 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. + * Update the current scrollTop when the height of the containers has been changed + * @returns {Number} scrollTop Returns the applied scrollTop * @private */ -Timeline.prototype._toScreen = function _toScreen(time) { - var conversion = this.range.conversion(this.mainPanel.width); - return (time.valueOf() - conversion.offset) * conversion.scale; +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; +}; + +/** + * Get the current scrollTop + * @returns {number} scrollTop + * @private + */ +Timeline.prototype._getScrollTop = function () { + return this.props.scrollTop; }; (function(exports) { @@ -9081,9 +9004,9 @@ function Node(properties, imagelist, grouplist, constants) { this.edges = []; // all edges connected to this node this.dynamicEdges = []; this.reroutedEdges = {}; - this.group = constants.nodes.group; - this.fontSize = constants.nodes.fontSize; + this.group = constants.nodes.group; + this.fontSize = Number(constants.nodes.fontSize); this.fontFace = constants.nodes.fontFace; this.fontColor = constants.nodes.fontColor; this.fontDrawThreshold = 3; @@ -9863,7 +9786,6 @@ Node.prototype._drawShape = function (ctx, shape) { 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(); @@ -10081,6 +10003,10 @@ function Edge (properties, graph, constants) { this.lengthFixed = false; this.setProperties(properties, constants); + + this.controlNodesEnabled = false; + this.controlNodes = {from:null, to:null, positions:{}}; + this.connectedNode = null; } /** @@ -10740,44 +10666,65 @@ Edge.prototype._drawArrow = function(ctx) { * @private */ Edge.prototype._getDistanceToEdge = function (x1,y1, x2,y2, x3,y3) { // x3,y3 is the point - if (this.smooth == true) { - 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))*this.via.x + Math.pow(t,2)*x2; - y = Math.pow(1-t,2)*y1 + (2*t*(1 - t))*this.via.y + 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 + if (this.from != this.to) { + if (this.smooth == true) { + 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))*this.via.x + Math.pow(t,2)*x2; + y = Math.pow(1-t,2)*y1 + (2*t*(1 - t))*this.via.y + 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; + + if (u > 1) { + u = 1; + } + else if (u < 0) { + u = 0; + } + + 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); + } } else { - var px = x2-x1, - py = y2-y1, - something = px*px + py*py, - u = ((x3 - x1) * px + (y3 - y1) * py) / something; - - if (u > 1) { - u = 1; + 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 if (u < 0) { - u = 0; + else { + x = node.x + radius; + y = node.y - node.height / 2; } - - 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); + dx = x - x3; + dy = y - y3; + return Math.abs(Math.sqrt(dx*dx + dy*dy) - radius); } }; @@ -10807,6 +10754,148 @@ Edge.prototype.positionBezierNode = function() { this.via.y = 0.5 * (this.from.y + this.to.y); } }; + +/** + * This function draws the control nodes for the manipulator. In order to enable this, only set the this.controlNodesEnabled to true. + * @param ctx + */ +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); + } + + 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:{}}; + } +} + +/** + * Enable control nodes. + * @private + */ +Edge.prototype._enableControlNodes = function() { + this.controlNodesEnabled = true; +} + +/** + * disable control nodes + * @private + */ +Edge.prototype._disableControlNodes = function() { + this.controlNodesEnabled = false; +} + +/** + * 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)); + + 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(); + } +} + +/** + * 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; + + + if (this.smooth == true) { + angle = Math.atan2((this.to.y - this.via.y), (this.to.x - this.via.x)); + dx = (this.to.x - this.via.x); + dy = (this.to.y - this.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.smooth == true) { + xTo = (1 - toBorderPoint) * this.via.x + toBorderPoint * this.to.x; + yTo = (1 - toBorderPoint) * this.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}}; +} /** * Popup is a class to create a popup window with some text * @param {Element} container The container object. @@ -12667,6 +12756,11 @@ var manipulationMixin = { if (this.boundFunction) { this.off('select', this.boundFunction); } + if (this.edgeBeingEdited !== undefined) { + this.edgeBeingEdited._disableControlNodes(); + this.edgeBeingEdited = undefined; + this.selectedControlNode = null; + } // restore overloaded functions this._restoreOverloadedFunctions(); @@ -12695,6 +12789,12 @@ var manipulationMixin = { "" + ""+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 += "" + "
" + @@ -12712,6 +12812,10 @@ var manipulationMixin = { var editButton = document.getElementById("graph-manipulate-editNode"); editButton.onclick = this._editNode.bind(this); } + else if (this._getSelectedEdgeCount() == 1 && this._getSelectedNodeCount() == 0) { + var editButton = document.getElementById("graph-manipulate-editEdge"); + editButton.onclick = this._createEditEdgeToolbar.bind(this); + } if (this._selectionIsEmpty() == false) { var deleteButton = document.getElementById("graph-manipulate-delete"); deleteButton.onclick = this._deleteSelected.bind(this); @@ -12805,9 +12909,105 @@ var manipulationMixin = { // redraw to show the unselect this._redraw(); + }, + + /** + * create the toolbar to edit edges + * + * @private + */ + _createEditEdgeToolbar : function() { + // clear the toolbar + this._clearManipulatorBar(); + + if (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'] + ""; + + // bind the icon + var backButton = document.getElementById("graph-manipulate-back"); + backButton.onclick = this._createManipulatorBar.bind(this); + + // 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; + + // redraw to show the unselect + 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. + * + * @private + */ + _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(); + }, + /** + * 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 + */ + _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(); }, + _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 @@ -12953,6 +13153,36 @@ var manipulationMixin = { } }, + /** + * connect two nodes with a new edge. + * + * @private + */ + _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(); + } + } + }, /** * Create the toolbar to edit the selected node. The label and the color can be changed. Other colors are derived from the chosen color. @@ -12993,6 +13223,8 @@ var manipulationMixin = { }, + + /** * delete everything in the selection * @@ -13321,7 +13553,7 @@ var SectorMixin = { // console.log("the node is part of the active sector"); // } // else { -// console.log("I dont know what the fuck happened!!"); +// console.log("I dont know what happened!!"); // } // when we switch to a new sector, we remove the node that will be expanded from the current nodes list. @@ -13585,6 +13817,7 @@ var SectorMixin = { this._loadLatestSector(); } }; + /** * Creation of the ClusterMixin var. * @@ -14972,7 +15205,7 @@ var SelectionMixin = { }, /** - * return the number of selected nodes + * return the selected node * * @returns {number} * @private @@ -14986,6 +15219,21 @@ var SelectionMixin = { return null; }, + /** + * return the selected edge + * + * @returns {number} + * @private + */ + _getSelectedEdge : function() { + for (var edgeId in this.selectionObj.edges) { + if (this.selectionObj.edges.hasOwnProperty(edgeId)) { + return this.selectionObj.edges[edgeId]; + } + } + return null; + }, + /** * return the number of selected edges @@ -15189,7 +15437,6 @@ var SelectionMixin = { * @private */ _handleTouch : function(pointer) { - }, @@ -15795,14 +16042,14 @@ function Graph (container, data, options) { this.renderTimestep = 1000 / this.renderRefreshRate; // ms -- saves calculation later on this.renderTime = 0.5 * this.renderTimestep; // measured time it takes to render a frame this.maxPhysicsTicksPerRender = 3; // max amount of physics ticks per render step. - this.physicsDiscreteStepsize = 0.65; // discrete stepsize of the simulation + this.physicsDiscreteStepsize = 0.50; // discrete stepsize of the simulation this.stabilize = true; // stabilize before displaying the graph this.selectable = true; this.initializing = true; // these functions are triggered when the dataset is edited - this.triggerFunctions = {add:null,edit:null,connect:null,del:null}; + this.triggerFunctions = {add:null,edit:null,editEdge:null,connect:null,del:null}; // set constant values this.constants = { @@ -15938,9 +16185,11 @@ function Graph (container, data, options) { 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).", @@ -15958,12 +16207,13 @@ function Graph (container, data, options) { background: '#FFFFC6' } }, - moveable: true, + dragGraph: true, + dragNodes: true, zoomable: true, hover: false }; this.hoverObj = {nodes:{},edges:{}}; - this.editMode = this.constants.dataManipulation.initiallyVisible; + // Node variables var graph = this; @@ -15997,7 +16247,6 @@ function Graph (container, data, options) { this._setScale(1); this.setOptions(options); - // other vars this.freezeSimulation = false;// freeze the simulation this.cachedFunctions = {}; @@ -16301,7 +16550,8 @@ Graph.prototype.setOptions = function (options) { if (options.freezeForStabilization !== undefined) {this.constants.freezeForStabilization = options.freezeForStabilization;} if (options.configurePhysics !== undefined){this.constants.configurePhysics = options.configurePhysics;} if (options.stabilizationIterations !== undefined) {this.constants.stabilizationIterations = options.stabilizationIterations;} - if (options.moveable !== undefined) {this.constants.moveable = options.moveable;} + if (options.dragGraph !== undefined) {this.constants.dragGraph = options.dragGraph;} + if (options.dragNodes !== undefined) {this.constants.dragNodes = options.dragNodes;} if (options.zoomable !== undefined) {this.constants.zoomable = options.zoomable;} if (options.hover !== undefined) {this.constants.hover = options.hover;} @@ -16321,6 +16571,10 @@ Graph.prototype.setOptions = function (options) { this.triggerFunctions.edit = options.onEdit; } + if (options.onEditEdge) { + this.triggerFunctions.editEdge = options.onEditEdge; + } + if (options.onConnect) { this.triggerFunctions.connect = options.onConnect; } @@ -16415,6 +16669,7 @@ Graph.prototype.setOptions = function (options) { this.constants.dataManipulation[prop] = options.dataManipulation[prop]; } } + this.editMode = this.constants.dataManipulation.initiallyVisible; } else if (options.dataManipulation !== undefined) { this.constants.dataManipulation.enabled = false; @@ -16728,7 +16983,7 @@ Graph.prototype._handleOnDrag = function(event) { var me = this, drag = this.drag, selection = drag.selection; - if (selection && selection.length) { + if (selection && selection.length && this.constants.dragNodes == true) { // calculate delta's and new location var deltaX = pointer.x - drag.pointer.x, deltaY = pointer.y - drag.pointer.y; @@ -16753,7 +17008,7 @@ Graph.prototype._handleOnDrag = function(event) { } } else { - if (this.constants.moveable == true) { + if (this.constants.dragGraph == true) { // move the graph var diffX = pointer.x - this.drag.pointer.x; var diffY = pointer.y - this.drag.pointer.y; @@ -17449,7 +17704,6 @@ Graph.prototype._updateValueRange = function(obj) { */ Graph.prototype.redraw = function() { this.setSize(this.width, this.height); - this._redraw(); }; @@ -17481,6 +17735,7 @@ Graph.prototype._redraw = function() { this._doInAllSectors("_drawAllSectorNodes",ctx); this._doInAllSectors("_drawEdges",ctx); this._doInAllSectors("_drawNodes",ctx,false); + this._doInAllSectors("_drawControlNodes",ctx); // this._doInSupportSector("_drawNodes",ctx,true); // this._drawTree(ctx,"#F00F0F"); @@ -17665,6 +17920,21 @@ Graph.prototype._drawEdges = function(ctx) { } }; +/** + * Redraw all edges + * The 2d context of a HTML canvas can be retrieved by canvas.getContext('2d'); + * @param {CanvasRenderingContext2D} ctx + * @private + */ +Graph.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 @@ -21368,8 +21638,6 @@ var vis = { }, Component: Component, - Panel: Panel, - RootPanel: RootPanel, ItemSet: ItemSet, TimeAxis: TimeAxis }, @@ -23005,7 +23273,7 @@ else { })(this); },{}],4:[function(require,module,exports){ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};//! moment.js -//! version : 2.6.0 +//! version : 2.7.0 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com @@ -23017,7 +23285,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? ************************************/ var moment, - VERSION = "2.6.0", + VERSION = "2.7.0", // the global-scope this is NOT the global object in Node.js globalScope = typeof global !== 'undefined' ? global : this, oldGlobalMoment, @@ -23042,6 +23310,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? _f : null, _l : null, _strict : null, + _tzm : null, _isUTC : null, _offset : null, // optional. Combine with _isUTC _pf : null, @@ -23150,6 +23419,16 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? // format function strings formatFunctions = {}, + // default relative time thresholds + relativeTimeThresholds = { + s: 45, //seconds to minutes + m: 45, //minutes to hours + h: 22, //hours to days + dd: 25, //days to month (month == 1) + dm: 45, //days to months (months > 1) + dy: 345 //days to year + }, + // tokens to ordinalize and pad ordinalizeTokens = 'DDD w W M D d'.split(' '), paddedTokens = 'M D H h m s w W'.split(' '), @@ -23289,6 +23568,16 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin']; + // Pick the first defined of two or three arguments. dfl comes from + // default. + function dfl(a, b, c) { + switch (arguments.length) { + case 2: return a != null ? a : b; + case 3: return a != null ? a : b != null ? b : c; + default: throw new Error("Implement me"); + } + } + function defaultParsingFlags() { // We need to deep clone this object, and es5 standard is not very // helpful. @@ -24157,30 +24446,86 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? config._useUTC = true; config._tzm = timezoneMinutesFromString(input); break; + // WEEKDAY - human + case 'dd': + case 'ddd': + case 'dddd': + a = getLangDefinition(config._l).weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (a != null) { + config._w = config._w || {}; + config._w['d'] = a; + } else { + config._pf.invalidWeekday = input; + } + break; + // WEEK, WEEK DAY - numeric case 'w': case 'ww': case 'W': case 'WW': case 'd': - case 'dd': - case 'ddd': - case 'dddd': case 'e': case 'E': token = token.substr(0, 1); /* falls through */ - case 'gg': case 'gggg': - case 'GG': case 'GGGG': case 'GGGGG': token = token.substr(0, 2); if (input) { config._w = config._w || {}; - config._w[token] = input; + config._w[token] = toInt(input); } break; + case 'gg': + case 'GG': + config._w = config._w || {}; + config._w[token] = moment.parseTwoDigitYear(input); + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, lang; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); + week = dfl(w.W, 1); + weekday = dfl(w.E, 1); + } else { + lang = getLangDefinition(config._l); + dow = lang._week.dow; + doy = lang._week.doy; + + weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); + week = dfl(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; } // convert an array to a date. @@ -24188,8 +24533,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? // note: all values past the year are optional and will default to the lowest possible value. // [year, month, day , hour, minute, second, millisecond] function dateFromConfig(config) { - var i, date, input = [], currentDate, - yearToUse, fixYear, w, temp, lang, weekday, week; + var i, date, input = [], currentDate, yearToUse; if (config._d) { return; @@ -24199,39 +24543,12 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? //compute day of the year from weeks and weekdays if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { - fixYear = function (val) { - var intVal = parseInt(val, 10); - return val ? - (val.length < 3 ? (intVal > 68 ? 1900 + intVal : 2000 + intVal) : intVal) : - (config._a[YEAR] == null ? moment().weekYear() : config._a[YEAR]); - }; - - w = config._w; - if (w.GG != null || w.W != null || w.E != null) { - temp = dayOfYearFromWeeks(fixYear(w.GG), w.W || 1, w.E, 4, 1); - } - else { - lang = getLangDefinition(config._l); - weekday = w.d != null ? parseWeekday(w.d, lang) : - (w.e != null ? parseInt(w.e, 10) + lang._week.dow : 0); - - week = parseInt(w.w, 10) || 1; - - //if we're parsing 'd', then the low day numbers may be next week - if (w.d != null && weekday < lang._week.dow) { - week++; - } - - temp = dayOfYearFromWeeks(fixYear(w.gg), week, weekday, lang._week.doy, lang._week.dow); - } - - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; + dayOfYearFromWeekInfo(config); } //if the day of the year is set, figure out what it is if (config._dayOfYear) { - yearToUse = config._a[YEAR] == null ? currentDate[YEAR] : config._a[YEAR]; + yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); if (config._dayOfYear > daysInYear(yearToUse)) { config._pf._overflowDayOfYear = true; @@ -24256,11 +24573,12 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; } - // add the offsets to the time to be parsed so that we can have a clean array for checking isValid - input[HOUR] += toInt((config._tzm || 0) / 60); - input[MINUTE] += toInt((config._tzm || 0) % 60); - config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + // Apply timezone offset from input. The actual zone can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() + config._tzm); + } } function dateFromObject(config) { @@ -24300,6 +24618,11 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? // date from string and format string function makeDateFromStringAndFormat(config) { + if (config._f === moment.ISO_8601) { + parseISO(config); + return; + } + config._a = []; config._pf.empty = true; @@ -24412,7 +24735,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? } // date from iso format - function makeDateFromString(config) { + function parseISO(config) { var i, l, string = config._i, match = isoRegex.exec(string); @@ -24436,8 +24759,16 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? config._f += "Z"; } makeDateFromStringAndFormat(config); + } else { + config._isValid = false; } - else { + } + + // date from iso format or fallback + function makeDateFromString(config) { + parseISO(config); + if (config._isValid === false) { + delete config._isValid; moment.createFromInputFallback(config); } } @@ -24518,15 +24849,15 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? hours = round(minutes / 60), days = round(hours / 24), years = round(days / 365), - args = seconds < 45 && ['s', seconds] || + args = seconds < relativeTimeThresholds.s && ['s', seconds] || minutes === 1 && ['m'] || - minutes < 45 && ['mm', minutes] || + minutes < relativeTimeThresholds.m && ['mm', minutes] || hours === 1 && ['h'] || - hours < 22 && ['hh', hours] || + hours < relativeTimeThresholds.h && ['hh', hours] || days === 1 && ['d'] || - days <= 25 && ['dd', days] || - days <= 45 && ['M'] || - days < 345 && ['MM', round(days / 30)] || + days <= relativeTimeThresholds.dd && ['dd', days] || + days <= relativeTimeThresholds.dm && ['M'] || + days < relativeTimeThresholds.dy && ['MM', round(days / 30)] || years === 1 && ['y'] || ['yy', years]; args[2] = withoutSuffix; args[3] = milliseconds > 0; @@ -24572,6 +24903,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; + d = d === 0 ? 7 : d; weekday = weekday != null ? weekday : firstDayOfWeek; daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; @@ -24647,6 +24979,40 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? config._d = new Date(config._i); }); + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return moment(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + moment.min = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + }; + + moment.max = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + }; + // creating with utc moment.utc = function (input, format, lang, strict) { var c; @@ -24743,6 +25109,9 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? // default format moment.defaultFormat = isoFormat; + // constant that refers to the ISO standard + moment.ISO_8601 = function () {}; + // Plugins that add properties should also add the key here (null value), // so we can properly clone ourselves. moment.momentProperties = momentProperties; @@ -24751,6 +25120,15 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? // It is intended to keep the offset in sync with the timezone. moment.updateOffset = function () {}; + // This function allows you to set a threshold for relative time strings + moment.relativeTimeThreshold = function(threshold, limit) { + if (relativeTimeThresholds[threshold] === undefined) { + return false; + } + relativeTimeThresholds[threshold] = limit; + return true; + }; + // This function will load languages and then set the global language. If // no arguments are passed in, it will simply return the current global // language key. @@ -24906,7 +25284,9 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? add : function (input, val) { var dur; // switch args to support add('s', 1) and add(1, 's') - if (typeof input === 'string') { + if (typeof input === 'string' && typeof val === 'string') { + dur = moment.duration(isNaN(+val) ? +input : +val, isNaN(+val) ? val : input); + } else if (typeof input === 'string') { dur = moment.duration(+val, input); } else { dur = moment.duration(input, val); @@ -24918,7 +25298,9 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? subtract : function (input, val) { var dur; // switch args to support subtract('s', 1) and subtract(1, 's') - if (typeof input === 'string') { + if (typeof input === 'string' && typeof val === 'string') { + dur = moment.duration(isNaN(+val) ? +input : +val, isNaN(+val) ? val : input); + } else if (typeof input === 'string') { dur = moment.duration(+val, input); } else { dur = moment.duration(input, val); @@ -24969,10 +25351,11 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? return this.from(moment(), withoutSuffix); }, - calendar : function () { + calendar : function (time) { // We want to compare the start of today, vs this. // Getting start-of-today depends on whether we're zone'd or not. - var sod = makeAs(moment(), this).startOf('day'), + var now = time || moment(), + sod = makeAs(now, this).startOf('day'), diff = this.diff(sod, 'days', true), format = diff < -6 ? 'sameElse' : diff < -1 ? 'lastWeek' : @@ -25067,15 +25450,21 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? return +this.clone().startOf(units) === +makeAs(input, this).startOf(units); }, - min: function (other) { - other = moment.apply(null, arguments); - return other < this ? this : other; - }, - - max: function (other) { - other = moment.apply(null, arguments); - return other > this ? this : other; - }, + min: deprecate( + "moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548", + function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + } + ), + + max: deprecate( + "moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548", + function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + } + ), // keepTime = true means only change the timezone, without affecting // the local hour. So 5:31:26 +0300 --[zone(2, true)]--> 5:31:26 +0200 diff --git a/dist/vis.min.css b/dist/vis.min.css index 6f9c3d0e..e08fd306 100644 --- a/dist/vis.min.css +++ b/dist/vis.min.css @@ -1 +1 @@ -.vis.timeline.rootpanel{position:relative;overflow:hidden;border:1px solid #bfbfbf;box-sizing:border-box}.vis.timeline .vpanel{position:absolute;overflow:hidden;box-sizing:border-box}.vis.timeline .vpanel.side{border-right:1px solid #bfbfbf}.vis.timeline .vpanel.side.hidden{display:none}.vis.timeline .labelset{position:relative;width:100%;overflow:hidden;box-sizing:border-box}.vis.timeline .labelset .vlabel{position:relative;left:0;top:0;width:100%;color:#4d4d4d;box-sizing:border-box}.vis.timeline.top .labelset .vlabel{border-top:1px solid #bfbfbf;border-bottom:none}.vis.timeline.bottom .labelset .vlabel{border-top:none;border-bottom:1px solid #bfbfbf}.vis.timeline .labelset .vlabel .inner{display:inline-block;padding:5px}.vis.timeline .itemset{position:relative;padding:0;margin:0;box-sizing:border-box}.vis.timeline .axis{overflow:visible}.vis.timeline .group{position:relative;box-sizing:border-box}.vis.timeline.top .group{border-top:1px solid #bfbfbf;border-bottom:none}.vis.timeline.bottom .group{border-top:none;border-bottom:1px solid #bfbfbf}.vis.timeline .item{position:absolute;color:#1A1A1A;border-color:#97B0F8;border-width:1px;background-color:#D5DDF6;display:inline-block;padding:5px}.vis.timeline .item.selected{border-color:#FFC200;background-color:#FFF785;z-index:999}.vis.timeline.editable .item.selected{cursor:move}.vis.timeline .item.point.selected{background-color:#FFF785}.vis.timeline .item.box{text-align:center;border-style:solid;border-radius:2px}.vis.timeline .item.point{background:0 0}.vis.timeline .item.dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}.vis.timeline .item.range,.vis.timeline .item.rangeoverflow{border-style:solid;border-radius:2px;box-sizing:border-box}.vis.timeline .item.range .content,.vis.timeline .item.rangeoverflow .content{position:relative;display:inline-block}.vis.timeline .item.range .content{overflow:hidden;max-width:100%}.vis.timeline .item.line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis.timeline .item .content{white-space:nowrap;overflow:hidden}.vis.timeline .item .delete{background:url(img/timeline/delete.png) no-repeat top center;position:absolute;width:24px;height:24px;top:0;right:-24px;cursor:pointer}.vis.timeline .item.range .drag-left,.vis.timeline .item.rangeoverflow .drag-left{position:absolute;width:24px;height:100%;top:0;left:-4px;cursor:w-resize;z-index:10000}.vis.timeline .item.range .drag-right,.vis.timeline .item.rangeoverflow .drag-right{position:absolute;width:24px;height:100%;top:0;right:-4px;cursor:e-resize;z-index:10001}.vis.timeline .timeaxis{position:absolute}.vis.timeline .timeaxis .text{position:absolute;color:#4d4d4d;padding:3px;white-space:nowrap}.vis.timeline .timeaxis .text.measure{position:absolute;padding-left:0;padding-right:0;margin-left:0;margin-right:0;visibility:hidden}.vis.timeline .timeaxis .grid.vertical{position:absolute;width:0;border-right:1px solid}.vis.timeline .timeaxis .grid.horizontal{position:absolute;left:0;width:100%;height:0;border-bottom:1px solid}.vis.timeline .timeaxis .grid.minor{border-color:#e5e5e5}.vis.timeline .timeaxis .grid.major{border-color:#bfbfbf}.vis.timeline .currenttime{background-color:#FF7F6E;width:2px;z-index:9}.vis.timeline .customtime{background-color:#6E94FF;width:2px;cursor:move;z-index:9}div.graph-manipulationDiv{border-width:0;border-bottom:1px;border-style:solid;border-color:#d6d9d8;background:#fff;background:-moz-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#fff),color-stop(48%,#fcfcfc),color-stop(50%,#fafafa),color-stop(100%,#fcfcfc));background:-webkit-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-o-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-ms-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:linear-gradient(to bottom,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#fcfcfc', GradientType=0);width:600px;height:30px;z-index:10;position:absolute}div.graph-manipulation-editMode{height:30px;z-index:10;position:absolute;margin-top:20px}div.graph-manipulation-closeDiv{height:30px;width:30px;z-index:11;position:absolute;margin-top:3px;margin-left:590px;background-position:0 0;background-repeat:no-repeat;background-image:url(img/graph/cross.png);cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.graph-manipulationUI{font-family:verdana;font-size:12px;-moz-border-radius:15px;border-radius:15px;display:inline-block;background-position:0 0;background-repeat:no-repeat;height:24px;margin:-14px 0 0 10px;vertical-align:middle;cursor:pointer;padding:0 8px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.graph-manipulationUI:hover{box-shadow:1px 1px 8px rgba(0,0,0,.2)}span.graph-manipulationUI:active{box-shadow:1px 1px 8px rgba(0,0,0,.5)}span.graph-manipulationUI.back{background-image:url(img/graph/backIcon.png)}span.graph-manipulationUI.none:hover{box-shadow:1px 1px 8px rgba(0,0,0,0);cursor:default}span.graph-manipulationUI.none:active{box-shadow:1px 1px 8px rgba(0,0,0,0)}span.graph-manipulationUI.none{padding:0}span.graph-manipulationUI.notification{margin:2px;font-weight:700}span.graph-manipulationUI.add{background-image:url(img/graph/addNodeIcon.png)}span.graph-manipulationUI.edit{background-image:url(img/graph/editIcon.png)}span.graph-manipulationUI.edit.editmode{background-color:#fcfcfc;border-style:solid;border-width:1px;border-color:#ccc}span.graph-manipulationUI.connect{background-image:url(img/graph/connectIcon.png)}span.graph-manipulationUI.delete{background-image:url(img/graph/deleteIcon.png)}span.graph-manipulationLabel{margin:0 0 0 23px;line-height:25px}div.graph-seperatorLine{display:inline-block;width:1px;height:20px;background-color:#bdbdbd;margin:5px 7px 0 15px}div.graph-navigation{width:34px;height:34px;z-index:10;-moz-border-radius:17px;border-radius:17px;position:absolute;display:inline-block;background-position:2px 2px;background-repeat:no-repeat;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.graph-navigation:hover{box-shadow:0 0 3px 3px rgba(56,207,21,.3)}div.graph-navigation.active,div.graph-navigation:active{box-shadow:0 0 1px 3px rgba(56,207,21,.95)}div.graph-navigation.up{background-image:url(img/graph/upArrow.png);bottom:50px;left:55px}div.graph-navigation.down{background-image:url(img/graph/downArrow.png);bottom:10px;left:55px}div.graph-navigation.left{background-image:url(img/graph/leftArrow.png);bottom:10px;left:15px}div.graph-navigation.right{background-image:url(img/graph/rightArrow.png);bottom:10px;left:95px}div.graph-navigation.zoomIn{background-image:url(img/graph/plus.png);bottom:10px;right:15px}div.graph-navigation.zoomOut{background-image:url(img/graph/minus.png);bottom:10px;right:55px}div.graph-navigation.zoomExtends{background-image:url(img/graph/zoomExtends.png);bottom:50px;right:15px} \ No newline at end of file +.vis.timeline.root{position:relative;border:1px solid #bfbfbf;overflow:hidden;padding:0;margin:0;box-sizing:border-box}.vis.timeline .vispanel{position:absolute;padding:0;margin:0;box-sizing:border-box}.vis.timeline .vispanel.bottom,.vis.timeline .vispanel.center,.vis.timeline .vispanel.left,.vis.timeline .vispanel.right,.vis.timeline .vispanel.top{border:1px #bfbfbf}.vis.timeline .vispanel.center,.vis.timeline .vispanel.left,.vis.timeline .vispanel.right{border-top-style:solid;border-bottom-style:solid;overflow:hidden}.vis.timeline .vispanel.bottom,.vis.timeline .vispanel.center,.vis.timeline .vispanel.top{border-left-style:solid;border-right-style:solid}.vis.timeline .background{overflow:hidden}.vis.timeline .vispanel>.content{position:relative}.vis.timeline .vispanel .shadow{position:absolute;width:100%;height:1px;box-shadow:0 0 10px rgba(0,0,0,.8)}.vis.timeline .vispanel .shadow.top{top:-1px;left:0}.vis.timeline .vispanel .shadow.bottom{bottom:-1px;left:0}.vis.timeline .labelset{position:relative;width:100%;overflow:hidden;box-sizing:border-box}.vis.timeline .labelset .vlabel{position:relative;left:0;top:0;width:100%;color:#4d4d4d;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis.timeline .labelset .vlabel:last-child{border-bottom:none}.vis.timeline .labelset .vlabel .inner{display:inline-block;padding:5px}.vis.timeline .labelset .vlabel .inner.hidden{padding:0}.vis.timeline .itemset{position:relative;padding:0;margin:0;box-sizing:border-box}.vis.timeline .itemset .background,.vis.timeline .itemset .foreground{position:absolute;width:100%;height:100%}.vis.timeline .axis{position:absolute;width:100%;height:0;left:1px;z-index:1}.vis.timeline .foreground .group{position:relative;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis.timeline .foreground .group:last-child{border-bottom:none}.vis.timeline .item{position:absolute;color:#1A1A1A;border-color:#97B0F8;border-width:1px;background-color:#D5DDF6;display:inline-block;padding:5px}.vis.timeline .item.selected{border-color:#FFC200;background-color:#FFF785;z-index:999}.vis.timeline .editable .item.selected{cursor:move}.vis.timeline .item.point.selected{background-color:#FFF785}.vis.timeline .item.box{text-align:center;border-style:solid;border-radius:2px}.vis.timeline .item.point{background:0 0}.vis.timeline .item.dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}.vis.timeline .item.range,.vis.timeline .item.rangeoverflow{border-style:solid;border-radius:2px;box-sizing:border-box}.vis.timeline .item.range .content,.vis.timeline .item.rangeoverflow .content{position:relative;display:inline-block}.vis.timeline .item.range .content{overflow:hidden;max-width:100%}.vis.timeline .item.line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis.timeline .item .content{white-space:nowrap;overflow:hidden}.vis.timeline .item .delete{background:url(img/timeline/delete.png) no-repeat top center;position:absolute;width:24px;height:24px;top:0;right:-24px;cursor:pointer}.vis.timeline .item.range .drag-left,.vis.timeline .item.rangeoverflow .drag-left{position:absolute;width:24px;height:100%;top:0;left:-4px;cursor:w-resize;z-index:10000}.vis.timeline .item.range .drag-right,.vis.timeline .item.rangeoverflow .drag-right{position:absolute;width:24px;height:100%;top:0;right:-4px;cursor:e-resize;z-index:10001}.vis.timeline .timeaxis{position:relative;overflow:hidden}.vis.timeline .timeaxis.foreground{top:0;left:0;width:100%}.vis.timeline .timeaxis.background{position:absolute;top:0;left:0;width:100%;height:100%}.vis.timeline .timeaxis .text{position:absolute;color:#4d4d4d;padding:3px;white-space:nowrap}.vis.timeline .timeaxis .text.measure{position:absolute;padding-left:0;padding-right:0;margin-left:0;margin-right:0;visibility:hidden}.vis.timeline .timeaxis .grid.vertical{position:absolute;width:0;border-right:1px solid}.vis.timeline .timeaxis .grid.minor{border-color:#e5e5e5}.vis.timeline .timeaxis .grid.major{border-color:#bfbfbf}.vis.timeline .currenttime{background-color:#FF7F6E;width:2px;z-index:1}.vis.timeline .customtime{background-color:#6E94FF;width:2px;cursor:move;z-index:1}div.graph-manipulationDiv{border-width:0;border-bottom:1px;border-style:solid;border-color:#d6d9d8;background:#fff;background:-moz-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#fff),color-stop(48%,#fcfcfc),color-stop(50%,#fafafa),color-stop(100%,#fcfcfc));background:-webkit-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-o-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-ms-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:linear-gradient(to bottom,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#fcfcfc', GradientType=0);width:600px;height:30px;z-index:10;position:absolute}div.graph-manipulation-editMode{height:30px;z-index:10;position:absolute;margin-top:20px}div.graph-manipulation-closeDiv{height:30px;width:30px;z-index:11;position:absolute;margin-top:3px;margin-left:590px;background-position:0 0;background-repeat:no-repeat;background-image:url(img/graph/cross.png);cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.graph-manipulationUI{font-family:verdana;font-size:12px;-moz-border-radius:15px;border-radius:15px;display:inline-block;background-position:0 0;background-repeat:no-repeat;height:24px;margin:-14px 0 0 10px;vertical-align:middle;cursor:pointer;padding:0 8px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.graph-manipulationUI:hover{box-shadow:1px 1px 8px rgba(0,0,0,.2)}span.graph-manipulationUI:active{box-shadow:1px 1px 8px rgba(0,0,0,.5)}span.graph-manipulationUI.back{background-image:url(img/graph/backIcon.png)}span.graph-manipulationUI.none:hover{box-shadow:1px 1px 8px transparent;cursor:default}span.graph-manipulationUI.none:active{box-shadow:1px 1px 8px transparent}span.graph-manipulationUI.none{padding:0}span.graph-manipulationUI.notification{margin:2px;font-weight:700}span.graph-manipulationUI.add{background-image:url(img/graph/addNodeIcon.png)}span.graph-manipulationUI.edit{background-image:url(img/graph/editIcon.png)}span.graph-manipulationUI.edit.editmode{background-color:#fcfcfc;border-style:solid;border-width:1px;border-color:#ccc}span.graph-manipulationUI.connect{background-image:url(img/graph/connectIcon.png)}span.graph-manipulationUI.delete{background-image:url(img/graph/deleteIcon.png)}span.graph-manipulationLabel{margin:0 0 0 23px;line-height:25px}div.graph-seperatorLine{display:inline-block;width:1px;height:20px;background-color:#bdbdbd;margin:5px 7px 0 15px}div.graph-navigation{width:34px;height:34px;z-index:10;-moz-border-radius:17px;border-radius:17px;position:absolute;display:inline-block;background-position:2px 2px;background-repeat:no-repeat;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.graph-navigation:hover{box-shadow:0 0 3px 3px rgba(56,207,21,.3)}div.graph-navigation.active,div.graph-navigation:active{box-shadow:0 0 1px 3px rgba(56,207,21,.95)}div.graph-navigation.up{background-image:url(img/graph/upArrow.png);bottom:50px;left:55px}div.graph-navigation.down{background-image:url(img/graph/downArrow.png);bottom:10px;left:55px}div.graph-navigation.left{background-image:url(img/graph/leftArrow.png);bottom:10px;left:15px}div.graph-navigation.right{background-image:url(img/graph/rightArrow.png);bottom:10px;left:95px}div.graph-navigation.zoomIn{background-image:url(img/graph/plus.png);bottom:10px;right:15px}div.graph-navigation.zoomOut{background-image:url(img/graph/minus.png);bottom:10px;right:55px}div.graph-navigation.zoomExtends{background-image:url(img/graph/zoomExtends.png);bottom:50px;right:15px} \ No newline at end of file diff --git a/dist/vis.min.js b/dist/vis.min.js index 5adfc5c1..7ade499b 100644 --- a/dist/vis.min.js +++ b/dist/vis.min.js @@ -4,8 +4,8 @@ * * A dynamic, browser-based visualization library. * - * @version 1.1.0 - * @date 2014-06-06 + * @version 2.0.0 + * @date 2014-06-19 * * @license * Copyright (C) 2011-2014 Almende B.V, http://almende.com @@ -22,13 +22,14 @@ * License for the specific language governing permissions and limitations under * the License. */ -!function(t){if("object"==typeof exports)module.exports=t();else if("function"==typeof define&&define.amd)define(t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.vis=t()}}(function(){var define,module,exports;return function t(e,i,s){function n(a,r){if(!i[a]){if(!e[a]){var h="function"==typeof require&&require;if(!r&&h)return h(a,!0);if(o)return o(a,!0);throw new Error("Cannot find module '"+a+"'")}var d=i[a]={exports:{}};e[a][0].call(d.exports,function(t){var i=e[a][1][t];return n(i?i:t)},d,d.exports,t,e,i,s)}return i[a].exports}for(var o="function"==typeof require&&require,a=0;ae?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}function Slider(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 moment="undefined"!=typeof window&&window.moment||require("moment"),Emitter=require("emitter-component"),Hammer;Hammer="undefined"!=typeof window?window.Hammer||require("hammerjs"):function(){throw Error("hammer.js is only available in a browser, not in node.js.")};var mousetrap;if(mousetrap="undefined"!=typeof window?window.mousetrap||require("mousetrap"):function(){throw Error("mouseTrap is only available in a browser, not in node.js.")},!Array.prototype.indexOf){Array.prototype.indexOf=function(t){for(var e=0;ei;++i)t.call(e||this,this[i],i,this)}),Array.prototype.map||(Array.prototype.map=function(t,e){var i,s,n;if(null==this)throw new TypeError(" this is null or not defined");var o=Object(this),a=o.length>>>0;if("function"!=typeof t)throw new TypeError(t+" is not a function");for(e&&(i=e),s=new Array(a),n=0;a>n;){var r,h;n in o&&(r=o[n],h=t.call(i,r,n,o),s[n]=h),n++}return s}),Array.prototype.filter||(Array.prototype.filter=function(t){"use strict";if(null==this)throw new TypeError;var e=Object(this),i=e.length>>>0;if("function"!=typeof t)throw new TypeError;for(var s=[],n=arguments[1],o=0;i>o;o++)if(o in e){var a=e[o];t.call(n,a,o,e)&&s.push(a)}return s}),Object.keys||(Object.keys=function(){var t=Object.prototype.hasOwnProperty,e=!{toString:null}.propertyIsEnumerable("toString"),i=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],s=i.length;return function(n){if("object"!=typeof n&&"function"!=typeof n||null===n)throw new TypeError("Object.keys called on non-object");var o=[];for(var a in n)t.call(n,a)&&o.push(a);if(e)for(var r=0;s>r;r++)t.call(n,i[r])&&o.push(i[r]);return o}}()),Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),Function.prototype.bind||(Function.prototype.bind=function(t){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var e=Array.prototype.slice.call(arguments,1),i=this,s=function(){},n=function(){return i.apply(this instanceof s&&t?this:t,e.concat(Array.prototype.slice.call(arguments)))};return s.prototype=this.prototype,n.prototype=new s,n}),Object.create||(Object.create=function(t){function e(){}if(arguments.length>1)throw new Error("Object.create implementation only accepts the first parameter.");return e.prototype=t,new e}),Function.prototype.bind||(Function.prototype.bind=function(t){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var e=Array.prototype.slice.call(arguments,1),i=this,s=function(){},n=function(){return i.apply(this instanceof s&&t?this:t,e.concat(Array.prototype.slice.call(arguments)))};return s.prototype=this.prototype,n.prototype=new s,n});var util={};util.isNumber=function(t){return t instanceof Number||"number"==typeof t},util.isString=function(t){return t instanceof String||"string"==typeof t},util.isDate=function(t){if(t instanceof Date)return!0;if(util.isString(t)){var e=ASPDateRegex.exec(t);if(e)return!0;if(!isNaN(Date.parse(t)))return!0}return!1},util.isDataTable=function(t){return"undefined"!=typeof google&&google.visualization&&google.visualization.DataTable&&t instanceof google.visualization.DataTable},util.randomUUID=function(){var t=function(){return Math.floor(65536*Math.random()).toString(16)};return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},util.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)&&void 0!==s[n]&&(t[n]=s[n])}return t},util.deepExtend=function t(e,i){if(Array.isArray(i))throw new TypeError("Arrays are not supported by deepExtend");for(var s in i)if(i.hasOwnProperty(s))if(i[s]&&i[s].constructor===Object)void 0===e[s]&&(e[s]={}),e[s].constructor===Object?t(e[s],i[s]):e[s]=i[s];else{if(Array.isArray(i[s]))throw new TypeError("Arrays are not supported by deepExtend");e[s]=i[s]}return e},util.equalArray=function(t,e){if(t.length!=e.length)return!1;for(var i=0,s=t.length;s>i;i++)if(t[i]!=e[i])return!1;return!0},util.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(util.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(util.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])):moment(t).toDate();throw new Error("Cannot convert object of type "+util.getType(t)+" to type Date");case"Moment":if(util.isNumber(t))return moment(t);if(t instanceof Date)return moment(t.valueOf());if(moment.isMoment(t))return moment(t);if(util.isString(t))return i=ASPDateRegex.exec(t),moment(i?Number(i[1]):t);throw new Error("Cannot convert object of type "+util.getType(t)+" to type Date");case"ISODate":if(util.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(moment.isMoment(t))return t.toDate().toISOString();if(util.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 "+util.getType(t)+" to type ISODate");case"ASPDate":if(util.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(util.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 "+util.getType(t)+" to type ASPDate");default:throw new Error("Cannot convert object of type "+util.getType(t)+' to type "'+e+'"')}};var ASPDateRegex=/^\/?Date\((\-?\d+)/i;util.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},util.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},util.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},util.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)},util.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)},util.addClassName=function(t,e){var i=t.className.split(" ");-1==i.indexOf(e)&&(i.push(e),t.className=i.join(" "))},util.removeClassName=function(t,e){var i=t.className.split(" "),s=i.indexOf(e);-1!=s&&(i.splice(s,1),t.className=i.join(" "))},util.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)},util.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},util.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},util.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)},util.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)},util.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},util.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},util.option={},util.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},util.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},util.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},util.option.asSize=function(t,e){return"function"==typeof t&&(t=t()),util.isString(t)?t:util.isNumber(t)?t+"px":e||null},util.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},util.GiveDec=function GiveDec(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)},util.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},util.parseColor=function(t){var e;if(util.isString(t))if(util.isValidHex(t)){var i=util.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=util.HSVToHex(n.h,n.h,n.v),a=util.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,util.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),util.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},util.hexToRGB=function(t){t=t.replace("#","").toUpperCase();var e=util.GiveDec(t.substring(0,1)),i=util.GiveDec(t.substring(1,2)),s=util.GiveDec(t.substring(2,3)),n=util.GiveDec(t.substring(3,4)),o=util.GiveDec(t.substring(4,5)),a=util.GiveDec(t.substring(5,6)),r=16*e+i,h=16*s+n,i=16*o+a;return{r:r,g:h,b:i}},util.RGBToHex=function(t,e,i){var s=util.GiveHex(Math.floor(t/16)),n=util.GiveHex(t%16),o=util.GiveHex(Math.floor(e/16)),a=util.GiveHex(e%16),r=util.GiveHex(Math.floor(i/16)),h=util.GiveHex(i%16),d=s+n+o+a+r+h;return"#"+d},util.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}},util.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)}},util.HSVToHex=function(t,e,i){var s=util.HSVToRGB(t,e,i);return util.RGBToHex(s.r,s.g,s.b)},util.hexToHSV=function(t){var e=util.hexToRGB(t);return util.RGBToHSV(e.r,e.g,e.b)},util.isValidHex=function(t){var e=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t);return e},util.copyObject=function(t,e){for(var i in t)t.hasOwnProperty(i)&&("object"==typeof t[i]?(e[i]={},util.copyObject(t[i],e[i])):e[i]=t[i])},DataSet.prototype.on=function(t,e){var i=this.subscribers[t];i||(i=[],this.subscribers[t]=i),i.push({callback:e})},DataSet.prototype.subscribe=DataSet.prototype.on,DataSet.prototype.off=function(t,e){var i=this.subscribers[t];i&&(this.subscribers[t]=i.filter(function(t){return t.callback!=e}))},DataSet.prototype.unsubscribe=DataSet.prototype.off,DataSet.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;no;o++)i=n._addItem(t[o]),s.push(i);else if(util.isDataTable(t))for(var r=this._getColumnNames(t),h=0,d=t.getNumberOfRows();d>h;h++){for(var l={},c=0,u=r.length;u>c;c++){var p=r[c];l[p]=t.getValue(h,c)}i=n._addItem(l),s.push(i)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=n._addItem(t),s.push(i)}return s.length&&this._trigger("add",{items:s},e),s},DataSet.prototype.update=function(t,e){var i=[],s=[],n=this,o=n.fieldId,a=function(t){var e=t[o];n.data[e]?(e=n._updateItem(t),s.push(e)):(e=n._addItem(t),i.push(e))};if(t instanceof Array)for(var r=0,h=t.length;h>r;r++)a(t[r]);else if(util.isDataTable(t))for(var d=this._getColumnNames(t),l=0,c=t.getNumberOfRows();c>l;l++){for(var u={},p=0,m=d.length;m>p;p++){var g=d[p];u[g]=t.getValue(l,p)}a(u)}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)},DataSet.prototype.get=function(){var t,e,i,s,n=this,o=this.showInternalIds,a=util.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.type){if(r="DataTable"==i.type?"DataTable":"Array",s&&r!=util.getType(s))throw new Error('Type of parameter "data" ('+util.getType(s)+") does not correspond with specified options.type ("+i.type+")");if("DataTable"==r&&!util.isDataTable(s))throw new Error('Parameter "data" must be a DataTable when options.type is "DataTable"')}else r=s&&"DataTable"==util.getType(s)?"DataTable":"Array";void 0!=i&&void 0!=i.showInternalIds&&(this.showInternalIds=i.showInternalIds);var h,d,l,c,u=i&&i.convert||this.options.convert,p=i&&i.filter,m=[];if(void 0!=t)h=n._getItem(t,u),p&&!p(h)&&(h=null);else if(void 0!=e)for(l=0,c=e.length;c>l;l++)h=n._getItem(e[l],u),(!p||p(h))&&m.push(h);else for(d in this.data)this.data.hasOwnProperty(d)&&(h=n._getItem(d,u),(!p||p(h))&&m.push(h));if(this.showInternalIds=o,i&&i.order&&void 0==t&&this._sort(m,i.order),i&&i.fields){var g=i.fields;if(void 0!=t)h=this._filterFields(h,g);else for(l=0,c=m.length;c>l;l++)m[l]=this._filterFields(m[l],g)}if("DataTable"==r){var f=this._getColumnNames(s);if(void 0!=t)n._appendRow(s,f,h);else for(l=0,c=m.length;c>l;l++)n._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},DataSet.prototype.getIds=function(t){var e,i,s,n,o,a=this.data,r=t&&t.filter,h=t&&t.order,d=t&&t.convert||this.options.convert,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},DataSet.prototype.forEach=function(t,e){var i,s,n=e&&e.filter,o=e&&e.convert||this.options.convert,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))},DataSet.prototype.map=function(t,e){var i,s=e&&e.filter,n=e&&e.convert||this.options.convert,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},DataSet.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},DataSet.prototype._sort=function(t,e){if(util.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)}},DataSet.prototype.remove=function(t,e){var i,s,n,o=[];if(t instanceof Array)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},DataSet.prototype._remove=function(t){if(util.isNumber(t)||util.isString(t)){if(this.data[t])return delete this.data[t],delete this.internalIds[t],t}else if(t instanceof Object){var e=t[this.fieldId];if(e&&this.data[e])return delete this.data[e],delete this.internalIds[e],e}return null},DataSet.prototype.clear=function(t){var e=Object.keys(this.data);return this.data={},this.internalIds={},this._trigger("remove",{items:e},t),e},DataSet.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},DataSet.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},DataSet.prototype.distinct=function(t){var e=this.data,i=[],s=this.options.convert[t],n=0;for(var o in e)if(e.hasOwnProperty(o)){for(var a=e[o],r=util.convert(a[t],s),h=!1,d=0;n>d;d++)if(i[d]==r){h=!0;break}h||void 0===r||(i[n]=r,n++)}return i},DataSet.prototype._addItem=function(t){var e=t[this.fieldId];if(void 0!=e){if(this.data[e])throw new Error("Cannot add item: item with id "+e+" already exists")}else e=util.randomUUID(),t[this.fieldId]=e,this.internalIds[e]=t;var i={};for(var s in t)if(t.hasOwnProperty(s)){var n=this.convert[s];i[s]=util.convert(t[s],n)}return this.data[e]=i,e},DataSet.prototype._getItem=function(t,e){var i,s,n=this.data[t];if(!n)return null;var o={},a=this.fieldId,r=this.internalIds;if(e)for(i in n)n.hasOwnProperty(i)&&(s=n[i],i==a&&s in r&&!this.showInternalIds||(o[i]=util.convert(s,e[i])));else for(i in n)n.hasOwnProperty(i)&&(s=n[i],i==a&&s in r&&!this.showInternalIds||(o[i]=s));return o},DataSet.prototype._updateItem=function(t){var e=t[this.fieldId];if(void 0==e)throw new Error("Cannot update item: item has no id (item: "+JSON.stringify(t)+")");var i=this.data[e];if(!i)throw new Error("Cannot update item: no item with id "+e+" found");for(var s in t)if(t.hasOwnProperty(s)){var n=this.convert[s];i[s]=util.convert(t[s],n)}return e},DataSet.prototype.isInternalId=function(t){return t in this.internalIds},DataSet.prototype._getColumnNames=function(t){for(var e=[],i=0,s=t.getNumberOfColumns();s>i;i++)e[i]=t.getColumnId(i)||t.getColumnLabel(i);return e},DataSet.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])}},DataView.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)}},DataView.prototype.get=function(){var t,e,i,s=this,n=util.getType(arguments[0]);"String"==n||"Number"==n||"Array"==n?(t=arguments[0],e=arguments[1],i=arguments[2]):(e=arguments[0],i=arguments[1]);var o=util.extend({},this.options,e);this.options.filter&&e&&e.filter&&(o.filter=function(t){return s.options.filter(t)&&e.filter(t)});var a=[];return void 0!=t&&a.push(t),a.push(o),a.push(i),this.data&&this.data.get.apply(this.data,a)},DataView.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},DataView.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)}},DataView.prototype.on=DataSet.prototype.on,DataView.prototype.off=DataSet.prototype.off,DataView.prototype._trigger=DataSet.prototype._trigger,DataView.prototype.subscribe=DataView.prototype.on,DataView.prototype.unsubscribe=DataView.prototype.off;var stack={};stack.orderByStart=function(t){t.sort(function(t,e){return t.data.start-e.data.start})},stack.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})},stack.stack=function(t,e,i){var s,n;if(i)for(s=0,n=t.length;n>s;s++)t[s].top=null;for(s=0,n=t.length;n>s;s++){var o=t[s];if(null===o.top){o.top=e.axis;do{for(var a=null,r=0,h=t.length;h>r;r++){var d=t[r];if(null!==d.top&&d!==o&&stack.collision(o,d,e.item)){a=d;break}}null!=a&&(o.top=a.top+a.height+e.item)}while(a)}}},stack.nostack=function(t,e){var i,s;for(i=0,s=t.length;s>i;i++)t[i].top=e.axis},stack.collision=function(t,e,i){return t.left-ie.left&&t.top-ie.top},TimeStep.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},TimeStep.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)},TimeStep.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},TimeStep.prototype.roundToMinor=function(){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: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)}if(1!=this.step)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: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)}},TimeStep.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},TimeStep.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case TimeStep.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case TimeStep.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case TimeStep.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case TimeStep.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 TimeStep.SCALE.WEEKDAY: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)}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: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)}if(1!=this.step)switch(this.scale){case TimeStep.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},TimeStep.prototype.setAutoScale=function(t){this.autoScale=t},TimeStep.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,s=864e5,n=36e5,o=6e4,a=1e3,r=1;1e3*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=5),e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=TimeStep.SCALE.MONTH,this.step=3),i>t&&(this.scale=TimeStep.SCALE.MONTH,this.step=1),5*s>t&&(this.scale=TimeStep.SCALE.DAY,this.step=5),2*s>t&&(this.scale=TimeStep.SCALE.DAY,this.step=2),s>t&&(this.scale=TimeStep.SCALE.DAY,this.step=1),s/2>t&&(this.scale=TimeStep.SCALE.WEEKDAY,this.step=1),4*n>t&&(this.scale=TimeStep.SCALE.HOUR,this.step=4),n>t&&(this.scale=TimeStep.SCALE.HOUR,this.step=1),15*o>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=15),10*o>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=10),5*o>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=5),o>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=1),15*a>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=15),10*a>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=10),5*a>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=5),a>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=1),200*r>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=200),100*r>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=100),50*r>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=50),10*r>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=10),5*r>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=5),r>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=1)}},TimeStep.prototype.snap=function(t){var e=new Date(t.valueOf());if(this.scale==TimeStep.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==TimeStep.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==TimeStep.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==TimeStep.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==TimeStep.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==TimeStep.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==TimeStep.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==TimeStep.SCALE.MILLISECOND){var s=this.step>5?this.step/2:1;e.setMilliseconds(Math.round(e.getMilliseconds()/s)*s)}return e},TimeStep.prototype.isMajor=function(){switch(this.scale){case TimeStep.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case TimeStep.SCALE.SECOND:return 0==this.current.getSeconds();case TimeStep.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case TimeStep.SCALE.HOUR:return 0==this.current.getHours();case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:return 1==this.current.getDate();case TimeStep.SCALE.MONTH:return 0==this.current.getMonth();case TimeStep.SCALE.YEAR:return!1;default:return!1}},TimeStep.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case TimeStep.SCALE.MILLISECOND:return moment(t).format("SSS");case TimeStep.SCALE.SECOND:return moment(t).format("s");case TimeStep.SCALE.MINUTE:return moment(t).format("HH:mm");case TimeStep.SCALE.HOUR:return moment(t).format("HH:mm");case TimeStep.SCALE.WEEKDAY:return moment(t).format("ddd D");case TimeStep.SCALE.DAY:return moment(t).format("D");case TimeStep.SCALE.MONTH:return moment(t).format("MMM");case TimeStep.SCALE.YEAR:return moment(t).format("YYYY");default:return""}},TimeStep.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case TimeStep.SCALE.MILLISECOND:return moment(t).format("HH:mm:ss");case TimeStep.SCALE.SECOND:return moment(t).format("D MMMM HH:mm");case TimeStep.SCALE.MINUTE:case TimeStep.SCALE.HOUR:return moment(t).format("ddd D MMMM");case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:return moment(t).format("MMMM YYYY");case TimeStep.SCALE.MONTH:return moment(t).format("YYYY");case TimeStep.SCALE.YEAR:return"";default:return""}},Emitter(Range.prototype),Range.prototype.setOptions=function(t){util.extend(this.options,t),null!==this.start&&null!==this.end&&this.setRange(this.start,this.end)},Range.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.emit("rangechange",s),this.emit("rangechanged",s)}},Range.prototype._applyRange=function(t,e){var i,s=null!=t?util.convert(t,"Date").valueOf():this.start,n=null!=e?util.convert(e,"Date").valueOf():this.end,o=null!=this.options.max?util.convert(this.options.max,"Date").valueOf():null,a=null!=this.options.min?util.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 r=parseFloat(this.options.zoomMin);0>r&&(r=0),r>n-s&&(this.end-this.start===r?(s=this.start,n=this.end):(i=r-(n-s),s-=i/2,n+=i/2))}if(null!==this.options.zoomMax){var h=parseFloat(this.options.zoomMax);0>h&&(h=0),n-s>h&&(this.end-this.start===h?(s=this.start,n=this.end):(i=n-s-h,s+=i/2,n-=i/2))}var d=this.start!=s||this.end!=n;return this.start=s,this.end=n,d},Range.prototype.getRange=function(){return{start:this.start,end:this.end}},Range.prototype.conversion=function(t){return Range.conversion(this.start,this.end,t)},Range.conversion=function(t,e,i){return 0!=i&&e-t!=0?{offset:t,scale:i/(e-t)}:{offset:0,scale:1}};var touchParams={};Range.prototype._onDragStart=function(){if(!touchParams.ignore){touchParams.start=this.start,touchParams.end=this.end;var t=this.parent.frame;t&&(t.style.cursor="move")}},Range.prototype._onDrag=function(t){var e=this.options.direction;if(validateDirection(e),!touchParams.ignore){var i="horizontal"==e?t.gesture.deltaX:t.gesture.deltaY,s=touchParams.end-touchParams.start,n="horizontal"==e?this.parent.width:this.parent.height,o=-i/n*s;this._applyRange(touchParams.start+o,touchParams.end+o),this.emit("rangechange",{start:new Date(this.start),end:new Date(this.end)})}},Range.prototype._onDragEnd=function(){touchParams.ignore||(this.parent.frame&&(this.parent.frame.style.cursor="auto"),this.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end)}))},Range.prototype._onMouseWheel=function(t){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=util.fakeGesture(this,t),n=getPointer(s.center,this.parent.frame),o=this._pointerToDate(n);this.zoom(i,o)}t.preventDefault()},Range.prototype._onTouch=function(t){touchParams.start=this.start,touchParams.end=this.end,touchParams.ignore=!1,touchParams.center=null;var e=ItemSet.itemFromTarget(t);e&&e.selected&&this.options.editable&&(touchParams.ignore=!0)},Range.prototype._onHold=function(){touchParams.ignore=!0},Range.prototype._onPinch=function(t){this.options.direction;if(touchParams.ignore=!0,t.gesture.touches.length>1){touchParams.center||(touchParams.center=getPointer(t.gesture.center,this.parent.frame));var e=1/t.gesture.scale,i=this._pointerToDate(touchParams.center),s=getPointer(t.gesture.center,this.parent.frame),n=(this._pointerToDate(this.parent,s),parseInt(i+(touchParams.start-i)*e)),o=parseInt(i+(touchParams.end-i)*e);this.setRange(n,o)}},Range.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(validateDirection(i),"horizontal"==i){var s=this.parent.width;return e=this.conversion(s),t.x/e.scale+e.offset}var n=this.parent.height;return e=this.conversion(n),t.y/e.scale+e.offset},Range.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)},Range.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},Range.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)},Emitter(Component.prototype),Component.prototype.setOptions=function(t){t&&(util.extend(this.options,t),this.repaint())},Component.prototype.getOption=function(t){var e;return this.options&&(e=this.options[t]),void 0===e&&this.defaultOptions&&(e=this.defaultOptions[t]),e},Component.prototype.getFrame=function(){return null},Component.prototype.repaint=function(){return!1},Component.prototype._isResized=function(){var t=this._previousWidth!==this.width||this._previousHeight!==this.height;return this._previousWidth=this.width,this._previousHeight=this.height,t},Panel.prototype=new Component,Panel.prototype.setOptions=Component.prototype.setOptions,Panel.prototype.getFrame=function(){return this.frame},Panel.prototype.appendChild=function(t){this.childs.push(t),t.parent=this;var e=t.getFrame();e&&(e.parentNode&&e.parentNode.removeChild(e),this.frame.appendChild(e))},Panel.prototype.insertBefore=function(t,e){var i=this.childs.indexOf(e);if(-1!=i){this.childs.splice(i,0,t),t.parent=this;var s=t.getFrame(); -if(s){s.parentNode&&s.parentNode.removeChild(s);var n=e.getFrame();n?this.frame.insertBefore(s,n):this.frame.appendChild(s)}}},Panel.prototype.removeChild=function(t){var e=this.childs.indexOf(t);if(-1!=e){this.childs.splice(e,1),t.parent=null;var i=t.getFrame();i&&i.parentNode&&this.frame.removeChild(i)}},Panel.prototype.hasChild=function(t){var e=this.childs.indexOf(t);return-1!=e},Panel.prototype.repaint=function(){var t=util.option.asString,e=this.options,i=this.getFrame();i.className="vpanel"+(e.className?" "+t(e.className):"");var s=this._repaintChilds();return this._updateSize(),this._isResized()||s},Panel.prototype._repaintChilds=function(){for(var t=!1,e=0,i=this.childs.length;i>e;e++)t=this.childs[e].repaint()||t;return t},Panel.prototype._updateSize=function(){this.frame.style.top=util.option.asSize(this.options.top),this.frame.style.bottom=util.option.asSize(this.options.bottom),this.frame.style.left=util.option.asSize(this.options.left),this.frame.style.right=util.option.asSize(this.options.right),this.frame.style.width=util.option.asSize(this.options.width,"100%"),this.frame.style.height=util.option.asSize(this.options.height,""),this.top=this.frame.offsetTop,this.left=this.frame.offsetLeft,this.width=this.frame.offsetWidth,this.height=this.frame.offsetHeight},RootPanel.prototype=new Panel,RootPanel.prototype._create=function(){this.frame=document.createElement("div"),this.hammer=Hammer(this.frame,{prevent_default:!0}),this.listeners={};var t=this,e=["touch","pinch","tap","doubletap","hold","dragstart","drag","dragend","mousewheel","DOMMouseScroll"];e.forEach(function(e){var i=function(){var i=[e].concat(Array.prototype.slice.call(arguments,0));t.emit.apply(t,i)};t.hammer.on(e,i),t.listeners[e]=i})},RootPanel.prototype.setOptions=function(t){t&&(util.extend(this.options,t),this.repaint(),this._initWatch())},RootPanel.prototype.getFrame=function(){return this.frame},RootPanel.prototype.repaint=function(){var t=this.options,e=t.editable.updateTime||t.editable.updateGroup,i="vis timeline rootpanel "+t.orientation+(e?" editable":"");t.className&&(i+=" "+util.option.asString(i)),this.frame.className=i;var s=this._repaintChilds();this.frame.style.maxHeight=util.option.asSize(this.options.maxHeight,""),this.frame.style.minHeight=util.option.asSize(this.options.minHeight,""),this._updateSize();var n=this._isResized()||s;n&&setTimeout(this.repaint.bind(this),0)},RootPanel.prototype._initWatch=function(){var t=this.getOption("autoResize");t?this._watch():this._unwatch()},RootPanel.prototype._watch=function(){var t=this;this._unwatch();var e=function(){var e=t.getOption("autoResize");return e?void(t.frame&&(t.frame.clientWidth!=t.lastWidth||t.frame.clientHeight!=t.lastHeight)&&(t.lastWidth=t.frame.clientWidth,t.lastHeight=t.frame.clientHeight,t.repaint())):void t._unwatch()};util.addEventListener(window,"resize",e),this.watchTimer=setInterval(e,1e3)},RootPanel.prototype._unwatch=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0)},TimeAxis.prototype=new Component,TimeAxis.prototype.setOptions=Component.prototype.setOptions,TimeAxis.prototype._create=function(){this.frame=document.createElement("div")},TimeAxis.prototype.setRange=function(t){if(!(t instanceof Range||t&&t.start&&t.end))throw new TypeError("Range must be an instance of Range, or an object containing start and end.");this.range=t},TimeAxis.prototype.getFrame=function(){return this.frame},TimeAxis.prototype.repaint=function(){var t=util.option.asSize,e=this.options,i=this.props,s=this.frame;s.className="timeaxis";var n=s.parentNode;if(n){this._calculateCharSize();var o=this.getOption("orientation"),a=this.getOption("showMinorLabels"),r=this.getOption("showMajorLabels"),h=this.parent.height;i.minorLabelHeight=a?i.minorCharHeight:0,i.majorLabelHeight=r?i.majorCharHeight:0,this.height=i.minorLabelHeight+i.majorLabelHeight,this.width=s.offsetWidth,i.minorLineHeight=h+i.minorLabelHeight,i.minorLineWidth=1,i.majorLineHeight=h+this.height,i.majorLineWidth=1;var d=s.nextSibling;n.removeChild(s),"top"==o?(s.style.top="0",s.style.left="0",s.style.bottom="",s.style.width=t(e.width,"100%"),s.style.height=this.height+"px"):(s.style.top="",s.style.bottom="0",s.style.left="0",s.style.width=t(e.width,"100%"),s.style.height=this.height+"px"),this._repaintLabels(),this._repaintLine(),d?n.insertBefore(s,d):n.appendChild(s)}return this._isResized()},TimeAxis.prototype._repaintLabels=function(){var t=this.getOption("orientation"),e=util.convert(this.range.start,"Number"),i=util.convert(this.range.end,"Number"),s=this.options.toTime(7*(this.props.minorCharWidth||10)).valueOf()-this.options.toTime(0).valueOf(),n=new TimeStep(new Date(e),new Date(i),s);this.step=n;var o=this.dom;o.redundant.majorLines=o.majorLines,o.redundant.majorTexts=o.majorTexts,o.redundant.minorLines=o.minorLines,o.redundant.minorTexts=o.minorTexts,o.majorLines=[],o.majorTexts=[],o.minorLines=[],o.minorTexts=[],n.first();for(var a=void 0,r=0;n.hasNext()&&1e3>r;){r++;var h=n.getCurrent(),d=this.options.toScreen(h),l=n.isMajor();this.getOption("showMinorLabels")&&this._repaintMinorText(d,n.getLabelMinor(),t),l&&this.getOption("showMajorLabels")?(d>0&&(void 0==a&&(a=d),this._repaintMajorText(d,n.getLabelMajor(),t)),this._repaintMajorLine(d,t)):this._repaintMinorLine(d,t),n.next()}if(this.getOption("showMajorLabels")){var c=this.options.toTime(0),u=n.getLabelMajor(c),p=u.length*(this.props.majorCharWidth||10)+10;(void 0==a||a>p)&&this._repaintMajorText(0,u,t)}util.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},TimeAxis.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.frame.appendChild(s)}this.dom.minorTexts.push(s),s.childNodes[0].nodeValue=e,"top"==i?(s.style.top=this.props.majorLabelHeight+"px",s.style.bottom=""):(s.style.top="",s.style.bottom=this.props.majorLabelHeight+"px"),s.style.left=t+"px"},TimeAxis.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.frame.appendChild(s)}this.dom.majorTexts.push(s),s.childNodes[0].nodeValue=e,"top"==i?(s.style.top="0px",s.style.bottom=""):(s.style.top="",s.style.bottom="0px"),s.style.left=t+"px"},TimeAxis.prototype._repaintMinorLine=function(t,e){var i=this.dom.redundant.minorLines.shift();i||(i=document.createElement("div"),i.className="grid vertical minor",this.frame.appendChild(i)),this.dom.minorLines.push(i);var s=this.props;"top"==e?(i.style.top=this.props.majorLabelHeight+"px",i.style.bottom=""):(i.style.top="",i.style.bottom=this.props.majorLabelHeight+"px"),i.style.height=s.minorLineHeight+"px",i.style.left=t-s.minorLineWidth/2+"px"},TimeAxis.prototype._repaintMajorLine=function(t,e){var i=this.dom.redundant.majorLines.shift();i||(i=document.createElement("DIV"),i.className="grid vertical major",this.frame.appendChild(i)),this.dom.majorLines.push(i);var s=this.props;"top"==e?(i.style.top="0px",i.style.bottom=""):(i.style.top="",i.style.bottom="0px"),i.style.left=t-s.majorLineWidth/2+"px",i.style.height=s.majorLineHeight+"px"},TimeAxis.prototype._repaintLine=function(){var t=this.dom.line,e=this.frame,i=this.getOption("orientation");this.getOption("showMinorLabels")||this.getOption("showMajorLabels")?(t?(e.removeChild(t),e.appendChild(t)):(t=document.createElement("div"),t.className="grid horizontal major",e.appendChild(t),this.dom.line=t),"top"==i?(t.style.top=this.height+"px",t.style.bottom=""):(t.style.top="",t.style.bottom=this.height+"px")):t&&t.parentNode&&(t.parentNode.removeChild(t),delete this.dom.line)},TimeAxis.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.frame.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.frame.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth},TimeAxis.prototype.snap=function(t){return this.step.snap(t)},CurrentTime.prototype=new Component,CurrentTime.prototype.setOptions=Component.prototype.setOptions,CurrentTime.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},CurrentTime.prototype.getFrame=function(){return this.bar},CurrentTime.prototype.repaint=function(){var t=(this.parent,new Date),e=this.options.toScreen(t);return this.bar.style.left=e+"px",this.bar.title="Current time: "+t,!1},CurrentTime.prototype.start=function(){function t(){e.stop();var i=e.range.conversion(e.parent.width).scale,s=1/i/10;30>s&&(s=30),s>1e3&&(s=1e3),e.repaint(),e.currentTimeTimer=setTimeout(t,s)}var e=this;t()},CurrentTime.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},CustomTime.prototype=new Component,CustomTime.prototype.setOptions=Component.prototype.setOptions,CustomTime.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=Hammer(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))},CustomTime.prototype.getFrame=function(){return this.bar},CustomTime.prototype.repaint=function(){var t=this.options.toScreen(this.customTime);return this.bar.style.left=t+"px",this.bar.title="Time: "+this.customTime,!1},CustomTime.prototype.setCustomTime=function(t){this.customTime=new Date(t.valueOf()),this.repaint()},CustomTime.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},CustomTime.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation(),t.preventDefault()},CustomTime.prototype._onDrag=function(t){if(this.eventParams.dragging){var e=t.gesture.deltaX,i=this.options.toScreen(this.eventParams.customTime)+e,s=this.options.toTime(i);this.setCustomTime(s),this.emit("timechange",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault()}},CustomTime.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.emit("timechanged",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault())};var UNGROUPED="__ungrouped__";ItemSet.prototype=new Panel,ItemSet.types={box:ItemBox,range:ItemRange,rangeoverflow:ItemRangeOverflow,point:ItemPoint},ItemSet.prototype._create=function(){var t=document.createElement("div");t["timeline-itemset"]=this,this.frame=t;var e=document.createElement("div");e.className="background",this.backgroundPanel.frame.appendChild(e),this.dom.background=e;var i=document.createElement("div");i.className="foreground",t.appendChild(i),this.dom.foreground=i;var s=document.createElement("div");s.className="axis",this.dom.axis=s,this.axisPanel.frame.appendChild(s);var n=document.createElement("div");n.className="labelset",this.dom.labelSet=n,this.sidePanel.frame.appendChild(n),this._updateUngrouped(),this.hammer=Hammer(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))},ItemSet.prototype.setOptions=function(t){Component.prototype.setOptions.call(this,t)},ItemSet.prototype.markDirty=function(){this.groupIds=[],this.stackDirty=!0},ItemSet.prototype.hide=function(){this.dom.axis.parentNode&&this.dom.axis.parentNode.removeChild(this.dom.axis),this.dom.background.parentNode&&this.dom.background.parentNode.removeChild(this.dom.background),this.dom.labelSet.parentNode&&this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)},ItemSet.prototype.show=function(){this.dom.axis.parentNode||this.axisPanel.frame.appendChild(this.dom.axis),this.dom.background.parentNode||this.backgroundPanel.frame.appendChild(this.dom.background),this.dom.labelSet.parentNode||this.sidePanel.frame.appendChild(this.dom.labelSet)},ItemSet.prototype.setRange=function(t){if(!(t instanceof Range||t&&t.start&&t.end))throw new TypeError("Range must be an instance of Range, or an object containing start and end.");this.range=t},ItemSet.prototype.setSelection=function(t){var e,i,s,n;if(t){if(!Array.isArray(t))throw new TypeError("Array expected");for(e=0,i=this.selection.length;i>e;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())}},ItemSet.prototype.getSelection=function(){return this.selection.concat([])},ItemSet.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}},ItemSet.prototype.getFrame=function(){return this.frame},ItemSet.prototype.repaint=function(){var t=this.options.margin,e=this.range,i=util.option.asSize,s=util.option.asString,n=this.options,o=this.getOption("orientation"),a=!1,r=this.frame;"number"==typeof t&&(t={item:t,axis:t}),r.className="itemset"+(n.className?" "+s(n.className):""),a=this._orderGroups()||a;var h=this.range.end-this.range.start,d=h!=this.lastVisibleInterval||this.width!=this.lastWidth;d&&(this.stackDirty=!0),this.lastVisibleInterval=h,this.lastWidth=this.width;var l=this.stackDirty,c=this._firstGroup(),u={item:t.item,axis:t.axis},p={item:t.item,axis:t.item/2},m=0,g=t.axis+t.item;return util.forEach(this.groups,function(t){var i=t==c?u:p;a=t.repaint(e,i,l)||a,m+=t.height}),m=Math.max(m,g),this.stackDirty=!1,r.style.left=i(n.left,""),r.style.right=i(n.right,""),r.style.top=i("top"==o?"0":""),r.style.bottom=i("top"==o?"":"0"),r.style.width=i(n.width,"100%"),r.style.height=i(m),this.top=r.offsetTop,this.left=r.offsetLeft,this.width=r.offsetWidth,this.height=m,this.dom.axis.style.left=i(n.left,"0"),this.dom.axis.style.right=i(n.right,""),this.dom.axis.style.width=i(n.width,"100%"),this.dom.axis.style.height=i(0),this.dom.axis.style.top=i("top"==o?"0":""),this.dom.axis.style.bottom=i("top"==o?"":"0"),a=this._isResized()||a},ItemSet.prototype._firstGroup=function(){var t="top"==this.options.orientation?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[UNGROUPED];return i||null},ItemSet.prototype._updateUngrouped=function(){var t=this.groups[UNGROUPED];if(this.groupsData)t&&(t.hide(),delete this.groups[UNGROUPED]);else if(!t){var e=null,i=null;t=new Group(e,i,this),this.groups[UNGROUPED]=t;for(var s in this.items)this.items.hasOwnProperty(s)&&t.add(this.items[s]);t.show()}},ItemSet.prototype.getForeground=function(){return this.dom.foreground},ItemSet.prototype.getBackground=function(){return this.dom.background},ItemSet.prototype.getAxis=function(){return this.dom.axis},ItemSet.prototype.getLabelSet=function(){return this.dom.labelSet},ItemSet.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof DataSet||t instanceof DataView))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(util.forEach(this.itemListeners,function(t,e){s.unsubscribe(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;util.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}},ItemSet.prototype.getItems=function(){return this.itemsData},ItemSet.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(util.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 DataSet||t instanceof DataView))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;util.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,s)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.emit("change")},ItemSet.prototype.getGroups=function(){return this.groupsData},ItemSet.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this._myDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},ItemSet.prototype._onUpdate=function(t){var e=this,i=this.items,s=this.itemOptions;t.forEach(function(t){var n=e.itemsData.get(t),o=i[t],a=n.type||n.start&&n.end&&"range"||e.options.type||"box",r=ItemSet.types[a];if(o&&(r&&o instanceof r?e._updateItem(o,n):(e._removeItem(o),o=null)),!o){if(!r)throw new TypeError('Unknown item type "'+a+'"');o=new r(n,e.options,s),o.id=t,e._addItem(o)}}),this._order(),this.stackDirty=!0,this.emit("change")},ItemSet.prototype._onAdd=ItemSet.prototype._onUpdate,ItemSet.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.emit("change"))},ItemSet.prototype._order=function(){util.forEach(this.groups,function(t){t.order()})},ItemSet.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},ItemSet.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==UNGROUPED)throw new Error("Illegal group id. "+t+" is a reserved id.");var n=Object.create(e.options);util.extend(n,{height:null}),s=new Group(t,i,e),e.groups[t]=s;for(var o in e.items)if(e.items.hasOwnProperty(o)){var a=e.items[o];a.data.group==t&&s.add(a)}s.order(),s.show()}}),this.emit("change")},ItemSet.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.emit("change")},ItemSet.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!util.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},ItemSet.prototype._addItem=function(t){this.items[t.id]=t;var e=this.groupsData?t.data.group:UNGROUPED,i=this.groups[e];i&&i.add(t)},ItemSet.prototype._updateItem=function(t,e){var i=t.data.group;if(t.data=e,t.displayed&&t.repaint(),i!=t.data.group){var s=this.groups[i];s&&s.remove(t);var n=this.groupsData?t.data.group:UNGROUPED,o=this.groups[n];o&&o.add(t)}},ItemSet.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:UNGROUPED,s=this.groups[i];s&&s.remove(t)},ItemSet.prototype._constructByEndArray=function(t){for(var e=[],i=0;it.start-e&&this.data.startt.start-e&&this.data.startt.start},ItemRange.prototype.repaint=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 repaint item: no parent attached");if(!t.box.parentNode){var e=this.parent.getForeground();if(!e)throw new Error("Cannot repaint 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}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.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dirty=!1),this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},ItemRange.prototype.show=function(){this.displayed||this.repaint()},ItemRange.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}},ItemRange.prototype.repositionX=function(){var t,e=this.props,i=this.parent.width,s=this.defaultOptions.toScreen(this.data.start),n=this.defaultOptions.toScreen(this.data.end),o="padding"in this.options?this.options.padding:this.defaultOptions.padding;-i>s&&(s=-i),n>2*i&&(n=2*i),t=0>s?Math.min(-s,n-s-e.content.width-2*o):0,this.left=s,this.width=Math.max(n-s,1),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=this.width+"px",this.dom.content.style.left=t+"px"},ItemRange.prototype.repositionY=function(){var t=this.options.orientation||this.defaultOptions.orientation,e=this.dom.box;"top"==t?(e.style.top=this.top+"px",e.style.bottom=""):(e.style.top="",e.style.bottom=this.top+"px")},ItemRange.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,Hammer(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)},ItemRange.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,Hammer(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)},ItemRangeOverflow.prototype=new ItemRange(null),ItemRangeOverflow.prototype.baseClassName="item rangeoverflow",ItemRangeOverflow.prototype.repositionX=function(){{var t,e=this.parent.width,i=this.defaultOptions.toScreen(this.data.start),s=this.defaultOptions.toScreen(this.data.end);"padding"in this.options?this.options.padding:this.defaultOptions.padding}-e>i&&(i=-e),s>2*e&&(s=2*e),t=Math.max(-i,0),this.left=i;var n=Math.max(s-i,1);this.width=n+this.props.content.width,this.dom.box.style.left=this.left+"px",this.dom.box.style.width=n+"px",this.dom.content.style.left=t+"px"},Group.prototype._create=function(){var t=document.createElement("div");t.className="vlabel",this.dom.label=t;var e=document.createElement("div");e.className="inner",t.appendChild(e),this.dom.inner=e;var i=document.createElement("div");i.className="group",i["timeline-group"]=this,this.dom.foreground=i,this.dom.background=document.createElement("div"),this.dom.axis=document.createElement("div"),this.dom.marker=document.createElement("div"),this.dom.marker.style.visibility="hidden",this.dom.marker.innerHTML="?",this.dom.background.appendChild(this.dom.marker)},Group.prototype.setData=function(t){var e=t&&t.content;e instanceof Element?this.dom.inner.appendChild(e):this.dom.inner.innerHTML=void 0!=e?e:this.groupId;var i=t&&t.className;i&&util.addClassName(this.dom.label,i)},Group.prototype.getForeground=function(){return this.dom.foreground},Group.prototype.getBackground=function(){return this.dom.background},Group.prototype.getAxis=function(){return this.dom.axis},Group.prototype.getLabelWidth=function(){return this.props.label.width},Group.prototype.repaint=function(t,e,i){var s=!1;this.visibleItems=this._updateVisibleItems(this.orderedItems,this.visibleItems,t);var n=this.dom.marker.clientHeight;n!=this.lastMarkerHeight&&(this.lastMarkerHeight=n,util.forEach(this.items,function(t){t.dirty=!0,t.displayed&&t.repaint()}),i=!0),this.itemSet.options.stack?stack.stack(this.visibleItems,e,i):stack.nostack(this.visibleItems,e);for(var o=0,a=this.visibleItems.length;a>o;o++){var r=this.visibleItems[o];r.repositionY()}var h,d=this.visibleItems;if(d.length){var l=d[0].top,c=d[0].top+d[0].height;util.forEach(d,function(t){l=Math.min(l,t.top),c=Math.max(c,t.top+t.height)}),h=c-l+e.axis+e.item}else h=e.axis+e.item;h=Math.max(h,this.props.label.height);var u=this.dom.foreground;return this.top=u.offsetTop,this.left=u.offsetLeft,this.width=u.offsetWidth,s=util.updateProperty(this,"height",h)||s,s=util.updateProperty(this.props.label,"width",this.dom.inner.clientWidth)||s,s=util.updateProperty(this.props.label,"height",this.dom.inner.clientHeight)||s,u.style.height=h+"px",this.dom.label.style.height=h+"px",s},Group.prototype.show=function(){this.dom.label.parentNode||this.itemSet.getLabelSet().appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.getForeground().appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.getBackground().appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.getAxis().appendChild(this.dom.axis)},Group.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)},Group.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),t instanceof ItemRange&&-1==this.visibleItems.indexOf(t)){var e=this.itemSet.range;this._checkIfVisible(t,this.visibleItems,e)}},Group.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)},Group.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},Group.prototype.order=function(){var t=util.toArray(this.items);this.orderedItems.byStart=t,this.orderedItems.byEnd=this._constructByEndArray(t),stack.orderByStart(this.orderedItems.byStart),stack.orderByEnd(this.orderedItems.byEnd)},Group.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0)for(n=0;n=0&&!this._checkIfInvisible(t.byStart[n],o,i);n--);for(n=s+1;n=0&&!this._checkIfInvisible(t.byEnd[n],o,i);n--);for(n=a+1;ne.start-a&&s[l].data[n]e.start-a&&s[l].data[n]=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)},Timeline.prototype.getItemRange=function(){var t=this.itemsData,e=null,i=null;if(t){var s=t.min("start");e=s?s.start.valueOf():null;var n=t.max("start");n&&(i=n.start.valueOf());var o=t.max("end");o&&(i=null==i?o.end.valueOf():Math.max(i,o.end.valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},Timeline.prototype.setSelection=function(t){this.itemSet.setSelection(t)},Timeline.prototype.getSelection=function(){return this.itemSet.getSelection()},Timeline.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)},Timeline.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},Timeline.prototype.redraw=function(){this.rootPanel.repaint()},Timeline.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},Timeline.prototype._onSelectItem=function(t){if(this.options.selectable){var e=t.gesture.srcEvent&&t.gesture.srcEvent.ctrlKey,i=t.gesture.srcEvent&&t.gesture.srcEvent.shiftKey;if(e||i)return void this._onMultiSelectItem(t);var s=this.getSelection(),n=ItemSet.itemFromTarget(t),o=n?[n.id]:[];this.setSelection(o);var a=this.getSelection();(a.length>0||s.length>0)&&this.emit("select",{items:this.getSelection()}),t.stopPropagation()}},Timeline.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=ItemSet.itemFromTarget(t);if(i){var s=e.itemsData.get(i.id);this.options.onUpdate(s,function(t){t&&e.itemsData.update(t)})}else{var n=vis.util.getAbsoluteLeft(this.contentPanel.frame),o=t.gesture.center.pageX-n,a={start:this.timeAxis.snap(this._toTime(o)),content:"new item"};("range"===this.options.type||"rangeoverflow"==this.options.type)&&(a.end=this.timeAxis.snap(this._toTime(o+this.rootPanel.width/5)));var r=util.randomUUID();a[this.itemsData.fieldId]=r;var h=ItemSet.groupFromTarget(t);h&&(a.group=h.groupId),this.options.onAdd(a,function(t){t&&e.itemsData.add(a)})}}},Timeline.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e,i=ItemSet.itemFromTarget(t);if(i){e=this.getSelection();var s=e.indexOf(i.id);-1==s?e.push(i.id):e.splice(s,1),this.setSelection(e),this.emit("select",{items:this.getSelection()}),t.stopPropagation()}}},Timeline.prototype._toTime=function(t){var e=this.range.conversion(this.mainPanel.width);return new Date(t/e.scale+e.offset)},Timeline.prototype._toScreen=function(t){var e=this.range.conversion(this.mainPanel.width);return(t.valueOf()-e.offset)*e.scale},function(t){function e(t){return M=t,u()}function i(){D=0,C=M.charAt(0)}function s(){D++,C=M.charAt(D)}function n(){return M.charAt(D+1)}function o(t){return P.test(t)}function a(t,e){if(t||(t={}),e)for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function r(t,e,i){for(var s=e.split("."),n=t;s.length;){var o=s.shift();s.length?(n[o]||(n[o]={}),n=n[o]):n[o]=i}}function h(t,e){for(var i,s,n=null,o=[t],r=t;r.parent;)o.push(r.parent),r=r.parent;if(r.nodes)for(i=0,s=r.nodes.length;s>i;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 d(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 l(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 c(){for(O=T.NULL,I="";" "==C||" "==C||"\n"==C||"\r"==C;)s();do{var t=!1;if("#"==C){for(var e=D-1;" "==M.charAt(e)||" "==M.charAt(e);)e--;if("\n"==M.charAt(e)||""==M.charAt(e)){for(;""!=C&&"\n"!=C;)s();t=!0}}if("/"==C&&"/"==n()){for(;""!=C&&"\n"!=C;)s();t=!0}if("/"==C&&"*"==n()){for(;""!=C;){if("*"==C&&"/"==n()){s(),s();break}s()}t=!0}for(;" "==C||" "==C||"\n"==C||"\r"==C;)s()}while(t);if(""==C)return void(O=T.DELIMITER);var i=C+n();if(E[i])return O=T.DELIMITER,I=i,s(),void s();if(E[C])return O=T.DELIMITER,I=C,void s();if(o(C)||"-"==C){for(I+=C,s();o(C);)I+=C,s();return"false"==I?I=!1:"true"==I?I=!0:isNaN(Number(I))||(I=Number(I)),void(O=T.IDENTIFIER)}if('"'==C){for(s();""!=C&&('"'!=C||'"'==C&&'"'==n());)I+=C,'"'==C&&s(),s();if('"'!=C)throw b('End of string " expected');return s(),void(O=T.IDENTIFIER)}for(O=T.UNKNOWN;""!=C;)I+=C,s();throw new SyntaxError('Syntax error in part "'+x(I,30)+'"')}function u(){var t={};if(i(),c(),"strict"==I&&(t.strict=!0,c()),("graph"==I||"digraph"==I)&&(t.type=I,c()),O==T.IDENTIFIER&&(t.id=I,c()),"{"!=I)throw b("Angle bracket { expected");if(c(),p(t),"}"!=I)throw b("Angle bracket } expected");if(c(),""!==I)throw b("End of file expected");return c(),delete t.node,delete t.edge,delete t.graph,t}function p(t){for(;""!==I&&"}"!=I;)m(t),";"==I&&c()}function m(t){var e=g(t);if(e)return void y(t,e);var i=f(t);if(!i){if(O!=T.IDENTIFIER)throw b("Identifier expected");var s=I;if(c(),"="==I){if(c(),O!=T.IDENTIFIER)throw b("Identifier expected");t[s]=I,c()}else v(t,s)}}function g(t){var e=null;if("subgraph"==I&&(e={},e.type="subgraph",c(),O==T.IDENTIFIER&&(e.id=I,c())),"{"==I){if(c(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,p(e),"}"!=I)throw b("Angle bracket } expected");c(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function f(t){return"node"==I?(c(),t.node=_(),"node"):"edge"==I?(c(),t.edge=_(),"edge"):"graph"==I?(c(),t.graph=_(),"graph"):null}function v(t,e){var i={id:e},s=_();s&&(i.attr=s),h(t,i),y(t,e)}function y(t,e){for(;"->"==I||"--"==I;){var i,s=I;c();var n=g(t);if(n)i=n;else{if(O!=T.IDENTIFIER)throw b("Identifier or subgraph expected");i=I,h(t,{id:i}),c()}var o=_(),a=l(t,e,i,s,o);d(t,a),e=i}}function _(){for(var t=null;"["==I;){for(c(),t={};""!==I&&"]"!=I;){if(O!=T.IDENTIFIER)throw b("Attribute name expected");var e=I;if(c(),"="!=I)throw b("Equal sign = expected");if(c(),O!=T.IDENTIFIER)throw b("Attribute value expected");var i=I;r(t,e,i),c(),","==I&&c()}if("]"!=I)throw b("Bracket ] expected");c()}return t}function b(t){return new SyntaxError(t+', got "'+x(I,30)+'" (char '+D+")")}function x(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function w(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 S(t){function i(t){var e={from:t.from,to:t.to};return a(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var s=e(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 e,s;e=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 e=i(t);n.edges.push(e)}),w(e,s,function(e,s){var o=l(n,e.id,s.id,t.type,t.attr),a=i(o);n.edges.push(a)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var e=i(t);n.edges.push(e)})}),s.attr&&(n.options=s.attr),n}var T={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},E={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},M="",D=0,C="",I="",O=T.NULL,P=/[a-zA-Z_0-9.:#]/;t.parseDOT=e,t.DOTToGraph=S}("undefined"!=typeof util?util:exports),"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),g=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,g,u,g),this.bezierCurveTo(u-h,g,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}}),Node.prototype.resetCluster=function(){this.formationScale=void 0,this.clusterSize=1,this.containedNodes={},this.containedEdges={},this.clusterSessions=[]},Node.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},Node.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},Node.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=util.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()}},Node.prototype.select=function(){this.selected=!0,this._reset()},Node.prototype.unselect=function(){this.selected=!1,this._reset()},Node.prototype.clearSizeCache=function(){this._reset()},Node.prototype._reset=function(){this.width=void 0,this.height=void 0},Node.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},Node.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}},Node.prototype._setForce=function(t,e){this.fx=t,this.fy=e},Node.prototype._addForce=function(t,e){this.fx+=t,this.fy+=e},Node.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}},Node.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}},Node.prototype.isFixed=function(){return this.xFixed&&this.yFixed},Node.prototype.isMoving=function(t){return Math.abs(this.vx)>t||Math.abs(this.vy)>t},Node.prototype.isSelected=function(){return this.selected},Node.prototype.getValue=function(){return this.value},Node.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},Node.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},Node.prototype.draw=function(){throw"Draw method not initialized for node"},Node.prototype.resize=function(){throw"Resize method not initialized for node"},Node.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},Node.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)}},Node.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.graphScaleInv,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")},Node.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)}},Node.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.graphScaleInv,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.graphScaleInv,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)},Node.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}},Node.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.graphScaleInv,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.graphScaleInv,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)},Node.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}},Node.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.graphScaleInv,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.graphScaleInv,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)},Node.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.graphScaleInv,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.graphScaleInv,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)},Node.prototype._drawDot=function(t){this._drawShape(t,"circle")},Node.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},Node.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},Node.prototype._drawSquare=function(t){this._drawShape(t,"square")},Node.prototype._drawStar=function(t){this._drawShape(t,"star")},Node.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}},Node.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.graphScaleInv,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.graphScaleInv,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") -},Node.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)}},Node.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)},Node.prototype._label=function(t,e,i,s,n,o){if(e&&this.fontSize*this.graphScale>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";for(var a=e.split("\n"),r=a.length,h=this.fontSize+4,d=s+(1-r)/2*h,l=0;r>l;l++)t.fillText(a[l],i,d),d+=h}},Node.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}},Node.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.graphScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.graphScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.graphScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.yh}return!1},Edge.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)}},Edge.prototype._getLineWidth=function(){return 1==this.selected?Math.min(2*this.width,this.widthMax)*this.graphScaleInv:1==this.hover?Math.min(this.hoverWidth,this.widthMax)*this.graphScaleInv:this.width*this.graphScaleInv},Edge.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()},Edge.prototype._circle=function(t,e,i,s){t.beginPath(),t.arc(e,i,s,0,2*Math.PI,!1),t.stroke()},Edge.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)}},Edge.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)}},Edge.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}},Edge.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)}},Edge.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))}},Edge.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 g=.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:g,y:f}}else m=this._pointOnLine(.5);this._label(t,this.label,m.x,m.y)}}else{var v,y,_,b=this.from,x=.25*Math.max(100,this.length);b.width||b.resize(t),b.width>b.height?(v=b.x+.5*b.width,y=b.y-x,_={x:v,y:b.y,angle:.9*Math.PI}):(v=b.x+x,y=b.y-.5*b.height,_={x:b.x,y:y,angle:.6*Math.PI}),t.beginPath(),t.arc(v,y,x,0,2*Math.PI,!1),t.stroke();var i=(10+5*this.width)*this.arrowScaleFactor;t.arrow(_.x,_.y,_.angle,i),t.fill(),t.stroke(),this.label&&(m=this._pointOnCircle(v,y,x,.5),this._label(t,this.label,m.x,m.y))}},Edge.prototype._getDistanceToEdge=function(t,e,i,s,n,o){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,g=p*p+m*m,f=((n-t)*p+(o-e)*m)/g;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)},Edge.prototype.setScale=function(t){this.graphScaleInv=1/t},Edge.prototype.select=function(){this.selected=!0},Edge.prototype.unselect=function(){this.selected=!1},Edge.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))},Popup.prototype.setPosition=function(t,e){this.x=parseInt(t),this.y=parseInt(e)},Popup.prototype.setText=function(t){this.frame.innerHTML=t},Popup.prototype.show=function(t){if(void 0===t&&(t=!0),t){var e=this.frame.clientHeight,i=this.frame.clientWidth,s=this.frame.parentNode.clientHeight,n=this.frame.parentNode.clientWidth,o=this.y-e;o+e+this.padding>s&&(o=s-e-this.padding),on&&(a=n-i-this.padding),athis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},_calculateForces:function(){this._calculateGravitationalForces(),this._calculateNodeForces(),1==this.constants.smoothCurves?this._calculateSpringForcesWithSupport():this._calculateSpringForces()},_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},_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=showValueOfRange.bind(this,"graph_BH_gc",-1,"physics_barnesHut_gravitationalConstant"),e=document.getElementById("graph_BH_cg"),e.onchange=showValueOfRange.bind(this,"graph_BH_cg",1,"physics_centralGravity"),e=document.getElementById("graph_BH_sc"),e.onchange=showValueOfRange.bind(this,"graph_BH_sc",1,"physics_springConstant"),e=document.getElementById("graph_BH_sl"),e.onchange=showValueOfRange.bind(this,"graph_BH_sl",1,"physics_springLength"),e=document.getElementById("graph_BH_damp"),e.onchange=showValueOfRange.bind(this,"graph_BH_damp",1,"physics_damping"),e=document.getElementById("graph_R_nd"),e.onchange=showValueOfRange.bind(this,"graph_R_nd",1,"physics_repulsion_nodeDistance"),e=document.getElementById("graph_R_cg"),e.onchange=showValueOfRange.bind(this,"graph_R_cg",1,"physics_centralGravity"),e=document.getElementById("graph_R_sc"),e.onchange=showValueOfRange.bind(this,"graph_R_sc",1,"physics_springConstant"),e=document.getElementById("graph_R_sl"),e.onchange=showValueOfRange.bind(this,"graph_R_sl",1,"physics_springLength"),e=document.getElementById("graph_R_damp"),e.onchange=showValueOfRange.bind(this,"graph_R_damp",1,"physics_damping"),e=document.getElementById("graph_H_nd"),e.onchange=showValueOfRange.bind(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),e=document.getElementById("graph_H_cg"),e.onchange=showValueOfRange.bind(this,"graph_H_cg",1,"physics_centralGravity"),e=document.getElementById("graph_H_sc"),e.onchange=showValueOfRange.bind(this,"graph_H_sc",1,"physics_springConstant"),e=document.getElementById("graph_H_sl"),e.onchange=showValueOfRange.bind(this,"graph_H_sl",1,"physics_springLength"),e=document.getElementById("graph_H_damp"),e.onchange=showValueOfRange.bind(this,"graph_H_damp",1,"physics_damping"),e=document.getElementById("graph_H_direction"),e.onchange=showValueOfRange.bind(this,"graph_H_direction",t,"hierarchicalLayout_direction"),e=document.getElementById("graph_H_levsep"),e.onchange=showValueOfRange.bind(this,"graph_H_levsep",1,"hierarchicalLayout_levelSeparation"),e=document.getElementById("graph_H_nspac"),e.onchange=showValueOfRange.bind(this,"graph_H_nspac",1,"hierarchicalLayout_nodeSpacing");var i=document.getElementById("graph_physicsMethod1"),s=document.getElementById("graph_physicsMethod2"),n=document.getElementById("graph_physicsMethod3");s.checked=!0,this.constants.physics.barnesHut.enabled&&(i.checked=!0),this.constants.hierarchicalLayout.enabled&&(n.checked=!0);var o=document.getElementById("graph_toggleSmooth"),a=document.getElementById("graph_repositionNodes"),r=document.getElementById("graph_generateOptions");o.onclick=graphToggleSmoothCurves.bind(this),a.onclick=graphRepositionNodes.bind(this),r.onclick=graphGenerateOptions.bind(this),o.style.background=1==this.constants.smoothCurves?"#A4FF56":"#FF8532",switchConfigurations.apply(this),i.onchange=switchConfigurations.bind(this),s.onchange=switchConfigurations.bind(this),n.onchange=switchConfigurations.bind(this)}},_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)}},hierarchalRepulsionMixin={_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,g=m;for(h=0;hi&&(o=f*i+u,0==i?i=.01:o/=i,s=t*o,n=e*o,a.fx-=s,a.fy-=n,r.fx+=s,r.fy+=n)}}},barnesHutMixin={_calculateNodeForces:function(){if(0!=this.constants.physics.barnesHut.gravitationalConstant){var t,e=this.calculationNodes,i=this.calculationNodeIndices,s=i.length;this._formBarnesHutTree(e,i);for(var n=this.barnesHutTree,o=0;s>o;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)}},_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}}},_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,g=.5*(n+a),f=.5*(o+r),v={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:g-m,maxX:g+m,minY:f-m,maxY:f+m},size:p,calcSize:1/p,children:{data:null},maxWidth:0,level:0,childrenCount:4}};for(this._splitBranch(v.root),h=0;s>h;h++)i=t[e[h]],this._placeInTree(v.root,i);this.barnesHutTree=v},_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")},_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)}},_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)},_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}},_drawTree:function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,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()}},repulsionMixin={_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,g=this.constants.physics.repulsion.nodeDistance,f=g;for(d=0;di&&(a=.5*f>i?1:v*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)}}},HierarchicalLayoutMixin={_resetLevels:function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];0==e.preassignedLevel&&(e.level=-1)}},_setupHierarchicalLayout:function(){if(1==this.constants.hierarchicalLayout.enabled&&this.nodeIndices.length>0){"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))}},_setLevel:function(t,e,i){for(var s=0;st)&&(n.level=t,e.length>1&&this._setLevel(t+1,n.edges,n.id))}},_restoreNodes:function(){for(nodeId in this.nodes)this.nodes.hasOwnProperty(nodeId)&&(this.nodes[nodeId].xFixed=!1,this.nodes[nodeId].yFixed=!1)}},manipulationMixin={_clearManipulatorBar:function(){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild)},_restoreOverloadedFunctions:function(){for(var t in this.cachedFunctions)this.cachedFunctions.hasOwnProperty(t)&&(this[t]=this.cachedFunctions[t])},_toggleEditMode:function(){this.editMode=!this.editMode;var t=document.getElementById("graph-manipulationDiv"),e=document.getElementById("graph-manipulation-closeDiv"),i=document.getElementById("graph-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()},_createManipulatorBar:function(){if(this.boundFunction&&this.off("select",this.boundFunction),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+""),0==this._selectionIsEmpty()&&(this.manipulationDiv.innerHTML+="
"+this.constants.labels.del+"");var t=document.getElementById("graph-manipulate-addNode");t.onclick=this._createAddNodeToolbar.bind(this);var e=document.getElementById("graph-manipulate-connectNode");if(e.onclick=this._createAddEdgeToolbar.bind(this),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit){var i=document.getElementById("graph-manipulate-editNode");i.onclick=this._editNode.bind(this)}if(0==this._selectionIsEmpty()){var s=document.getElementById("graph-manipulate-delete");s.onclick=this._deleteSelected.bind(this)}var n=document.getElementById("graph-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("graph-manipulate-editModeButton");o.onclick=this._toggleEditMode.bind(this)}},_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("graph-manipulate-back");t.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._addNode.bind(this),this.on("select",this.boundFunction)},_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("graph-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()},_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 Node({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 Node({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 Edge({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()))}},_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()}},_addNode:function(){if(this._selectionIsEmpty()&&1==this.editMode){var t=this._pointerToPositionObject(this.pointerPosition),e={id:util.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()}},_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()}},_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)},_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()}}},SectorMixin={_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},_switchToSector:function(t,e){void 0===e||"active"==e?this._switchToActiveSector(t):this._switchToFrozenSector(t)},_switchToActiveSector:function(t){this.nodeIndices=this.sectors.active[t].nodeIndices,this.nodes=this.sectors.active[t].nodes,this.edges=this.sectors.active[t].edges},_switchToSupportSector:function(){this.nodeIndices=this.sectors.support.nodeIndices,this.nodes=this.sectors.support.nodes,this.edges=this.sectors.support.edges},_switchToFrozenSector:function(t){this.nodeIndices=this.sectors.frozen[t].nodeIndices,this.nodes=this.sectors.frozen[t].nodes,this.edges=this.sectors.frozen[t].edges},_loadLatestSector:function(){this._switchToSector(this._sector())},_sector:function(){return this.activeSector[this.activeSector.length-1]},_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.")},_setActiveSector:function(t){this.activeSector.push(t)},_forgetLastSector:function(){this.activeSector.pop()},_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},_deleteActiveSector:function(t){delete this.sectors.active[t]},_deleteFrozenSector:function(t){delete this.sectors.frozen[t]},_freezeSector:function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},_activateSector:function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},_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()},_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()},_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()},_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))},_clearNodeIndexList:function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},_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),nt&&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()},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()},updateClustersDefault:function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},increaseClusterLevel:function(){this.updateClusters(-1,!1,!0)},decreaseClusterLevel:function(){this.updateClusters(1,!1,!0)},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)},_aggregateHubs:function(t){this._getHubSize(),this._formClustersByHub(t,!1)},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()},_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)}},_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)}}},_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))}}},_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)},_formClustersByHub:function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,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)}}},_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)))},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)},_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)},_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}},SelectionMixin={_getNodesOverlappingWith:function(t,e){var i=this.nodes;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},_getAllNodesOverlappingWith:function(t){var e=[];return this._doInAllActiveSectors("_getNodesOverlappingWith",t,e),e},_pointerToPositionObject:function(t){var e=this._XconvertDOMtoCanvas(t.x),i=this._YconvertDOMtoCanvas(t.y);return{left:e,top:i,right:e,bottom:i}},_getNodeAt:function(t){var e=this._pointerToPositionObject(t),i=this._getAllNodesOverlappingWith(e);return i.length>0?this.nodes[i[i.length-1]]:null},_getEdgesOverlappingWith:function(t,e){var i=this.edges;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},_getAllEdgesOverlappingWith:function(t){var e=[];return this._doInAllActiveSectors("_getEdgesOverlappingWith",t,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},_addToSelection:function(t){t instanceof Node?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t},_addToHover:function(t){t instanceof Node?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t},_removeFromSelection:function(t){t instanceof Node?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]},_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())},_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())},_getSelectedNodeCount:function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t},_getSelectedNode:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return null},_getSelectedEdgeCount:function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t},_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},_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},_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},_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)}this.redraw()},_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])}},NavigationMixin={_cleanNavigation:function(){var t=document.getElementById("graph-navigation_wrapper");null!=t&&this.containerElement.removeChild(t),document.onmouseup=null},_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="graph-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;it.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._centerGraph(s),0==e&&(this.moving=!0,this.start())},Graph.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},Graph.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=vis.util.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()},Graph.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.moveable&&(this.constants.moveable=t.moveable),void 0!==t.zoomable&&(this.constants.zoomable=t.zoomable),void 0!==t.hover&&(this.constants.hover=t.hover),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.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])}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&&(util.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&&(util.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=util.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=util.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()},Graph.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="graph-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=Hammer(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)},Graph.prototype._createKeyBinds=function(){var t=this;this.mousetrap=mousetrap,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)))},Graph.prototype._getPointer=function(t){return{x:t.pageX-vis.util.getAbsoluteLeft(this.frame.canvas),y:t.pageY-vis.util.getAbsoluteTop(this.frame.canvas)}},Graph.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)},Graph.prototype._onDragStart=function(){this._handleDragStart()},Graph.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)}}},Graph.prototype._onDrag=function(t){this._handleOnDrag(t)},Graph.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){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.moveable){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()}}},Graph.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})},Graph.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},Graph.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},Graph.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},Graph.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},Graph.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)},Graph.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}},Graph.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=util.fakeGesture(this,t),o=this._getPointer(n.center);this._zoom(i,o)}t.preventDefault()},Graph.prototype._onMouseMoveTitle=function(t){var e=util.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 r in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(r)&&(a instanceof Node&&a.id!=r||a instanceof Edge||null==a)&&(this._blurObject(this.hoverObj.nodes[r]),delete this.hoverObj.nodes[r]);this.redraw()}},Graph.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 Popup(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()},Graph.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},Graph.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})},Graph.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof DataSet||t instanceof DataView)this.nodesData=t;else if(t instanceof Array)this.nodesData=new DataSet,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new DataSet}if(e&&util.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;util.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},Graph.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 Node(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()},Graph.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 Node(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)},Graph.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)},Graph.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof DataSet||t instanceof DataView)this.edgesData=t;else if(t instanceof Array)this.edgesData=new DataSet,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new DataSet}if(e&&util.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;util.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},Graph.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 Edge(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()},Graph.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 Edge(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)},Graph.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()},Graph.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()}},Graph.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)},Graph.prototype.redraw=function(){this.setSize(this.width,this.height),this._redraw()},Graph.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),t.restore() -},Graph.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")},Graph.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},Graph.prototype._setScale=function(t){this.scale=t},Graph.prototype._getScale=function(){return this.scale},Graph.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},Graph.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},Graph.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},Graph.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},Graph.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},Graph.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},Graph.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)},Graph.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)}},Graph.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)}},Graph.prototype._physicsTick=function(){this.freezeSimulation||this.moving&&(this._doInAllActiveSectors("_initializeForceCalculation"),this._doInAllActiveSectors("_discreteStepNodes"),this.constants.smoothCurves&&this._doInSupportSector("_discreteStepNodes"),this._findCenter(this._getRange()))},Graph.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.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),(void 0!==t||void 0!==e)&&this.calculateCameraOrientation()},Graph3d.Camera.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},Graph3d.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())},Graph3d.Camera.prototype.getArmLength=function(){return this.armLength},Graph3d.Camera.prototype.getCameraLocation=function(){return this.cameraLocation},Graph3d.Camera.prototype.getCameraRotation=function(){return this.cameraRotation},Graph3d.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},Graph3d.prototype._setScale=function(){this.scale=new Point3d(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!==Graph3d.STYLE.DOTCOLOR&&this.style!==Graph3d.STYLE.DOTSIZE&&this.style!==Graph3d.STYLE.BARCOLOR&&this.style!==Graph3d.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)}},Graph3d.prototype.getNumberOfRows=function(t){return t.length},Graph3d.prototype.getNumberOfColumns=function(t){var e=0;for(var i in t[0])t[0].hasOwnProperty(i)&&e++;return e},Graph3d.prototype.getDistinctValues=function(t,e){for(var i=[],s=0;st[s][e]&&(i.min=t[s][e]),i.maxt;t++){var p=(t-c)/(u-c),m=240*p,g=this._hsv2rgb(m,1,1);l.strokeStyle=g,l.beginPath(),l.moveTo(r,o+t),l.lineTo(a,o+t),l.stroke()}l.strokeStyle=this.colorAxis,l.strokeRect(r,o,i,n)}if(this.style===Graph3d.STYLE.DOTSIZE&&(l.strokeStyle=this.colorAxis,l.fillStyle=this.colorDot,l.beginPath(),l.moveTo(r,o),l.lineTo(a,o),l.lineTo(a-i+e,h),l.lineTo(r,h),l.closePath(),l.fill(),l.stroke()),this.style===Graph3d.STYLE.DOTCOLOR||this.style===Graph3d.STYLE.DOTSIZE){var f=5,v=new StepNumber(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,!0);for(v.start(),v.getCurrent()0?this.yMin:this.yMax,n=this._convert3Dto2D(new Point3d(_,a,this.zMin)),Math.cos(2*y)>0?(m.textAlign="center",m.textBaseline="top",n.y+=v):Math.sin(2*y)<0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(" "+i.getCurrent()+" ",n.x,n.y),i.next()}for(m.lineWidth=1,s=void 0===this.defaultYStep,i=new StepNumber(this.yMin,this.yMax,this.yStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,n=this._convert3Dto2D(new Point3d(o,i.getCurrent(),this.zMin)),Math.cos(2*y)<0?(m.textAlign="center",m.textBaseline="top",n.y+=v):Math.sin(2*y)>0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(" "+i.getCurrent()+" ",n.x,n.y),i.next();for(m.lineWidth=1,s=void 0===this.defaultZStep,i=new StepNumber(this.zMin,this.zMax,this.zStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,a=Math.sin(y)<0?this.yMin:this.yMax;!i.end();)t=this._convert3Dto2D(new Point3d(o,a,i.getCurrent())),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(t.x-v,t.y),m.stroke(),m.textAlign="right",m.textBaseline="middle",m.fillStyle=this.colorAxis,m.fillText(i.getCurrent()+" ",t.x-5,t.y),i.next();m.lineWidth=1,t=this._convert3Dto2D(new Point3d(o,a,this.zMin)),e=this._convert3Dto2D(new Point3d(o,a,this.zMax)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke(),m.lineWidth=1,c=this._convert3Dto2D(new Point3d(this.xMin,this.yMin,this.zMin)),u=this._convert3Dto2D(new Point3d(this.xMax,this.yMin,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(c.x,c.y),m.lineTo(u.x,u.y),m.stroke(),c=this._convert3Dto2D(new Point3d(this.xMin,this.yMax,this.zMin)),u=this._convert3Dto2D(new Point3d(this.xMax,this.yMax,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(c.x,c.y),m.lineTo(u.x,u.y),m.stroke(),m.lineWidth=1,t=this._convert3Dto2D(new Point3d(this.xMin,this.yMin,this.zMin)),e=this._convert3Dto2D(new Point3d(this.xMin,this.yMax,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke(),t=this._convert3Dto2D(new Point3d(this.xMax,this.yMin,this.zMin)),e=this._convert3Dto2D(new Point3d(this.xMax,this.yMax,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke();var b=this.xLabel;b.length>0&&(l=.1/this.scale.y,o=(this.xMin+this.xMax)/2,a=Math.cos(y)>0?this.yMin-l:this.yMax+l,n=this._convert3Dto2D(new Point3d(o,a,this.zMin)),Math.cos(2*y)>0?(m.textAlign="center",m.textBaseline="top"):Math.sin(2*y)<0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(b,n.x,n.y));var x=this.yLabel;x.length>0&&(d=.1/this.scale.x,o=Math.sin(y)>0?this.xMin-d:this.xMax+d,a=(this.yMin+this.yMax)/2,n=this._convert3Dto2D(new Point3d(o,a,this.zMin)),Math.cos(2*y)<0?(m.textAlign="center",m.textBaseline="top"):Math.sin(2*y)>0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(x,n.x,n.y));var w=this.zLabel;w.length>0&&(h=30,o=Math.cos(y)>0?this.xMin:this.xMax,a=Math.sin(y)<0?this.yMin:this.yMax,r=(this.zMin+this.zMax)/2,n=this._convert3Dto2D(new Point3d(o,a,r)),m.textAlign="right",m.textBaseline="middle",m.fillStyle=this.colorAxis,m.fillText(w,n.x-h,n.y))},Graph3d.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)+")"},Graph3d.prototype._redrawDataGrid=function(){var t,e,i,s,n,o,a,r,h,d,l,c,u,p=this.frame.canvas,m=p.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(n=0;n0}else o=!0;o?(u=(t.point.z+e.point.z+i.point.z+s.point.z)/4,d=240*(1-(u-this.zMin)*this.scale.z/this.verticalRatio),l=1,this.showShadow?(c=Math.min(1+x.x/w/2,1),a=this._hsv2rgb(d,l,c),r=a):(c=1,a=this._hsv2rgb(d,l,c),r=this.colorAxis)):(a="gray",r=this.colorAxis),h=.5,m.lineWidth=h,m.fillStyle=a,m.strokeStyle=r,m.beginPath(),m.moveTo(t.screen.x,t.screen.y),m.lineTo(e.screen.x,e.screen.y),m.lineTo(s.screen.x,s.screen.y),m.lineTo(i.screen.x,i.screen.y),m.closePath(),m.fill(),m.stroke()}}else for(n=0;nc&&(c=0);var u,p,m;this.style===Graph3d.STYLE.DOTCOLOR?(u=240*(1-(h.point.value-this.valueMin)*this.scale.value),p=this._hsv2rgb(u,1,1),m=this._hsv2rgb(u,1,.8)):this.style===Graph3d.STYLE.DOTSIZE?(p=this.colorDot,m=this.colorDotBorder):(u=240*(1-(h.point.z-this.zMin)*this.scale.z/this.verticalRatio),p=this._hsv2rgb(u,1,1),m=this._hsv2rgb(u,1,.8)),i.lineWidth=1,i.strokeStyle=m,i.fillStyle=p,i.beginPath(),i.arc(h.screen.x,h.screen.y,c,0,2*Math.PI,!0),i.fill(),i.stroke()}}},Graph3d.prototype._redrawDataBar=function(){var t,e,i,s,n=this.frame.canvas,o=n.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()}},Graph3d.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)}},Graph3d.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)},Graph3d.prototype._dataPointFromXY=function(t,e){var i,s=100,n=null,o=null,a=null,r=new Point2d(t,e);if(this.style===Graph3d.STYLE.BAR||this.style===Graph3d.STYLE.BARCOLOR||this.style===Graph3d.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var h=n.surfaces;if(h)for(var d=h.length-1;d>=0;d--){var l=h[d],c=l.corners,u=[c[0].screen,c[1].screen,c[2].screen],p=[c[2].screen,c[3].screen,c[0].screen];if(this._insideTriangle(r,u)||this._insideTriangle(r,p))return n}}else for(i=0;iv)&&s>v&&(a=v,o=n)}}return o},Graph3d.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"},Graph3d.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},Point3d.subtract=function(t,e){var i=new Point3d;return i.x=t.x-e.x,i.y=t.y-e.y,i.z=t.z-e.z,i},Point3d.add=function(t,e){var i=new Point3d;return i.x=t.x+e.x,i.y=t.y+e.y,i.z=t.z+e.z,i},Point3d.avg=function(t,e){return new Point3d((t.x+e.x)/2,(t.y+e.y)/2,(t.z+e.z)/2)},Point3d.crossProduct=function(t,e){var i=new Point3d;return i.x=t.y*e.z-t.z*e.y,i.y=t.z*e.x-t.x*e.z,i.z=t.x*e.y-t.y*e.x,i},Point3d.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},Point2d=function(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0},Filter.prototype.isLoaded=function(){return this.loaded},Filter.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},Filter.prototype.getLabel=function(){return this.graph.filterLabel},Filter.prototype.getColumn=function(){return this.column},Filter.prototype.getSelectedValue=function(){return void 0===this.index?void 0:this.values[this.index]},Filter.prototype.getValues=function(){return this.values},Filter.prototype.getValue=function(t){if(t>=this.values.length)throw"Error: index out of range";return this.values[t]},Filter.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 DataView(this.data,{filter:function(t){return t[i.column]==i.value}}).get();e=this.graph._getDataPoints(s),this.dataPoints[t]=e}return e},Filter.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},Filter.prototype.selectValue=function(t){if(t>=this.values.length)throw"Error: index out of range";this.index=t,this.value=this.values[t]},Filter.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t=t||(void 0!==e&&(this.prettyStep=e),this._step=this.prettyStep===!0?StepNumber.calculatePrettyStep(t):t)},StepNumber.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},StepNumber.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},StepNumber.prototype.getStep=function(){return this._step},StepNumber.prototype.start=function(){this._current=this._start-this._start%this._step},StepNumber.prototype.next=function(){this._current+=this._step},StepNumber.prototype.end=function(){return this._current>this._end},Slider.prototype.prev=function(){var t=this.getIndex();t>0&&(t--,this.setIndex(t))},Slider.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},Slider.prototype.setIndex=function(t){if(!(ts&&(s=0),s>this.values.length-1&&(s=this.values.length-1),s},Slider.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},Slider.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,s=this.leftToIndex(i);this.setIndex(s),G3DpreventDefault()},Slider.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};var vis={util:util,moment:moment,DataSet:DataSet,DataView:DataView,Range:Range,stack:stack,TimeStep:TimeStep,components:{items:{Item:Item,ItemBox:ItemBox,ItemPoint:ItemPoint,ItemRange:ItemRange},Component:Component,Panel:Panel,RootPanel:RootPanel,ItemSet:ItemSet,TimeAxis:TimeAxis},graph:{Node:Node,Edge:Edge,Popup:Popup,Groups:Groups,Images:Images},Timeline:Timeline,Graph:Graph,Graph3d:Graph3d};"undefined"!=typeof exports&&(exports=vis),"undefined"!=typeof module&&"undefined"!=typeof module.exports&&(module.exports=vis),"function"==typeof define&&define(function(){return vis}),"undefined"!=typeof window&&(window.vis=vis)},{"emitter-component":2,hammerjs:3,moment:4,mousetrap:5}],2:[function(t,e){function i(t){return t?s(t):void 0}function s(t){for(var e in i.prototype)t[e]=i.prototype[e];return t}e.exports=i,i.prototype.on=i.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},i.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},i.prototype.off=i.prototype.removeListener=i.prototype.removeAllListeners=i.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},i.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},i.prototype.hasListeners=function(t){return!!this.listeners(t).length}},{}],3:[function(t,e){!function(t,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 t,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 e&&"object"==typeof e.exports?e.exports=n:(t.Hammer=n,"function"==typeof t.define&&t.define.amd&&t.define("hammer",[],function(){return n}))}(this)},{}],4:[function(t,e){var i="undefined"!=typeof self?self:"undefined"!=typeof window?window:{};(function(s){function n(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function o(t,e){function i(){ce.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}var s=!0;return c(function(){return s&&(i(),s=!1),e.apply(this,arguments)},e)}function a(t,e){return function(i){return m(t.call(this,i),e) -}}function r(t,e){return function(i){return this.lang().ordinal(t.call(this,i),e)}}function h(){}function d(t){D(t),c(this,t)}function l(t){var e=b(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 c(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 u(t){var e,i={};for(e in t)t.hasOwnProperty(e)&&Ee.hasOwnProperty(e)&&(i[e]=t[e]);return i}function p(t){return 0>t?Math.ceil(t):Math.floor(t)}function m(t,e,i){for(var s=""+Math.abs(t),n=t>=0;s.lengths;s++)(i&&t[s]!==e[s]||!i&&w(t[s])!==w(e[s]))&&a++;return a+o}function _(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=ti[t]||ei[e]||e}return t}function b(t){var e,i,s={};for(i in t)t.hasOwnProperty(i)&&(e=_(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"}ce[t]=function(n,o){var a,r,h=ce.fn._lang[t],d=[];if("number"==typeof n&&(o=n,n=s),r=function(t){var e=ce().utc().set(i,t);return h.call(ce.fn._lang,e,n||"")},null!=o)return r(o);for(a=0;e>a;a++)d.push(r(a));return d}}function w(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=e>=0?Math.floor(e):Math.ceil(e)),i}function S(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function T(t,e,i){return ee(ce([t,11,31+e-i]),e,i).week}function E(t){return M(t)?366:365}function M(t){return t%4===0&&t%100!==0||t%400===0}function D(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[ye]<0||t._a[ye]>11?ye:t._a[_e]<1||t._a[_e]>S(t._a[ve],t._a[ye])?_e:t._a[be]<0||t._a[be]>23?be:t._a[xe]<0||t._a[xe]>59?xe:t._a[we]<0||t._a[we]>59?we:t._a[Se]<0||t._a[Se]>999?Se:-1,t._pf._overflowDayOfYear&&(ve>e||e>_e)&&(e=_e),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 I(t){return t?t.toLowerCase().replace("_","-"):t}function O(t,e){return e._isUTC?ce(t).zone(e._offset||0):ce(t).local()}function P(t,e){return e.abbr=t,Te[t]||(Te[t]=new h),Te[t].set(e),Te[t]}function L(t){delete Te[t]}function N(e){var i,s,n,o,a=0,r=function(e){if(!Te[e]&&Me)try{t("./lang/"+e)}catch(i){}return Te[e]};if(!e)return ce.fn._lang;if(!f(e)){if(s=r(e))return s;e=[e]}for(;a0;){if(s=r(o.slice(0,i).join("-")))return s;if(n&&n.length>=i&&y(o,n,!0)>=i-1)break;i--}a++}return ce.fn._lang}function k(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function z(t){var e,i,s=t.match(Oe);for(e=0,i=s.length;i>e;e++)s[e]=oi[s[e]]?oi[s[e]]:k(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 A(t,e){return t.isValid()?(e=R(e,t.lang()),ii[e]||(ii[e]=z(e)),ii[e](t)):t.lang().invalidDate()}function R(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 F(t,e){var i,s=e._strict;switch(t){case"Q":return Be;case"DDDD":return je;case"YYYY":case"GGGG":case"gggg":return s?Ve:ke;case"Y":case"G":case"g":return Xe;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?Ue:ze;case"S":if(s)return Be;case"SS":if(s)return We;case"SSS":if(s)return je;case"DDD":return Ne;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Re;case"a":case"A":return N(e._l)._meridiemParse;case"X":return Ye;case"Z":case"ZZ":return Fe;case"T":return Ge;case"SSSS":return Ae;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?We:Le;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Le;case"Do":return He;default:return i=new RegExp(U(V(t.replace("\\","")),"i"))}}function G(t){t=t||"";var e=t.match(Fe)||[],i=e[e.length-1]||[],s=(i+"").match(Je)||["-",0,0],n=+(60*s[1])+w(s[2]);return"+"===s[0]?-n:n}function Y(t,e,i){var s,n=i._a;switch(t){case"Q":null!=e&&(n[ye]=3*(w(e)-1));break;case"M":case"MM":null!=e&&(n[ye]=w(e)-1);break;case"MMM":case"MMMM":s=N(i._l).monthsParse(e),null!=s?n[ye]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(n[_e]=w(e));break;case"Do":null!=e&&(n[_e]=w(parseInt(e,10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=w(e));break;case"YY":n[ve]=ce.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":n[ve]=w(e);break;case"a":case"A":i._isPm=N(i._l).isPM(e);break;case"H":case"HH":case"h":case"hh":n[be]=w(e);break;case"m":case"mm":n[xe]=w(e);break;case"s":case"ss":n[we]=w(e);break;case"S":case"SS":case"SSS":case"SSSS":n[Se]=w(1e3*("0."+e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=G(e);break;case"w":case"ww":case"W":case"WW":case"d":case"dd":case"ddd":case"dddd":case"e":case"E":t=t.substr(0,1);case"gg":case"gggg":case"GG":case"GGGG":case"GGGGG":t=t.substr(0,2),e&&(i._w=i._w||{},i._w[t]=e)}}function H(t){var e,i,s,n,o,a,r,h,d,l,c=[];if(!t._d){for(s=W(t),t._w&&null==t._a[_e]&&null==t._a[ye]&&(o=function(e){var i=parseInt(e,10);return e?e.length<3?i>68?1900+i:2e3+i:i:null==t._a[ve]?ce().weekYear():t._a[ve]},a=t._w,null!=a.GG||null!=a.W||null!=a.E?r=ie(o(a.GG),a.W||1,a.E,4,1):(h=N(t._l),d=null!=a.d?J(a.d,h):null!=a.e?parseInt(a.e,10)+h._week.dow:0,l=parseInt(a.w,10)||1,null!=a.d&&dE(n)&&(t._pf._overflowDayOfYear=!0),i=$(n,0,t._dayOfYear),t._a[ye]=i.getUTCMonth(),t._a[_e]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=c[e]=s[e];for(;7>e;e++)t._a[e]=c[e]=null==t._a[e]?2===e?1:0:t._a[e];c[be]+=w((t._tzm||0)/60),c[xe]+=w((t._tzm||0)%60),t._d=(t._useUTC?$:K).apply(null,c)}}function B(t){var e;t._d||(e=b(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],H(t))}function W(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function j(t){t._a=[],t._pf.empty=!0;var e,i,s,n,o,a=N(t._l),r=""+t._i,h=r.length,d=0;for(s=R(t._f,a).match(Oe)||[],e=0;e0&&t._pf.unusedInput.push(o),r=r.slice(r.indexOf(i)+i.length),d+=i.length),oi[n]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(n),Y(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[be]<12&&(t._a[be]+=12),t._isPm===!1&&12===t._a[be]&&(t._a[be]=0),H(t),D(t)}function V(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,n){return e||i||s||n})}function U(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function X(t){var e,i,s,o,a;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(o=0;oa)&&(s=a,i=e));c(t,i||e)}function q(t){var e,i,s=t._i,n=qe.exec(s);if(n){for(t._pf.iso=!0,e=0,i=Ke.length;i>e;e++)if(Ke[e][1].exec(s)){t._f=Ke[e][0]+(n[6]||" ");break}for(e=0,i=$e.length;i>e;e++)if($e[e][1].exec(s)){t._f+=$e[e][0];break}s.match(Fe)&&(t._f+="Z"),j(t)}else ce.createFromInputFallback(t)}function Z(t){var e=t._i,i=De.exec(e);e===s?t._d=new Date:i?t._d=new Date(+i[1]):"string"==typeof e?q(t):f(e)?(t._a=e.slice(0),H(t)):v(e)?t._d=new Date(+e):"object"==typeof e?B(t):"number"==typeof e?t._d=new Date(e):ce.createFromInputFallback(t)}function K(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 $(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function J(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 Q(t,e,i,s,n){return n.relativeTime(e||1,!!i,t,s)}function te(t,e,i){var s=fe(Math.abs(t)/1e3),n=fe(s/60),o=fe(n/60),a=fe(o/24),r=fe(a/365),h=45>s&&["s",s]||1===n&&["m"]||45>n&&["mm",n]||1===o&&["h"]||22>o&&["hh",o]||1===a&&["d"]||25>=a&&["dd",a]||45>=a&&["M"]||345>a&&["MM",fe(a/30)]||1===r&&["y"]||["yy",r];return h[2]=e,h[3]=t>0,h[4]=i,Q.apply({},h)}function ee(t,e,i){var s,n=i-e,o=i-t.day();return o>n&&(o-=7),n-7>o&&(o+=7),s=ce(t).add("d",o),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function ie(t,e,i,s,n){var o,a,r=$(t,0,1).getUTCDay();return 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:E(t-1)+a}}function se(t){var e=t._i,i=t._f;return null===e||i===s&&""===e?ce.invalid({nullInput:!0}):("string"==typeof e&&(t._i=e=N().preparse(e)),ce.isMoment(e)?(t=u(e),t._d=new Date(+e._d)):i?f(i)?X(t):j(t):Z(t),new d(t))}function ne(t,e){var i;return"string"==typeof e&&(e=t.lang().monthsParse(e),"number"!=typeof e)?t:(i=Math.min(t.date(),S(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,i),t)}function oe(t,e){return t._d["get"+(t._isUTC?"UTC":"")+e]()}function ae(t,e,i){return"Month"===e?ne(t,i):t._d["set"+(t._isUTC?"UTC":"")+e](i)}function re(t,e){return function(i){return null!=i?(ae(this,t,i),ce.updateOffset(this,e),this):oe(this,t)}}function he(t){ce.duration.fn[t]=function(){return this._data[t]}}function de(t,e){ce.duration.fn["as"+t]=function(){return+this/e}}function le(t){"undefined"==typeof ender&&(ue=ge.moment,ge.moment=t?o("Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.",ce):ce)}for(var ce,ue,pe,me="2.6.0",ge="undefined"!=typeof i?i:this,fe=Math.round,ve=0,ye=1,_e=2,be=3,xe=4,we=5,Se=6,Te={},Ee={_isAMomentObject:null,_i:null,_f:null,_l:null,_strict:null,_isUTC:null,_offset:null,_pf:null,_lang:null},Me="undefined"!=typeof e&&e.exports,De=/^\/?Date\((\-?\d+)/i,Ce=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,Ie=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,Oe=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,Pe=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,Le=/\d\d?/,Ne=/\d{1,3}/,ke=/\d{1,4}/,ze=/[+\-]?\d{1,6}/,Ae=/\d+/,Re=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Fe=/Z|[\+\-]\d\d:?\d\d/gi,Ge=/T/i,Ye=/[\+\-]?\d+(\.\d{1,3})?/,He=/\d{1,2}/,Be=/\d/,We=/\d\d/,je=/\d{3}/,Ve=/\d{4}/,Ue=/[+-]?\d{6}/,Xe=/[+-]?\d+/,qe=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Ze="YYYY-MM-DDTHH:mm:ssZ",Ke=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],$e=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Je=/([\+\-]|\d\d)/gi,Qe=("Date|Hours|Minutes|Seconds|Milliseconds".split("|"),{Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6}),ti={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",Q:"quarter",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},ei={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},ii={},si="DDD w W M D d".split(" "),ni="M D H h m s w W".split(" "),oi={M:function(){return this.month()+1},MMM:function(t){return this.lang().monthsShort(this,t)},MMMM:function(t){return this.lang().months(this,t)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(t){return this.lang().weekdaysMin(this,t)},ddd:function(t){return this.lang().weekdaysShort(this,t)},dddd:function(t){return this.lang().weekdays(this,t)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return m(this.year()%100,2)},YYYY:function(){return m(this.year(),4)},YYYYY:function(){return m(this.year(),5)},YYYYYY:function(){var t=this.year(),e=t>=0?"+":"-";return e+m(Math.abs(t),6)},gg:function(){return m(this.weekYear()%100,2)},gggg:function(){return m(this.weekYear(),4)},ggggg:function(){return m(this.weekYear(),5)},GG:function(){return m(this.isoWeekYear()%100,2)},GGGG:function(){return m(this.isoWeekYear(),4)},GGGGG:function(){return m(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 w(this.milliseconds()/100)},SS:function(){return m(w(this.milliseconds()/10),2)},SSS:function(){return m(this.milliseconds(),3)},SSSS:function(){return m(this.milliseconds(),3)},Z:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+m(w(t/60),2)+":"+m(w(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+m(w(t/60),2)+m(w(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},ai=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];si.length;)pe=si.pop(),oi[pe+"o"]=r(oi[pe],pe);for(;ni.length;)pe=ni.pop(),oi[pe+pe]=a(oi[pe],2);for(oi.DDDD=a(oi.DDD,3),c(h.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=ce.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=ce([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 ee(t,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),ce=function(t,e,i,o){var a;return"boolean"==typeof i&&(o=i,i=s),a={},a._isAMomentObject=!0,a._i=t,a._f=e,a._l=i,a._strict=o,a._isUTC=!1,a._pf=n(),se(a)},ce.suppressDeprecationWarnings=!1,ce.createFromInputFallback=o("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)}),ce.utc=function(t,e,i,o){var a;return"boolean"==typeof i&&(o=i,i=s),a={},a._isAMomentObject=!0,a._useUTC=!0,a._isUTC=!0,a._l=i,a._i=t,a._f=e,a._strict=o,a._pf=n(),se(a).utc()},ce.unix=function(t){return ce(1e3*t)},ce.duration=function(t,e){var i,s,n,o=t,a=null;return ce.isDuration(t)?o={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(o={},e?o[e]=t:o.milliseconds=t):(a=Ce.exec(t))?(i="-"===a[1]?-1:1,o={y:0,d:w(a[_e])*i,h:w(a[be])*i,m:w(a[xe])*i,s:w(a[we])*i,ms:w(a[Se])*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 l(o),ce.isDuration(t)&&t.hasOwnProperty("_lang")&&(s._lang=t._lang),s},ce.version=me,ce.defaultFormat=Ze,ce.momentProperties=Ee,ce.updateOffset=function(){},ce.lang=function(t,e){var i;return t?(e?P(I(t),e):null===e?(L(t),t="en"):Te[t]||N(t),i=ce.duration.fn._lang=ce.fn._lang=N(t),i._abbr):ce.fn._lang._abbr},ce.langData=function(t){return t&&t._lang&&t._lang._abbr&&(t=t._lang._abbr),N(t)},ce.isMoment=function(t){return t instanceof d||null!=t&&t.hasOwnProperty("_isAMomentObject")},ce.isDuration=function(t){return t instanceof l},pe=ai.length-1;pe>=0;--pe)x(ai[pe]);ce.normalizeUnits=function(t){return _(t)},ce.invalid=function(t){var e=ce.utc(0/0);return null!=t?c(e._pf,t):e._pf.userInvalidated=!0,e},ce.parseZone=function(){return ce.apply(null,arguments).parseZone()},ce.parseTwoDigitYear=function(t){return w(t)+(w(t)>68?1900:2e3)},c(ce.fn=d.prototype,{clone:function(){return ce(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=ce(this).utc();return 00:!1},parsingFlags:function(){return c({},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=A(this,t||ce.defaultFormat);return this.lang().postformat(e)},add:function(t,e){var i;return i="string"==typeof t?ce.duration(+e,t):ce.duration(t,e),g(this,i,1),this},subtract:function(t,e){var i;return i="string"==typeof t?ce.duration(+e,t):ce.duration(t,e),g(this,i,-1),this},diff:function(t,e,i){var s,n,o=O(t,this),a=6e4*(this.zone()-o.zone());return e=_(e),"year"===e||"month"===e?(s=432e5*(this.daysInMonth()+o.daysInMonth()),n=12*(this.year()-o.year())+(this.month()-o.month()),n+=(this-ce(this).startOf("month")-(o-ce(o).startOf("month")))/s,n-=6e4*(this.zone()-ce(this).startOf("month").zone()-(o.zone()-ce(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:p(n)},from:function(t,e){return ce.duration(this.diff(t)).lang(this.lang()._abbr).humanize(!e)},fromNow:function(t){return this.from(ce(),t)},calendar:function(){var t=O(ce(),this).startOf("day"),e=this.diff(t,"days",!0),i=-6>e?"sameElse":-1>e?"lastWeek":0>e?"lastDay":1>e?"sameDay":2>e?"nextDay":7>e?"nextWeek":"sameElse";return this.format(this.lang().calendar(i,this))},isLeapYear:function(){return M(this.year())},isDST:function(){return this.zone()+ce(t).startOf(e)},isBefore:function(t,e){return e="undefined"!=typeof e?e:"millisecond",+this.clone().startOf(e)<+ce(t).startOf(e)},isSame:function(t,e){return e=e||"ms",+this.clone().startOf(e)===+O(t,this).startOf(e)},min:function(t){return t=ce.apply(null,arguments),this>t?this:t},max:function(t){return t=ce.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=G(t)),Math.abs(t)<16&&(t=60*t),this._offset=t,this._isUTC=!0,i!==t&&(!e||this._changeInProgress?g(this,ce.duration(i-t,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,ce.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?ce(t).zone():0,(this.zone()-t)%60===0},daysInMonth:function(){return S(this.year(),this.month())},dayOfYear:function(t){var e=fe((ce(this).startOf("day")-ce(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=ee(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==t?e:this.add("y",t-e)},isoWeekYear:function(t){var e=ee(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=ee(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 T(this.year(),1,4)},weeksInYear:function(){var t=this._lang._week;return T(this.year(),t.dow,t.doy)},get:function(t){return t=_(t),this[t]()},set:function(t,e){return t=_(t),"function"==typeof this[t]&&this[t](e),this},lang:function(t){return t===s?this._lang:(this._lang=N(t),this)}}),ce.fn.millisecond=ce.fn.milliseconds=re("Milliseconds",!1),ce.fn.second=ce.fn.seconds=re("Seconds",!1),ce.fn.minute=ce.fn.minutes=re("Minutes",!1),ce.fn.hour=ce.fn.hours=re("Hours",!0),ce.fn.date=re("Date",!0),ce.fn.dates=o("dates accessor is deprecated. Use date instead.",re("Date",!0)),ce.fn.year=re("FullYear",!0),ce.fn.years=o("years accessor is deprecated. Use year instead.",re("FullYear",!0)),ce.fn.days=ce.fn.day,ce.fn.months=ce.fn.month,ce.fn.weeks=ce.fn.week,ce.fn.isoWeeks=ce.fn.isoWeek,ce.fn.quarters=ce.fn.quarter,ce.fn.toJSON=ce.fn.toISOString,c(ce.duration.fn=l.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=p(n/1e3),r.seconds=t%60,e=p(t/60),r.minutes=e%60,i=p(e/60),r.hours=i%24,o+=p(i/24),r.days=o%30,a+=p(o/30),r.months=a%12,s=p(a/12),r.years=s},weeks:function(){return p(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*w(this._months/12)},humanize:function(t){var e=+this,i=te(e,!t,this.lang());return t&&(i=this.lang().pastFuture(e,i)),this.lang().postformat(i)},add:function(t,e){var i=ce.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=ce.duration(t,e);return this._milliseconds-=i._milliseconds,this._days-=i._days,this._months-=i._months,this._bubble(),this},get:function(t){return t=_(t),this[t.toLowerCase()+"s"]()},as:function(t){return t=_(t),this["as"+t.charAt(0).toUpperCase()+t.slice(1)+"s"]()},lang:ce.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(pe in Qe)Qe.hasOwnProperty(pe)&&(de(pe,Qe[pe]),he(pe.toLowerCase()));de("Weeks",6048e5),ce.duration.fn.asMonths=function(){return(+this-31536e6*this.years())/2592e6+12*this.years()},ce.lang("en",{ordinal:function(t){var e=t%10,i=1===w(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),Me?e.exports=ce:"function"==typeof define&&define.amd?(define("moment",function(t,e,i){return i.config&&i.config()&&i.config().noGlobal===!0&&(ge.moment=ue),ce}),le(!0)):le()}).call(this)},{}],5:[function(t,e){function i(t,e,i){return t.addEventListener?t.addEventListener(e,i,!1):void t.attachEvent("on"+e,i)}function s(t){return"keypress"==t.type?String.fromCharCode(t.which):x[t.which]?x[t.which]:w[t.which]?w[t.which]:String.fromCharCode(t.which).toLowerCase()}function n(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 o(t,e){return t.sort().join(",")===e.sort().join(",")}function a(t){t=t||{};var e,i=!1;for(e in D)t[e]?i=!0:D[e]=0;i||(I=!1)}function r(t,e,i,s,n){var a,r,h=[];if(!E[t])return[];for("keyup"==i&&u(t)&&(e=[t]),a=0;a95&&112>t||x.hasOwnProperty(t)&&(_[x[t]]=t)}return _}function g(t,e,i){return i||(i=m()[t]?"keydown":"keypress"),"keypress"==i&&e.length&&(i="keydown"),i}function f(t,e,i,n){D[t]=0,n||(n=g(e[0],[]));var o,r=function(){I=n,++D[t],p()},h=function(t){d(i,t),"keyup"!==n&&(C=s(t)),setTimeout(a,10)};for(o=0;o1)return f(t,d,e,i);for(h="+"===t?["+"]:t.split("+"),o=0;o":".","?":"/","|":"\\"},T={option:"alt",command:"meta","return":"enter",escape:"esc"},E={},M={},D={},C=!1,I=!1,O=1;20>O;++O)x[111+O]="f"+O;for(O=0;9>=O;++O)x[O+96]=O;i(document,"keypress",c),i(document,"keydown",c),i(document,"keyup",c);var P={bind:function(t,e,i){return y(t instanceof Array?t:[t],e,i),M[t+":"+i]=e,this},unbind:function(t,e){return M[t+":"+e]&&(delete M[t+":"+e],this.bind(t,function(){},e)),this},trigger:function(t,e){return M[t+":"+e](),this},reset:function(){return E={},M={},this}};e.exports=P},{}]},{},[1])(1)}); \ No newline at end of file +!function(t){if("object"==typeof exports)module.exports=t();else if("function"==typeof define&&define.amd)define(t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.vis=t()}}(function(){var define,module,exports;return function t(e,i,s){function n(r,a){if(!i[r]){if(!e[r]){var h="function"==typeof require&&require;if(!a&&h)return h(r,!0);if(o)return o(r,!0);throw new Error("Cannot find module '"+r+"'")}var d=i[r]={exports:{}};e[r][0].call(d.exports,function(t){var i=e[r][1][t];return n(i?i:t)},d,d.exports,t,e,i,s)}return i[r].exports}for(var o="function"==typeof require&&require,r=0;re?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}function Slider(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 moment="undefined"!=typeof window&&window.moment||require("moment"),Emitter=require("emitter-component"),Hammer;Hammer="undefined"!=typeof window?window.Hammer||require("hammerjs"):function(){throw Error("hammer.js is only available in a browser, not in node.js.")};var mousetrap;if(mousetrap="undefined"!=typeof window?window.mousetrap||require("mousetrap"):function(){throw Error("mouseTrap is only available in a browser, not in node.js.")},!Array.prototype.indexOf){Array.prototype.indexOf=function(t){for(var e=0;ei;++i)t.call(e||this,this[i],i,this)}),Array.prototype.map||(Array.prototype.map=function(t,e){var i,s,n;if(null==this)throw new TypeError(" this is null or not defined");var o=Object(this),r=o.length>>>0;if("function"!=typeof t)throw new TypeError(t+" is not a function");for(e&&(i=e),s=new Array(r),n=0;r>n;){var a,h;n in o&&(a=o[n],h=t.call(i,a,n,o),s[n]=h),n++}return s}),Array.prototype.filter||(Array.prototype.filter=function(t){"use strict";if(null==this)throw new TypeError;var e=Object(this),i=e.length>>>0;if("function"!=typeof t)throw new TypeError;for(var s=[],n=arguments[1],o=0;i>o;o++)if(o in e){var r=e[o];t.call(n,r,o,e)&&s.push(r)}return s}),Object.keys||(Object.keys=function(){var t=Object.prototype.hasOwnProperty,e=!{toString:null}.propertyIsEnumerable("toString"),i=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],s=i.length;return function(n){if("object"!=typeof n&&"function"!=typeof n||null===n)throw new TypeError("Object.keys called on non-object");var o=[];for(var r in n)t.call(n,r)&&o.push(r);if(e)for(var a=0;s>a;a++)t.call(n,i[a])&&o.push(i[a]);return o}}()),Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),Function.prototype.bind||(Function.prototype.bind=function(t){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var e=Array.prototype.slice.call(arguments,1),i=this,s=function(){},n=function(){return i.apply(this instanceof s&&t?this:t,e.concat(Array.prototype.slice.call(arguments)))};return s.prototype=this.prototype,n.prototype=new s,n}),Object.create||(Object.create=function(t){function e(){}if(arguments.length>1)throw new Error("Object.create implementation only accepts the first parameter.");return e.prototype=t,new e}),Function.prototype.bind||(Function.prototype.bind=function(t){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var e=Array.prototype.slice.call(arguments,1),i=this,s=function(){},n=function(){return i.apply(this instanceof s&&t?this:t,e.concat(Array.prototype.slice.call(arguments)))};return s.prototype=this.prototype,n.prototype=new s,n});var util={};util.isNumber=function(t){return t instanceof Number||"number"==typeof t},util.isString=function(t){return t instanceof String||"string"==typeof t},util.isDate=function(t){if(t instanceof Date)return!0;if(util.isString(t)){var e=ASPDateRegex.exec(t);if(e)return!0;if(!isNaN(Date.parse(t)))return!0}return!1},util.isDataTable=function(t){return"undefined"!=typeof google&&google.visualization&&google.visualization.DataTable&&t instanceof google.visualization.DataTable},util.randomUUID=function(){var t=function(){return Math.floor(65536*Math.random()).toString(16)};return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()},util.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},util.selectiveExtend=function(t,e){if(!Array.isArray(t))throw new Error("Array with property names expected as first argument");for(var i=1,s=arguments.length;s>i;i++)for(var n=arguments[i],o=0,r=t.length;r>o;o++){var a=t[o];n.hasOwnProperty(a)&&(e[a]=n[a])}return e},util.deepExtend=function(t,e){if(Array.isArray(e))throw new TypeError("Arrays are not supported by deepExtend");for(var i in e)if(e.hasOwnProperty(i))if(e[i]&&e[i].constructor===Object)void 0===t[i]&&(t[i]={}),t[i].constructor===Object?util.deepExtend(t[i],e[i]):t[i]=e[i];else{if(Array.isArray(e[i]))throw new TypeError("Arrays are not supported by deepExtend");t[i]=e[i]}return t},util.equalArray=function(t,e){if(t.length!=e.length)return!1;for(var i=0,s=t.length;s>i;i++)if(t[i]!=e[i])return!1;return!0},util.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(util.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(util.isString(t))return i=ASPDateRegex.exec(t),i?new Date(Number(i[1])):moment(t).toDate();throw new Error("Cannot convert object of type "+util.getType(t)+" to type Date");case"Moment":if(util.isNumber(t))return moment(t);if(t instanceof Date)return moment(t.valueOf());if(moment.isMoment(t))return moment(t);if(util.isString(t))return i=ASPDateRegex.exec(t),moment(i?Number(i[1]):t);throw new Error("Cannot convert object of type "+util.getType(t)+" to type Date");case"ISODate":if(util.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(moment.isMoment(t))return t.toDate().toISOString();if(util.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 "+util.getType(t)+" to type ISODate");case"ASPDate":if(util.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(util.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 "+util.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+e+'"')}};var ASPDateRegex=/^\/?Date\((\-?\d+)/i;util.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},util.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},util.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},util.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)},util.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)},util.addClassName=function(t,e){var i=t.className.split(" ");-1==i.indexOf(e)&&(i.push(e),t.className=i.join(" "))},util.removeClassName=function(t,e){var i=t.className.split(" "),s=i.indexOf(e);-1!=s&&(i.splice(s,1),t.className=i.join(" ")) +},util.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)},util.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e},util.updateProperty=function(t,e,i){return t[e]!==i?(t[e]=i,!0):!1},util.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)},util.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)},util.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},util.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},util.option={},util.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},util.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},util.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},util.option.asSize=function(t,e){return"function"==typeof t&&(t=t()),util.isString(t)?t:util.isNumber(t)?t+"px":e||null},util.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},util.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)},util.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},util.parseColor=function(t){var e;if(util.isString(t))if(util.isValidHex(t)){var i=util.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=util.HSVToHex(n.h,n.h,n.v),r=util.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,util.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),util.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},util.hexToRGB=function(t){t=t.replace("#","").toUpperCase();var e=util.GiveDec(t.substring(0,1)),i=util.GiveDec(t.substring(1,2)),s=util.GiveDec(t.substring(2,3)),n=util.GiveDec(t.substring(3,4)),o=util.GiveDec(t.substring(4,5)),r=util.GiveDec(t.substring(5,6)),a=16*e+i,h=16*s+n,i=16*o+r;return{r:a,g:h,b:i}},util.RGBToHex=function(t,e,i){var s=util.GiveHex(Math.floor(t/16)),n=util.GiveHex(t%16),o=util.GiveHex(Math.floor(e/16)),r=util.GiveHex(e%16),a=util.GiveHex(Math.floor(i/16)),h=util.GiveHex(i%16),d=s+n+o+r+a+h;return"#"+d},util.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}},util.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)}},util.HSVToHex=function(t,e,i){var s=util.HSVToRGB(t,e,i);return util.RGBToHex(s.r,s.g,s.b)},util.hexToHSV=function(t){var e=util.hexToRGB(t);return util.RGBToHSV(e.r,e.g,e.b)},util.isValidHex=function(t){var e=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t);return e},util.copyObject=function(t,e){for(var i in t)t.hasOwnProperty(i)&&("object"==typeof t[i]?(e[i]={},util.copyObject(t[i],e[i])):e[i]=t[i])},DataSet.prototype.on=function(t,e){var i=this._subscribers[t];i||(i=[],this._subscribers[t]=i),i.push({callback:e})},DataSet.prototype.subscribe=DataSet.prototype.on,DataSet.prototype.off=function(t,e){var i=this._subscribers[t];i&&(this._subscribers[t]=i.filter(function(t){return t.callback!=e}))},DataSet.prototype.unsubscribe=DataSet.prototype.off,DataSet.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;no;o++)i=n._addItem(t[o]),s.push(i);else if(util.isDataTable(t))for(var a=this._getColumnNames(t),h=0,d=t.getNumberOfRows();d>h;h++){for(var l={},c=0,u=a.length;u>c;c++){var p=a[c];l[p]=t.getValue(h,c)}i=n._addItem(l),s.push(i)}else{if(!(t instanceof Object))throw new Error("Unknown dataType");i=n._addItem(t),s.push(i)}return s.length&&this._trigger("add",{items:s},e),s},DataSet.prototype.update=function(t,e){var i=[],s=[],n=this,o=n._fieldId,r=function(t){var e=t[o];n._data[e]?(e=n._updateItem(t),s.push(e)):(e=n._addItem(t),i.push(e))};if(Array.isArray(t))for(var a=0,h=t.length;h>a;a++)r(t[a]);else if(util.isDataTable(t))for(var d=this._getColumnNames(t),l=0,c=t.getNumberOfRows();c>l;l++){for(var u={},p=0,m=d.length;m>p;p++){var g=d[p];u[g]=t.getValue(l,p)}r(u)}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)},DataSet.prototype.get=function(){var t,e,i,s,n=this,o=util.getType(arguments[0]);"String"==o||"Number"==o?(t=arguments[0],i=arguments[1],s=arguments[2]):"Array"==o?(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!=util.getType(s))throw new Error('Type of parameter "data" ('+util.getType(s)+") does not correspond with specified options.type ("+i.type+")");if("DataTable"==r&&!util.isDataTable(s))throw new Error('Parameter "data" must be a DataTable when options.type is "DataTable"')}else r=s&&"DataTable"==util.getType(s)?"DataTable":"Array";var a,h,d,l,c=i&&i.type||this._options.type,u=i&&i.filter,p=[];if(void 0!=t)a=n._getItem(t,c),u&&!u(a)&&(a=null);else if(void 0!=e)for(d=0,l=e.length;l>d;d++)a=n._getItem(e[d],c),(!u||u(a))&&p.push(a);else for(h in this._data)this._data.hasOwnProperty(h)&&(a=n._getItem(h,c),(!u||u(a))&&p.push(a));if(i&&i.order&&void 0==t&&this._sort(p,i.order),i&&i.fields){var m=i.fields;if(void 0!=t)a=this._filterFields(a,m);else for(d=0,l=p.length;l>d;d++)p[d]=this._filterFields(p[d],m)}if("DataTable"==r){var g=this._getColumnNames(s);if(void 0!=t)n._appendRow(s,g,a);else for(d=0,l=p.length;l>d;d++)n._appendRow(s,g,p[d]);return s}if(void 0!=t)return a;if(s){for(d=0,l=p.length;l>d;d++)s.push(p[d]);return s}return p},DataSet.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},DataSet.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))},DataSet.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},DataSet.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},DataSet.prototype._sort=function(t,e){if(util.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)}},DataSet.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},DataSet.prototype._remove=function(t){if(util.isNumber(t)||util.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},DataSet.prototype.clear=function(t){var e=Object.keys(this._data);return this._data={},this._trigger("remove",{items:e},t),e},DataSet.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},DataSet.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},DataSet.prototype.distinct=function(t){var e,i=this._data,s=[],n=this._options.type&&this._options.type[t]||null,o=0;for(var r in i)if(i.hasOwnProperty(r)){var a=i[r],h=a[t],d=!1;for(e=0;o>e;e++)if(s[e]==h){d=!0;break}d||void 0===h||(s[o]=h,o++)}if(n)for(e=0;ei;i++)e[i]=t.getColumnId(i)||t.getColumnLabel(i);return e},DataSet.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])}},DataView.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)}},DataView.prototype.get=function(){var t,e,i,s=this,n=util.getType(arguments[0]);"String"==n||"Number"==n||"Array"==n?(t=arguments[0],e=arguments[1],i=arguments[2]):(e=arguments[0],i=arguments[1]);var o=util.extend({},this._options,e);this._options.filter&&e&&e.filter&&(o.filter=function(t){return s._options.filter(t)&&e.filter(t)});var r=[];return void 0!=t&&r.push(t),r.push(o),r.push(i),this._data&&this._data.get.apply(this._data,r)},DataView.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},DataView.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)}},DataView.prototype.on=DataSet.prototype.on,DataView.prototype.off=DataSet.prototype.off,DataView.prototype._trigger=DataSet.prototype._trigger,DataView.prototype.subscribe=DataView.prototype.on,DataView.prototype.unsubscribe=DataView.prototype.off;var stack={};stack.orderByStart=function(t){t.sort(function(t,e){return t.data.start-e.data.start})},stack.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})},stack.stack=function(t,e,i){var s,n;if(i)for(s=0,n=t.length;n>s;s++)t[s].top=null;for(s=0,n=t.length;n>s;s++){var o=t[s];if(null===o.top){o.top=e.axis;do{for(var r=null,a=0,h=t.length;h>a;a++){var d=t[a];if(null!==d.top&&d!==o&&stack.collision(o,d,e.item)){r=d;break}}null!=r&&(o.top=r.top+r.height+e.item)}while(r)}}},stack.nostack=function(t,e){var i,s;for(i=0,s=t.length;s>i;i++)t[i].top=e.axis},stack.collision=function(t,e,i){return t.left-ie.left&&t.top-ie.top},TimeStep.SCALE={MILLISECOND:1,SECOND:2,MINUTE:3,HOUR:4,DAY:5,WEEKDAY:6,MONTH:7,YEAR:8},TimeStep.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)},TimeStep.prototype.first=function(){this.current=new Date(this._start.valueOf()),this.roundToMinor()},TimeStep.prototype.roundToMinor=function(){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: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)}if(1!=this.step)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: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)}},TimeStep.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},TimeStep.prototype.next=function(){var t=this.current.valueOf();if(this.current.getMonth()<6)switch(this.scale){case TimeStep.SCALE.MILLISECOND:this.current=new Date(this.current.valueOf()+this.step);break;case TimeStep.SCALE.SECOND:this.current=new Date(this.current.valueOf()+1e3*this.step);break;case TimeStep.SCALE.MINUTE:this.current=new Date(this.current.valueOf()+1e3*this.step*60);break;case TimeStep.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 TimeStep.SCALE.WEEKDAY: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)}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: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)}if(1!=this.step)switch(this.scale){case TimeStep.SCALE.MILLISECOND:this.current.getMilliseconds()0&&(this.step=e),this.autoScale=!1},TimeStep.prototype.setAutoScale=function(t){this.autoScale=t},TimeStep.prototype.setMinimumStep=function(t){if(void 0!=t){var e=31104e6,i=2592e6,s=864e5,n=36e5,o=6e4,r=1e3,a=1;1e3*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=1e3),500*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=500),100*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=100),50*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=50),10*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=10),5*e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=5),e>t&&(this.scale=TimeStep.SCALE.YEAR,this.step=1),3*i>t&&(this.scale=TimeStep.SCALE.MONTH,this.step=3),i>t&&(this.scale=TimeStep.SCALE.MONTH,this.step=1),5*s>t&&(this.scale=TimeStep.SCALE.DAY,this.step=5),2*s>t&&(this.scale=TimeStep.SCALE.DAY,this.step=2),s>t&&(this.scale=TimeStep.SCALE.DAY,this.step=1),s/2>t&&(this.scale=TimeStep.SCALE.WEEKDAY,this.step=1),4*n>t&&(this.scale=TimeStep.SCALE.HOUR,this.step=4),n>t&&(this.scale=TimeStep.SCALE.HOUR,this.step=1),15*o>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=15),10*o>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=10),5*o>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=5),o>t&&(this.scale=TimeStep.SCALE.MINUTE,this.step=1),15*r>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=15),10*r>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=10),5*r>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=5),r>t&&(this.scale=TimeStep.SCALE.SECOND,this.step=1),200*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=200),100*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=100),50*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=50),10*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=10),5*a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=5),a>t&&(this.scale=TimeStep.SCALE.MILLISECOND,this.step=1)}},TimeStep.prototype.snap=function(t){var e=new Date(t.valueOf());if(this.scale==TimeStep.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==TimeStep.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==TimeStep.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==TimeStep.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==TimeStep.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==TimeStep.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==TimeStep.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==TimeStep.SCALE.MILLISECOND){var s=this.step>5?this.step/2:1;e.setMilliseconds(Math.round(e.getMilliseconds()/s)*s)}return e},TimeStep.prototype.isMajor=function(){switch(this.scale){case TimeStep.SCALE.MILLISECOND:return 0==this.current.getMilliseconds();case TimeStep.SCALE.SECOND:return 0==this.current.getSeconds();case TimeStep.SCALE.MINUTE:return 0==this.current.getHours()&&0==this.current.getMinutes();case TimeStep.SCALE.HOUR:return 0==this.current.getHours();case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:return 1==this.current.getDate();case TimeStep.SCALE.MONTH:return 0==this.current.getMonth();case TimeStep.SCALE.YEAR:return!1;default:return!1}},TimeStep.prototype.getLabelMinor=function(t){switch(void 0==t&&(t=this.current),this.scale){case TimeStep.SCALE.MILLISECOND:return moment(t).format("SSS");case TimeStep.SCALE.SECOND:return moment(t).format("s");case TimeStep.SCALE.MINUTE:return moment(t).format("HH:mm");case TimeStep.SCALE.HOUR:return moment(t).format("HH:mm");case TimeStep.SCALE.WEEKDAY:return moment(t).format("ddd D");case TimeStep.SCALE.DAY:return moment(t).format("D");case TimeStep.SCALE.MONTH:return moment(t).format("MMM");case TimeStep.SCALE.YEAR:return moment(t).format("YYYY");default:return""}},TimeStep.prototype.getLabelMajor=function(t){switch(void 0==t&&(t=this.current),this.scale){case TimeStep.SCALE.MILLISECOND:return moment(t).format("HH:mm:ss");case TimeStep.SCALE.SECOND:return moment(t).format("D MMMM HH:mm");case TimeStep.SCALE.MINUTE:case TimeStep.SCALE.HOUR:return moment(t).format("ddd D MMMM");case TimeStep.SCALE.WEEKDAY:case TimeStep.SCALE.DAY:return moment(t).format("MMMM YYYY");case TimeStep.SCALE.MONTH:return moment(t).format("YYYY");case TimeStep.SCALE.YEAR:return"";default:return""}},Range.prototype=new Component,Range.prototype.setOptions=function(t){if(t){var e=["direction","min","max","zoomMin","zoomMax","moveable","zoomable"];util.selectiveExtend(e,this.options,t),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},Range.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)}},Range.prototype._applyRange=function(t,e){var i,s=null!=t?util.convert(t,"Date").valueOf():this.start,n=null!=e?util.convert(e,"Date").valueOf():this.end,o=null!=this.options.max?util.convert(this.options.max,"Date").valueOf():null,r=null!=this.options.min?util.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 a=parseFloat(this.options.zoomMin);0>a&&(a=0),a>n-s&&(this.end-this.start===a?(s=this.start,n=this.end):(i=a-(n-s),s-=i/2,n+=i/2))}if(null!==this.options.zoomMax){var h=parseFloat(this.options.zoomMax);0>h&&(h=0),n-s>h&&(this.end-this.start===h?(s=this.start,n=this.end):(i=n-s-h,s+=i/2,n-=i/2))}var d=this.start!=s||this.end!=n;return this.start=s,this.end=n,d},Range.prototype.getRange=function(){return{start:this.start,end:this.end}},Range.prototype.conversion=function(t){return Range.conversion(this.start,this.end,t)},Range.conversion=function(t,e,i){return 0!=i&&e-t!=0?{offset:t,scale:i/(e-t)}:{offset:0,scale:1}},Range.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"))},Range.prototype._onDrag=function(t){if(this.options.moveable){var e=this.options.direction;if(validateDirection(e),this.props.touch.allowDragging){var i="horizontal"==e?t.gesture.deltaX:t.gesture.deltaY,s=this.props.touch.end-this.props.touch.start,n="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height,o=-i/n*s;this._applyRange(this.props.touch.start+o,this.props.touch.end+o),this.body.emitter.emit("rangechange",{start:new Date(this.start),end:new Date(this.end)})}}},Range.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)}))},Range.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=util.fakeGesture(this,t),n=getPointer(s.center,this.body.dom.center),o=this._pointerToDate(n);this.zoom(i,o)}t.preventDefault()}},Range.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},Range.prototype._onHold=function(){this.props.touch.allowDragging=!1},Range.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=getPointer(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)}},Range.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(validateDirection(i),"horizontal"==i){var s=this.body.domProps.center.width;return e=this.conversion(s),t.x/e.scale+e.offset}var n=this.body.domProps.center.height;return e=this.conversion(n),t.y/e.scale+e.offset},Range.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)},Range.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},Range.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)},Component.prototype.setOptions=function(t){t&&util.extend(this.options,t)},Component.prototype.redraw=function(){return!1},Component.prototype.destroy=function(){},Component.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},TimeAxis.prototype=new Component,TimeAxis.prototype.setOptions=function(t){t&&util.selectiveExtend(["orientation","showMinorLabels","showMajorLabels"],this.options,t)},TimeAxis.prototype._create=function(){this.dom.foreground=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.foreground.className="timeaxis foreground",this.dom.background.className="timeaxis background"},TimeAxis.prototype.destroy=function(){this.dom.foreground.parentNode&&this.dom.foreground.parentNode.removeChild(this.dom.foreground),this.dom.background.parentNode&&this.dom.background.parentNode.removeChild(this.dom.background),this.body=null},TimeAxis.prototype.redraw=function(){var t=this.options,e=this.props,i=this.dom.foreground,s=this.dom.background,n="top"==t.orientation?this.body.dom.top:this.body.dom.bottom,o=i.parentNode!==n;this._calculateCharSize();var r=(this.options.orientation,this.options.showMinorLabels),a=this.options.showMajorLabels;e.minorLabelHeight=r?e.minorCharHeight:0,e.majorLabelHeight=a?e.majorCharHeight:0,e.height=e.minorLabelHeight+e.majorLabelHeight,e.width=i.offsetWidth,e.minorLineHeight=this.body.domProps.root.height-e.majorLabelHeight-("top"==t.orientation?this.body.domProps.bottom.height:this.body.domProps.top.height),e.minorLineWidth=1,e.majorLineHeight=e.minorLineHeight+e.majorLabelHeight,e.majorLineWidth=1;var h=i.nextSibling,d=s.nextSibling;return i.parentNode&&i.parentNode.removeChild(i),s.parentNode&&s.parentNode.removeChild(s),i.style.height=this.props.height+"px",this._repaintLabels(),h?n.insertBefore(i,h):n.appendChild(i),d?this.body.dom.backgroundVertical.insertBefore(s,d):this.body.dom.backgroundVertical.appendChild(s),this._isResized()||o},TimeAxis.prototype._repaintLabels=function(){var t=this.options.orientation,e=util.convert(this.body.range.start,"Number"),i=util.convert(this.body.range.end,"Number"),s=this.body.util.toTime(7*(this.props.minorCharWidth||10)).valueOf()-this.body.util.toTime(0).valueOf(),n=new TimeStep(new Date(e),new Date(i),s);this.step=n;var o=this.dom;o.redundant.majorLines=o.majorLines,o.redundant.majorTexts=o.majorTexts,o.redundant.minorLines=o.minorLines,o.redundant.minorTexts=o.minorTexts,o.majorLines=[],o.majorTexts=[],o.minorLines=[],o.minorTexts=[],n.first();for(var r=void 0,a=0;n.hasNext()&&1e3>a;){a++;var h=n.getCurrent(),d=this.body.util.toScreen(h),l=n.isMajor();this.options.showMinorLabels&&this._repaintMinorText(d,n.getLabelMinor(),t),l&&this.options.showMajorLabels?(d>0&&(void 0==r&&(r=d),this._repaintMajorText(d,n.getLabelMajor(),t)),this._repaintMajorLine(d,t)):this._repaintMinorLine(d,t),n.next()}if(this.options.showMajorLabels){var c=this.body.util.toTime(0),u=n.getLabelMajor(c),p=u.length*(this.props.majorCharWidth||10)+10;(void 0==r||r>p)&&this._repaintMajorText(0,u,t)}util.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})},TimeAxis.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"},TimeAxis.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"},TimeAxis.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"},TimeAxis.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"},TimeAxis.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},TimeAxis.prototype.snap=function(t){return this.step.snap(t)},CurrentTime.prototype=new Component,CurrentTime.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},CurrentTime.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},CurrentTime.prototype.setOptions=function(t){t&&util.selectiveExtend(["showCurrentTime"],this.options,t)},CurrentTime.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},CurrentTime.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()},CurrentTime.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},CustomTime.prototype=new Component,CustomTime.prototype.setOptions=function(t){t&&util.selectiveExtend(["showCustomTime"],this.options,t)},CustomTime.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=Hammer(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))},CustomTime.prototype.destroy=function(){this.options.showCustomTime=!1,this.redraw(),this.hammer.enable(!1),this.hammer=null,this.body=null},CustomTime.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},CustomTime.prototype.setCustomTime=function(t){this.customTime=new Date(t.valueOf()),this.redraw()},CustomTime.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},CustomTime.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation(),t.preventDefault()},CustomTime.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()}},CustomTime.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{time:new Date(this.customTime.valueOf())}),t.stopPropagation(),t.preventDefault())};var UNGROUPED="__ungrouped__";ItemSet.prototype=new Component,ItemSet.types={box:ItemBox,range:ItemRange,rangeoverflow:ItemRangeOverflow,point:ItemPoint},ItemSet.prototype._create=function(){var t=document.createElement("div");t.className="itemset",t["timeline-itemset"]=this,this.dom.frame=t;var e=document.createElement("div");e.className="background",t.appendChild(e),this.dom.background=e;var i=document.createElement("div");i.className="foreground",t.appendChild(i),this.dom.foreground=i;var s=document.createElement("div");s.className="axis",this.dom.axis=s;var n=document.createElement("div");n.className="labelset",this.dom.labelSet=n,this._updateUngrouped(),this.hammer=Hammer(this.body.dom.centerContainer,{prevent_default:!0}),this.hammer.on("touch",this._onTouch.bind(this)),this.hammer.on("dragstart",this._onDragStart.bind(this)),this.hammer.on("drag",this._onDrag.bind(this)),this.hammer.on("dragend",this._onDragEnd.bind(this)),this.hammer.on("tap",this._onSelectItem.bind(this)),this.hammer.on("hold",this._onMultiSelectItem.bind(this)),this.hammer.on("doubletap",this._onAddItem.bind(this)),this.show()},ItemSet.prototype.setOptions=function(t){if(t){var e=["type","align","orientation","padding","stack","selectable","groupOrder"];util.selectiveExtend(e,this.options,t),"margin"in t&&("number"==typeof t.margin?(this.options.margin.axis=t.margin,this.options.margin.item=t.margin):"object"==typeof t.margin&&util.selectiveExtend(["axis","item"],this.options.margin,t.margin)),"editable"in t&&("boolean"==typeof t.editable?(this.options.editable.updateTime=t.editable,this.options.editable.updateGroup=t.editable,this.options.editable.add=t.editable,this.options.editable.remove=t.editable):"object"==typeof t.editable&&util.selectiveExtend(["updateTime","updateGroup","add","remove"],this.options.editable,t.editable));var i=function(e){if(e in t){var i=t[e];if(!(i instanceof Function)||2!=i.length)throw new Error("option "+e+" must be a function "+e+"(item, callback)");this.options[e]=i}}.bind(this);["onAdd","onUpdate","onRemove","onMove"].forEach(i),this.markDirty()}},ItemSet.prototype.markDirty=function(){this.groupIds=[],this.stackDirty=!0},ItemSet.prototype.destroy=function(){this.hide(),this.setItems(null),this.setGroups(null),this.hammer=null,this.body=null,this.conversion=null},ItemSet.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.axis.parentNode&&this.dom.axis.parentNode.removeChild(this.dom.axis),this.dom.labelSet.parentNode&&this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)},ItemSet.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame),this.dom.axis.parentNode||this.body.dom.backgroundVertical.appendChild(this.dom.axis),this.dom.labelSet.parentNode||this.body.dom.left.appendChild(this.dom.labelSet)},ItemSet.prototype.setSelection=function(t){var e,i,s,n;if(t){if(!Array.isArray(t))throw new TypeError("Array expected");for(e=0,i=this.selection.length;i>e;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())}},ItemSet.prototype.getSelection=function(){return this.selection.concat([])},ItemSet.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}},ItemSet.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=util.option.asSize,s=this.options,n=s.orientation,o=!1,r=this.dom.frame,a=s.editable.updateTime||s.editable.updateGroup;r.className="itemset"+(a?" editable":""),o=this._orderGroups()||o;var h=e.end-e.start,d=h!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;d&&(this.stackDirty=!0),this.lastVisibleInterval=h,this.props.lastWidth=this.props.width;var l=this.stackDirty,c=this._firstGroup(),u={item:t.item,axis:t.axis},p={item:t.item,axis:t.item/2},m=0,g=t.axis+t.item;return util.forEach(this.groups,function(t){var i=t==c?u:p,s=t.redraw(e,i,l);o=s||o,m+=t.height}),m=Math.max(m,g),this.stackDirty=!1,r.style.height=i(m),this.props.top=r.offsetTop,this.props.left=r.offsetLeft,this.props.width=r.offsetWidth,this.props.height=m,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",o=this._isResized()||o},ItemSet.prototype._firstGroup=function(){var t="top"==this.options.orientation?0:this.groupIds.length-1,e=this.groupIds[t],i=this.groups[e]||this.groups[UNGROUPED];return i||null},ItemSet.prototype._updateUngrouped=function(){var t=this.groups[UNGROUPED];if(this.groupsData)t&&(t.hide(),delete this.groups[UNGROUPED]);else if(!t){var e=null,i=null;t=new Group(e,i,this),this.groups[UNGROUPED]=t;for(var s in this.items)this.items.hasOwnProperty(s)&&t.add(this.items[s]);t.show()}},ItemSet.prototype.getLabelSet=function(){return this.dom.labelSet},ItemSet.prototype.setItems=function(t){var e,i=this,s=this.itemsData;if(t){if(!(t instanceof DataSet||t instanceof DataView))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(s&&(util.forEach(this.itemListeners,function(t,e){s.off(e,t)}),e=s.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;util.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}},ItemSet.prototype.getItems=function(){return this.itemsData},ItemSet.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(util.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 DataSet||t instanceof DataView))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;util.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")},ItemSet.prototype.getGroups=function(){return this.groupsData},ItemSet.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this._myDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},ItemSet.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i=e.itemsData.get(t,e.itemOptions),s=e.items[t],n=i.type||i.start&&i.end&&"range"||e.options.type||"box",o=ItemSet.types[n];if(s&&(o&&s instanceof o?e._updateItem(s,i):(e._removeItem(s),s=null)),!s){if(!o)throw new TypeError('Unknown item type "'+n+'"');s=new o(i,e.conversion,e.options),s.id=t,e._addItem(s)}}),this._order(),this.stackDirty=!0,this.body.emitter.emit("change")},ItemSet.prototype._onAdd=ItemSet.prototype._onUpdate,ItemSet.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"))},ItemSet.prototype._order=function(){util.forEach(this.groups,function(t){t.order()})},ItemSet.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},ItemSet.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==UNGROUPED)throw new Error("Illegal group id. "+t+" is a reserved id.");var n=Object.create(e.options);util.extend(n,{height:null}),s=new Group(t,i,e),e.groups[t]=s;for(var o in e.items)if(e.items.hasOwnProperty(o)){var r=e.items[o];r.data.group==t&&s.add(r)}s.order(),s.show()}}),this.body.emitter.emit("change")},ItemSet.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")},ItemSet.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder}),e=!util.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},ItemSet.prototype._addItem=function(t){this.items[t.id]=t;var e=this.groupsData?t.data.group:UNGROUPED,i=this.groups[e];i&&i.add(t)},ItemSet.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:UNGROUPED,o=this.groups[n];o&&o.add(t)}},ItemSet.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:UNGROUPED,s=this.groups[i];s&&s.remove(t)},ItemSet.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0||s.length>0)&&this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}},ItemSet.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this,i=this.body.util.snap||null,s=ItemSet.itemFromTarget(t);if(s){var n=e.itemsData.get(s.id);this.options.onUpdate(n,function(t){t&&e.itemsData.update(t)})}else{var o=vis.util.getAbsoluteLeft(this.dom.frame),r=t.gesture.center.pageX-o,a=this.body.util.toTime(r),h={start:i?i(a):a,content:"new item"};if("range"===this.options.type||"rangeoverflow"==this.options.type){var d=this.body.util.toTime(r+this.props.width/5);h.end=i?i(d):d}h[this.itemsData.fieldId]=util.randomUUID();var l=ItemSet.groupFromTarget(t);l&&(h.group=l.groupId),this.options.onAdd(h,function(t){t&&e.itemsData.add(h)})}}},ItemSet.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e,i=ItemSet.itemFromTarget(t);if(i){e=this.getSelection();var s=e.indexOf(i.id);-1==s?e.push(i.id):e.splice(s,1),this.setSelection(e),this.body.emitter.emit("select",{items:this.getSelection()}),t.stopPropagation()}}},ItemSet.itemFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},ItemSet.groupFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-group"))return e["timeline-group"];e=e.parentNode}return null},ItemSet.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},ItemSet.prototype._myDataSet=function(){for(var t=this.itemsData;t instanceof DataView;)t=t.data;return t},Item.prototype.select=function(){this.selected=!0,this.displayed&&this.redraw()},Item.prototype.unselect=function(){this.selected=!1,this.displayed&&this.redraw()},Item.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},Item.prototype.isVisible=function(){return!1},Item.prototype.show=function(){return!1},Item.prototype.hide=function(){return!1},Item.prototype.redraw=function(){},Item.prototype.repositionX=function(){},Item.prototype.repositionY=function(){},Item.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",Hammer(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)},ItemBox.prototype=new Item(null,null,null),ItemBox.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},ItemRange.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}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.props.content.width=this.dom.content.offsetWidth,this.height=this.dom.box.offsetHeight,this.dirty=!1),this._repaintDeleteButton(t.box),this._repaintDragLeft(),this._repaintDragRight()},ItemRange.prototype.show=function(){this.displayed||this.redraw()},ItemRange.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}},ItemRange.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),t=0>s?Math.min(-s,n-s-e.content.width-2*o):0,this.left=s,this.width=Math.max(n-s,1),this.dom.box.style.left=this.left+"px",this.dom.box.style.width=this.width+"px",this.dom.content.style.left=t+"px"},ItemRange.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"},ItemRange.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,Hammer(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)},ItemRange.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,Hammer(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)},ItemRangeOverflow.prototype=new ItemRange(null,null,null),ItemRangeOverflow.prototype.baseClassName="item rangeoverflow",ItemRangeOverflow.prototype.repositionX=function(){var t,e=this.parent.width,i=this.conversion.toScreen(this.data.start),s=this.conversion.toScreen(this.data.end);-e>i&&(i=-e),s>2*e&&(s=2*e),t=Math.max(-i,0),this.left=i;var n=Math.max(s-i,1);this.width=n+this.props.content.width,this.dom.box.style.left=this.left+"px",this.dom.box.style.width=n+"px",this.dom.content.style.left=t+"px"},Group.prototype._create=function(){var t=document.createElement("div");t.className="vlabel",this.dom.label=t;var e=document.createElement("div");e.className="inner",t.appendChild(e),this.dom.inner=e;var i=document.createElement("div");i.className="group",i["timeline-group"]=this,this.dom.foreground=i,this.dom.background=document.createElement("div"),this.dom.background.className="group",this.dom.axis=document.createElement("div"),this.dom.axis.className="group",this.dom.marker=document.createElement("div"),this.dom.marker.style.visibility="hidden",this.dom.marker.innerHTML="?",this.dom.background.appendChild(this.dom.marker)},Group.prototype.setData=function(t){var e=t&&t.content;e instanceof Element?this.dom.inner.appendChild(e):this.dom.inner.innerHTML=void 0!=e?e:this.groupId,this.dom.inner.firstChild?util.removeClassName(this.dom.inner,"hidden"):util.addClassName(this.dom.inner,"hidden");var i=t&&t.className||null;i!=this.className&&(this.className&&(util.removeClassName(this.dom.label,i),util.removeClassName(this.dom.foreground,i),util.removeClassName(this.dom.background,i),util.removeClassName(this.dom.axis,i)),util.addClassName(this.dom.label,i),util.addClassName(this.dom.foreground,i),util.addClassName(this.dom.background,i),util.addClassName(this.dom.axis,i))},Group.prototype.getLabelWidth=function(){return this.props.label.width},Group.prototype.redraw=function(t,e,i){var s=!1;this.visibleItems=this._updateVisibleItems(this.orderedItems,this.visibleItems,t);var n=this.dom.marker.clientHeight;n!=this.lastMarkerHeight&&(this.lastMarkerHeight=n,util.forEach(this.items,function(t){t.dirty=!0,t.displayed&&t.redraw()}),i=!0),this.itemSet.options.stack?stack.stack(this.visibleItems,e,i):stack.nostack(this.visibleItems,e);var o,r=this.visibleItems;if(r.length){var a=r[0].top,h=r[0].top+r[0].height;util.forEach(r,function(t){a=Math.min(a,t.top),h=Math.max(h,t.top+t.height)}),o=h-a+e.axis+e.item}else o=e.axis+e.item;o=Math.max(o,this.props.label.height);var d=this.dom.foreground;this.top=d.offsetTop,this.left=d.offsetLeft,this.width=d.offsetWidth,s=util.updateProperty(this,"height",o)||s,s=util.updateProperty(this.props.label,"width",this.dom.inner.clientWidth)||s,s=util.updateProperty(this.props.label,"height",this.dom.inner.clientHeight)||s,d.style.height=o+"px",this.dom.label.style.height=o+"px";for(var l=0,c=this.visibleItems.length;c>l;l++){var u=this.visibleItems[l];u.repositionY()}return s},Group.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)},Group.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)},Group.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),t instanceof ItemRange&&-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},Group.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)},Group.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},Group.prototype.order=function(){var t=util.toArray(this.items);this.orderedItems.byStart=t,this.orderedItems.byEnd=this._constructByEndArray(t),stack.orderByStart(this.orderedItems.byStart),stack.orderByEnd(this.orderedItems.byEnd)},Group.prototype._constructByEndArray=function(t){for(var e=[],i=0;i0)for(n=0;n=0&&!this._checkIfInvisible(t.byStart[n],o,i);n--);for(n=s+1;n=0&&!this._checkIfInvisible(t.byEnd[n],o,i);n--);for(n=r+1;ne.start-r&&s[l].data[n]e.start-r&&s[l].data[n]=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)},Timeline.prototype.getItemRange=function(){var t=this.itemsData,e=null,i=null;if(t){var s=t.min("start");e=s?util.convert(s.start,"Date").valueOf():null;var n=t.max("start");n&&(i=util.convert(n.start,"Date").valueOf());var o=t.max("end");o&&(i=null==i?util.convert(o.end,"Date").valueOf():Math.max(i,util.convert(o.end,"Date").valueOf()))}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},Timeline.prototype.setSelection=function(t){this.itemSet&&this.itemSet.setSelection(t)},Timeline.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},Timeline.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)},Timeline.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},Timeline.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=util.option.asSize(e.maxHeight,""),s.root.style.minHeight=util.option.asSize(e.minHeight,""),s.root.style.width=util.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),a=i.top.height+r+i.bottom.height+n+i.border.top+i.border.bottom;s.root.style.height=util.option.asSize(e.height,a+"px"),i.root.height=s.root.offsetHeight,i.background.height=i.root.height-n;var h=i.root.height-i.top.height-i.bottom.height-n;i.centerContainer.height=h,i.leftContainer.height=h,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 d=i.root.width-i.left.width-i.right.width-o;i.center.width=d,i.centerContainer.width=d,i.top.width=d,i.bottom.width=d,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 l=this.props.scrollTop;"bottom"==e.orientation&&(l+=Math.max(this.props.centerContainer.height-this.props.center.height,0)),s.center.style.left="0",s.center.style.top=l+"px",s.left.style.left="0",s.left.style.top=l+"px",s.right.style.left="0",s.right.style.top=l+"px";var c=0==this.props.scrollTop?"hidden":"",u=this.props.scrollTop==this.props.scrollTopMin?"hidden":"";s.shadowTop.style.visibility=c,s.shadowBottom.style.visibility=u,s.shadowTopLeft.style.visibility=c,s.shadowBottomLeft.style.visibility=u,s.shadowTopRight.style.visibility=c,s.shadowBottomRight.style.visibility=u,this.components.forEach(function(e){t=e.redraw()||t}),t&&this.redraw()}},Timeline.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},Timeline.prototype._toTime=function(t){var e=this.range.conversion(this.props.center.width);return new Date(t/e.scale+e.offset)},Timeline.prototype._toScreen=function(t){var e=this.range.conversion(this.props.center.width);return(t.valueOf()-e.offset)*e.scale},Timeline.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},Timeline.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")))},util.addEventListener(window,"resize",this._onResize),this.watchTimer=setInterval(this._onResize,1e3)},Timeline.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),util.removeEventListener(window,"resize",this._onResize),this._onResize=null},Timeline.prototype._onTouch=function(){this.touch.allowDragging=!0},Timeline.prototype._onPinch=function(){this.touch.allowDragging=!1},Timeline.prototype._onDragStart=function(){this.touch.initialScrollTop=this.props.scrollTop},Timeline.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()}},Timeline.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},Timeline.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.scrollTopi;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 d(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 l(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 c(){for(I=T.NULL,N="";" "==C||" "==C||"\n"==C||"\r"==C;)s();do{var t=!1;if("#"==C){for(var e=D-1;" "==M.charAt(e)||" "==M.charAt(e);)e--;if("\n"==M.charAt(e)||""==M.charAt(e)){for(;""!=C&&"\n"!=C;)s();t=!0}}if("/"==C&&"/"==n()){for(;""!=C&&"\n"!=C;)s();t=!0}if("/"==C&&"*"==n()){for(;""!=C;){if("*"==C&&"/"==n()){s(),s();break}s()}t=!0}for(;" "==C||" "==C||"\n"==C||"\r"==C;)s()}while(t);if(""==C)return void(I=T.DELIMITER);var i=C+n();if(E[i])return I=T.DELIMITER,N=i,s(),void s();if(E[C])return I=T.DELIMITER,N=C,void s();if(o(C)||"-"==C){for(N+=C,s();o(C);)N+=C,s();return"false"==N?N=!1:"true"==N?N=!0:isNaN(Number(N))||(N=Number(N)),void(I=T.IDENTIFIER)}if('"'==C){for(s();""!=C&&('"'!=C||'"'==C&&'"'==n());)N+=C,'"'==C&&s(),s();if('"'!=C)throw b('End of string " expected');return s(),void(I=T.IDENTIFIER)}for(I=T.UNKNOWN;""!=C;)N+=C,s();throw new SyntaxError('Syntax error in part "'+w(N,30)+'"')}function u(){var t={};if(i(),c(),"strict"==N&&(t.strict=!0,c()),("graph"==N||"digraph"==N)&&(t.type=N,c()),I==T.IDENTIFIER&&(t.id=N,c()),"{"!=N)throw b("Angle bracket { expected");if(c(),p(t),"}"!=N)throw b("Angle bracket } expected");if(c(),""!==N)throw b("End of file expected");return c(),delete t.node,delete t.edge,delete t.graph,t}function p(t){for(;""!==N&&"}"!=N;)m(t),";"==N&&c()}function m(t){var e=g(t);if(e)return void y(t,e);var i=f(t);if(!i){if(I!=T.IDENTIFIER)throw b("Identifier expected");var s=N;if(c(),"="==N){if(c(),I!=T.IDENTIFIER)throw b("Identifier expected");t[s]=N,c()}else v(t,s)}}function g(t){var e=null;if("subgraph"==N&&(e={},e.type="subgraph",c(),I==T.IDENTIFIER&&(e.id=N,c())),"{"==N){if(c(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,p(e),"}"!=N)throw b("Angle bracket } expected");c(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function f(t){return"node"==N?(c(),t.node=_(),"node"):"edge"==N?(c(),t.edge=_(),"edge"):"graph"==N?(c(),t.graph=_(),"graph"):null}function v(t,e){var i={id:e},s=_();s&&(i.attr=s),h(t,i),y(t,e)}function y(t,e){for(;"->"==N||"--"==N;){var i,s=N;c();var n=g(t);if(n)i=n;else{if(I!=T.IDENTIFIER)throw b("Identifier or subgraph expected");i=N,h(t,{id:i}),c()}var o=_(),r=l(t,e,i,s,o);d(t,r),e=i}}function _(){for(var t=null;"["==N;){for(c(),t={};""!==N&&"]"!=N;){if(I!=T.IDENTIFIER)throw b("Attribute name expected");var e=N;if(c(),"="!=N)throw b("Equal sign = expected");if(c(),I!=T.IDENTIFIER)throw b("Attribute value expected");var i=N;a(t,e,i),c(),","==N&&c()}if("]"!=N)throw b("Bracket ] expected");c()}return t}function b(t){return new SyntaxError(t+', got "'+w(N,30)+'" (char '+D+")")}function w(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function x(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 S(t){function i(t){var e={from:t.from,to:t.to};return r(e,t.attr),e.style="->"==t.type?"arrow":"line",e}var s=e(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 e,s;e=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 e=i(t);n.edges.push(e)}),x(e,s,function(e,s){var o=l(n,e.id,s.id,t.type,t.attr),r=i(o);n.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var e=i(t);n.edges.push(e)})}),s.attr&&(n.options=s.attr),n}var T={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},E={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},M="",D=0,C="",N="",I=T.NULL,O=/[a-zA-Z_0-9.:#]/;t.parseDOT=e,t.DOTToGraph=S}("undefined"!=typeof util?util:exports),"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),g=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,g,u,g),this.bezierCurveTo(u-h,g,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}}),Node.prototype.resetCluster=function(){this.formationScale=void 0,this.clusterSize=1,this.containedNodes={},this.containedEdges={},this.clusterSessions=[]},Node.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},Node.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},Node.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=util.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()}},Node.prototype.select=function(){this.selected=!0,this._reset()},Node.prototype.unselect=function(){this.selected=!1,this._reset()},Node.prototype.clearSizeCache=function(){this._reset()},Node.prototype._reset=function(){this.width=void 0,this.height=void 0},Node.prototype.getTitle=function(){return"function"==typeof this.title?this.title():this.title},Node.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}},Node.prototype._setForce=function(t,e){this.fx=t,this.fy=e},Node.prototype._addForce=function(t,e){this.fx+=t,this.fy+=e},Node.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}},Node.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}},Node.prototype.isFixed=function(){return this.xFixed&&this.yFixed},Node.prototype.isMoving=function(t){return Math.abs(this.vx)>t||Math.abs(this.vy)>t},Node.prototype.isSelected=function(){return this.selected},Node.prototype.getValue=function(){return this.value},Node.prototype.getDistance=function(t,e){var i=this.x-t,s=this.y-e;return Math.sqrt(i*i+s*s)},Node.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},Node.prototype.draw=function(){throw"Draw method not initialized for node"},Node.prototype.resize=function(){throw"Resize method not initialized for node"},Node.prototype.isOverlappingWith=function(t){return this.leftt.left&&this.topt.top},Node.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)}},Node.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.graphScaleInv,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")},Node.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)}},Node.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.graphScaleInv,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.graphScaleInv,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)},Node.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}},Node.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.graphScaleInv,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.graphScaleInv,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)},Node.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}},Node.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.graphScaleInv,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.graphScaleInv,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) +},Node.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.graphScaleInv,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.graphScaleInv,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)},Node.prototype._drawDot=function(t){this._drawShape(t,"circle")},Node.prototype._drawTriangle=function(t){this._drawShape(t,"triangle")},Node.prototype._drawTriangleDown=function(t){this._drawShape(t,"triangleDown")},Node.prototype._drawSquare=function(t){this._drawShape(t,"square")},Node.prototype._drawStar=function(t){this._drawShape(t,"star")},Node.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}},Node.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.graphScaleInv,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.graphScaleInv,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")},Node.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)}},Node.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)},Node.prototype._label=function(t,e,i,s,n,o){if(e&&this.fontSize*this.graphScale>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";for(var r=e.split("\n"),a=r.length,h=this.fontSize+4,d=s+(1-a)/2*h,l=0;a>l;l++)t.fillText(r[l],i,d),d+=h}},Node.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}},Node.prototype.inArea=function(){return void 0!==this.width?this.x+this.width*this.graphScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.graphScaleInv=this.canvasTopLeft.y&&this.y-this.height*this.graphScaleInv=this.canvasTopLeft.x&&this.x=this.canvasTopLeft.y&&this.yh}return!1},Edge.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,r=this.length/4,a=this.from;a.width||a.resize(t),a.width>a.height?(n=a.x+a.width/2,o=a.y-r):(n=a.x+r,o=a.y-a.height/2),this._circle(t,n,o,r),e=this._pointOnCircle(n,o,r,.5),this._label(t,this.label,e.x,e.y)}},Edge.prototype._getLineWidth=function(){return 1==this.selected?Math.min(2*this.width,this.widthMax)*this.graphScaleInv:1==this.hover?Math.min(this.hoverWidth,this.widthMax)*this.graphScaleInv:this.width*this.graphScaleInv},Edge.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()},Edge.prototype._circle=function(t,e,i,s){t.beginPath(),t.arc(e,i,s,0,2*Math.PI,!1),t.stroke()},Edge.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,r=i-n/2,a=s-o/2;t.fillRect(r,a,n,o),t.fillStyle=this.fontColor||"black",t.textAlign="left",t.textBaseline="top",t.fillText(e,r,a)}},Edge.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)}},Edge.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}},Edge.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)}},Edge.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 r,a,h=.25*Math.max(100,this.length),d=this.from;d.width||d.resize(t),d.width>d.height?(r=d.x+.5*d.width,a=d.y-h):(r=d.x+h,a=d.y-.5*d.height),this._circle(t,r,a,h);var i=.2*Math.PI,s=(10+5*this.width)*this.arrowScaleFactor;e=this._pointOnCircle(r,a,h,.5),t.arrow(e.x,e.y,i,s),t.fill(),t.stroke(),this.label&&(e=this._pointOnCircle(r,a,h,.5),this._label(t,this.label,e.x,e.y))}},Edge.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),r=this.from.distanceToBorder(t,e+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.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 g=.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:g,y:f}}else m=this._pointOnLine(.5);this._label(t,this.label,m.x,m.y)}}else{var v,y,_,b=this.from,w=.25*Math.max(100,this.length);b.width||b.resize(t),b.width>b.height?(v=b.x+.5*b.width,y=b.y-w,_={x:v,y:b.y,angle:.9*Math.PI}):(v=b.x+w,y=b.y-.5*b.height,_={x:b.x,y:y,angle:.6*Math.PI}),t.beginPath(),t.arc(v,y,w,0,2*Math.PI,!1),t.stroke();var i=(10+5*this.width)*this.arrowScaleFactor;t.arrow(_.x,_.y,_.angle,i),t.fill(),t.stroke(),this.label&&(m=this._pointOnCircle(v,y,w,.5),this._label(t,this.label,m.x,m.y))}},Edge.prototype._getDistanceToEdge=function(t,e,i,s,n,o){if(this.from!=this.to){if(1==this.smooth){var r,a,h,d,l,c,u=1e9;for(r=0;10>r;r++)a=.1*r,h=Math.pow(1-a,2)*t+2*a*(1-a)*this.via.x+Math.pow(a,2)*i,d=Math.pow(1-a,2)*e+2*a*(1-a)*this.via.y+Math.pow(a,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,g=p*p+m*m,f=((n-t)*p+(o-e)*m)/g;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,v=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-v):(h=y.x+v,d=y.y-y.height/2),l=h-n,c=d-o,Math.abs(Math.sqrt(l*l+c*c)-v)},Edge.prototype.setScale=function(t){this.graphScaleInv=1/t},Edge.prototype.select=function(){this.selected=!0},Edge.prototype.unselect=function(){this.selected=!1},Edge.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))},Edge.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 Node({id:e,shape:"dot",color:{background:"#ff4e00",border:"#3c3c3c",highlight:{background:"#07f968"}}},{},{},s),this.controlNodes.to=new Node({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:{}}},Edge.prototype._enableControlNodes=function(){this.controlNodesEnabled=!0},Edge.prototype._disableControlNodes=function(){this.controlNodesEnabled=!1},Edge.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},Edge.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())},Edge.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),r=(n-o)/n,a=r*this.from.x+(1-r)*this.to.x,h=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),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:a,y:h},to:{x:d,y:l}}},Popup.prototype.setPosition=function(t,e){this.x=parseInt(t),this.y=parseInt(e)},Popup.prototype.setText=function(t){this.frame.innerHTML=t},Popup.prototype.show=function(t){if(void 0===t&&(t=!0),t){var e=this.frame.clientHeight,i=this.frame.clientWidth,s=this.frame.parentNode.clientHeight,n=this.frame.parentNode.clientWidth,o=this.y-e;o+e+this.padding>s&&(o=s-e-this.padding),on&&(r=n-i-this.padding),rthis.constants.clustering.clusterThreshold&&1==this.constants.clustering.enabled&&this.clusterToFit(this.constants.clustering.reduceToNodes,!1),this._calculateForces())},_calculateForces:function(){this._calculateGravitationalForces(),this._calculateNodeForces(),1==this.constants.smoothCurves?this._calculateSpringForcesWithSupport():this._calculateSpringForces()},_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},_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=showValueOfRange.bind(this,"graph_BH_gc",-1,"physics_barnesHut_gravitationalConstant"),e=document.getElementById("graph_BH_cg"),e.onchange=showValueOfRange.bind(this,"graph_BH_cg",1,"physics_centralGravity"),e=document.getElementById("graph_BH_sc"),e.onchange=showValueOfRange.bind(this,"graph_BH_sc",1,"physics_springConstant"),e=document.getElementById("graph_BH_sl"),e.onchange=showValueOfRange.bind(this,"graph_BH_sl",1,"physics_springLength"),e=document.getElementById("graph_BH_damp"),e.onchange=showValueOfRange.bind(this,"graph_BH_damp",1,"physics_damping"),e=document.getElementById("graph_R_nd"),e.onchange=showValueOfRange.bind(this,"graph_R_nd",1,"physics_repulsion_nodeDistance"),e=document.getElementById("graph_R_cg"),e.onchange=showValueOfRange.bind(this,"graph_R_cg",1,"physics_centralGravity"),e=document.getElementById("graph_R_sc"),e.onchange=showValueOfRange.bind(this,"graph_R_sc",1,"physics_springConstant"),e=document.getElementById("graph_R_sl"),e.onchange=showValueOfRange.bind(this,"graph_R_sl",1,"physics_springLength"),e=document.getElementById("graph_R_damp"),e.onchange=showValueOfRange.bind(this,"graph_R_damp",1,"physics_damping"),e=document.getElementById("graph_H_nd"),e.onchange=showValueOfRange.bind(this,"graph_H_nd",1,"physics_hierarchicalRepulsion_nodeDistance"),e=document.getElementById("graph_H_cg"),e.onchange=showValueOfRange.bind(this,"graph_H_cg",1,"physics_centralGravity"),e=document.getElementById("graph_H_sc"),e.onchange=showValueOfRange.bind(this,"graph_H_sc",1,"physics_springConstant"),e=document.getElementById("graph_H_sl"),e.onchange=showValueOfRange.bind(this,"graph_H_sl",1,"physics_springLength"),e=document.getElementById("graph_H_damp"),e.onchange=showValueOfRange.bind(this,"graph_H_damp",1,"physics_damping"),e=document.getElementById("graph_H_direction"),e.onchange=showValueOfRange.bind(this,"graph_H_direction",t,"hierarchicalLayout_direction"),e=document.getElementById("graph_H_levsep"),e.onchange=showValueOfRange.bind(this,"graph_H_levsep",1,"hierarchicalLayout_levelSeparation"),e=document.getElementById("graph_H_nspac"),e.onchange=showValueOfRange.bind(this,"graph_H_nspac",1,"hierarchicalLayout_nodeSpacing");var i=document.getElementById("graph_physicsMethod1"),s=document.getElementById("graph_physicsMethod2"),n=document.getElementById("graph_physicsMethod3");s.checked=!0,this.constants.physics.barnesHut.enabled&&(i.checked=!0),this.constants.hierarchicalLayout.enabled&&(n.checked=!0);var o=document.getElementById("graph_toggleSmooth"),r=document.getElementById("graph_repositionNodes"),a=document.getElementById("graph_generateOptions");o.onclick=graphToggleSmoothCurves.bind(this),r.onclick=graphRepositionNodes.bind(this),a.onclick=graphGenerateOptions.bind(this),o.style.background=1==this.constants.smoothCurves?"#A4FF56":"#FF8532",switchConfigurations.apply(this),i.onchange=switchConfigurations.bind(this),s.onchange=switchConfigurations.bind(this),n.onchange=switchConfigurations.bind(this)}},_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)}},hierarchalRepulsionMixin={_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,g=m;for(h=0;hi&&(o=f*i+u,0==i?i=.01:o/=i,s=t*o,n=e*o,r.fx-=s,r.fy-=n,a.fx+=s,a.fy+=n)}}},barnesHutMixin={_calculateNodeForces:function(){if(0!=this.constants.physics.barnesHut.gravitationalConstant){var t,e=this.calculationNodes,i=this.calculationNodeIndices,s=i.length;this._formBarnesHutTree(e,i);for(var n=this.barnesHutTree,o=0;s>o;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)}},_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}}},_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,g=.5*(n+r),f=.5*(o+a),v={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:g-m,maxX:g+m,minY:f-m,maxY:f+m},size:p,calcSize:1/p,children:{data:null},maxWidth:0,level:0,childrenCount:4}};for(this._splitBranch(v.root),h=0;s>h;h++)i=t[e[h]],this._placeInTree(v.root,i);this.barnesHutTree=v},_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")},_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)}},_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)},_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}},_drawTree:function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,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()}},repulsionMixin={_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,g=this.constants.physics.repulsion.nodeDistance,f=g;for(d=0;di&&(r=.5*f>i?1:v*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)}}},HierarchicalLayoutMixin={_resetLevels:function(){for(var t in this.nodes)if(this.nodes.hasOwnProperty(t)){var e=this.nodes[t];0==e.preassignedLevel&&(e.level=-1)}},_setupHierarchicalLayout:function(){if(1==this.constants.hierarchicalLayout.enabled&&this.nodeIndices.length>0){"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,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))}},_setLevel:function(t,e,i){for(var s=0;st)&&(n.level=t,e.length>1&&this._setLevel(t+1,n.edges,n.id))}},_restoreNodes:function(){for(nodeId in this.nodes)this.nodes.hasOwnProperty(nodeId)&&(this.nodes[nodeId].xFixed=!1,this.nodes[nodeId].yFixed=!1)}},manipulationMixin={_clearManipulatorBar:function(){for(;this.manipulationDiv.hasChildNodes();)this.manipulationDiv.removeChild(this.manipulationDiv.firstChild)},_restoreOverloadedFunctions:function(){for(var t in this.cachedFunctions)this.cachedFunctions.hasOwnProperty(t)&&(this[t]=this.cachedFunctions[t])},_toggleEditMode:function(){this.editMode=!this.editMode;var t=document.getElementById("graph-manipulationDiv"),e=document.getElementById("graph-manipulation-closeDiv"),i=document.getElementById("graph-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()},_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("graph-manipulate-addNode");t.onclick=this._createAddNodeToolbar.bind(this);var e=document.getElementById("graph-manipulate-connectNode");if(e.onclick=this._createAddEdgeToolbar.bind(this),1==this._getSelectedNodeCount()&&this.triggerFunctions.edit){var i=document.getElementById("graph-manipulate-editNode");i.onclick=this._editNode.bind(this)}else if(1==this._getSelectedEdgeCount()&&0==this._getSelectedNodeCount()){var i=document.getElementById("graph-manipulate-editEdge");i.onclick=this._createEditEdgeToolbar.bind(this)}if(0==this._selectionIsEmpty()){var s=document.getElementById("graph-manipulate-delete");s.onclick=this._deleteSelected.bind(this)}var n=document.getElementById("graph-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("graph-manipulate-editModeButton");o.onclick=this._toggleEditMode.bind(this)}},_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("graph-manipulate-back");t.onclick=this._createManipulatorBar.bind(this),this.boundFunction=this._addNode.bind(this),this.on("select",this.boundFunction)},_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("graph-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()},_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("graph-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()},_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()},_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()},_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()},_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 Node({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 Node({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 Edge({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()))}},_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()}},_addNode:function(){if(this._selectionIsEmpty()&&1==this.editMode){var t=this._pointerToPositionObject(this.pointerPosition),e={id:util.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()}},_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()}},_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()}},_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)},_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()}}},SectorMixin={_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},_switchToSector:function(t,e){void 0===e||"active"==e?this._switchToActiveSector(t):this._switchToFrozenSector(t)},_switchToActiveSector:function(t){this.nodeIndices=this.sectors.active[t].nodeIndices,this.nodes=this.sectors.active[t].nodes,this.edges=this.sectors.active[t].edges},_switchToSupportSector:function(){this.nodeIndices=this.sectors.support.nodeIndices,this.nodes=this.sectors.support.nodes,this.edges=this.sectors.support.edges},_switchToFrozenSector:function(t){this.nodeIndices=this.sectors.frozen[t].nodeIndices,this.nodes=this.sectors.frozen[t].nodes,this.edges=this.sectors.frozen[t].edges},_loadLatestSector:function(){this._switchToSector(this._sector())},_sector:function(){return this.activeSector[this.activeSector.length-1]},_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.")},_setActiveSector:function(t){this.activeSector.push(t)},_forgetLastSector:function(){this.activeSector.pop()},_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},_deleteActiveSector:function(t){delete this.sectors.active[t]},_deleteFrozenSector:function(t){delete this.sectors.frozen[t]},_freezeSector:function(t){this.sectors.frozen[t]=this.sectors.active[t],this._deleteActiveSector(t)},_activateSector:function(t){this.sectors.active[t]=this.sectors.frozen[t],this._deleteFrozenSector(t)},_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()},_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()},_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()},_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))},_clearNodeIndexList:function(){var t=this._sector();this.sectors.active[t].nodeIndices=[],this.nodeIndices=this.sectors.active[t].nodeIndices},_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),nt&&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()},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()},updateClustersDefault:function(){1==this.constants.clustering.enabled&&this.updateClusters(0,!1,!1)},increaseClusterLevel:function(){this.updateClusters(-1,!1,!0)},decreaseClusterLevel:function(){this.updateClusters(1,!1,!0)},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)},_aggregateHubs:function(t){this._getHubSize(),this._formClustersByHub(t,!1) +},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()},_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)}},_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)}}},_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))}}},_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)},_formClustersByHub:function(t,e){for(var i in this.nodes)this.nodes.hasOwnProperty(i)&&this._formClusterFromHub(this.nodes[i],t,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)}}},_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)))},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)},_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)},_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}},SelectionMixin={_getNodesOverlappingWith:function(t,e){var i=this.nodes;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},_getAllNodesOverlappingWith:function(t){var e=[];return this._doInAllActiveSectors("_getNodesOverlappingWith",t,e),e},_pointerToPositionObject:function(t){var e=this._XconvertDOMtoCanvas(t.x),i=this._YconvertDOMtoCanvas(t.y);return{left:e,top:i,right:e,bottom:i}},_getNodeAt:function(t){var e=this._pointerToPositionObject(t),i=this._getAllNodesOverlappingWith(e);return i.length>0?this.nodes[i[i.length-1]]:null},_getEdgesOverlappingWith:function(t,e){var i=this.edges;for(var s in i)i.hasOwnProperty(s)&&i[s].isOverlappingWith(t)&&e.push(s)},_getAllEdgesOverlappingWith:function(t){var e=[];return this._doInAllActiveSectors("_getEdgesOverlappingWith",t,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},_addToSelection:function(t){t instanceof Node?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t},_addToHover:function(t){t instanceof Node?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t},_removeFromSelection:function(t){t instanceof Node?delete this.selectionObj.nodes[t.id]:delete this.selectionObj.edges[t.id]},_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())},_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())},_getSelectedNodeCount:function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t},_getSelectedNode:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t];return null},_getSelectedEdge:function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t];return null},_getSelectedEdgeCount:function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t},_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},_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},_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},_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)}this.redraw()},_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])}},NavigationMixin={_cleanNavigation:function(){var t=document.getElementById("graph-navigation_wrapper");null!=t&&this.containerElement.removeChild(t),document.onmouseup=null},_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="graph-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;it.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._centerGraph(s),0==e&&(this.moving=!0,this.start())},Graph.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var t in this.nodes)this.nodes.hasOwnProperty(t)&&this.nodeIndices.push(t)},Graph.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=vis.util.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()},Graph.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.dragGraph&&(this.constants.dragGraph=t.dragGraph),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.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&&(util.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&&(util.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=util.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=util.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()},Graph.prototype._create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);if(this.frame=document.createElement("div"),this.frame.className="graph-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=Hammer(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)},Graph.prototype._createKeyBinds=function(){var t=this;this.mousetrap=mousetrap,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)))},Graph.prototype._getPointer=function(t){return{x:t.pageX-vis.util.getAbsoluteLeft(this.frame.canvas),y:t.pageY-vis.util.getAbsoluteTop(this.frame.canvas)}},Graph.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)},Graph.prototype._onDragStart=function(){this._handleDragStart()},Graph.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)}}},Graph.prototype._onDrag=function(t){this._handleOnDrag(t)},Graph.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.dragGraph){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(),this.moving=!0,this.start()}}},Graph.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})},Graph.prototype._onTap=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleTap(e)},Graph.prototype._onDoubleTap=function(t){var e=this._getPointer(t.gesture.center);this._handleDoubleTap(e)},Graph.prototype._onHold=function(t){var e=this._getPointer(t.gesture.center);this.pointerPosition=e,this._handleOnHold(e)},Graph.prototype._onRelease=function(t){var e=this._getPointer(t.gesture.center);this._handleOnRelease(e)},Graph.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)},Graph.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}},Graph.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=util.fakeGesture(this,t),o=this._getPointer(n.center);this._zoom(i,o)}t.preventDefault()},Graph.prototype._onMouseMoveTitle=function(t){var e=util.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 a in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(a)&&(r instanceof Node&&r.id!=a||r instanceof Edge||null==r)&&(this._blurObject(this.hoverObj.nodes[a]),delete this.hoverObj.nodes[a]);this.redraw()}},Graph.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 Popup(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()},Graph.prototype._checkHidePopup=function(t){this.popupObj&&this._getNodeAt(t)||(this.popupObj=void 0,this.popup&&this.popup.hide())},Graph.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})},Graph.prototype._setNodes=function(t){var e=this.nodesData;if(t instanceof DataSet||t instanceof DataView)this.nodesData=t;else if(t instanceof Array)this.nodesData=new DataSet,this.nodesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.nodesData=new DataSet}if(e&&util.forEach(this.nodesListeners,function(t,i){e.off(i,t)}),this.nodes={},this.nodesData){var i=this;util.forEach(this.nodesListeners,function(t,e){i.nodesData.on(e,t)});var s=this.nodesData.getIds();this._addNodes(s)}this._updateSelection()},Graph.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 Node(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()},Graph.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 Node(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)},Graph.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)},Graph.prototype._setEdges=function(t){var e=this.edgesData;if(t instanceof DataSet||t instanceof DataView)this.edgesData=t;else if(t instanceof Array)this.edgesData=new DataSet,this.edgesData.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.edgesData=new DataSet}if(e&&util.forEach(this.edgesListeners,function(t,i){e.off(i,t)}),this.edges={},this.edgesData){var i=this;util.forEach(this.edgesListeners,function(t,e){i.edgesData.on(e,t)});var s=this.edgesData.getIds();this._addEdges(s)}this._reconnectEdges()},Graph.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 Edge(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()},Graph.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 Edge(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)},Graph.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()},Graph.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()}},Graph.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)},Graph.prototype.redraw=function(){this.setSize(this.width,this.height),this._redraw()},Graph.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()},Graph.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")},Graph.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}},Graph.prototype._setScale=function(t){this.scale=t},Graph.prototype._getScale=function(){return this.scale},Graph.prototype._XconvertDOMtoCanvas=function(t){return(t-this.translation.x)/this.scale},Graph.prototype._XconvertCanvasToDOM=function(t){return t*this.scale+this.translation.x},Graph.prototype._YconvertDOMtoCanvas=function(t){return(t-this.translation.y)/this.scale},Graph.prototype._YconvertCanvasToDOM=function(t){return t*this.scale+this.translation.y},Graph.prototype.canvasToDOM=function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}},Graph.prototype.DOMtoCanvas=function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}},Graph.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)},Graph.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)}},Graph.prototype._drawControlNodes=function(t){var e=this.edges;for(var i in e)e.hasOwnProperty(i)&&e[i]._drawControlNodes(t)},Graph.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)}},Graph.prototype._physicsTick=function(){this.freezeSimulation||this.moving&&(this._doInAllActiveSectors("_initializeForceCalculation"),this._doInAllActiveSectors("_discreteStepNodes"),this.constants.smoothCurves&&this._doInSupportSector("_discreteStepNodes"),this._findCenter(this._getRange()))},Graph.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.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),(void 0!==t||void 0!==e)&&this.calculateCameraOrientation()},Graph3d.Camera.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},Graph3d.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())},Graph3d.Camera.prototype.getArmLength=function(){return this.armLength},Graph3d.Camera.prototype.getCameraLocation=function(){return this.cameraLocation},Graph3d.Camera.prototype.getCameraRotation=function(){return this.cameraRotation},Graph3d.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},Graph3d.prototype._setScale=function(){this.scale=new Point3d(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!==Graph3d.STYLE.DOTCOLOR&&this.style!==Graph3d.STYLE.DOTSIZE&&this.style!==Graph3d.STYLE.BARCOLOR&&this.style!==Graph3d.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)}},Graph3d.prototype.getNumberOfRows=function(t){return t.length},Graph3d.prototype.getNumberOfColumns=function(t){var e=0;for(var i in t[0])t[0].hasOwnProperty(i)&&e++;return e},Graph3d.prototype.getDistinctValues=function(t,e){for(var i=[],s=0;st[s][e]&&(i.min=t[s][e]),i.maxt;t++){var p=(t-c)/(u-c),m=240*p,g=this._hsv2rgb(m,1,1);l.strokeStyle=g,l.beginPath(),l.moveTo(a,o+t),l.lineTo(r,o+t),l.stroke() +}l.strokeStyle=this.colorAxis,l.strokeRect(a,o,i,n)}if(this.style===Graph3d.STYLE.DOTSIZE&&(l.strokeStyle=this.colorAxis,l.fillStyle=this.colorDot,l.beginPath(),l.moveTo(a,o),l.lineTo(r,o),l.lineTo(r-i+e,h),l.lineTo(a,h),l.closePath(),l.fill(),l.stroke()),this.style===Graph3d.STYLE.DOTCOLOR||this.style===Graph3d.STYLE.DOTSIZE){var f=5,v=new StepNumber(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,!0);for(v.start(),v.getCurrent()0?this.yMin:this.yMax,n=this._convert3Dto2D(new Point3d(_,r,this.zMin)),Math.cos(2*y)>0?(m.textAlign="center",m.textBaseline="top",n.y+=v):Math.sin(2*y)<0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(" "+i.getCurrent()+" ",n.x,n.y),i.next()}for(m.lineWidth=1,s=void 0===this.defaultYStep,i=new StepNumber(this.yMin,this.yMax,this.yStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,n=this._convert3Dto2D(new Point3d(o,i.getCurrent(),this.zMin)),Math.cos(2*y)<0?(m.textAlign="center",m.textBaseline="top",n.y+=v):Math.sin(2*y)>0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(" "+i.getCurrent()+" ",n.x,n.y),i.next();for(m.lineWidth=1,s=void 0===this.defaultZStep,i=new StepNumber(this.zMin,this.zMax,this.zStep,s),i.start(),i.getCurrent()0?this.xMin:this.xMax,r=Math.sin(y)<0?this.yMin:this.yMax;!i.end();)t=this._convert3Dto2D(new Point3d(o,r,i.getCurrent())),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(t.x-v,t.y),m.stroke(),m.textAlign="right",m.textBaseline="middle",m.fillStyle=this.colorAxis,m.fillText(i.getCurrent()+" ",t.x-5,t.y),i.next();m.lineWidth=1,t=this._convert3Dto2D(new Point3d(o,r,this.zMin)),e=this._convert3Dto2D(new Point3d(o,r,this.zMax)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke(),m.lineWidth=1,c=this._convert3Dto2D(new Point3d(this.xMin,this.yMin,this.zMin)),u=this._convert3Dto2D(new Point3d(this.xMax,this.yMin,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(c.x,c.y),m.lineTo(u.x,u.y),m.stroke(),c=this._convert3Dto2D(new Point3d(this.xMin,this.yMax,this.zMin)),u=this._convert3Dto2D(new Point3d(this.xMax,this.yMax,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(c.x,c.y),m.lineTo(u.x,u.y),m.stroke(),m.lineWidth=1,t=this._convert3Dto2D(new Point3d(this.xMin,this.yMin,this.zMin)),e=this._convert3Dto2D(new Point3d(this.xMin,this.yMax,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke(),t=this._convert3Dto2D(new Point3d(this.xMax,this.yMin,this.zMin)),e=this._convert3Dto2D(new Point3d(this.xMax,this.yMax,this.zMin)),m.strokeStyle=this.colorAxis,m.beginPath(),m.moveTo(t.x,t.y),m.lineTo(e.x,e.y),m.stroke();var b=this.xLabel;b.length>0&&(l=.1/this.scale.y,o=(this.xMin+this.xMax)/2,r=Math.cos(y)>0?this.yMin-l:this.yMax+l,n=this._convert3Dto2D(new Point3d(o,r,this.zMin)),Math.cos(2*y)>0?(m.textAlign="center",m.textBaseline="top"):Math.sin(2*y)<0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(b,n.x,n.y));var w=this.yLabel;w.length>0&&(d=.1/this.scale.x,o=Math.sin(y)>0?this.xMin-d:this.xMax+d,r=(this.yMin+this.yMax)/2,n=this._convert3Dto2D(new Point3d(o,r,this.zMin)),Math.cos(2*y)<0?(m.textAlign="center",m.textBaseline="top"):Math.sin(2*y)>0?(m.textAlign="right",m.textBaseline="middle"):(m.textAlign="left",m.textBaseline="middle"),m.fillStyle=this.colorAxis,m.fillText(w,n.x,n.y));var x=this.zLabel;x.length>0&&(h=30,o=Math.cos(y)>0?this.xMin:this.xMax,r=Math.sin(y)<0?this.yMin:this.yMax,a=(this.zMin+this.zMax)/2,n=this._convert3Dto2D(new Point3d(o,r,a)),m.textAlign="right",m.textBaseline="middle",m.fillStyle=this.colorAxis,m.fillText(x,n.x-h,n.y))},Graph3d.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)+")"},Graph3d.prototype._redrawDataGrid=function(){var t,e,i,s,n,o,r,a,h,d,l,c,u,p=this.frame.canvas,m=p.getContext("2d");if(!(void 0===this.dataPoints||this.dataPoints.length<=0)){for(n=0;n0}else o=!0;o?(u=(t.point.z+e.point.z+i.point.z+s.point.z)/4,d=240*(1-(u-this.zMin)*this.scale.z/this.verticalRatio),l=1,this.showShadow?(c=Math.min(1+w.x/x/2,1),r=this._hsv2rgb(d,l,c),a=r):(c=1,r=this._hsv2rgb(d,l,c),a=this.colorAxis)):(r="gray",a=this.colorAxis),h=.5,m.lineWidth=h,m.fillStyle=r,m.strokeStyle=a,m.beginPath(),m.moveTo(t.screen.x,t.screen.y),m.lineTo(e.screen.x,e.screen.y),m.lineTo(s.screen.x,s.screen.y),m.lineTo(i.screen.x,i.screen.y),m.closePath(),m.fill(),m.stroke()}}else for(n=0;nc&&(c=0);var u,p,m;this.style===Graph3d.STYLE.DOTCOLOR?(u=240*(1-(h.point.value-this.valueMin)*this.scale.value),p=this._hsv2rgb(u,1,1),m=this._hsv2rgb(u,1,.8)):this.style===Graph3d.STYLE.DOTSIZE?(p=this.colorDot,m=this.colorDotBorder):(u=240*(1-(h.point.z-this.zMin)*this.scale.z/this.verticalRatio),p=this._hsv2rgb(u,1,1),m=this._hsv2rgb(u,1,.8)),i.lineWidth=1,i.strokeStyle=m,i.fillStyle=p,i.beginPath(),i.arc(h.screen.x,h.screen.y,c,0,2*Math.PI,!0),i.fill(),i.stroke()}}},Graph3d.prototype._redrawDataBar=function(){var t,e,i,s,n=this.frame.canvas,o=n.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()}},Graph3d.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)}},Graph3d.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)},Graph3d.prototype._dataPointFromXY=function(t,e){var i,s=100,n=null,o=null,r=null,a=new Point2d(t,e);if(this.style===Graph3d.STYLE.BAR||this.style===Graph3d.STYLE.BARCOLOR||this.style===Graph3d.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var h=n.surfaces;if(h)for(var d=h.length-1;d>=0;d--){var l=h[d],c=l.corners,u=[c[0].screen,c[1].screen,c[2].screen],p=[c[2].screen,c[3].screen,c[0].screen];if(this._insideTriangle(a,u)||this._insideTriangle(a,p))return n}}else for(i=0;iv)&&s>v&&(r=v,o=n)}}return o},Graph3d.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"},Graph3d.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},Point3d.subtract=function(t,e){var i=new Point3d;return i.x=t.x-e.x,i.y=t.y-e.y,i.z=t.z-e.z,i},Point3d.add=function(t,e){var i=new Point3d;return i.x=t.x+e.x,i.y=t.y+e.y,i.z=t.z+e.z,i},Point3d.avg=function(t,e){return new Point3d((t.x+e.x)/2,(t.y+e.y)/2,(t.z+e.z)/2)},Point3d.crossProduct=function(t,e){var i=new Point3d;return i.x=t.y*e.z-t.z*e.y,i.y=t.z*e.x-t.x*e.z,i.z=t.x*e.y-t.y*e.x,i},Point3d.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},Point2d=function(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0},Filter.prototype.isLoaded=function(){return this.loaded},Filter.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},Filter.prototype.getLabel=function(){return this.graph.filterLabel},Filter.prototype.getColumn=function(){return this.column},Filter.prototype.getSelectedValue=function(){return void 0===this.index?void 0:this.values[this.index]},Filter.prototype.getValues=function(){return this.values},Filter.prototype.getValue=function(t){if(t>=this.values.length)throw"Error: index out of range";return this.values[t]},Filter.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 DataView(this.data,{filter:function(t){return t[i.column]==i.value}}).get();e=this.graph._getDataPoints(s),this.dataPoints[t]=e}return e},Filter.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},Filter.prototype.selectValue=function(t){if(t>=this.values.length)throw"Error: index out of range";this.index=t,this.value=this.values[t]},Filter.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t=t||(void 0!==e&&(this.prettyStep=e),this._step=this.prettyStep===!0?StepNumber.calculatePrettyStep(t):t)},StepNumber.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},StepNumber.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},StepNumber.prototype.getStep=function(){return this._step},StepNumber.prototype.start=function(){this._current=this._start-this._start%this._step},StepNumber.prototype.next=function(){this._current+=this._step},StepNumber.prototype.end=function(){return this._current>this._end},Slider.prototype.prev=function(){var t=this.getIndex();t>0&&(t--,this.setIndex(t))},Slider.prototype.next=function(){var t=this.getIndex();t0?this.setIndex(0):this.index=void 0},Slider.prototype.setIndex=function(t){if(!(ts&&(s=0),s>this.values.length-1&&(s=this.values.length-1),s},Slider.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},Slider.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,s=this.leftToIndex(i);this.setIndex(s),G3DpreventDefault()},Slider.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};var vis={util:util,moment:moment,DataSet:DataSet,DataView:DataView,Range:Range,stack:stack,TimeStep:TimeStep,components:{items:{Item:Item,ItemBox:ItemBox,ItemPoint:ItemPoint,ItemRange:ItemRange},Component:Component,ItemSet:ItemSet,TimeAxis:TimeAxis},graph:{Node:Node,Edge:Edge,Popup:Popup,Groups:Groups,Images:Images},Timeline:Timeline,Graph:Graph,Graph3d:Graph3d};"undefined"!=typeof exports&&(exports=vis),"undefined"!=typeof module&&"undefined"!=typeof module.exports&&(module.exports=vis),"function"==typeof define&&define(function(){return vis}),"undefined"!=typeof window&&(window.vis=vis)},{"emitter-component":2,hammerjs:3,moment:4,mousetrap:5}],2:[function(t,e){function i(t){return t?s(t):void 0}function s(t){for(var e in i.prototype)t[e]=i.prototype[e];return t}e.exports=i,i.prototype.on=i.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},i.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},i.prototype.off=i.prototype.removeListener=i.prototype.removeAllListeners=i.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},i.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},i.prototype.hasListeners=function(t){return!!this.listeners(t).length}},{}],3:[function(t,e){!function(t,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 t,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 e&&"object"==typeof e.exports?e.exports=n:(t.Hammer=n,"function"==typeof t.define&&t.define.amd&&t.define("hammer",[],function(){return n}))}(this)},{}],4:[function(t,e){var i="undefined"!=typeof self?self:"undefined"!=typeof window?window:{};(function(s){function n(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 o(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function r(t,e){function i(){ge.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}var s=!0;return u(function(){return s&&(i(),s=!1),e.apply(this,arguments)},e)}function a(t,e){return function(i){return g(t.call(this,i),e)}}function h(t,e){return function(i){return this.lang().ordinal(t.call(this,i),e)}}function d(){}function l(t){C(t),u(this,t)}function c(t){var e=w(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 u(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 p(t){var e,i={};for(e in t)t.hasOwnProperty(e)&&Ne.hasOwnProperty(e)&&(i[e]=t[e]);return i}function m(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&&S(t[s])!==S(e[s]))&&r++;return r+o}function b(t){if(t){var e=t.toLowerCase().replace(/(.)s$/,"$1");t=ni[t]||oi[e]||e}return t}function w(t){var e,i,s={};for(i in t)t.hasOwnProperty(i)&&(e=b(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(n,o){var r,a,h=ge.fn._lang[t],d=[];if("number"==typeof n&&(o=n,n=s),a=function(t){var e=ge().utc().set(i,t);return h.call(ge.fn._lang,e,n||"")},null!=o)return a(o);for(r=0;e>r;r++)d.push(a(r));return d}}function S(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 E(t,e,i){return ne(ge([t,11,31+e-i]),e,i).week}function M(t){return D(t)?366:365}function D(t){return t%4===0&&t%100!==0||t%400===0}function C(t){var e;t._a&&-2===t._pf.overflow&&(e=t._a[xe]<0||t._a[xe]>11?xe:t._a[Se]<1||t._a[Se]>T(t._a[we],t._a[xe])?Se:t._a[Te]<0||t._a[Te]>23?Te:t._a[Ee]<0||t._a[Ee]>59?Ee:t._a[Me]<0||t._a[Me]>59?Me:t._a[De]<0||t._a[De]>999?De:-1,t._pf._overflowDayOfYear&&(we>e||e>Se)&&(e=Se),t._pf.overflow=e)}function N(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 I(t){return t?t.toLowerCase().replace("_","-"):t}function O(t,e){return e._isUTC?ge(t).zone(e._offset||0):ge(t).local()}function L(t,e){return e.abbr=t,Ce[t]||(Ce[t]=new d),Ce[t].set(e),Ce[t]}function k(t){delete Ce[t]}function P(e){var i,s,n,o,r=0,a=function(e){if(!Ce[e]&&Ie)try{t("./lang/"+e)}catch(i){}return Ce[e]};if(!e)return ge.fn._lang;if(!v(e)){if(s=a(e))return s;e=[e]}for(;r0;){if(s=a(o.slice(0,i).join("-")))return s;if(n&&n.length>=i&&_(o,n,!0)>=i-1)break;i--}r++}return ge.fn._lang}function z(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function A(t){var e,i,s=t.match(Pe);for(e=0,i=s.length;i>e;e++)s[e]=li[s[e]]?li[s[e]]:z(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 R(t,e){return t.isValid()?(e=F(e,t.lang()),ri[e]||(ri[e]=A(e)),ri[e](t)):t.lang().invalidDate()}function F(t,e){function i(t){return e.longDateFormat(t)||t}var s=5;for(ze.lastIndex=0;s>=0&&ze.test(t);)t=t.replace(ze,i),ze.lastIndex=0,s-=1;return t}function G(t,e){var i,s=e._strict;switch(t){case"Q":return Ue;case"DDDD":return qe;case"YYYY":case"GGGG":case"gggg":return s?Ze:Fe;case"Y":case"G":case"g":return $e;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return s?Ke:Ge;case"S":if(s)return Ue;case"SS":if(s)return Xe;case"SSS":if(s)return qe;case"DDD":return Re;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Ye;case"a":case"A":return P(e._l)._meridiemParse;case"X":return Ve;case"Z":case"ZZ":return Be;case"T":return We;case"SSSS":return He;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return s?Xe:Ae;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Ae;case"Do":return je;default:return i=new RegExp(q(X(t.replace("\\","")),"i"))}}function H(t){t=t||"";var e=t.match(Be)||[],i=e[e.length-1]||[],s=(i+"").match(ii)||["-",0,0],n=+(60*s[1])+S(s[2]);return"+"===s[0]?-n:n}function Y(t,e,i){var s,n=i._a;switch(t){case"Q":null!=e&&(n[xe]=3*(S(e)-1));break;case"M":case"MM":null!=e&&(n[xe]=S(e)-1);break;case"MMM":case"MMMM":s=P(i._l).monthsParse(e),null!=s?n[xe]=s:i._pf.invalidMonth=e;break;case"D":case"DD":null!=e&&(n[Se]=S(e));break;case"Do":null!=e&&(n[Se]=S(parseInt(e,10)));break;case"DDD":case"DDDD":null!=e&&(i._dayOfYear=S(e));break;case"YY":n[we]=ge.parseTwoDigitYear(e);break;case"YYYY":case"YYYYY":case"YYYYYY":n[we]=S(e);break;case"a":case"A":i._isPm=P(i._l).isPM(e);break;case"H":case"HH":case"h":case"hh":n[Te]=S(e);break;case"m":case"mm":n[Ee]=S(e);break;case"s":case"ss":n[Me]=S(e);break;case"S":case"SS":case"SSS":case"SSSS":n[De]=S(1e3*("0."+e));break;case"X":i._d=new Date(1e3*parseFloat(e));break;case"Z":case"ZZ":i._useUTC=!0,i._tzm=H(e);break;case"dd":case"ddd":case"dddd":s=P(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]=S(e));break;case"gg":case"GG":i._w=i._w||{},i._w[t]=ge.parseTwoDigitYear(e)}}function B(t){var e,i,s,o,r,a,h,d;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(r=1,a=4,i=n(e.GG,t._a[we],ne(ge(),1,4).year),s=n(e.W,1),o=n(e.E,1)):(d=P(t._l),r=d._week.dow,a=d._week.doy,i=n(e.gg,t._a[we],ne(ge(),r,a).year),s=n(e.w,1),null!=e.d?(o=e.d,r>o&&++s):o=null!=e.e?e.e+r:r),h=oe(i,s,o,a,r),t._a[we]=h.year,t._dayOfYear=h.dayOfYear}function W(t){var e,i,s,o,r=[];if(!t._d){for(s=j(t),t._w&&null==t._a[Se]&&null==t._a[xe]&&B(t),t._dayOfYear&&(o=n(t._a[we],s[we]),t._dayOfYear>M(o)&&(t._pf._overflowDayOfYear=!0),i=te(o,0,t._dayOfYear),t._a[xe]=i.getUTCMonth(),t._a[Se]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=r[e]=s[e];for(;7>e;e++)t._a[e]=r[e]=null==t._a[e]?2===e?1:0:t._a[e];t._d=(t._useUTC?te:Q).apply(null,r),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()+t._tzm)}}function V(t){var e;t._d||(e=w(t._i),t._a=[e.year,e.month,e.day,e.hour,e.minute,e.second,e.millisecond],W(t))}function j(t){var e=new Date;return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function U(t){if(t._f===ge.ISO_8601)return void K(t);t._a=[],t._pf.empty=!0;var e,i,s,n,o,r=P(t._l),a=""+t._i,h=a.length,d=0;for(s=F(t._f,r).match(Pe)||[],e=0;e0&&t._pf.unusedInput.push(o),a=a.slice(a.indexOf(i)+i.length),d+=i.length),li[n]?(i?t._pf.empty=!1:t._pf.unusedTokens.push(n),Y(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),W(t),C(t)}function X(t){return t.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,s,n){return e||i||s||n})}function q(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Z(t){var e,i,s,n,r;if(0===t._f.length)return t._pf.invalidFormat=!0,void(t._d=new Date(0/0));for(n=0;nr)&&(s=r,i=e));u(t,i||e)}function K(t){var e,i,s=t._i,n=Je.exec(s);if(n){for(t._pf.iso=!0,e=0,i=ti.length;i>e;e++)if(ti[e][1].exec(s)){t._f=ti[e][0]+(n[6]||" ");break}for(e=0,i=ei.length;i>e;e++)if(ei[e][1].exec(s)){t._f+=ei[e][0];break}s.match(Be)&&(t._f+="Z"),U(t)}else t._isValid=!1}function $(t){K(t),t._isValid===!1&&(delete t._isValid,ge.createFromInputFallback(t))}function J(t){var e=t._i,i=Oe.exec(e);e===s?t._d=new Date:i?t._d=new Date(+i[1]):"string"==typeof e?$(t):v(e)?(t._a=e.slice(0),W(t)):y(e)?t._d=new Date(+e):"object"==typeof e?V(t):"number"==typeof e?t._d=new Date(e):ge.createFromInputFallback(t)}function Q(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 te(t){var e=new Date(Date.UTC.apply(null,arguments));return 1970>t&&e.setUTCFullYear(t),e}function ee(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 ie(t,e,i,s,n){return n.relativeTime(e||1,!!i,t,s)}function se(t,e,i){var s=be(Math.abs(t)/1e3),n=be(s/60),o=be(n/60),r=be(o/24),a=be(r/365),h=s0,h[4]=i,ie.apply({},h)}function ne(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 oe(t,e,i,s,n){var o,r,a=te(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:M(t-1)+r}}function re(t){var e=t._i,i=t._f;return null===e||i===s&&""===e?ge.invalid({nullInput:!0}):("string"==typeof e&&(t._i=e=P().preparse(e)),ge.isMoment(e)?(t=p(e),t._d=new Date(+e._d)):i?v(i)?Z(t):U(t):J(t),new l(t))}function ae(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 S(this.milliseconds()/100)},SS:function(){return g(S(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(S(t/60),2)+":"+g(S(t)%60,2)},ZZ:function(){var t=-this.zone(),e="+";return 0>t&&(t=-t,e="-"),e+g(S(t/60),2)+g(S(t)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},ci=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];hi.length;)ve=hi.pop(),li[ve+"o"]=h(li[ve],ve);for(;di.length;)ve=di.pop(),li[ve+ve]=a(li[ve],2);for(li.DDDD=a(li.DDD,3),u(d.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 ne(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,n){var r;return"boolean"==typeof i&&(n=i,i=s),r={},r._isAMomentObject=!0,r._i=t,r._f=e,r._l=i,r._strict=n,r._isUTC=!1,r._pf=o(),re(r)},ge.suppressDeprecationWarnings=!1,ge.createFromInputFallback=r("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 ae("isBefore",t)},ge.max=function(){var t=[].slice.call(arguments,0);return ae("isAfter",t)},ge.utc=function(t,e,i,n){var r;return"boolean"==typeof i&&(n=i,i=s),r={},r._isAMomentObject=!0,r._useUTC=!0,r._isUTC=!0,r._l=i,r._i=t,r._f=e,r._strict=n,r._pf=o(),re(r).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=Le.exec(t))?(i="-"===r[1]?-1:1,o={y:0,d:S(r[Se])*i,h:S(r[Te])*i,m:S(r[Ee])*i,s:S(r[Me])*i,ms:S(r[De])*i}):(r=ke.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 c(o),ge.isDuration(t)&&t.hasOwnProperty("_lang")&&(s._lang=t._lang),s},ge.version=ye,ge.defaultFormat=Qe,ge.ISO_8601=function(){},ge.momentProperties=Ne,ge.updateOffset=function(){},ge.relativeTimeThreshold=function(t,e){return ai[t]===s?!1:(ai[t]=e,!0)},ge.lang=function(t,e){var i;return t?(e?L(I(t),e):null===e?(k(t),t="en"):Ce[t]||P(t),i=ge.duration.fn._lang=ge.fn._lang=P(t),i._abbr):ge.fn._lang._abbr},ge.langData=function(t){return t&&t._lang&&t._lang._abbr&&(t=t._lang._abbr),P(t)},ge.isMoment=function(t){return t instanceof l||null!=t&&t.hasOwnProperty("_isAMomentObject")},ge.isDuration=function(t){return t instanceof c},ve=ci.length-1;ve>=0;--ve)x(ci[ve]);ge.normalizeUnits=function(t){return b(t)},ge.invalid=function(t){var e=ge.utc(0/0);return null!=t?u(e._pf,t):e._pf.userInvalidated=!0,e},ge.parseZone=function(){return ge.apply(null,arguments).parseZone()},ge.parseTwoDigitYear=function(t){return S(t)+(S(t)>68?1900:2e3)},u(ge.fn=l.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 u({},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=R(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),f(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),f(this,i,-1),this},diff:function(t,e,i){var s,n,o=O(t,this),r=6e4*(this.zone()-o.zone());return e=b(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:m(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 D(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:r("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:r("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=H(t)),Math.abs(t)<16&&(t=60*t),this._offset=t,this._isUTC=!0,i!==t&&(!e||this._changeInProgress?f(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=be((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=ne(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==t?e:this.add("y",t-e)},isoWeekYear:function(t){var e=ne(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=ne(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 E(this.year(),1,4)},weeksInYear:function(){var t=this._lang._week;return E(this.year(),t.dow,t.doy)},get:function(t){return t=b(t),this[t]()},set:function(t,e){return t=b(t),"function"==typeof this[t]&&this[t](e),this},lang:function(t){return t===s?this._lang:(this._lang=P(t),this)}}),ge.fn.millisecond=ge.fn.milliseconds=ce("Milliseconds",!1),ge.fn.second=ge.fn.seconds=ce("Seconds",!1),ge.fn.minute=ge.fn.minutes=ce("Minutes",!1),ge.fn.hour=ge.fn.hours=ce("Hours",!0),ge.fn.date=ce("Date",!0),ge.fn.dates=r("dates accessor is deprecated. Use date instead.",ce("Date",!0)),ge.fn.year=ce("FullYear",!0),ge.fn.years=r("years accessor is deprecated. Use year instead.",ce("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,u(ge.duration.fn=c.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=m(n/1e3),a.seconds=t%60,e=m(t/60),a.minutes=e%60,i=m(e/60),a.hours=i%24,o+=m(i/24),a.days=o%30,r+=m(o/30),a.months=r%12,s=m(r/12),a.years=s},weeks:function(){return m(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*S(this._months/12)},humanize:function(t){var e=+this,i=se(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=b(t),this[t.toLowerCase()+"s"]()},as:function(t){return t=b(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 si)si.hasOwnProperty(ve)&&(pe(ve,si[ve]),ue(ve.toLowerCase()));pe("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===S(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),Ie?e.exports=ge:"function"==typeof define&&define.amd?(define("moment",function(t,e,i){return i.config&&i.config()&&i.config().noGlobal===!0&&(_e.moment=fe),ge}),me(!0)):me()}).call(this)},{}],5:[function(t,e){function i(t,e,i){return t.addEventListener?t.addEventListener(e,i,!1):void t.attachEvent("on"+e,i)}function s(t){return"keypress"==t.type?String.fromCharCode(t.which):w[t.which]?w[t.which]:x[t.which]?x[t.which]:String.fromCharCode(t.which).toLowerCase()}function n(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 o(t,e){return t.sort().join(",")===e.sort().join(",")}function r(t){t=t||{};var e,i=!1;for(e in D)t[e]?i=!0:D[e]=0;i||(N=!1)}function a(t,e,i,s,n){var r,a,h=[];if(!E[t])return[];for("keyup"==i&&u(t)&&(e=[t]),r=0;r95&&112>t||w.hasOwnProperty(t)&&(_[w[t]]=t)}return _}function g(t,e,i){return i||(i=m()[t]?"keydown":"keypress"),"keypress"==i&&e.length&&(i="keydown"),i}function f(t,e,i,n){D[t]=0,n||(n=g(e[0],[]));var o,a=function(){N=n,++D[t],p()},h=function(t){d(i,t),"keyup"!==n&&(C=s(t)),setTimeout(r,10)};for(o=0;o1)return f(t,d,e,i);for(h="+"===t?["+"]:t.split("+"),o=0;o":".","?":"/","|":"\\"},T={option:"alt",command:"meta","return":"enter",escape:"esc"},E={},M={},D={},C=!1,N=!1,I=1;20>I;++I)w[111+I]="f"+I;for(I=0;9>=I;++I)w[I+96]=I;i(document,"keypress",c),i(document,"keydown",c),i(document,"keyup",c);var O={bind:function(t,e,i){return y(t instanceof Array?t:[t],e,i),M[t+":"+i]=e,this},unbind:function(t,e){return M[t+":"+e]&&(delete M[t+":"+e],this.bind(t,function(){},e)),this},trigger:function(t,e){return M[t+":"+e](),this},reset:function(){return E={},M={},this}};e.exports=O},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/docs/dataset.html b/docs/dataset.html index 0828e37e..723affae 100644 --- a/docs/dataset.html +++ b/docs/dataset.html @@ -91,7 +91,7 @@ console.log('filtered items', items); // retrieve formatted items var items = data.get({ fields: ['id', 'date'], - convert: { + type: { date: 'ISODate' } }); @@ -149,7 +149,7 @@ var data = new vis.DataSet([data] [, options]) - convert + type Object.<String, String> none @@ -227,7 +227,7 @@ var data = new vis.DataSet([data] [, options]) Number[] Get ids of all items or of a filtered set of items. - Available options are described in section Data Selection, except that options fields and convert are not applicable in case of getIds. + Available options are described in section Data Selection, except that options fields and type are not applicable in case of getIds. @@ -649,7 +649,7 @@ DataSet.map(callback [, options]); - convert + type Object.<String, String> An object containing field names as key, and data types as value. @@ -700,7 +700,7 @@ data.add([ // retrieve formatted items var items = data.get({ fields: ['id', 'date', 'group'], // output the specified fields only - convert: { + type: { date: 'Date', // convert the date fields to Date objects group: 'String' // convert the group fields to Strings } diff --git a/docs/graph.html b/docs/graph.html index 20e96ed2..23d49b6a 100644 --- a/docs/graph.html +++ b/docs/graph.html @@ -1593,6 +1593,16 @@ var options: { // all fields normally accepted by a node can be used. callback(newData); // call the callback with the new data to edit the node. } + onEditEdge: function(data,callback) { + /** data = {id: edgeID, + * from: nodeId1, + * to: nodeId2, + * }; + */ + var newData = {..}; // alter the data as you want, except for the ID. + // all fields normally accepted by an edge can be used. + callback(newData); // call the callback with the new data to edit the edge. + } onConnect: function(data,callback) { // data = {from: nodeId1, to: nodeId2}; var newData = {..}; // check or alter data as you see fit. @@ -1951,10 +1961,12 @@ var options: { 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 either one of the control points and drag them to another 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 diff --git a/docs/img/vis_overview.odg b/docs/img/vis_overview.odg index 0be797e9e3bd0fe567a4911f67019ebb0d433bb6..ec94baea10c58a2f58527e7a23fe91dafa38d1e1 100644 GIT binary patch literal 16920 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 z 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 literal 17762 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 diff --git a/docs/img/vis_overview.png b/docs/img/vis_overview.png index d2de2359ad74df648068623ba60fbffecd43db72..588d58401e3e7654514119fe3b8f2293fbf53d55 100644 GIT binary patch literal 66220 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 R=bJ$wAu9W}Q24#){{nUPREhuq literal 64008 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
$yjCu6Q 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 XrM8|M{4^DcZ?&AX;>%*mH~#+tnUvxd diff --git a/docs/index.html b/docs/index.html index 48eff665..1d6e3bd8 100644 --- a/docs/index.html +++ b/docs/index.html @@ -34,6 +34,13 @@ Vis.js contains of the following components:

+
+ - - -

Install

npm

@@ -163,16 +162,23 @@ var timeline = new vis.Timeline(container, data, options); <div id="visualization"></div> <script type="text/javascript"> + // DOM element where the Timeline will be attached var container = document.getElementById('visualization'); - var data = [ + + // Create a DataSet (allows two way data-binding) + var data = new vis.DataSet([ {id: 1, content: 'item 1', start: '2013-04-20'}, {id: 2, content: 'item 2', start: '2013-04-14'}, {id: 3, content: 'item 3', start: '2013-04-18'}, {id: 4, content: 'item 4', start: '2013-04-16', end: '2013-04-19'}, {id: 5, content: 'item 5', start: '2013-04-25'}, {id: 6, content: 'item 6', start: '2013-04-27'} - ]; + ]); + + // Configuration for the Timeline var options = {}; + + // Create a Timeline var timeline = new vis.Timeline(container, data, options); </script> </body> diff --git a/docs/timeline.html b/docs/timeline.html index 179d11a1..6907887d 100644 --- a/docs/timeline.html +++ b/docs/timeline.html @@ -68,16 +68,23 @@ <div id="visualization"></div> <script type="text/javascript"> + // DOM element where the Timeline will be attached var container = document.getElementById('visualization'); - var items = [ + + // Create a DataSet (allows two way data-binding) + var items = new vis.DataSet([ {id: 1, content: 'item 1', start: '2013-04-20'}, {id: 2, content: 'item 2', start: '2013-04-14'}, {id: 3, content: 'item 3', start: '2013-04-18'}, {id: 4, content: 'item 4', start: '2013-04-16', end: '2013-04-19'}, {id: 5, content: 'item 5', start: '2013-04-25'}, {id: 6, content: 'item 6', start: '2013-04-27'} - ]; + ]); + + // Configuration for the Timeline var options = {}; + + // Create a Timeline var timeline = new vis.Timeline(container, items, options); </script> </body> @@ -458,6 +465,16 @@ var options = { Specifies the minimum height for the Timeline. Can be a number in pixels or a string like "300px". + + moveable + Boolean + true + + Specifies whether the Timeline can be moved and zoomed by dragging the window. + See also option zoomable. + + + onAdd Function @@ -533,7 +550,7 @@ var options = { showCurrentTime boolean - false + true Show a vertical bar at the current time. @@ -599,6 +616,16 @@ var options = { The width of the timeline in pixels or as a percentage. + + zoomable + Boolean + true + + Specifies whether the Timeline can be zoomed by pinching or scrolling in the window. + Only applicable when option moveable is set true. + + + zoomMax Number @@ -646,6 +673,13 @@ timeline.clear({options: true}); // clear options only + + destroy() + none + Destroy the Timeline. The timeline is removed from memory. all DOM elements and event listeners are cleaned up. + + + fit() none @@ -895,7 +929,7 @@ var options = {

  • item: the item being manipulated
  • -
  • callback: a callback function which must be invoked to report back. The callback must be invoked as callback(item | null). Here, item can contain changes to the passed item. When invoked as callback(null), the action will be cancelled.
  • +
  • callback: a callback function which must be invoked to report back. The callback must be invoked as callback(item | null). Here, item can contain changes to the passed item. Parameter `item` typically contains fields `content`, `start`, and optionally `end`. The type of `start` and `end` is determined by the DataSet type configuration and is `Date` by default. When invoked as callback(null), the action will be cancelled.

diff --git a/download/vis.zip b/download/vis.zip index 7bedaba2e6f75daee498dca3fffa75288ca964a4..f260afb729a349bcf2dd154859a23daf1904fcc4 100644 GIT binary patch delta 1134409 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ΜFM2lt;K^#o{%{rUGNCwQWLVPj$~ zh@kj|+lKY^jOv9NQ#!qTj=97Qu7GN}x8UgNtrtE6n@4RyyNp}i!8A()4%G>J zJ!K}vp0nWj?xdhwN(QbLZqg_6`CJP5^#LQ%mMm$?r^5BU!4*wXz;ys z{D}Ned}rR4^yTn|{m{2R{~#PiOwzkJ7q0R=VL!b{X~2{%$pk_(PEzb=GYdv((X1~b zmOJKuD}CdQfs~srGi$N0@QNvBG82d-d+fY1jgftSooo42&(SkfxE+X-Z47r_X_jq#*;%d!$&`!DwBY!H7nESyD zgm@pdo}{`RAJY|;tux-tsETpKapEDd1&IWo`i@<3!_oJbqb{J14zv@%y!UVQ$Vz!a zJkfr71C95QcciB!3)N}%oKErkcu#uIhH4c;fT^ODHiH(Kz1>pW_r-+YQNLH2f@IRM zaS4tIjGN<#cG>a>6U-A#xzFZxMm+$ ztg@7e1_g^!xSH$;6TiB4JnOjFI9iyOX|B4j1LS=Pm~YV#_4`a@Y)+9~_0m@!<>`jn z3=eNn^@Vnc6Or6Zg&~J$%7`?JOr}Dp_e(Fy9((%(wc2`IIIRH}A7mAM^hOWHvj}mK zxeT|FXS8;zF4jN0i;l@F{cWd2-?--v*6mvTENc+8ci=VTG@?>YOQZZ^o<)+HSLMh| z019e7MCv7{J1V_o^PKT*s=0z6E)fa08rht;!s83HYa8ixP~X-U;Y#tGQ!aszRoh0@ zX4TP)o|k;e=IVy7gsWTa|-@hz>ZZ zYNCo2?e_wdE9r5mdNTXo+JV+}x;0M}pkutq%qCayUP7tSdUV!$N+!MKI#a>WHdvRv z@}#F@fR8F_Pn*_Yj>U$#l~5p{fMIqiE#rwx!N1J=vs?21fP$*^Rd<<#7|r4jUKl5K zY&en*aXJkcTjjz6eO>;Cte2#hNdLo{8IM@&_pb8GX)V1QxZA<=AY+Pm|NOE;;Aq2_3ulOO)Y5nO%w-GZ z4^MCE`(~WNNR`JICqS%>Bnxe3V_qPq8A#;$=x!l6jcTCYd~?g-mm;bjpnMjq(FrrX zSvB?^ooLY^o8NSMVZO`o>Ya=O9t>eRNW$Gq)RvK3IM)A|wimC)q(--pAbhmgIrVn; z+-Kaa9DIv&ot!ie)3jbfvboe&uc>l=4rj~7enuovYMXSWBI>Q&;l<>mKL%U$+P%%QslaIZ}a>Q^w_JOWrB70*Tae>!G%_{$BF_3z{DJfZoj?&@ z&lVzY!-ky?pM~&JOCSuDZCXs1K!_(e$da8%t|H8=OWFk{#xB7OP({=AeL>H;bh?hs zD(Huy-t$6N0HK;Ql>0n2(FaAlfuk5ebNWxmm|^tce-Tg7x22AUg^UnQA(fYa#QP$W zbA{u;3kUxULoKOtBa6bE?1~(=F8+O(igZqod}kLGrdk~VJFUkJ91A?KcN;~59XujP zQnM?7L>rX>X8;oq@J4yg7Xb@&1WRKwxNSl?Hcch6DGz}OEEWE-wcEt?Hu*z)dvHlI zHw32e8kL$0jRh-I=yPnl5)-oH63;&p1R;bpgb7Q*JD1EGni4)5b)&NCgA zB5V#rB&8@@{Q{Gr{{W`=pf3!MJX<%?O$5Tvi$5PH z#D52gt}LwJhd1=|VT3SlB#YCe~BrGEXz6|m7Nztg7(NR<}R5*7|$3>|JKGDA|~NS6~KIpGZ~ADG=A}=rvDQv!ureG z1P5WPXKW5UNF)zOJ)dY60pjJowU*}Ow!6Q#RDoJ&nBRQiaPfX4N z#fua$aQLO>n4Jc`I&$2 z!0;YzGgA4pb3&4TpF7VXS*~O`IPf=>jwWDL3VT_J1015f2k|HJ>~0R@h${>#9=rn? z`PZ#zd1U;gRb&@>+Fg`Hq8dms3R%M;-qF7V$jv z++ZM`d-)jBkrzVLa1g@8xS{4reV@G)qfAkDFssIDNPzO`HY8)@w{T50yO3$F5jwL?j z1bMl!LM-NCkEu|7^4To3qNLN^>s~j1)m2?JRGc?Yzg>LkiI~I>GR1v(7}vq&1qMr< zK;T_yp`&&T1m*XCRkNvoHxZuUn_Q=8@>E5}-S8OX|Kx>W_F zHi8o7A0N7TQ}jy3`ga$n2m%rQ;~^_nFrxqP z5Lev!Cm=dh9Z!Co5kvlcvhJHhvf+euVcv4)cuzyaynN_SN7p!I+3S;|634&Cc6@-N<>EnmETc=A8qwj;l8IOsIEwtO!wlU4%* z39c^>PiT2&Q8ve8_E#c{B|_}10+5+;ogk1hl@ud4u~Sx4VAz*5>4!Un9k^ycVn*a0 zX-W}SPsTU`aBx9&r55Dyomsy5n$G)#aw+XOYwU`~2G+h+XRWz-NJAxmSaj?@+_TQg za}}214PBv2dz19HNCJh``u4H8hSD{q6K1X|!`<$taEN{-<(p1*H=~~fgJP)bKsV)o^Ik{N7j~N94Zv+e?Ms!Epta-*w zknyarlvVyBQ8h9h_50uFF%IKU?K#S3d;K0>?EPXIAE!Q~RWhG?e{E&=nrh_e5)hRoRuAO!075fxekP$16=@-cHFE^*y*7aYCC4Rxp7T_VT z`GZNA3KXK-zOl>eaw^oL$g4s`>)Nq6fC9e>b{UKGGXGM7WA5KBAi9ofhC*+Z?vMFN zL!OAUeV&I+*Q-kV{M>DtI>&uFmf@EdkyoJEOV_L9I6bXC9_&>Q0-{s08N63Ix~q61 z{91U{A`K$;t4y&mf^&R*&qXrs-FPiPuH=6#aact#WTH|laWHutf2mdqPqEIAsl2Zy z2c|9*`HWpqcJgPEb3DAdB(8OCE>GLp2-Tk(tf+K4iToYe-}m+>0e+xuK6ZM$epD;4 zyZ^4s>*?wpSy8J922AHJQ>$pI_9fePUuR2uFYj%H%Q7IOiVKxi+Ury=s-)I8g832F z4O%TG`ZXeY{|s80T<%F)9dun|k~e>YtvV}keCA}VrBV#sk9q~$GNx(VNer#=RGu0T zzt7#qR`riesr8{Qysbz8RgF!+$Tn*lIZ5Jz&RFwgqE?UEfzo6X)e5dW15c^IlUL9h zrB>d_&(+Wd+CRm(Z$8}5UoB-g^aLtw@O+w#%cB?`;a1XzW_{FNGN-Hdes>hmm?|g7 zi^<7XHUH&JF`2@k!fr}1ZxYdZNfh z+XUrL!y%y-J45qWKQy(5j+QCD4{~R5iT<85cQo5`{py^ypRb=$_?1%kw*e$J?Y2vr z(1C8`vBYKZNtff16Hc4<-&jJk_M0i6NkjC@GCHgyXW6qpXIj5uv#*=}B^$^!k4ls& zgG@DiEkNheYqFZUhbt#N|s1rAPwJ;O7#Uyi0%NEt| z+odC!P#%9Ck5Wjfxtqo9wH#EuUOg)nb{rC){{nQjSN%_Qhtf^;oRgfK>$lBOnaFge z-p-bcbZJu6JQ&9UO=8oXBlRQxo8lq>25Ao$Lkc$<#f5LVn1#plXxGoQ?VyBjhe`nlEpOr6?>) z(Isy03pzfVKSs@m8OJR2+ER;>M9xN^|3G5sropa?CpY0~bjoJWgQf=k0u zHZMb_%dR&}aYDxU?Q>g9SJPOAUwTzU${nbq$;tP1y=v&KL`q#<{wB2&u_9t2Y=MMF zhxZkywTaK+ROa59j+^yx$aC?zBB^3gSHSjNHq0%R;)Jn8v6Pz>qS**AR8*vvw;+pU}C zNT{Agx+MNEGtZ1n)p*tAxOLCJ*o(mEMTFIJIo9iHIs))#>&LwDjY#DLG~N8>1F`?= z4H@4M;q+f6ogf$<((cQn_1z-maQoNaOpX#Z5^tL;lINn~s*Yu!H=5x$vq^G#x5Yaq z^ijXbDmn2@5X2EUK^h9Rd+Ik@xmLN@Q68Kq)eBoaNOZz%PlZ?BQR5F|XkP)Vv?oMy zPDfSzZ!j%yuM>ID?>fUyuuhf{IFmy~F4ol3nNtlaVx{Aep%K@smi7MF;u#x0KUuNA z)kQ;DIoq5+tkf4)%M(5sRzV#U=4(H}8N~H#oN1Kdam{u%!f%$?Wj%3_VL zM;Wp5a*RVyI5O|8pPE{G!Q^qr~MHQ+v*Ca6ni<*DVHoza4z-RSvU? z;w_+OZMG;?9s++)#;&kw4%9wAL+7mgB9hUt+&&5Z8^;Qxw|c-i2x0Ix@yo<5W(Mh4-#FDVxEq zy>J^{&nzHR4ggkZR#t)WV|Vg%1}*qP_EYlTm7S(DXbUCSqwVe_1;&rV>1`)yKlo~6 zmf!O+6RXt?ZLDYF$Ppu7-V5VStl;Gy+Pn=n|46i0&uF()Cu`eZfnQ7GCOZ{eym-=$ zkc`lcXu(x9UU$>1tb@slRBoi!a4v1ya56ET5|Qh0Z=TT|o;m|*ZeKkQ-zthXOMgjO zKXz@nNauQHDzq+_5pxE*}YVMWDZxCp8GO8TRo;BwZ4uPF@Urh0B?cbID z^+xqG_PCdNF7O2S@sD6SD?J9Kh5k*tU!8r-uM7|PTt=Jn%yyN*Zm+Nkq)VjI(b7idWaA?%Y=3O!fGb)k=n}r&TX5+3+yRMe1DPKe0l+U@dR`PA^ z!@3K`LfgK-gBR-BNBDc?Y9W8f-XtOLw^h|$kG=KLEJb|zMs0zQ z<8c_-z($LK(7gFE*Z4imUcp39B;2smU~J$eCt&e9b?^F`=6aE%%*H#DB`RQ0pkW8u zxpR_qk?kac%`pfGL5FTCB`gHL>HW=GN5sDOBR@$p6kB+akkC{0L;F$PLB@D|>{hLZ zx!AZ8tK$?XL8%Y9)5Eu%z593M*RWy5zdHcQ9o+8pQFk^98cfX+zSL3p47@x{nm+73n~O-x_0TVr zRT@9!7ttoABh+q3UI=qBMUo)YKJc9EXlPh?#BCS=Mn7>1xdrmtLy`p??s-b|-vOpR zMp>}fIunI830Zh-`+%7TEy7QIYn$4Eo-mNrKRbpR0X$GN`+csLxCsw(y zQk36c@~Xk%$%yL12o@0y&J7Y$m>jKJ42LUeQaJm{l@~npNA@(c9egrzI$3^THy3zs z6loUVbS4OvF?j&Htc@gklY%v*Ls1tXtU^q7b=)lMruT=-Pp%qW92ND)E{VJ?xdAlf;bwKl}fCSbeimdTfqQM>aB{M zS)teYolKlahJ8fVf*3STBBhYWXKJ>FrKA&pC`e(*0%0qKE+vH9c53dGH4Mk}`?tCwlBs4m(!JmYuq2-(ru=`q~=I1io+dK#u=}Gr1jD`nU{Tn`v%Ll^Z)f){owhO_mgD3}}Bb1BNPJqLwQLulPEGq>i68&is;WeKQXnSX^}w zgr>e3!PSG=@~&sRTHi4S2(2t^dp)Y0KSG=W&OEx#oQ5>Kb5 zDCUT$5X(R0sqk)){o%;>b(09dxF3AUC62zW-Dl37j}n8_E|eGD_2;0six&r&6p7Y` zRCutAmD5p)Al?CH5ctYTC$_i8SNs|1h}gFMFt8g~b<7S6 zU!B_f6i??VDMKvGXw>JjNgeSyXlm@^*}$&!&xSe!{@IYnL1#Plr{)WZR{UnXcUqk1 zgu{V z-WtV_tegR(*hLq_lIh5QRCp;zQ=}i>p8nZT*XlIZj-}i{&J`E_|F)sMJ&Iws{)~?* z|LDH|*id89PfFpTQe-DAGjg;jjI8^Z*n8H}7mw1<$&wF&9Pjd*{i;CnJE{?velqpg z-R;4n=PSU>QU1nk6WeQZC5`|(NdA0jM+igW#b>~K$5W4ma{5zT^i!cPO3I-R8Jmcf zKhb@aJ6gG~_TW~I)zIocHYA*Pyg8vH-c0#jJcSmS!yfN zza;Sb@G2sR)C5d$?g!|}LEZBb+DAnKe0OUhGV;mc)8!&T_TY*F?%zo z4Npua;=KpQuM*91>0KWcq+q$P z;V*I#K%DXSU-Q`x&Yd5ZpXlq5q_5BZMf(>la+YGPi>|2dKGHah-4CxYdgv)KHw5Hc#E zPvA0?h-G>GlQQtj#FAv0RWo8)dTeIQs7zFmmP*n%yly2|j7DKOS5ed>9xfEAT_G6j z*+dibKErMD)$7u!!s6mI^*Qa(?c&utbF=n|Z@0x#mw8i2#<&Fz1TvS6#6TW)D7`EA zOYH_=7Y&$)->pe^>{c!g&>M@_RLt4dIvHLB&l2e_2`l+gTwCitkLv;Cq6?Jok#_~y3v>xIa%<-y zj^g67VJ(NHD)j?*o*sKU*{y*Tl1R;Hyzi1aa63WB0=aeGEHy0*! zn^@w_9FZ2#D}=0N%Tvl$IjTm^fm`-8#vnm(Jix^q4^w6e9&mM4CSGj9(ffeBYZv(1 z!9)v@^Zx>>AgoLFIn^O)kf2g>H3so7M%#SvZLIG;a1eFs6DnL=jFA7hq6**Fu*kQD zM`j+~=SCECK=_sID^4TcRjZK^2Arh?SlyY27Yx%OhM9A+Bx!=ZpSLpXEo>}WzgLFUB|G<CgmzZdlU&N_d=j9LFlOXwW#yO95aMjv{T<7<{ zt*aZr<8d|k6<6_q#kR-uKgbusKugliX&^kXJS~S$Zymb8a?6FMOG-SKvnkVJ=VjxwKR=@s(llCP1R1=XL`C`{d zri_ZPDpWUpDV^jX!#EZBj75}xl=N6xrnlvGOf^NC-t1{q@Sik%V>J#iHpT$RT-+rd zMV;c?OCA${6P!HC^(>zZW@mqoetN*xpy5_Bt~PE%S>|56i&KGMJi=NoG7EfOn?S0f z2TyK8`o|dU2LHhElThWraKu9dFLIvjZ904Wu47)`=p(K#RlM!@aUloB{_Bu->i+1q=-z)wf2$2>{kn{}vm8&cb#Tdav3~J8%yiE@OK)CIvtM5JWIFXn z?eI^-^rF+DT_5_g&KAXF!%z-gGE;;Zl=>CAbl*xFGq8e{+xvVY^;d1|p3r-2xoR`_ ztF6%XZdoOj80ha?H`Rn2$e|?U3 zkoS={`0$V!YF*>_Uw|m#sUuvmu{?#-VwnDmv*-HL9nz#nCUT8(jiYw?RV6&V{lC!l zIbBYG_LlKIxoNr{R?2qIq&tpt#qRl^`YEAGp^MeOi%94tVS(rom}!&?G8EdPm3!!S zIp1WM)`z9&tcHTkTFoSZC{A(=P86iIn$LAzvPh-&{Q0H?t?_dHU%6%mW;ni86IwU$YZpR|-8&++M=($V90EHJ<{Xf=iq{-2X1>de*n1j}$Ig zENqH3V9AtZ==4iIO1ExzEf`~m=e`;=T086NS;UCeNz9gc+a7DL@?M`NND&2dcF4-n zNtYc>So5s-9|PNWmgXBCnDs8sK}?E{?Kf!8F&-ZN^(PxTRb7c>sMbb})DI;{WYh$y zTXDeQ(y<6h^Lrh3OP@e!PkVWvD)m&;}$)v=timf9($ z2onQl0B~Mb=873t5NF7;jNiFBK;hi6KLIS8ry8I3jh|(pu{xyvR1frq`ifxH#oo6; z!NkIrym@MNfY-4b6`<&td@Z&|a{I7@SZm*q)Kc8cE75Culn?FS1Vi`6?Rpm(a84)L z98?i1cE)T^>fzwEEC%!xP?kh+Pf|9XzGV4Q3(J2aWfg6Efox1Z>q9p{ov$s zll(Qz_E;h*+XX{on{`&cUx)+cc7?CP=t$*XCV>K!C+&Hy0zQ-T+k@}xQtQR?n~6$w zjlkF0`;e8iMhvrW$CSS-TP;@bS1KC+{qZII^L8SR+fAkakGm>a+3m52#DKy5db6Zl z+?<>F<3*OTg@$X*>wT89%v8Qbp$x^e*xn8VHjL@d6pf_Qit+jfo}>Gb({k*>qW?fq z2AHl$)W*q-fC8{)uBp8uAkpU8F|5_S3fyCzV%=uUw)S|R`i(bdK(ub!B^^v2R-9Gf zu5vlc4@{Gs0V`@v#Gudc;kcdLPILWSGf`PUmB!aP@)kxw}wnAzXlc(`&lT zT1-RYpA*%JbQ(xIz6bwvBE0`{qWZ7%9Q>12L4-*t5XCTgH&P>LF+YbH19}0L*=P-*ol86%@T)7ed z3lRwb2}^JYs$ht{hjw;QdJ(Rb zx*5a-d?8ApVsUVKuO~?QPOC)T0FU*VN^=8;&YVLijS3`0Pt?ID-u0O|(jZex{U=4F z5D2MP!I~HD1(bjM#_7jjko!-Hh$aGe0+NjO2JM{@5_UeFqfUsK6b*4V^NZyaP(aG&>KX%QGO&-2$J~B)G%lfH33t$>XeYi z!v@{kj`Vo`qTXjck9Vju82nxdj+dT^CKCDQmen``d`SLc8l>mZwp>WYlDShA zSi!Y{01!j)gMj3ea!+D{S96N`Mx7kizpB1qYpXMnNX#H0f=rxTgHgYiRxnGBRPJEp zQmRuK(vCk<8a!3LFaCmq?kedVnoua(o}Uopil^gVhJ`+Qi9wJ;KzhBLSSdby01Os}KFNx2kZ)EJ6A2O)M};t-J{NsXyrgu4zESKq#Yg+6ENcfS5GdlQIE z=*F-&(#Y*~fBq(&4J;*pJ`}!L90z+Ud8@s6$=*;*;->U^N{;h0NP8U5yjUp7Jh}Ei zeGfiDzMG!I{gfTx^5aQm{k$ZP5J&)UaIf`!33Okb@^*&bh&$wCTi8Nl#dtNZi|MIY z-MWhe=upK7k;tRt2yh_=^_fuupgfz#s+@Zr^EsJ*PtYCT4Wb87Z~viwt>#l{LGe@d z`rAwTiy2?qelb|`aWv$FsHCH_@a4nrrF8+3CXA6=PTu8k}Z3p%OYmeT5_ zUe&j9!o42`(Hu>p)WAFGzsO|OaHJWiKhvY?@+G`8SqqQndy5*AZuarwLQ-i*`r8=e ztfY+%t7Uy>vPWvv9%S>mY^&_wYH+Y;*ez#^a^bJGsj6st5{9ohH$DQVRl&Ui!o&UO zz=^MfqSA-A7`IyZpk(yp8>!{YUBPgu5x5B2cdrylRNdH&|2*0CKQ%-~9;uJ%iW?$h z!>J0FD>9lXtE2UFlX^?h_cD7<;0Za^Qcyh$4$+0tsm#P<&B{ z9;@JvkODk~2S-ASWeT?15T>i08;S)jX3wqz-!eZj2$KJ&v%z#aPvO@`&i2A3(V&ak zZ5~-AA1+1bK-mb5?4p9=4syj)+jsWh(YUekK?`lEi1>&wxOKj9Az(+gAo!+SQ#`kU zFk;PZ_k9*oy!{gUQJ|6#;Cc0#%Un%M*Q3)bWoDUx+x>;Y!xGNwG80#xphlb7&?D0u ze{cY{3WjijRQl1hAkwu&jilu>k^OYqu83SxR)NHU!N2YL1!%7I2;dW_{S1M zxCp$kTOr=DYfhMwom<}*J(`D5U911f3@owRr=BM*YZFX3?hBG75Dm8W_**7UG6IZP zsY`;b%Yr3ZtJSlJ``@KWq5Fz) z$V_?i|3%zc#>Cw&ZhCOn7I$}d zhXO^4Lvf0`yYnmV?q1xXxI2a7?(XjH%X`k*%|DxLHk(a$lbJm8<;i@Q50km)zOLJ9 z1m&Ejyvo+n+Pi57{!gY)ukkc$nU!qG@UQV@)UDvR4l1ndQ3TN{_*#6Si~N&4%jG(N zr`{8z(Vbl|y5Yr6&i%oEkKh2qGWv^JdkF(_{A=zAy6b)J^e;YYPpluAfM?2MxyE}t zeaRw-yE%%ymIOMfIgI4F|Et96clD=oB9KQ|Q}X!{?cX2|Yi~_F<`rvJvs7Lp*xS0b zV;E4`=w7!u*Oe?S2B?dkL*|@ZWBV4^O?@hGaAcG>Yb$@zXRyIDUQ1*R;}s9Z;SKI| z(LcisJG(oIPxG)ubCu<&EJ*qT-10|1Y@%!4Qj?9;oQWz0sNs3n3Y4Jq}q#ii}*;PF_cMk0GY$bALNiJPnBx3*chO&Af?57 zbNW?D%T-V~c|W}kWZQ((l#>y*n_jjCF4?&J8A@_z=)mZ}kih!OFrleuct2H1H#u3! z?5+P~u>7YXah9trT4h~GFUBasGFr z-Gz;LvKxD32gKC*@h+_xi0n;kC zmfz&}n9eBOc^E_Js+0coxqtr^E!u40OT1;QQuGfV3Ct+&W}H^Z*UzvwiaSKIG&)zIU*^n zt@Q^1;MG>X!1SsSBpI9GbSRnZ0AgovS&PoI*4ZfZd=iutQcZ9W!isxm#Rc;# zXVP2i2BgOs-OhXdR~k&+EWtrYIRQ6_5K0$F%*UO~;HhXqx z*4}!|g!1UPKXK&M*}DEBjS0Ez9$eAkWjMTB%eq#TkeRsD!_{u#HPJk@hOs&4mGou< zc-BChFGXd#E905;$uGYsG_w4bCG+##p7QPYHmz}}{LE@8VC(6^Z|hgkRMu}iAQY{( zTRbDgn>W?=B4fIacMUD(Rc|9YIR|dBIr**c`j1}!ZQ9Wv$~wck`8rp2?fKII(?b+! zZf6}_ys&k>_on%cA1gwVEk4!V8vToBK-Rv%Mf>gZi%)zT!6E^K{kgXqf$q`qyatV@ zmW#pyz<2RmFkYR3@YC@5HqKM>d1WGr6*hY!3$KOMCU+fk zVGCQGJmXI7hqU>$;G6lUr_Z_UG6ad**0 zZnEBjR-@s%aC}-KSfqt>ZfN?aA2~W%_TaUvs|y$OvwWzq8D8hq3J$T7DPwHMo{IIj6CY4D^EQwiQK~8oo0VIl=#sHiYzKyO1e{ zlM2O_M1_0s`@%~;F&|7u3<=HZxkPt?(c5NwAd&A;}_7ML=nxTm1z^aRa!^1oxQcFqQ$nCHRz(tv0W}k{>N96qY zLK6K`7!ne)3xe5>F*{Ir^U@6xJyJMNKNpi(1XV&3CBPnXDO;@L07&r#ht3}TRMU(f z^1!z0-}=K0F_2c|>&A7Hm%DBxx8Hd6Cvh}1$^HM-iQ+F4d$q>z9~U?%A;6w~cKlN( zy8NgUiJ7>#bT(Yy{!=GPdqx08KTr6%5%-{dwwu4k`PJN6OtobAjmIx5PBJttnx^mB zArVLG#PU`i=%qIDe9I@>O3R+=626l++e(vXpW-4^{Ok;#h%yzZEf_g`OX96rxz1>i z>zPuCklwok4U376Ce%Rq4VL{=yJRj$WFUzmGkaQ4&!-7>KQIe4ba7!)i4ZS~NB^Kq zvv=mhFHf)-?1-TSIlmzz(7L z?3i$()78}2(0yTJ{Lsh{*UWux6XNcn2l;vL{~^s%IF5uofhlb5D51Z}JNcg;C&d5N zCgOk8)`iU+xYlPoFu?4|?tRIi^OF5{o9MrjW`14`e%^* zG-E1REDAIy`SA~F7E1JQ(#-dRG`s%qq}kgCXjX&{{D(B_v{3<1Jnr2M|A#ai`WIJ6Ie=e8l60)NhG@Ap49jo) zDcU*cUu~k*+t{twk2aA+>2g(xP3JG4GKal?+C-*9C?9R2t>ew21D?wRL_mSRjwsy6 zsy%`L_NghYT0EW_^&Twpb>y-7gEU(n53$J$$^I8&#wDOcSa)np|bn&rAGv z9g`*rSrRJte{lf+m-qj3J>b0~bgB_>06C=ePk@Ty;KpW&KS(oub)F?K;R~;iS`j?R zHduTd8KfQ!`7_xP>}L!J#Mb0F4`|nee!?+ZvavE;OrAB33c5a&L6ILj1w|0c)i)9e|JdJ_d&Qwd?sCfdN?CnaCZ z_?nxIKbY7b_nUo`F$hy+xD_eh4gr$wX zkrNS{p$sG2$jq;J(cP)t?0nL#V!7rrYKqV3iKv-2)NoSB-m%

xH~Dyz8mX9k$-b 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%0DwZsHi1aXPHb5{MLg=k16MpC7Y1z;*CnIq>jUFh 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