From 900220c0877e7be92bb531913c0047acf35d981b Mon Sep 17 00:00:00 2001 From: Alex de Mulder Date: Fri, 18 Apr 2014 12:37:09 +0200 Subject: [PATCH] bugfixes for IE9, style fixes --- dist/vis.js | 452 +++++++++--------- docs/graph.html | 2 +- src/graph/Graph.js | 23 +- .../graphMixins/HierarchicalLayoutMixin.js | 2 +- src/graph/graphMixins/ManipulationMixin.js | 20 +- src/graph/graphMixins/MixinLoader.js | 56 ++- .../physics/HierarchialRepulsion.js | 16 +- src/graph/graphMixins/physics/PhysicsMixin.js | 249 +++++----- src/graph/graphMixins/physics/Repulsion.js | 20 +- src/util.js | 66 ++- 10 files changed, 447 insertions(+), 459 deletions(-) diff --git a/dist/vis.js b/dist/vis.js index b9f9c5da..4ab8b824 100644 --- a/dist/vis.js +++ b/dist/vis.js @@ -964,53 +964,41 @@ util.option.asElement = function (value, defaultValue) { -util.GiveDec = function GiveDec(Hex) -{ - if(Hex == "A") +util.GiveDec = function GiveDec(Hex) { + if (Hex == "A") Value = 10; - else - if(Hex == "B") + else if (Hex == "B") Value = 11; - else - if(Hex == "C") + else if (Hex == "C") Value = 12; - else - if(Hex == "D") + else if (Hex == "D") Value = 13; - else - if(Hex == "E") + else if (Hex == "E") Value = 14; - else - if(Hex == "F") + else if (Hex == "F") Value = 15; else Value = eval(Hex) return Value; -} +}; -util.GiveHex = function GiveHex(Dec) -{ - if(Dec == 10) +util.GiveHex = function GiveHex(Dec) { + if (Dec == 10) Value = "A"; - else - if(Dec == 11) + else if (Dec == 11) Value = "B"; - else - if(Dec == 12) + else if (Dec == 12) Value = "C"; - else - if(Dec == 13) + else if (Dec == 13) Value = "D"; - else - if(Dec == 14) + else if (Dec == 14) Value = "E"; - else - if(Dec == 15) + else if (Dec == 15) Value = "F"; else Value = "" + Dec; return Value; -} +}; /** * Parse a color property into an object with border, background, and @@ -1163,34 +1151,34 @@ 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) { - var rgb = util.HSVToRGB(h,s,v); - return util.RGBToHex(rgb.r,rgb.g,rgb.b); -} +util.HSVToHex = function HSVToHex(h, s, v) { + var rgb = util.HSVToRGB(h, s, v); + return util.RGBToHex(rgb.r, rgb.g, rgb.b); +}; util.hexToHSV = function hexToHSV(hex) { var rgb = util.hexToRGB(hex); - return util.RGBToHSV(rgb.r,rgb.g,rgb.b); -} + return util.RGBToHSV(rgb.r, rgb.g, rgb.b); +}; util.isValidHex = function isValidHex(hex) { - var isOk = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(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 copyObject(objectFrom, objectTo) { for (var i in objectFrom) { if (objectFrom.hasOwnProperty(i)) { if (typeof objectFrom[i] == "object") { objectTo[i] = {}; - util.copyObject(objectFrom[i],objectTo[i]); + util.copyObject(objectFrom[i], objectTo[i]); } else { objectTo[i] = objectFrom[i]; } } } -} +}; /** * DataSet @@ -11473,7 +11461,7 @@ var physicsMixin = { * * @private */ - _toggleBarnesHut : function() { + _toggleBarnesHut: function () { this.constants.physics.barnesHut.enabled = !this.constants.physics.barnesHut.enabled; this._loadSelectedForceSolver(); this.moving = true; @@ -11481,22 +11469,21 @@ var physicsMixin = { }, - /** * This loads the node force solver based on the barnes hut or repulsion algorithm * * @private */ - _loadSelectedForceSolver : function() { + _loadSelectedForceSolver: function () { // this overloads the this._calculateNodeForces if (this.constants.physics.barnesHut.enabled == true) { this._clearMixin(repulsionMixin); this._clearMixin(hierarchalRepulsionMixin); this.constants.physics.centralGravity = this.constants.physics.barnesHut.centralGravity; - this.constants.physics.springLength = this.constants.physics.barnesHut.springLength; + this.constants.physics.springLength = this.constants.physics.barnesHut.springLength; this.constants.physics.springConstant = this.constants.physics.barnesHut.springConstant; - this.constants.physics.damping = this.constants.physics.barnesHut.damping; + this.constants.physics.damping = this.constants.physics.barnesHut.damping; this._loadMixin(barnesHutMixin); } @@ -11505,9 +11492,9 @@ var physicsMixin = { this._clearMixin(repulsionMixin); this.constants.physics.centralGravity = this.constants.physics.hierarchicalRepulsion.centralGravity; - this.constants.physics.springLength = this.constants.physics.hierarchicalRepulsion.springLength; + this.constants.physics.springLength = this.constants.physics.hierarchicalRepulsion.springLength; this.constants.physics.springConstant = this.constants.physics.hierarchicalRepulsion.springConstant; - this.constants.physics.damping = this.constants.physics.hierarchicalRepulsion.damping; + this.constants.physics.damping = this.constants.physics.hierarchicalRepulsion.damping; this._loadMixin(hierarchalRepulsionMixin); } @@ -11517,9 +11504,9 @@ var physicsMixin = { this.barnesHutTree = undefined; this.constants.physics.centralGravity = this.constants.physics.repulsion.centralGravity; - this.constants.physics.springLength = this.constants.physics.repulsion.springLength; + this.constants.physics.springLength = this.constants.physics.repulsion.springLength; this.constants.physics.springConstant = this.constants.physics.repulsion.springConstant; - this.constants.physics.damping = this.constants.physics.repulsion.damping; + this.constants.physics.damping = this.constants.physics.repulsion.damping; this._loadMixin(repulsionMixin); } @@ -11531,10 +11518,10 @@ var physicsMixin = { * * @private */ - _initializeForceCalculation : function() { + _initializeForceCalculation: function () { // stop calculation if there is only one node if (this.nodeIndices.length == 1) { - this.nodes[this.nodeIndices[0]]._setForce(0,0); + this.nodes[this.nodeIndices[0]]._setForce(0, 0); } else { // if there are too many nodes on screen, we cluster without repositioning @@ -11553,7 +11540,7 @@ var physicsMixin = { * Forces are caused by: edges, repulsing forces between nodes, gravity * @private */ - _calculateForces : function() { + _calculateForces: function () { // Gravity is required to keep separated groups from floating off // the forces are reset to zero in this loop by using _setForce instead // of _addForce @@ -11578,7 +11565,7 @@ var physicsMixin = { * * @private */ - _updateCalculationNodes : function() { + _updateCalculationNodes: function () { if (this.constants.smoothCurves == true) { this.calculationNodes = {}; this.calculationNodeIndices = []; @@ -11595,7 +11582,7 @@ var physicsMixin = { this.calculationNodes[supportNodeId] = supportNodes[supportNodeId]; } else { - supportNodes[supportNodeId]._setForce(0,0); + supportNodes[supportNodeId]._setForce(0, 0); } } } @@ -11618,7 +11605,7 @@ var physicsMixin = { * * @private */ - _calculateGravitationalForces : function() { + _calculateGravitationalForces: function () { var dx, dy, distance, node, i; var nodes = this.calculationNodes; var gravity = this.constants.physics.centralGravity; @@ -11631,7 +11618,7 @@ var physicsMixin = { if (this._sector() == "default" && gravity != 0) { dx = -node.x; dy = -node.y; - distance = Math.sqrt(dx*dx + dy*dy); + distance = Math.sqrt(dx * dx + dy * dy); gravityForce = (distance == 0) ? 0 : (gravity / distance); node.fx = dx * gravityForce; @@ -11650,7 +11637,7 @@ var physicsMixin = { * * @private */ - _calculateSpringForces : function() { + _calculateSpringForces: function () { var edgeLength, edge, edgeId; var dx, dy, fx, fy, springForce, length; var edges = this.edges; @@ -11668,7 +11655,7 @@ var physicsMixin = { dx = (edge.from.x - edge.to.x); dy = (edge.from.y - edge.to.y); - length = Math.sqrt(dx * dx + dy * dy); + length = Math.sqrt(dx * dx + dy * dy); if (length == 0) { length = 0.01; @@ -11695,7 +11682,7 @@ var physicsMixin = { * * @private */ - _calculateSpringForcesWithSupport : function() { + _calculateSpringForcesWithSupport: function () { var edgeLength, edge, edgeId, combinedClusterSize; var edges = this.edges; @@ -11717,8 +11704,8 @@ var physicsMixin = { // this implies that the edges between big clusters are longer edgeLength += combinedClusterSize * this.constants.clustering.edgeGrowth; - this._calculateSpringForce(node1,node2,0.5*edgeLength); - this._calculateSpringForce(node2,node3,0.5*edgeLength); + this._calculateSpringForce(node1, node2, 0.5 * edgeLength); + this._calculateSpringForce(node2, node3, 0.5 * edgeLength); } } } @@ -11735,12 +11722,12 @@ var physicsMixin = { * @param edgeLength * @private */ - _calculateSpringForce : function(node1,node2,edgeLength) { + _calculateSpringForce: function (node1, node2, edgeLength) { var dx, dy, fx, fy, springForce, length; dx = (node1.x - node2.x); dy = (node1.y - node2.y); - length = Math.sqrt(dx * dx + dy * dy); + length = Math.sqrt(dx * dx + dy * dy); if (length == 0) { length = 0.01; @@ -11762,137 +11749,137 @@ var physicsMixin = { * Load the HTML for the physics config and bind it * @private */ - _loadPhysicsConfiguration : function() { + _loadPhysicsConfiguration: function () { if (this.physicsConfiguration === undefined) { this.backupConstants = {}; - util.copyObject(this.constants,this.backupConstants); + util.copyObject(this.constants, this.backupConstants); - var hierarchicalLayoutDirections = ["LR","RL","UD","DU"]; + var hierarchicalLayoutDirections = ["LR", "RL", "UD", "DU"]; this.physicsConfiguration = document.createElement('div'); this.physicsConfiguration.className = "PhysicsConfiguration"; this.physicsConfiguration.innerHTML = '' + '' + '' + '' + - ''+ + '' + '' + - ''+ + '' + '
Simulation Mode:
Barnes HutRepulsionRepulsionHierarchical
' + - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + '' + '' + '' + '' + '' + '' + - ''+ + '' + '
Options:
' - this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement); + 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); + this.containerElement.parentElement.insertBefore(this.optionsDiv, this.containerElement); var rangeElement; rangeElement = document.getElementById('graph_BH_gc'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_BH_gc',-1,"physics_barnesHut_gravitationalConstant"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_gc', -1, "physics_barnesHut_gravitationalConstant"); rangeElement = document.getElementById('graph_BH_cg'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_BH_cg',1,"physics_centralGravity"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_cg', 1, "physics_centralGravity"); rangeElement = document.getElementById('graph_BH_sc'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_BH_sc',1,"physics_springConstant"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sc', 1, "physics_springConstant"); rangeElement = document.getElementById('graph_BH_sl'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_BH_sl',1,"physics_springLength"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sl', 1, "physics_springLength"); rangeElement = document.getElementById('graph_BH_damp'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_BH_damp',1,"physics_damping"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_damp', 1, "physics_damping"); rangeElement = document.getElementById('graph_R_nd'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_R_nd',1,"physics_repulsion_nodeDistance"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_nd', 1, "physics_repulsion_nodeDistance"); rangeElement = document.getElementById('graph_R_cg'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_R_cg',1,"physics_centralGravity"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_cg', 1, "physics_centralGravity"); rangeElement = document.getElementById('graph_R_sc'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_R_sc',1,"physics_springConstant"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sc', 1, "physics_springConstant"); rangeElement = document.getElementById('graph_R_sl'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_R_sl',1,"physics_springLength"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sl', 1, "physics_springLength"); rangeElement = document.getElementById('graph_R_damp'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_R_damp',1,"physics_damping"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_damp', 1, "physics_damping"); rangeElement = document.getElementById('graph_H_nd'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_nd',1,"physics_hierarchicalRepulsion_nodeDistance"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); rangeElement = document.getElementById('graph_H_cg'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_cg',1,"physics_centralGravity"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_cg', 1, "physics_centralGravity"); rangeElement = document.getElementById('graph_H_sc'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_sc',1,"physics_springConstant"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sc', 1, "physics_springConstant"); rangeElement = document.getElementById('graph_H_sl'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_sl',1,"physics_springLength"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sl', 1, "physics_springLength"); rangeElement = document.getElementById('graph_H_damp'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_damp',1,"physics_damping"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_damp', 1, "physics_damping"); rangeElement = document.getElementById('graph_H_direction'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_direction',hierarchicalLayoutDirections,"hierarchicalLayout_direction"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_direction', hierarchicalLayoutDirections, "hierarchicalLayout_direction"); rangeElement = document.getElementById('graph_H_levsep'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_levsep',1,"hierarchicalLayout_levelSeparation"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_levsep', 1, "hierarchicalLayout_levelSeparation"); rangeElement = document.getElementById('graph_H_nspac'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_nspac',1,"hierarchicalLayout_nodeSpacing"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nspac', 1, "hierarchicalLayout_nodeSpacing"); var radioButton1 = document.getElementById("graph_physicsMethod1"); var radioButton2 = document.getElementById("graph_physicsMethod2"); @@ -11912,8 +11899,12 @@ var physicsMixin = { graph_toggleSmooth.onclick = graphToggleSmoothCurves.bind(this); graph_repositionNodes.onclick = graphRepositionNodes.bind(this); graph_generateOptions.onclick = graphGenerateOptions.bind(this); - if (this.constants.smoothCurves == true) {graph_toggleSmooth.style.background = "#A4FF56";} - else {graph_toggleSmooth.style.background = "#FF8532";} + if (this.constants.smoothCurves == true) { + graph_toggleSmooth.style.background = "#A4FF56"; + } + else { + graph_toggleSmooth.style.background = "#FF8532"; + } switchConfigurations.apply(this); @@ -11924,7 +11915,7 @@ var physicsMixin = { } }, - _overWriteGraphConstants : function(constantsVariableName, value) { + _overWriteGraphConstants: function (constantsVariableName, value) { var nameArray = constantsVariableName.split("_"); if (nameArray.length == 1) { this.constants[nameArray[0]] = value; @@ -11936,7 +11927,7 @@ var physicsMixin = { this.constants[nameArray[0]][nameArray[1]][nameArray[2]] = value; } } -} +}; function graphToggleSmoothCurves () { this.constants.smoothCurves = !this.constants.smoothCurves; @@ -11965,7 +11956,7 @@ function graphRepositionNodes () { }; function graphGenerateOptions () { - var options = "No options are required, default values used." + var options = "No options are required, default values used."; var optionsSpecific = []; var radioButton1 = document.getElementById("graph_physicsMethod1"); var radioButton2 = document.getElementById("graph_physicsMethod2"); @@ -11976,8 +11967,8 @@ function graphGenerateOptions () { if (this.constants.physics.springConstant != this.backupConstants.physics.barnesHut.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} if (this.constants.physics.damping != this.backupConstants.physics.barnesHut.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} if (optionsSpecific.length != 0) { - options = "var options = {" - options += "physics: {barnesHut: {" + options = "var options = {"; + options += "physics: {barnesHut: {"; for (var i = 0; i < optionsSpecific.length; i++) { options += optionsSpecific[i]; if (i < optionsSpecific.length - 1) { @@ -11996,7 +11987,7 @@ function graphGenerateOptions () { } } else if (radioButton2.checked == true) { - options = "var options = {" + options = "var options = {"; options += "physics: {barnesHut: {enabled: false}"; if (this.constants.physics.repulsion.nodeDistance != this.backupConstants.physics.repulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.repulsion.nodeDistance);} if (this.constants.physics.centralGravity != this.backupConstants.physics.repulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} @@ -12004,7 +11995,7 @@ function graphGenerateOptions () { if (this.constants.physics.springConstant != this.backupConstants.physics.repulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} if (this.constants.physics.damping != this.backupConstants.physics.repulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} if (optionsSpecific.length != 0) { - options += ", repulsion: {" + options += ", repulsion: {"; for (var i = 0; i < optionsSpecific.length; i++) { options += optionsSpecific[i]; if (i < optionsSpecific.length - 1) { @@ -12020,14 +12011,14 @@ function graphGenerateOptions () { options += '};' } else { - options = "var options = {" + options = "var options = {"; if (this.constants.physics.hierarchicalRepulsion.nodeDistance != this.backupConstants.physics.hierarchicalRepulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.hierarchicalRepulsion.nodeDistance);} if (this.constants.physics.centralGravity != this.backupConstants.physics.hierarchicalRepulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} if (this.constants.physics.springLength != this.backupConstants.physics.hierarchicalRepulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} if (this.constants.physics.springConstant != this.backupConstants.physics.hierarchicalRepulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} if (this.constants.physics.damping != this.backupConstants.physics.hierarchicalRepulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} if (optionsSpecific.length != 0) { - options += "physics: {hierarchicalRepulsion: {" + options += "physics: {hierarchicalRepulsion: {"; for (var i = 0; i < optionsSpecific.length; i++) { options += optionsSpecific[i]; if (i < optionsSpecific.length - 1) { @@ -12063,7 +12054,7 @@ function graphGenerateOptions () { function switchConfigurations () { - var ids = ["graph_BH_table","graph_R_table","graph_H_table"] + var ids = ["graph_BH_table", "graph_R_table", "graph_H_table"]; var radioButton = document.querySelector('input[name="graph_physicsMethod"]:checked').value; var tableId = "graph_" + radioButton + "_table"; var table = document.getElementById(tableId); @@ -12136,8 +12127,8 @@ var hierarchalRepulsionMixin = { * This field is linearly approximated. * * @private - */ - _calculateNodeForces : function() { + */ + _calculateNodeForces: function () { var dx, dy, distance, fx, fy, combinedClusterSize, repulsingForce, node1, node2, i, j; @@ -12146,7 +12137,7 @@ var hierarchalRepulsionMixin = { // approximation constants var b = 5; - var a_base = 0.5*-b; + var a_base = 0.5 * -b; // repulsing forces between nodes @@ -12155,10 +12146,10 @@ var hierarchalRepulsionMixin = { // we loop from i over all but the last entree in the array // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j - for (i = 0; i < nodeIndices.length-1; i++) { + for (i = 0; i < nodeIndices.length - 1; i++) { node1 = nodes[nodeIndices[i]]; - for (j = i+1; j < nodeIndices.length; j++) { + for (j = i + 1; j < nodeIndices.length; j++) { node2 = nodes[nodeIndices[j]]; dx = node2.x - node1.x; @@ -12166,7 +12157,7 @@ var hierarchalRepulsionMixin = { distance = Math.sqrt(dx * dx + dy * dy); var a = a_base / minimumDistance; - if (distance < 2*minimumDistance) { + if (distance < 2 * minimumDistance) { repulsingForce = a * distance + b; // linear approx of 1 / (1 + Math.exp((distance / minimumDistance - 1) * steepness)) // normalize force with @@ -12174,7 +12165,7 @@ var hierarchalRepulsionMixin = { distance = 0.01; } else { - repulsingForce = repulsingForce/distance; + repulsingForce = repulsingForce / distance; } fx = dx * repulsingForce; fy = dy * repulsingForce; @@ -12187,7 +12178,7 @@ var hierarchalRepulsionMixin = { } } } -} +}; /** * Created by Alex on 2/10/14. */ @@ -12575,8 +12566,8 @@ var repulsionMixin = { * This field is linearly approximated. * * @private - */ - _calculateNodeForces : function() { + */ + _calculateNodeForces: function () { var dx, dy, angle, distance, fx, fy, combinedClusterSize, repulsingForce, node1, node2, i, j; @@ -12584,8 +12575,8 @@ var repulsionMixin = { var nodeIndices = this.calculationNodeIndices; // approximation constants - var a_base = -2/3; - var b = 4/3; + var a_base = -2 / 3; + var b = 4 / 3; // repulsing forces between nodes var nodeDistance = this.constants.physics.repulsion.nodeDistance; @@ -12593,9 +12584,9 @@ var repulsionMixin = { // we loop from i over all but the last entree in the array // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j - for (i = 0; i < nodeIndices.length-1; i++) { + for (i = 0; i < nodeIndices.length - 1; i++) { node1 = nodes[nodeIndices[i]]; - for (j = i+1; j < nodeIndices.length; j++) { + for (j = i + 1; j < nodeIndices.length; j++) { node2 = nodes[nodeIndices[j]]; combinedClusterSize = node1.clusterSize + node2.clusterSize - 2; @@ -12605,8 +12596,8 @@ var repulsionMixin = { minimumDistance = (combinedClusterSize == 0) ? nodeDistance : (nodeDistance * (1 + combinedClusterSize * this.constants.clustering.distanceAmplification)); var a = a_base / minimumDistance; - if (distance < 2*minimumDistance) { - if (distance < 0.5*minimumDistance) { + if (distance < 2 * minimumDistance) { + if (distance < 0.5 * minimumDistance) { repulsingForce = 1.0; } else { @@ -12615,7 +12606,7 @@ var repulsionMixin = { // amplify the repulsion for clusters. repulsingForce *= (combinedClusterSize == 0) ? 1 : 1 + combinedClusterSize * this.constants.clustering.forceAmplification; - repulsingForce = repulsingForce/distance; + repulsingForce = repulsingForce / distance; fx = dx * repulsingForce; fy = dy * repulsingForce; @@ -12628,7 +12619,7 @@ var repulsionMixin = { } } } -} +}; var HierarchicalLayoutMixin = { @@ -12681,7 +12672,7 @@ var HierarchicalLayoutMixin = { // if the user defined some levels but not all, alert and run without hierarchical layout if (undefinedLevel == true && definedLevel == true) { - alert("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.") + alert("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes."); this.zoomExtent(true,this.constants.clustering.enabled); if (!this.constants.clustering.enabled) { this.start(); @@ -13016,7 +13007,7 @@ var manipulationMixin = { // reset global variables this.blockConnectingEdgeSelection = false; - this.forceAppendSelection = false + this.forceAppendSelection = false; if (this.editMode == true) { while (this.manipulationDiv.hasChildNodes()) { @@ -13039,7 +13030,7 @@ var manipulationMixin = { this.manipulationDiv.innerHTML += "" + "
" + "" + - ""+this.constants.labels['delete'] +""; + ""+this.constants.labels['del'] +""; } @@ -13065,7 +13056,7 @@ var manipulationMixin = { else { this.editModeDiv.innerHTML = "" + "" + - ""+this.constants.labels['edit'] +"" + "" + this.constants.labels['edit'] + ""; var editModeButton = document.getElementById("graph-manipulate-editModeButton"); editModeButton.onclick = this._toggleEditMode.bind(this); } @@ -13209,7 +13200,7 @@ var manipulationMixin = { var connectFromId = this.edges['connectionEdge'].fromId; // remove the temporary nodes and edge - delete this.edges['connectionEdge'] + delete this.edges['connectionEdge']; delete this.sectors['support']['nodes']['targetNode']; delete this.sectors['support']['nodes']['targetViaNode']; @@ -13276,7 +13267,7 @@ var manipulationMixin = { if (this.triggerFunctions.connect.length == 2) { var me = this; this.triggerFunctions.connect(defaultData, function(finalizedData) { - me.edgesData.add(finalizedData) + me.edgesData.add(finalizedData); me.moving = true; me.start(); }); @@ -13288,7 +13279,7 @@ var manipulationMixin = { } } else { - this.edgesData.add(defaultData) + this.edgesData.add(defaultData); this.moving = true; this.start(); } @@ -13345,14 +13336,14 @@ var manipulationMixin = { if (!this._clusterInSelection()) { var selectedNodes = this.getSelectedNodes(); var selectedEdges = this.getSelectedEdges(); - if (this.triggerFunctions.delete) { + if (this.triggerFunctions.del) { var me = this; var data = {nodes: selectedNodes, edges: selectedEdges}; - if (this.triggerFunctions.delete.length = 2) { - this.triggerFunctions.delete(data, function (finalizedData) { + if (this.triggerFunctions.del.length = 2) { + this.triggerFunctions.del(data, function (finalizedData) { me.edgesData.remove(finalizedData.edges); me.nodesData.remove(finalizedData.nodes); - this._unselectAll(); + me._unselectAll(); me.moving = true; me.start(); }); @@ -15859,7 +15850,7 @@ var graphMixinLoaders = { * @param {Object} sourceVariable | this object has to contain functions. * @private */ - _loadMixin : function(sourceVariable) { + _loadMixin: function (sourceVariable) { for (var mixinFunction in sourceVariable) { if (sourceVariable.hasOwnProperty(mixinFunction)) { Graph.prototype[mixinFunction] = sourceVariable[mixinFunction]; @@ -15874,7 +15865,7 @@ var graphMixinLoaders = { * @param {Object} sourceVariable | this object has to contain functions. * @private */ - _clearMixin : function(sourceVariable) { + _clearMixin: function (sourceVariable) { for (var mixinFunction in sourceVariable) { if (sourceVariable.hasOwnProperty(mixinFunction)) { Graph.prototype[mixinFunction] = undefined; @@ -15888,15 +15879,13 @@ var graphMixinLoaders = { * * @private */ - _loadPhysicsSystem : function() { + _loadPhysicsSystem: function () { this._loadMixin(physicsMixin); this._loadSelectedForceSolver(); if (this.constants.configurePhysics == true) { this._loadPhysicsConfiguration(); } - }, - - + }, /** @@ -15904,7 +15893,7 @@ var graphMixinLoaders = { * * @private */ - _loadClusterSystem : function() { + _loadClusterSystem: function () { this.clusterSession = 0; this.hubThreshold = 5; this._loadMixin(ClusterMixin); @@ -15916,26 +15905,26 @@ var graphMixinLoaders = { * * @private */ - _loadSectorSystem : function() { + _loadSectorSystem: function () { this.sectors = { }, - this.activeSector = ["default"]; + this.activeSector = ["default"]; this.sectors["active"] = { }, - this.sectors["active"]["default"] = {"nodes":{}, - "edges":{}, - "nodeIndices":[], - "formationScale": 1.0, - "drawingNode": undefined }; + this.sectors["active"]["default"] = {"nodes": {}, + "edges": {}, + "nodeIndices": [], + "formationScale": 1.0, + "drawingNode": undefined }; this.sectors["frozen"] = {}, - this.sectors["support"] = {"nodes":{}, - "edges":{}, - "nodeIndices":[], - "formationScale": 1.0, - "drawingNode": undefined }; + this.sectors["support"] = {"nodes": {}, + "edges": {}, + "nodeIndices": [], + "formationScale": 1.0, + "drawingNode": undefined }; this.nodeIndices = this.sectors["active"]["default"]["nodeIndices"]; // the node indices list is used to speed up the computation of the repulsion fields this._loadMixin(SectorMixin); - }, + }, /** @@ -15943,11 +15932,11 @@ var graphMixinLoaders = { * * @private */ - _loadSelectionSystem : function() { - this.selectionObj = {nodes:{},edges:{}}; + _loadSelectionSystem: function () { + this.selectionObj = {nodes: {}, edges: {}}; this._loadMixin(SelectionMixin); - }, + }, /** @@ -15955,7 +15944,7 @@ var graphMixinLoaders = { * * @private */ - _loadManipulationSystem : function() { + _loadManipulationSystem: function () { // reset global variables -- these are used by the selection of nodes and edges. this.blockConnectingEdgeSelection = false; this.forceAppendSelection = false @@ -16018,7 +16007,7 @@ var graphMixinLoaders = { this._clearMixin(manipulationMixin); } } - }, + }, /** @@ -16026,7 +16015,7 @@ var graphMixinLoaders = { * * @private */ - _loadNavigationControls : function() { + _loadNavigationControls: function () { this._loadMixin(NavigationMixin); // the clean function removes the button divs, this is done to remove the bindings. @@ -16034,7 +16023,7 @@ var graphMixinLoaders = { if (this.constants.navigation.enabled == true) { this._loadNavigationElements(); } - }, + }, /** @@ -16042,11 +16031,11 @@ var graphMixinLoaders = { * * @private */ - _loadHierarchySystem : function() { + _loadHierarchySystem: function () { this._loadMixin(HierarchicalLayoutMixin); } -} +}; /** * @constructor Graph @@ -16080,7 +16069,7 @@ function Graph (container, data, options) { this.initializing = true; // these functions are triggered when the dataset is edited - this.triggerFunctions = {add:null,edit:null,connect:null,delete:null}; + this.triggerFunctions = {add:null,edit:null,connect:null,del:null}; // set constant values this.constants = { @@ -16207,7 +16196,7 @@ function Graph (container, data, options) { add:"Add Node", edit:"Edit", link:"Add Link", - delete:"Delete selected", + del:"Delete selected", editNode:"Edit Node", back:"Back", addDescription:"Click in an empty space to place a new node.", @@ -16584,7 +16573,7 @@ Graph.prototype.setOptions = function (options) { } if (options.onDelete) { - this.triggerFunctions.delete = options.onDelete; + this.triggerFunctions.del = options.onDelete; } if (options.physics) { @@ -18005,15 +17994,20 @@ Graph.prototype.start = function() { if (this.moving || this.xIncrement != 0 || this.yIncrement != 0 || this.zoomIncrement != 0) { if (!this.timer) { var ua = navigator.userAgent.toLowerCase(); - if (ua.indexOf('safari') != -1) { + + var requiresTimeout = false; + if (ua.indexOf('msie 9.0') != -1) { // IE 9 + requiresTimeout = true; + } + else if (ua.indexOf('safari') != -1) { // safari if (ua.indexOf('chrome') <= -1) { - // safari - this.timer = window.setTimeout(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function - } - else { - this.timer = window.requestAnimationFrame(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function + requiresTimeout = true; } } + + if (requiresTimeout == true) { + this.timer = window.setTimeout(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function + } else{ this.timer = window.requestAnimationFrame(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function } diff --git a/docs/graph.html b/docs/graph.html index b62e9f17..bac86e1b 100644 --- a/docs/graph.html +++ b/docs/graph.html @@ -1857,7 +1857,7 @@ var options: { add:"Add Node", edit:"Edit", link:"Add Link", - delete:"Delete selected", + del:"Delete selected", editNode:"Edit Node", back:"Back", addDescription:"Click in an empty space to place a new node.", diff --git a/src/graph/Graph.js b/src/graph/Graph.js index dd85955b..8dd9db68 100644 --- a/src/graph/Graph.js +++ b/src/graph/Graph.js @@ -30,7 +30,7 @@ function Graph (container, data, options) { this.initializing = true; // these functions are triggered when the dataset is edited - this.triggerFunctions = {add:null,edit:null,connect:null,delete:null}; + this.triggerFunctions = {add:null,edit:null,connect:null,del:null}; // set constant values this.constants = { @@ -157,7 +157,7 @@ function Graph (container, data, options) { add:"Add Node", edit:"Edit", link:"Add Link", - delete:"Delete selected", + del:"Delete selected", editNode:"Edit Node", back:"Back", addDescription:"Click in an empty space to place a new node.", @@ -534,7 +534,7 @@ Graph.prototype.setOptions = function (options) { } if (options.onDelete) { - this.triggerFunctions.delete = options.onDelete; + this.triggerFunctions.del = options.onDelete; } if (options.physics) { @@ -1955,15 +1955,20 @@ Graph.prototype.start = function() { if (this.moving || this.xIncrement != 0 || this.yIncrement != 0 || this.zoomIncrement != 0) { if (!this.timer) { var ua = navigator.userAgent.toLowerCase(); - if (ua.indexOf('safari') != -1) { + + var requiresTimeout = false; + if (ua.indexOf('msie 9.0') != -1) { // IE 9 + requiresTimeout = true; + } + else if (ua.indexOf('safari') != -1) { // safari if (ua.indexOf('chrome') <= -1) { - // safari - this.timer = window.setTimeout(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function - } - else { - this.timer = window.requestAnimationFrame(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function + requiresTimeout = true; } } + + if (requiresTimeout == true) { + this.timer = window.setTimeout(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function + } else{ this.timer = window.requestAnimationFrame(this._animationStep.bind(this), this.renderTimestep); // wait this.renderTimeStep milliseconds and perform the animation step function } diff --git a/src/graph/graphMixins/HierarchicalLayoutMixin.js b/src/graph/graphMixins/HierarchicalLayoutMixin.js index ca18927f..560978fc 100644 --- a/src/graph/graphMixins/HierarchicalLayoutMixin.js +++ b/src/graph/graphMixins/HierarchicalLayoutMixin.js @@ -50,7 +50,7 @@ var HierarchicalLayoutMixin = { // if the user defined some levels but not all, alert and run without hierarchical layout if (undefinedLevel == true && definedLevel == true) { - alert("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.") + alert("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes."); this.zoomExtent(true,this.constants.clustering.enabled); if (!this.constants.clustering.enabled) { this.start(); diff --git a/src/graph/graphMixins/ManipulationMixin.js b/src/graph/graphMixins/ManipulationMixin.js index 7e96ad2f..09147d7a 100644 --- a/src/graph/graphMixins/ManipulationMixin.js +++ b/src/graph/graphMixins/ManipulationMixin.js @@ -74,7 +74,7 @@ var manipulationMixin = { // reset global variables this.blockConnectingEdgeSelection = false; - this.forceAppendSelection = false + this.forceAppendSelection = false; if (this.editMode == true) { while (this.manipulationDiv.hasChildNodes()) { @@ -97,7 +97,7 @@ var manipulationMixin = { this.manipulationDiv.innerHTML += "" + "
" + "" + - ""+this.constants.labels['delete'] +""; + ""+this.constants.labels['del'] +""; } @@ -123,7 +123,7 @@ var manipulationMixin = { else { this.editModeDiv.innerHTML = "" + "" + - ""+this.constants.labels['edit'] +"" + "" + this.constants.labels['edit'] + ""; var editModeButton = document.getElementById("graph-manipulate-editModeButton"); editModeButton.onclick = this._toggleEditMode.bind(this); } @@ -267,7 +267,7 @@ var manipulationMixin = { var connectFromId = this.edges['connectionEdge'].fromId; // remove the temporary nodes and edge - delete this.edges['connectionEdge'] + delete this.edges['connectionEdge']; delete this.sectors['support']['nodes']['targetNode']; delete this.sectors['support']['nodes']['targetViaNode']; @@ -334,7 +334,7 @@ var manipulationMixin = { if (this.triggerFunctions.connect.length == 2) { var me = this; this.triggerFunctions.connect(defaultData, function(finalizedData) { - me.edgesData.add(finalizedData) + me.edgesData.add(finalizedData); me.moving = true; me.start(); }); @@ -346,7 +346,7 @@ var manipulationMixin = { } } else { - this.edgesData.add(defaultData) + this.edgesData.add(defaultData); this.moving = true; this.start(); } @@ -403,14 +403,14 @@ var manipulationMixin = { if (!this._clusterInSelection()) { var selectedNodes = this.getSelectedNodes(); var selectedEdges = this.getSelectedEdges(); - if (this.triggerFunctions.delete) { + if (this.triggerFunctions.del) { var me = this; var data = {nodes: selectedNodes, edges: selectedEdges}; - if (this.triggerFunctions.delete.length = 2) { - this.triggerFunctions.delete(data, function (finalizedData) { + if (this.triggerFunctions.del.length = 2) { + this.triggerFunctions.del(data, function (finalizedData) { me.edgesData.remove(finalizedData.edges); me.nodesData.remove(finalizedData.nodes); - this._unselectAll(); + me._unselectAll(); me.moving = true; me.start(); }); diff --git a/src/graph/graphMixins/MixinLoader.js b/src/graph/graphMixins/MixinLoader.js index c4000fdb..23f7dc07 100644 --- a/src/graph/graphMixins/MixinLoader.js +++ b/src/graph/graphMixins/MixinLoader.js @@ -11,7 +11,7 @@ var graphMixinLoaders = { * @param {Object} sourceVariable | this object has to contain functions. * @private */ - _loadMixin : function(sourceVariable) { + _loadMixin: function (sourceVariable) { for (var mixinFunction in sourceVariable) { if (sourceVariable.hasOwnProperty(mixinFunction)) { Graph.prototype[mixinFunction] = sourceVariable[mixinFunction]; @@ -26,7 +26,7 @@ var graphMixinLoaders = { * @param {Object} sourceVariable | this object has to contain functions. * @private */ - _clearMixin : function(sourceVariable) { + _clearMixin: function (sourceVariable) { for (var mixinFunction in sourceVariable) { if (sourceVariable.hasOwnProperty(mixinFunction)) { Graph.prototype[mixinFunction] = undefined; @@ -40,15 +40,13 @@ var graphMixinLoaders = { * * @private */ - _loadPhysicsSystem : function() { + _loadPhysicsSystem: function () { this._loadMixin(physicsMixin); this._loadSelectedForceSolver(); if (this.constants.configurePhysics == true) { this._loadPhysicsConfiguration(); } - }, - - + }, /** @@ -56,7 +54,7 @@ var graphMixinLoaders = { * * @private */ - _loadClusterSystem : function() { + _loadClusterSystem: function () { this.clusterSession = 0; this.hubThreshold = 5; this._loadMixin(ClusterMixin); @@ -68,26 +66,26 @@ var graphMixinLoaders = { * * @private */ - _loadSectorSystem : function() { + _loadSectorSystem: function () { this.sectors = { }, - this.activeSector = ["default"]; + this.activeSector = ["default"]; this.sectors["active"] = { }, - this.sectors["active"]["default"] = {"nodes":{}, - "edges":{}, - "nodeIndices":[], - "formationScale": 1.0, - "drawingNode": undefined }; + this.sectors["active"]["default"] = {"nodes": {}, + "edges": {}, + "nodeIndices": [], + "formationScale": 1.0, + "drawingNode": undefined }; this.sectors["frozen"] = {}, - this.sectors["support"] = {"nodes":{}, - "edges":{}, - "nodeIndices":[], - "formationScale": 1.0, - "drawingNode": undefined }; + this.sectors["support"] = {"nodes": {}, + "edges": {}, + "nodeIndices": [], + "formationScale": 1.0, + "drawingNode": undefined }; this.nodeIndices = this.sectors["active"]["default"]["nodeIndices"]; // the node indices list is used to speed up the computation of the repulsion fields this._loadMixin(SectorMixin); - }, + }, /** @@ -95,11 +93,11 @@ var graphMixinLoaders = { * * @private */ - _loadSelectionSystem : function() { - this.selectionObj = {nodes:{},edges:{}}; + _loadSelectionSystem: function () { + this.selectionObj = {nodes: {}, edges: {}}; this._loadMixin(SelectionMixin); - }, + }, /** @@ -107,7 +105,7 @@ var graphMixinLoaders = { * * @private */ - _loadManipulationSystem : function() { + _loadManipulationSystem: function () { // reset global variables -- these are used by the selection of nodes and edges. this.blockConnectingEdgeSelection = false; this.forceAppendSelection = false @@ -170,7 +168,7 @@ var graphMixinLoaders = { this._clearMixin(manipulationMixin); } } - }, + }, /** @@ -178,7 +176,7 @@ var graphMixinLoaders = { * * @private */ - _loadNavigationControls : function() { + _loadNavigationControls: function () { this._loadMixin(NavigationMixin); // the clean function removes the button divs, this is done to remove the bindings. @@ -186,7 +184,7 @@ var graphMixinLoaders = { if (this.constants.navigation.enabled == true) { this._loadNavigationElements(); } - }, + }, /** @@ -194,8 +192,8 @@ var graphMixinLoaders = { * * @private */ - _loadHierarchySystem : function() { + _loadHierarchySystem: function () { this._loadMixin(HierarchicalLayoutMixin); } -} +}; diff --git a/src/graph/graphMixins/physics/HierarchialRepulsion.js b/src/graph/graphMixins/physics/HierarchialRepulsion.js index 37037fcf..8ccb40b8 100644 --- a/src/graph/graphMixins/physics/HierarchialRepulsion.js +++ b/src/graph/graphMixins/physics/HierarchialRepulsion.js @@ -10,8 +10,8 @@ var hierarchalRepulsionMixin = { * This field is linearly approximated. * * @private - */ - _calculateNodeForces : function() { + */ + _calculateNodeForces: function () { var dx, dy, distance, fx, fy, combinedClusterSize, repulsingForce, node1, node2, i, j; @@ -20,7 +20,7 @@ var hierarchalRepulsionMixin = { // approximation constants var b = 5; - var a_base = 0.5*-b; + var a_base = 0.5 * -b; // repulsing forces between nodes @@ -29,10 +29,10 @@ var hierarchalRepulsionMixin = { // we loop from i over all but the last entree in the array // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j - for (i = 0; i < nodeIndices.length-1; i++) { + for (i = 0; i < nodeIndices.length - 1; i++) { node1 = nodes[nodeIndices[i]]; - for (j = i+1; j < nodeIndices.length; j++) { + for (j = i + 1; j < nodeIndices.length; j++) { node2 = nodes[nodeIndices[j]]; dx = node2.x - node1.x; @@ -40,7 +40,7 @@ var hierarchalRepulsionMixin = { distance = Math.sqrt(dx * dx + dy * dy); var a = a_base / minimumDistance; - if (distance < 2*minimumDistance) { + if (distance < 2 * minimumDistance) { repulsingForce = a * distance + b; // linear approx of 1 / (1 + Math.exp((distance / minimumDistance - 1) * steepness)) // normalize force with @@ -48,7 +48,7 @@ var hierarchalRepulsionMixin = { distance = 0.01; } else { - repulsingForce = repulsingForce/distance; + repulsingForce = repulsingForce / distance; } fx = dx * repulsingForce; fy = dy * repulsingForce; @@ -61,4 +61,4 @@ var hierarchalRepulsionMixin = { } } } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/graph/graphMixins/physics/PhysicsMixin.js b/src/graph/graphMixins/physics/PhysicsMixin.js index da319f8a..946307b5 100644 --- a/src/graph/graphMixins/physics/PhysicsMixin.js +++ b/src/graph/graphMixins/physics/PhysicsMixin.js @@ -10,7 +10,7 @@ var physicsMixin = { * * @private */ - _toggleBarnesHut : function() { + _toggleBarnesHut: function () { this.constants.physics.barnesHut.enabled = !this.constants.physics.barnesHut.enabled; this._loadSelectedForceSolver(); this.moving = true; @@ -18,22 +18,21 @@ var physicsMixin = { }, - /** * This loads the node force solver based on the barnes hut or repulsion algorithm * * @private */ - _loadSelectedForceSolver : function() { + _loadSelectedForceSolver: function () { // this overloads the this._calculateNodeForces if (this.constants.physics.barnesHut.enabled == true) { this._clearMixin(repulsionMixin); this._clearMixin(hierarchalRepulsionMixin); this.constants.physics.centralGravity = this.constants.physics.barnesHut.centralGravity; - this.constants.physics.springLength = this.constants.physics.barnesHut.springLength; + this.constants.physics.springLength = this.constants.physics.barnesHut.springLength; this.constants.physics.springConstant = this.constants.physics.barnesHut.springConstant; - this.constants.physics.damping = this.constants.physics.barnesHut.damping; + this.constants.physics.damping = this.constants.physics.barnesHut.damping; this._loadMixin(barnesHutMixin); } @@ -42,9 +41,9 @@ var physicsMixin = { this._clearMixin(repulsionMixin); this.constants.physics.centralGravity = this.constants.physics.hierarchicalRepulsion.centralGravity; - this.constants.physics.springLength = this.constants.physics.hierarchicalRepulsion.springLength; + this.constants.physics.springLength = this.constants.physics.hierarchicalRepulsion.springLength; this.constants.physics.springConstant = this.constants.physics.hierarchicalRepulsion.springConstant; - this.constants.physics.damping = this.constants.physics.hierarchicalRepulsion.damping; + this.constants.physics.damping = this.constants.physics.hierarchicalRepulsion.damping; this._loadMixin(hierarchalRepulsionMixin); } @@ -54,9 +53,9 @@ var physicsMixin = { this.barnesHutTree = undefined; this.constants.physics.centralGravity = this.constants.physics.repulsion.centralGravity; - this.constants.physics.springLength = this.constants.physics.repulsion.springLength; + this.constants.physics.springLength = this.constants.physics.repulsion.springLength; this.constants.physics.springConstant = this.constants.physics.repulsion.springConstant; - this.constants.physics.damping = this.constants.physics.repulsion.damping; + this.constants.physics.damping = this.constants.physics.repulsion.damping; this._loadMixin(repulsionMixin); } @@ -68,10 +67,10 @@ var physicsMixin = { * * @private */ - _initializeForceCalculation : function() { + _initializeForceCalculation: function () { // stop calculation if there is only one node if (this.nodeIndices.length == 1) { - this.nodes[this.nodeIndices[0]]._setForce(0,0); + this.nodes[this.nodeIndices[0]]._setForce(0, 0); } else { // if there are too many nodes on screen, we cluster without repositioning @@ -90,7 +89,7 @@ var physicsMixin = { * Forces are caused by: edges, repulsing forces between nodes, gravity * @private */ - _calculateForces : function() { + _calculateForces: function () { // Gravity is required to keep separated groups from floating off // the forces are reset to zero in this loop by using _setForce instead // of _addForce @@ -115,7 +114,7 @@ var physicsMixin = { * * @private */ - _updateCalculationNodes : function() { + _updateCalculationNodes: function () { if (this.constants.smoothCurves == true) { this.calculationNodes = {}; this.calculationNodeIndices = []; @@ -132,7 +131,7 @@ var physicsMixin = { this.calculationNodes[supportNodeId] = supportNodes[supportNodeId]; } else { - supportNodes[supportNodeId]._setForce(0,0); + supportNodes[supportNodeId]._setForce(0, 0); } } } @@ -155,7 +154,7 @@ var physicsMixin = { * * @private */ - _calculateGravitationalForces : function() { + _calculateGravitationalForces: function () { var dx, dy, distance, node, i; var nodes = this.calculationNodes; var gravity = this.constants.physics.centralGravity; @@ -168,7 +167,7 @@ var physicsMixin = { if (this._sector() == "default" && gravity != 0) { dx = -node.x; dy = -node.y; - distance = Math.sqrt(dx*dx + dy*dy); + distance = Math.sqrt(dx * dx + dy * dy); gravityForce = (distance == 0) ? 0 : (gravity / distance); node.fx = dx * gravityForce; @@ -187,7 +186,7 @@ var physicsMixin = { * * @private */ - _calculateSpringForces : function() { + _calculateSpringForces: function () { var edgeLength, edge, edgeId; var dx, dy, fx, fy, springForce, length; var edges = this.edges; @@ -205,7 +204,7 @@ var physicsMixin = { dx = (edge.from.x - edge.to.x); dy = (edge.from.y - edge.to.y); - length = Math.sqrt(dx * dx + dy * dy); + length = Math.sqrt(dx * dx + dy * dy); if (length == 0) { length = 0.01; @@ -232,7 +231,7 @@ var physicsMixin = { * * @private */ - _calculateSpringForcesWithSupport : function() { + _calculateSpringForcesWithSupport: function () { var edgeLength, edge, edgeId, combinedClusterSize; var edges = this.edges; @@ -254,8 +253,8 @@ var physicsMixin = { // this implies that the edges between big clusters are longer edgeLength += combinedClusterSize * this.constants.clustering.edgeGrowth; - this._calculateSpringForce(node1,node2,0.5*edgeLength); - this._calculateSpringForce(node2,node3,0.5*edgeLength); + this._calculateSpringForce(node1, node2, 0.5 * edgeLength); + this._calculateSpringForce(node2, node3, 0.5 * edgeLength); } } } @@ -272,12 +271,12 @@ var physicsMixin = { * @param edgeLength * @private */ - _calculateSpringForce : function(node1,node2,edgeLength) { + _calculateSpringForce: function (node1, node2, edgeLength) { var dx, dy, fx, fy, springForce, length; dx = (node1.x - node2.x); dy = (node1.y - node2.y); - length = Math.sqrt(dx * dx + dy * dy); + length = Math.sqrt(dx * dx + dy * dy); if (length == 0) { length = 0.01; @@ -299,137 +298,137 @@ var physicsMixin = { * Load the HTML for the physics config and bind it * @private */ - _loadPhysicsConfiguration : function() { + _loadPhysicsConfiguration: function () { if (this.physicsConfiguration === undefined) { this.backupConstants = {}; - util.copyObject(this.constants,this.backupConstants); + util.copyObject(this.constants, this.backupConstants); - var hierarchicalLayoutDirections = ["LR","RL","UD","DU"]; + var hierarchicalLayoutDirections = ["LR", "RL", "UD", "DU"]; this.physicsConfiguration = document.createElement('div'); this.physicsConfiguration.className = "PhysicsConfiguration"; this.physicsConfiguration.innerHTML = '' + '' + '' + '' + - ''+ + '' + '' + - ''+ + '' + + '
Simulation Mode:
Barnes HutRepulsionRepulsionHierarchical
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + '' + - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + '' + '' + '' + '' + '' + '' + - ''+ + '' + '
Options:
' - this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement); + 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); + this.containerElement.parentElement.insertBefore(this.optionsDiv, this.containerElement); var rangeElement; rangeElement = document.getElementById('graph_BH_gc'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_BH_gc',-1,"physics_barnesHut_gravitationalConstant"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_gc', -1, "physics_barnesHut_gravitationalConstant"); rangeElement = document.getElementById('graph_BH_cg'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_BH_cg',1,"physics_centralGravity"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_cg', 1, "physics_centralGravity"); rangeElement = document.getElementById('graph_BH_sc'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_BH_sc',1,"physics_springConstant"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sc', 1, "physics_springConstant"); rangeElement = document.getElementById('graph_BH_sl'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_BH_sl',1,"physics_springLength"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sl', 1, "physics_springLength"); rangeElement = document.getElementById('graph_BH_damp'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_BH_damp',1,"physics_damping"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_damp', 1, "physics_damping"); rangeElement = document.getElementById('graph_R_nd'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_R_nd',1,"physics_repulsion_nodeDistance"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_nd', 1, "physics_repulsion_nodeDistance"); rangeElement = document.getElementById('graph_R_cg'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_R_cg',1,"physics_centralGravity"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_cg', 1, "physics_centralGravity"); rangeElement = document.getElementById('graph_R_sc'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_R_sc',1,"physics_springConstant"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sc', 1, "physics_springConstant"); rangeElement = document.getElementById('graph_R_sl'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_R_sl',1,"physics_springLength"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sl', 1, "physics_springLength"); rangeElement = document.getElementById('graph_R_damp'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_R_damp',1,"physics_damping"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_damp', 1, "physics_damping"); rangeElement = document.getElementById('graph_H_nd'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_nd',1,"physics_hierarchicalRepulsion_nodeDistance"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance"); rangeElement = document.getElementById('graph_H_cg'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_cg',1,"physics_centralGravity"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_cg', 1, "physics_centralGravity"); rangeElement = document.getElementById('graph_H_sc'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_sc',1,"physics_springConstant"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sc', 1, "physics_springConstant"); rangeElement = document.getElementById('graph_H_sl'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_sl',1,"physics_springLength"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sl', 1, "physics_springLength"); rangeElement = document.getElementById('graph_H_damp'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_damp',1,"physics_damping"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_damp', 1, "physics_damping"); rangeElement = document.getElementById('graph_H_direction'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_direction',hierarchicalLayoutDirections,"hierarchicalLayout_direction"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_direction', hierarchicalLayoutDirections, "hierarchicalLayout_direction"); rangeElement = document.getElementById('graph_H_levsep'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_levsep',1,"hierarchicalLayout_levelSeparation"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_levsep', 1, "hierarchicalLayout_levelSeparation"); rangeElement = document.getElementById('graph_H_nspac'); - rangeElement.onchange = showValueOfRange.bind(this,'graph_H_nspac',1,"hierarchicalLayout_nodeSpacing"); + rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nspac', 1, "hierarchicalLayout_nodeSpacing"); var radioButton1 = document.getElementById("graph_physicsMethod1"); var radioButton2 = document.getElementById("graph_physicsMethod2"); @@ -449,8 +448,12 @@ var physicsMixin = { graph_toggleSmooth.onclick = graphToggleSmoothCurves.bind(this); graph_repositionNodes.onclick = graphRepositionNodes.bind(this); graph_generateOptions.onclick = graphGenerateOptions.bind(this); - if (this.constants.smoothCurves == true) {graph_toggleSmooth.style.background = "#A4FF56";} - else {graph_toggleSmooth.style.background = "#FF8532";} + if (this.constants.smoothCurves == true) { + graph_toggleSmooth.style.background = "#A4FF56"; + } + else { + graph_toggleSmooth.style.background = "#FF8532"; + } switchConfigurations.apply(this); @@ -461,7 +464,7 @@ var physicsMixin = { } }, - _overWriteGraphConstants : function(constantsVariableName, value) { + _overWriteGraphConstants: function (constantsVariableName, value) { var nameArray = constantsVariableName.split("_"); if (nameArray.length == 1) { this.constants[nameArray[0]] = value; @@ -473,7 +476,7 @@ var physicsMixin = { this.constants[nameArray[0]][nameArray[1]][nameArray[2]] = value; } } -} +}; function graphToggleSmoothCurves () { this.constants.smoothCurves = !this.constants.smoothCurves; @@ -502,7 +505,7 @@ function graphRepositionNodes () { }; function graphGenerateOptions () { - var options = "No options are required, default values used." + var options = "No options are required, default values used."; var optionsSpecific = []; var radioButton1 = document.getElementById("graph_physicsMethod1"); var radioButton2 = document.getElementById("graph_physicsMethod2"); @@ -513,8 +516,8 @@ function graphGenerateOptions () { if (this.constants.physics.springConstant != this.backupConstants.physics.barnesHut.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} if (this.constants.physics.damping != this.backupConstants.physics.barnesHut.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} if (optionsSpecific.length != 0) { - options = "var options = {" - options += "physics: {barnesHut: {" + options = "var options = {"; + options += "physics: {barnesHut: {"; for (var i = 0; i < optionsSpecific.length; i++) { options += optionsSpecific[i]; if (i < optionsSpecific.length - 1) { @@ -533,7 +536,7 @@ function graphGenerateOptions () { } } else if (radioButton2.checked == true) { - options = "var options = {" + options = "var options = {"; options += "physics: {barnesHut: {enabled: false}"; if (this.constants.physics.repulsion.nodeDistance != this.backupConstants.physics.repulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.repulsion.nodeDistance);} if (this.constants.physics.centralGravity != this.backupConstants.physics.repulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} @@ -541,7 +544,7 @@ function graphGenerateOptions () { if (this.constants.physics.springConstant != this.backupConstants.physics.repulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} if (this.constants.physics.damping != this.backupConstants.physics.repulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} if (optionsSpecific.length != 0) { - options += ", repulsion: {" + options += ", repulsion: {"; for (var i = 0; i < optionsSpecific.length; i++) { options += optionsSpecific[i]; if (i < optionsSpecific.length - 1) { @@ -557,14 +560,14 @@ function graphGenerateOptions () { options += '};' } else { - options = "var options = {" + options = "var options = {"; if (this.constants.physics.hierarchicalRepulsion.nodeDistance != this.backupConstants.physics.hierarchicalRepulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.hierarchicalRepulsion.nodeDistance);} if (this.constants.physics.centralGravity != this.backupConstants.physics.hierarchicalRepulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);} if (this.constants.physics.springLength != this.backupConstants.physics.hierarchicalRepulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);} if (this.constants.physics.springConstant != this.backupConstants.physics.hierarchicalRepulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);} if (this.constants.physics.damping != this.backupConstants.physics.hierarchicalRepulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);} if (optionsSpecific.length != 0) { - options += "physics: {hierarchicalRepulsion: {" + options += "physics: {hierarchicalRepulsion: {"; for (var i = 0; i < optionsSpecific.length; i++) { options += optionsSpecific[i]; if (i < optionsSpecific.length - 1) { @@ -600,7 +603,7 @@ function graphGenerateOptions () { function switchConfigurations () { - var ids = ["graph_BH_table","graph_R_table","graph_H_table"] + var ids = ["graph_BH_table", "graph_R_table", "graph_H_table"]; var radioButton = document.querySelector('input[name="graph_physicsMethod"]:checked').value; var tableId = "graph_" + radioButton + "_table"; var table = document.getElementById(tableId); diff --git a/src/graph/graphMixins/physics/Repulsion.js b/src/graph/graphMixins/physics/Repulsion.js index dccfb9c4..71a9994b 100644 --- a/src/graph/graphMixins/physics/Repulsion.js +++ b/src/graph/graphMixins/physics/Repulsion.js @@ -10,8 +10,8 @@ var repulsionMixin = { * This field is linearly approximated. * * @private - */ - _calculateNodeForces : function() { + */ + _calculateNodeForces: function () { var dx, dy, angle, distance, fx, fy, combinedClusterSize, repulsingForce, node1, node2, i, j; @@ -19,8 +19,8 @@ var repulsionMixin = { var nodeIndices = this.calculationNodeIndices; // approximation constants - var a_base = -2/3; - var b = 4/3; + var a_base = -2 / 3; + var b = 4 / 3; // repulsing forces between nodes var nodeDistance = this.constants.physics.repulsion.nodeDistance; @@ -28,9 +28,9 @@ var repulsionMixin = { // we loop from i over all but the last entree in the array // j loops from i+1 to the last. This way we do not double count any of the indices, nor i == j - for (i = 0; i < nodeIndices.length-1; i++) { + for (i = 0; i < nodeIndices.length - 1; i++) { node1 = nodes[nodeIndices[i]]; - for (j = i+1; j < nodeIndices.length; j++) { + for (j = i + 1; j < nodeIndices.length; j++) { node2 = nodes[nodeIndices[j]]; combinedClusterSize = node1.clusterSize + node2.clusterSize - 2; @@ -40,8 +40,8 @@ var repulsionMixin = { minimumDistance = (combinedClusterSize == 0) ? nodeDistance : (nodeDistance * (1 + combinedClusterSize * this.constants.clustering.distanceAmplification)); var a = a_base / minimumDistance; - if (distance < 2*minimumDistance) { - if (distance < 0.5*minimumDistance) { + if (distance < 2 * minimumDistance) { + if (distance < 0.5 * minimumDistance) { repulsingForce = 1.0; } else { @@ -50,7 +50,7 @@ var repulsionMixin = { // amplify the repulsion for clusters. repulsingForce *= (combinedClusterSize == 0) ? 1 : 1 + combinedClusterSize * this.constants.clustering.forceAmplification; - repulsingForce = repulsingForce/distance; + repulsingForce = repulsingForce / distance; fx = dx * repulsingForce; fy = dy * repulsingForce; @@ -63,4 +63,4 @@ var repulsionMixin = { } } } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/util.js b/src/util.js index 67657be8..11fad5cf 100644 --- a/src/util.js +++ b/src/util.js @@ -654,53 +654,41 @@ util.option.asElement = function (value, defaultValue) { -util.GiveDec = function GiveDec(Hex) -{ - if(Hex == "A") +util.GiveDec = function GiveDec(Hex) { + if (Hex == "A") Value = 10; - else - if(Hex == "B") + else if (Hex == "B") Value = 11; - else - if(Hex == "C") + else if (Hex == "C") Value = 12; - else - if(Hex == "D") + else if (Hex == "D") Value = 13; - else - if(Hex == "E") + else if (Hex == "E") Value = 14; - else - if(Hex == "F") + else if (Hex == "F") Value = 15; else Value = eval(Hex) return Value; -} +}; -util.GiveHex = function GiveHex(Dec) -{ - if(Dec == 10) +util.GiveHex = function GiveHex(Dec) { + if (Dec == 10) Value = "A"; - else - if(Dec == 11) + else if (Dec == 11) Value = "B"; - else - if(Dec == 12) + else if (Dec == 12) Value = "C"; - else - if(Dec == 13) + else if (Dec == 13) Value = "D"; - else - if(Dec == 14) + else if (Dec == 14) Value = "E"; - else - if(Dec == 15) + else if (Dec == 15) Value = "F"; else Value = "" + Dec; return Value; -} +}; /** * Parse a color property into an object with border, background, and @@ -853,31 +841,31 @@ 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) { - var rgb = util.HSVToRGB(h,s,v); - return util.RGBToHex(rgb.r,rgb.g,rgb.b); -} +util.HSVToHex = function HSVToHex(h, s, v) { + var rgb = util.HSVToRGB(h, s, v); + return util.RGBToHex(rgb.r, rgb.g, rgb.b); +}; util.hexToHSV = function hexToHSV(hex) { var rgb = util.hexToRGB(hex); - return util.RGBToHSV(rgb.r,rgb.g,rgb.b); -} + return util.RGBToHSV(rgb.r, rgb.g, rgb.b); +}; util.isValidHex = function isValidHex(hex) { - var isOk = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(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 copyObject(objectFrom, objectTo) { for (var i in objectFrom) { if (objectFrom.hasOwnProperty(i)) { if (typeof objectFrom[i] == "object") { objectTo[i] = {}; - util.copyObject(objectFrom[i],objectTo[i]); + util.copyObject(objectFrom[i], objectTo[i]); } else { objectTo[i] = objectFrom[i]; } } } -} +};