Spaces:
Running
Running
/* sigmajs.org - an open-source light-weight JavaScript graph drawing library - Facenuke - Author: Alexis Jacomy - License: MIT */ | |
var sigma = { | |
tools: {}, | |
classes: {}, | |
instances: {} | |
}; | |
(function () { | |
Array.prototype.some || (Array.prototype.some = function (g, n) { | |
var i = this.length; | |
if ("function" != typeof g) throw new TypeError; | |
for (var k = 0; k < i; k++) if (k in this && g.call(n, this[k], k, this)) return !0; | |
return !1 | |
}); | |
Array.prototype.forEach || (Array.prototype.forEach = function (g, n) { | |
var i = this.length; | |
if (typeof g != "function") throw new TypeError; | |
for (var k = 0; k < i; k++) k in this && g.call(n, this[k], k, this) | |
}); | |
Array.prototype.map || (Array.prototype.map = function (g, n) { | |
var i = this.length; | |
if (typeof g != "function") throw new TypeError; | |
for (var k = Array(i), o = 0; o < i; o++) o in this && (k[o] = g.call(n, this[o], o, this)); | |
return k | |
}); | |
Array.prototype.filter || (Array.prototype.filter = function (g, n) { | |
var i = this.length; | |
if (typeof g != "function") throw new TypeError; | |
for (var k = [], o = 0; o < i; o++) if (o in this) { | |
var t = this[o]; | |
g.call(n, t, o, this) && k.push(t) | |
} | |
return k | |
}); | |
Array.prototype.indexOf || (Array.prototype.indexOf = function (g) { | |
for (var n = 0; n < this.length; n++) if (this[n] === g) return n; | |
return -1 | |
}); | |
Object.keys || (Object.keys = function () { | |
var g = Object.prototype.hasOwnProperty, | |
n = !{ | |
toString: null | |
}.propertyIsEnumerable("toString"), | |
i = ["toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "constructor"], | |
k = i.length; | |
return function (o) { | |
if (typeof o !== "object" && typeof o !== "function" || o === null) throw new TypeError("Object.keys called on non-object"); | |
var t = [], | |
s; | |
for (s in o) g.call(o, s) && t.push(s); | |
if (n) for (s = 0; s < k; s++) g.call(o, i[s]) && t.push(i[s]); | |
return t | |
} | |
}()) | |
})(); | |
sigma.classes.Cascade = function () { | |
this.p = {}; | |
this.config = function (g, n) { | |
if ("string" == typeof g && void 0 == n) return this.p[g]; | |
var i = "object" == typeof g && void 0 == n ? g : {}; | |
"string" == typeof g && (i[g] = n); | |
for (var k in i) void 0 != this.p[k] && (this.p[k] = i[k]); | |
return this | |
} | |
}; | |
sigma.classes.EventDispatcher = function () { | |
var g = {}, | |
n = this; | |
this.one = function (i, k) { | |
if (!k || !i) return n; | |
("string" == typeof i ? i.split(" ") : i).forEach(function (i) { | |
g[i] || (g[i] = []); | |
g[i].push({ | |
h: k, | |
one: !0 | |
}) | |
}); | |
return n | |
}; | |
this.bind = function (i, k) { | |
if (!k || !i) return n; | |
("string" == typeof i ? i.split(" ") : i).forEach(function (i) { | |
g[i] || (g[i] = []); | |
g[i].push({ | |
h: k, | |
one: !1 | |
}) | |
}); | |
return n | |
}; | |
this.unbind = function (i, k) { | |
i || (g = {}); | |
var o = "string" == typeof i ? i.split(" ") : i; | |
k ? o.forEach(function (i) { | |
g[i] && (g[i] = g[i].filter(function (i) { | |
return i.h != k | |
})); | |
g[i] && 0 == g[i].length && delete g[i] | |
}) : o.forEach(function (i) { | |
delete g[i] | |
}); | |
return n | |
}; | |
this.dispatch = function (i, k) { | |
sigma.action = i; | |
g[i] && (g[i].forEach(function (g) { | |
g.h({ | |
type: i, | |
content: k, | |
target: n | |
}) | |
}), g[i] = g[i].filter(function (i) { | |
return !i.one | |
})); | |
return n | |
} | |
}; | |
(function () { | |
var g; | |
function n() { | |
function b(d) { | |
return { | |
x: d.x, | |
y: d.y, | |
size: d.size, | |
degree: d.degree, | |
inDegree: d.inDegree, | |
outDegree: d.outDegree, | |
displayX: d.displayX, | |
displayY: d.displayY, | |
displaySize: d.displaySize, | |
label: d.label, | |
id: d.id, | |
color: d.color, | |
fixed: d.fixed, | |
active: d.active, | |
hidden: d.hidden, | |
attr: d.attr | |
} | |
} | |
function i(d) { | |
return { | |
source: d.source.id, | |
target: d.target.id, | |
size: d.size, | |
type: d.type, | |
weight: d.weight, | |
displaySize: d.displaySize, | |
label: d.label, | |
hidden: d.hidden, | |
id: d.id, | |
attr: d.attr, | |
color: d.color | |
} | |
} | |
function h() { | |
c.nodes = []; | |
c.nodesBG = []; | |
c.nodesIndex = {}; | |
c.nodesBGIndex = {}; | |
c.edges = []; | |
c.edgesIndex = {}; | |
return c | |
} | |
sigma.classes.Cascade.call(this); | |
sigma.classes.EventDispatcher.call(this); | |
var c = this; | |
this.p = { | |
minNodeSize: 0, | |
maxNodeSize: 0, | |
minEdgeSize: 0, | |
maxEdgeSize: 0, | |
minBGSize: 0, | |
maxBGSize: 0, | |
scalingMode: "inside", | |
nodesPowRatio: 0.5, | |
edgesPowRatio: 0 | |
}; | |
this.borders = {}; | |
h(); | |
this.addNode = function (d, b) { | |
if (c.nodesIndex[d]) throw Error('Node "' + d + '" already exists.'); | |
var b = b || {}, | |
a = { | |
x: 0, | |
y: 0, | |
size: 1, | |
degree: 0, | |
inDegree: 0, | |
outDegree: 0, | |
fixed: !1, | |
active: !1, | |
hidden: !1, | |
label: d.toString(), | |
id: d.toString(), | |
attr: {} | |
}, | |
f; | |
for (f in b) switch (f) { | |
case "id": | |
break; | |
case "x": | |
case "y": | |
case "size": | |
a[f] = +b[f]; | |
break; | |
case "fixed": | |
case "active": | |
case "hidden": | |
a[f] = !! b[f]; | |
break; | |
case "color": | |
case "label": | |
a[f] = b[f]; | |
break; | |
default: | |
a.attr[f] = b[f] | |
} | |
c.nodes.push(a); | |
c.nodesIndex[d.toString()] = a; | |
return c | |
}; | |
this.addNodeBG = function (d, b) { | |
if (c.nodesBGIndex[d]) throw Error('NodeBG "' + d + '" already exists.'); | |
var b = b || {}, | |
a = { | |
x: 0, | |
y: 0, | |
size: 1, | |
fixed: !1, | |
active: !1, | |
hidden: !1, | |
label: d.toString(), | |
id: d.toString(), | |
attr: {} | |
}, | |
f; | |
for (f in b) switch (f) { | |
case "id": | |
break; | |
case "x": | |
case "y": | |
case "size": | |
a[f] = +b[f]; | |
break; | |
case "fixed": | |
case "active": | |
case "hidden": | |
a[f] = !! b[f]; | |
break; | |
case "color": | |
case "label": | |
a[f] = b[f]; | |
break; | |
default: | |
a.attr[f] = b[f] | |
} | |
c.nodesBG.push(a); | |
c.nodesBGIndex[d.toString()] = a; | |
return c | |
}; | |
this.addEdge = function (d, b, a, f) { | |
if (c.edgesIndex[d]) throw Error('Edge "' + d + '" already exists.'); | |
if (!c.nodesIndex[b]) throw Error("Edge's source \"" + b + '" does not exist yet.'); | |
if (!c.nodesIndex[a]) throw Error("Edge's target \"" + a + '" does not exist yet.'); | |
f = f || {}; | |
b = { | |
source: c.nodesIndex[b], | |
target: c.nodesIndex[a], | |
size: 1, | |
weight: 1, | |
displaySize: 0.5, | |
label: d.toString(), | |
id: d.toString(), | |
hidden: !1, | |
attr: {} | |
}; | |
b.source.degree++; | |
b.source.outDegree++; | |
b.target.degree++; | |
b.target.inDegree++; | |
for (var h in f) switch (h) { | |
case "id": | |
case "source": | |
case "target": | |
break; | |
case "hidden": | |
b[h] = !! f[h]; | |
break; | |
case "size": | |
case "weight": | |
b[h] = +f[h]; | |
break; | |
case "color": | |
b[h] = f[h].toString(); | |
break; | |
case "type": | |
b[h] = f[h].toString(); | |
break; | |
case "label": | |
b[h] = f[h]; | |
break; | |
default: | |
b.attr[h] = f[h] | |
} | |
c.edges.push(b); | |
c.edgesIndex[d.toString()] = b; | |
return c | |
}; | |
this.dropNode = function (b) { | |
((b instanceof Array ? b : [b]) || []).forEach(function (b) { | |
if (c.nodesIndex[b]) { | |
var a = null; | |
c.nodes.some(function (d, c) { | |
return d.id == b ? (a = c, !0) : !1 | |
}); | |
null != a && c.nodes.splice(a, 1); | |
delete c.nodesIndex[b]; | |
c.edges = c.edges.filter(function (a) { | |
return a.source.id == b ? (delete c.edgesIndex[a.id], a.target.degree--, a.target.inDegree--, !1) : a.target.id == b ? (delete c.edgesIndex[a.id], a.source.degree--, a.source.outDegree--, !1) : !0 | |
}) | |
} else sigma.log('Node "' + b + '" does not exist.') | |
}); | |
return c | |
}; | |
this.dropEdge = function (b) { | |
((b instanceof Array ? b : [b]) || []).forEach(function (b) { | |
if (c.edgesIndex[b]) { | |
c.edgesIndex[b].source.degree--; | |
c.edgesIndex[b].source.outDegree--; | |
c.edgesIndex[b].target.degree--; | |
c.edgesIndex[b].target.inDegree--; | |
var a = null; | |
c.edges.some(function (d, c) { | |
return d.id == b ? (a = c, !0) : !1 | |
}); | |
null != a && c.edges.splice(a, 1); | |
delete c.edgesIndex[b] | |
} else sigma.log('Edge "' + b + '" does not exist.') | |
}); | |
return c | |
}; | |
this.iterEdges = function (b, h) { | |
var a = h ? h.map(function (a) { | |
return c.edgesIndex[a] | |
}) : c.edges, | |
f = a.map(i); | |
f.forEach(b); | |
a.forEach(function (a, b) { | |
var d = f[b], | |
j; | |
for (j in d) switch (j) { | |
case "id": | |
case "displaySize": | |
break; | |
case "weight": | |
case "size": | |
a[j] = +d[j]; | |
break; | |
case "source": | |
case "target": | |
a[j] = c.nodesIndex[j] || a[j]; | |
break; | |
case "hidden": | |
a[j] = !! d[j]; | |
break; | |
case "color": | |
case "label": | |
case "type": | |
a[j] = (d[j] || "").toString(); | |
break; | |
default: | |
a.attr[j] = d[j] | |
} | |
}); | |
return c | |
}; | |
this.iterNodes = function (d, h) { | |
var a = h ? h.map(function (a) { | |
return c.nodesIndex[a] | |
}) : c.nodes, | |
f = a.map(b); | |
f.forEach(d); | |
a.forEach(function (a, b) { | |
var d = f[b], | |
c; | |
for (c in d) switch (c) { | |
case "id": | |
case "attr": | |
case "degree": | |
case "inDegree": | |
case "outDegree": | |
case "displayX": | |
case "displayY": | |
case "displaySize": | |
break; | |
case "x": | |
case "y": | |
case "size": | |
a[c] = +d[c]; | |
break; | |
case "fixed": | |
case "active": | |
case "hidden": | |
a[c] = !! d[c]; | |
break; | |
case "color": | |
case "label": | |
a[c] = d[c].toString(); | |
break; | |
default: | |
a.attr[c] = d[c] | |
} | |
}); | |
return c | |
}; | |
this.getEdges = function (b) { | |
var h = ((b instanceof Array ? b : [b]) || []).map(function (a) { | |
return i(c.edgesIndex[a]) | |
}); | |
return b instanceof Array ? h : h[0] | |
}; | |
this.getNodes = function (d) { | |
var h = ((d instanceof Array ? d : [d]) || []).map(function (a) { | |
return b(c.nodesIndex[a]) | |
}); | |
return d instanceof Array ? h : h[0] | |
}; | |
this.empty = h; | |
this.rescale = function (b, h, a, f, i) { | |
var l = 0, | |
m = 0, | |
j = 0, | |
g = Math; | |
a && c.nodes.forEach(function (a) { | |
m = g.max(a.size, m) | |
}); | |
f && c.edges.forEach(function (a) { | |
l = g.max(a.size, l) | |
}); | |
i && c.nodesBG.forEach(function (a) { | |
j = g.max(a.size, j) | |
}); | |
var m = m || 1, | |
j = j || 1, | |
l = l || 1, | |
v, q, A, w; | |
a && c.nodes.forEach(function (a) { | |
q = g.max(a.x, q || a.x); | |
v = g.min(a.x, v || a.x); | |
w = g.max(a.y, w || a.y); | |
A = g.min(a.y, A || a.y) | |
}); | |
var u = "outside" == c.p.scalingMode ? g.max(b / g.max(q - v, 1), h / g.max(w - A, 1)) : g.min(b / g.max(q - v, 1), h / g.max(w - A, 1)), | |
u = u - u / 20, | |
x, k; | |
!c.p.maxNodeSize && !c.p.minNodeSize ? (x = 1, k = 0) : c.p.maxNodeSize == c.p.minNodeSize ? (x = 0, k = c.p.maxNodeSize) : (x = (c.p.maxNodeSize - c.p.minNodeSize) / m, k = c.p.minNodeSize); | |
var p, r; | |
!c.p.maxEdgeSize && !c.p.minEdgeSize ? (p = 1, r = 0) : (p = c.p.maxEdgeSize == c.p.minEdgeSize ? 0 : (c.p.maxEdgeSize - c.p.minEdgeSize) / l, r = c.p.minEdgeSize); | |
a && c.nodes.forEach(function (a) { | |
a.displaySize = a.size * x + k; | |
if (!a.fixed) { | |
a.displayX = (a.x - (q + v) / 2) * u + b / 2; | |
a.displayY = (a.y - (w + A) / 2) * u + h / 2 | |
} | |
}); | |
i && c.nodesBG.forEach(function (a) { | |
a.displaySize = a.size * g.sqrt(sigInst._core.mousecaptor.ratio * u); | |
if (!a.fixed) { | |
a.displayX = (a.x - (q + v) / 2) * u + b / 2; | |
a.displayY = (a.y - (w + A) / 2) * u + h / 2 | |
} | |
}); | |
f && c.edges.forEach(function (a) { | |
a.displaySize = a.size * p + r | |
}); | |
return c | |
}; | |
this.translate = function (b, h, a, f, i, g) { | |
var m = Math.pow(a, c.p.nodesPowRatio); | |
f && c.nodes.forEach(function (c) { | |
c.fixed || (c.displayX = c.displayX * a + b, c.displayY = c.displayY * a + h); | |
c.displaySize *= m | |
}); | |
g && c.nodesBG.forEach(function (c) { | |
c.fixed || (c.displayX = c.displayX * a + b, c.displayY = c.displayY * a + h); | |
c.displaySize *= m | |
}); | |
m = Math.pow(a, c.p.edgesPowRatio); | |
i && c.edges.forEach(function (a) { | |
a.displaySize *= m | |
}); | |
return c | |
}; | |
this.setBorders = function () { | |
c.borders = {}; | |
c.nodes.forEach(function (b) { | |
c.borders.minX = Math.min(void 0 == c.borders.minX ? b.displayX - b.displaySize : c.borders.minX, b.displayX - b.displaySize); | |
c.borders.maxX = Math.max(void 0 == c.borders.maxX ? b.displayX + b.displaySize : c.borders.maxX, b.displayX + b.displaySize); | |
c.borders.minY = Math.min(void 0 == c.borders.minY ? b.displayY - b.displaySize : c.borders.minY, b.displayY - b.displaySize); | |
c.borders.maxY = Math.max(void 0 == c.borders.maxY ? b.displayY - b.displaySize : c.borders.maxY, b.displayY - b.displaySize) | |
}) | |
}; | |
this.checkHover = function (b, h) { | |
var a, f, i, g = [], | |
m = []; | |
c.nodes.forEach(function (c) { | |
if (c.hidden) c.hover = !1; | |
else { | |
a = Math.abs(c.displayX - b); | |
f = Math.abs(c.displayY - h); | |
i = c.displaySize; | |
var v = c.hover, | |
k = a < i && f < i && Math.sqrt(a * a + f * f) < i; | |
v && !k ? (c.hover = !1, m.push(c.id)) : k && !v && (c.hover = !0, g.push(c.id)) | |
} | |
}); | |
g.length && c.dispatch("overnodes", g); | |
m.length && c.dispatch("outnodes", m); | |
return c | |
} | |
} | |
function i(b, i) { | |
function h() { | |
var b; | |
b = "<p>GLOBAL :</p>"; | |
for (var h in c.p.globalProbes) b += "<p>" + h + " : " + c.p.globalProbes[h]() + "</p>"; | |
b += "<br><p>LOCAL :</p>"; | |
for (h in c.p.localProbes) b += "<p>" + h + " : " + c.p.localProbes[h]() + "</p>"; | |
c.p.dom.innerHTML = b; | |
return c | |
} | |
sigma.classes.Cascade.call(this); | |
var c = this; | |
this.instance = b; | |
this.monitoring = !1; | |
this.p = { | |
fps: 40, | |
dom: i, | |
globalProbes: { | |
"Time (ms)": sigma.chronos.getExecutionTime, | |
Queue: sigma.chronos.getQueuedTasksCount, | |
Tasks: sigma.chronos.getTasksCount, | |
FPS: sigma.chronos.getFPS | |
}, | |
localProbes: { | |
"Nodes count": function () { | |
return c.instance.graph.nodes.length | |
}, | |
"Edges count": function () { | |
return c.instance.graph.edges.length | |
} | |
} | |
}; | |
this.activate = function () { | |
c.monitoring || (c.monitoring = window.setInterval(h, 1E3 / c.p.fps)); | |
return c | |
}; | |
this.desactivate = function () { | |
c.monitoring && (window.clearInterval(c.monitoring), c.monitoring = null, c.p.dom.innerHTML = ""); | |
return c | |
} | |
} | |
function k(b) { | |
function i(a) { | |
f.mouseX = void 0 != a.offsetX && a.offsetX || void 0 != a.layerX && a.layerX || void 0 != a.clientX && a.clientX; | |
f.mouseY = void 0 != a.offsetY && a.offsetY || void 0 != a.layerY && a.layerY || void 0 != a.clientY && a.clientY; | |
if (f.isMouseDown) { | |
var b = f.mouseX - k + m, | |
c = f.mouseY - l + j; | |
if (b != f.stageX || c != f.stageY) w = A, x = u, A = b, u = c, f.stageX = b, f.stageY = c, f.dispatch("drag") | |
} | |
f.dispatch("move"); | |
a.preventDefault ? a.preventDefault() : a.returnValue = !1 | |
} | |
function h(a) { | |
f.p.mouseEnabled && f.isMouseDown && (f.isMouseDown = !1, f.dispatch("mouseup"), (m != f.stageX || j != f.stageY) && g(f.stageX + f.p.inertia * (f.stageX - w), f.stageY + f.p.inertia * (f.stageY - x)), a.preventDefault ? a.preventDefault() : a.returnValue = !1) | |
} | |
function c(a) { | |
f.p.mouseEnabled && (f.isMouseDown = !0, f.dispatch("mousedown"), m = f.stageX, j = f.stageY, k = f.mouseX, l = f.mouseY, w = A = f.stageX, x = u = f.stageY, f.dispatch("startdrag"), a.preventDefault ? a.preventDefault() : a.returnValue = !1) | |
} | |
function d(a) { | |
f.p.mouseEnabled && (g(f.mouseX, f.mouseY, f.ratio * (0 < (void 0 != a.wheelDelta && a.wheelDelta || void 0 != a.detail && -a.detail) ? f.p.zoomMultiply : 1 / f.p.zoomMultiply)), f.p.blockScroll && (a.preventDefault ? a.preventDefault() : a.returnValue = !1)) | |
} | |
function g(b, c, d) { | |
if (!f.isMouseDown && (window.clearInterval(f.interpolationID), p = void 0 != d, m = f.stageX, y = b, j = f.stageY, q = c, n = d || f.ratio, n = Math.min(Math.max(n, f.p.minRatio), f.p.maxRatio), B = f.p.directZooming ? 1 - (p ? f.p.zoomDelta : f.p.dragDelta) : 0, f.ratio != n || f.stageX != y || f.stageY != q)) a(), f.interpolationID = window.setInterval(a, 50), f.dispatch("startinterpolate") | |
} | |
function a() { | |
B += p ? f.p.zoomDelta : f.p.dragDelta; | |
B = Math.min(B, 1); | |
var a = sigma.easing.quadratic.easeout(B), | |
b = f.ratio; | |
f.ratio = b * (1 - a) + n * a; | |
p ? (f.stageX = y + (f.stageX - y) * f.ratio / b, f.stageY = q + (f.stageY - q) * f.ratio / b) : (f.stageX = m * (1 - a) + y * a, f.stageY = j * (1 - a) + q * a); | |
f.dispatch("interpolate"); | |
1 <= B && (window.clearInterval(f.interpolationID), a = f.ratio, p ? (f.ratio = n, f.stageX = y + (f.stageX - y) * f.ratio / a, f.stageY = q + (f.stageY - q) * f.ratio / a) : (f.stageX = y, f.stageY = q), f.dispatch("stopinterpolate")) | |
} | |
sigma.classes.Cascade.call(this); | |
sigma.classes.EventDispatcher.call(this); | |
var f = this; | |
this.p = { | |
minRatio: 1, | |
maxRatio: 32, | |
marginRatio: 1, | |
zoomDelta: 0.1, | |
dragDelta: 0.3, | |
zoomMultiply: 2, | |
directZooming: !1, | |
blockScroll: !0, | |
inertia: 1.1, | |
mouseEnabled: !0 | |
}; | |
var k = 0, | |
l = 0, | |
m = 0, | |
j = 0, | |
n = 1, | |
y = 0, | |
q = 0, | |
A = 0, | |
w = 0, | |
u = 0, | |
x = 0, | |
B = 0, | |
p = !1; | |
this.stageY = this.stageX = 0; | |
this.ratio = 1; | |
this.mouseY = this.mouseX = 0; | |
this.isMouseDown = !1; | |
b.addEventListener && document.addEventListener ? (b.addEventListener("DOMMouseScroll", d, !0), b.addEventListener("mousewheel", d, !0), b.addEventListener("mousemove", i, !0), b.addEventListener("mousedown", c, !0), document.addEventListener("mouseup", h, !0)) : (b.attachEvent("onDOMMouseScroll", d), b.attachEvent("onmousewheel", d), b.attachEvent("onmousemove", i), b.attachEvent("onmousedown", c), document.attachEvent("onmouseup", h)); | |
this.checkBorders = function () { | |
return f | |
}; | |
this.interpolate = g | |
} | |
function o(b, i, h, c, d, g, a, f, k) { | |
function l(a) { | |
var b = c, | |
d = Math.round, | |
f = "fixed" == j.p.labelSize ? j.p.defaultLabelSize : j.p.labelSizeRatio * a.displaySize; | |
b.font = (j.p.hoverFontStyle || j.p.fontStyle || "") + " " + f + "px " + (j.p.hoverFont || j.p.font || ""); | |
b.fillStyle = "node" == j.p.labelHoverBGColor ? a.color || j.p.defaultNodeColor : j.p.defaultHoverLabelBGColor; | |
j.p.labelHoverShadow && (b.shadowOffsetX = 0, b.shadowOffsetY = 0, b.shadowBlur = 4, b.shadowColor = j.p.labelHoverShadowColor); | |
var h = d(a.displayX + 10), | |
g = d(a.displayY - f / 2 - 2), | |
i = d(b.measureText(a.label).width + 6), | |
m = d(f + 4); | |
d(f / 2 + 2); | |
b.fillRect(h, g, i, m); | |
b.shadowOffsetX = 0; | |
b.shadowOffsetY = 0; | |
b.shadowBlur = 0; | |
b.fillStyle = "node" == j.p.labelHoverColor ? a.color || j.p.defaultNodeColor : j.p.defaultLabelHoverColor; | |
b.fillText(a.label, h + 4, g + m - 3); | |
return j | |
} | |
function m(a) { | |
if (isNaN(a.x) || isNaN(a.y)) throw Error("A node's coordinate is not a number (id: " + a.id + ")"); | |
return !a.hidden && a.displayX + a.displaySize > -n / 3 && a.displayX - a.displaySize < 4 * n / 3 && a.displayY + a.displaySize > -y / 3 && a.displayY - a.displaySize < 4 * y / 3 | |
} | |
sigma.classes.Cascade.call(this); | |
var j = this; | |
this.contexts = { | |
node: b, | |
edge: i, | |
label: h, | |
hover: c, | |
bg: d, | |
bg2: g | |
}; | |
this.p = { | |
labelColor: "default", | |
defaultLabelColor: "#fff", | |
labelHoverBGColor: "default", | |
defaultHoverLabelBGColor: "#fff", | |
labelHoverShadow: !0, | |
labelHoverShadowColor: "#000", | |
labelHoverColor: "default", | |
defaultLabelHoverColor: "#000", | |
labelActiveBGColor: "default", | |
defaultActiveLabelBGColor: "#fff", | |
labelActiveShadow: !0, | |
labelActiveShadowColor: "#000", | |
labelActiveColor: "default", | |
defaultLabelActiveColor: "#000", | |
labelSize: "fixed", | |
defaultLabelSize: 12, | |
labelSizeRatio: 2, | |
labelThreshold: 6, | |
font: "Arial", | |
hoverFont: "", | |
activeFont: "", | |
fontStyle: "", | |
hoverFontStyle: "", | |
activeFontStyle: "", | |
edgeColor: "source", | |
defaultEdgeColor: "#aaa", | |
defaultEdgeType: "line", | |
defaultNodeColor: "#aaa", | |
nodeHoverColor: "node", | |
defaultNodeHoverColor: "#fff", | |
nodeActiveColor: "node", | |
defaultNodeActiveColor: "#fff", | |
borderSize: 0, | |
nodeBorderColor: "node", | |
defaultNodeBorderColor: "#fff", | |
edgesSpeed: 200, | |
nodesSpeed: 200, | |
nodesBGSpeed: 200, | |
labelsSpeed: 200 | |
}; | |
var n = f, | |
y = k; | |
this.currentBGIndex = this.currentLabelIndex = this.currentBGIndex = this.currentNodeIndex = this.currentEdgeIndex = 0; | |
this.task_drawLabel = function () { | |
for (var b = a.nodes.length, c = 0; c++ < j.p.labelsSpeed && j.currentLabelIndex < b;) if (j.isOnScreen(a.nodes[j.currentLabelIndex])) { | |
var d = a.nodes[j.currentLabelIndex++], | |
f = h; | |
if (d.displaySize >= j.p.labelThreshold) { | |
var g = "fixed" == j.p.labelSize ? j.p.defaultLabelSize : j.p.labelSizeRatio * d.displaySize; | |
f.font = (j.p.hoverFontStyle || j.p.fontStyle || "") + " " + g + "px " + (j.p.hoverFont || j.p.font || ""); | |
var i = Math.round, | |
m = i(d.displayX + 10), | |
l = i(d.displayY + g / 2 - 2), | |
k = i(f.measureText(d.label).width + 6), | |
v = i(g + 4); | |
i(g / 2 + 2); | |
f.font = j.p.fontStyle + g + "px " + j.p.font; | |
f.fillStyle = "#258EA4"; | |
f.fillRect(m, l - v + 3, k, v); | |
f.fillStyle = "#fff"; | |
f.fillText(d.label, m + 4, l) | |
} | |
} else j.currentLabelIndex++; | |
return j.currentLabelIndex < b | |
}; | |
this.task_drawEdge = function () { | |
for (var b = a.edges.length, c, d, f = 0, h; f++ < j.p.edgesSpeed && j.currentEdgeIndex < b;) if (h = a.edges[j.currentEdgeIndex], c = h.source, d = h.target, h.hidden || c.hidden || d.hidden || !j.isOnScreen(c) && !j.isOnScreen(d)) j.currentEdgeIndex++; | |
else { | |
c = a.edges[j.currentEdgeIndex++]; | |
d = c.source.displayX; | |
h = c.source.displayY; | |
var g = c.target.displayX, | |
m = c.target.displayY, | |
l = void 0; | |
// l = c.attr.color ? c.attr.color : "rgba(255, 0, 0, .6)"; | |
if (!l) switch (j.p.edgeColor) { | |
case "source": | |
l = c.source.color || j.p.defaultNodeColor; | |
break; | |
case "target": | |
l = c.target.color || j.p.defaultNodeColor; | |
break; | |
default: | |
l = j.p.defaultEdgeColor | |
} | |
var k = i; | |
k.strokeStyle = l; | |
k.lineWidth = c.attr.lineWidth ? c.attr.lineWidth : 0.2; | |
switch (c.type || j.p.defaultEdgeType) { | |
case "curve": | |
k.beginPath(); | |
k.moveTo(d, h); | |
k.quadraticCurveTo((d + g) / 2 + (m - h) / 4, (h + m) / 2 + (d - g) / 4, g, m); | |
k.stroke(); | |
break; | |
default: | |
k.beginPath(), k.moveTo(d, h), k.lineTo(g, m), k.stroke() | |
} | |
} | |
return j.currentEdgeIndex < b | |
}; | |
this.task_drawNode = function () { | |
for (var b = a.nodes.length, c = 0; c++ < j.p.nodesSpeed && j.currentNodeIndex < b;) j.isOnScreen(a.nodes[j.currentNodeIndex]) ? j.drawNode(a.nodes[j.currentNodeIndex++]) : j.currentNodeIndex++; | |
return j.currentNodeIndex < b | |
}; | |
this.task_drawBG = function () { | |
for (var b = a.nodesBG.length, c = 0; c++ < j.p.nodesBGSpeed && j.currentBGIndex < b;) j.drawBG(a.nodesBG[j.currentBGIndex++]); | |
return j.currentBGIndex < b | |
}; | |
this.drawBG = function (a) { | |
var b = Math, | |
c = b.round(10 * a.displaySize) / 10, | |
f = a.displayX, | |
h = a.displayY; | |
d.fillStyle = "#fff"; | |
d.beginPath(); | |
d.arc(f, h, c, 0, 2 * b.PI, !0); | |
d.closePath(); | |
d.fill(); | |
var g = "fixed" == j.p.labelSize ? j.p.defaultLabelSize : j.p.labelSizeRatio * a.displaySize, | |
b = b.round, | |
i, m, l; | |
i = d.measureText(a.label).width; | |
l = c * a.attr.deltaX / 100; | |
var k = c * a.attr.deltaY / 100; | |
switch (a.attr.position) { | |
default: c = b(f - l - c - i - 13); | |
l = b(h + k); | |
i = c; | |
m = l - 3; | |
f = b(f); | |
h = b(h + k); | |
break; | |
case "right": | |
c = b(f + l + a.displaySize + 8 + i), l = b(h + k), i = c - i, m = l - 3, f = b(f), h = b(h + k) | |
} | |
d.font = g + "px sans-serif"; | |
d.fillStyle = "#fff"; | |
d.fillText(a.label, i, m); | |
d.strokeStyle = "#fff"; | |
d.lineWidth = 0.7; | |
d.save(); | |
d.moveTo(c, l); | |
d.lineTo(f, h); | |
d.stroke(); | |
d.restore(); | |
return j | |
}; | |
this.drawNode = function (a) { | |
var c = Math.round(10 * a.displaySize) / 10; | |
b.fillStyle = a.attr.color ? a.attr.color : "#ff0000"; | |
b.strokeStyle = a.attr.strokeStyle ? a.attr.strokeStyle : "#000"; | |
a.attr.lineWidth && (b.lineWidth = a.attr.lineWidth); | |
var d = 2 * Math.PI; | |
1 > c && (c = 1); | |
var f = a.displayX, | |
h = a.displayY, | |
i = 9 * c; | |
// m = b.createRadialGradient(f, h, i - 7, f, h, i); | |
// m.addColorStop(0, "#ff0000"); | |
// m.addColorStop(1, "rgba(255, 255, 255, 0)"); | |
//g.fillStyle = m; | |
b.beginPath(); | |
b.arc(f, h, 1.4 * c, 0, d, !0); | |
b.closePath(); | |
a.attr.lineWidth && b.stroke(); | |
b.fill(); | |
a.hover && l(a); | |
return j | |
}; | |
this.getCtx = function (a) { | |
return j.contexts[a] ? j.contexts[a] : !1 | |
}; | |
this.drawActiveNode = function (a) { | |
var b = c; | |
if (!m(a)) return j; | |
var d = "fixed" == j.p.labelSize ? j.p.defaultLabelSize : j.p.labelSizeRatio * a.displaySize; | |
b.font = (j.p.activeFontStyle || j.p.fontStyle || "") + " " + d + "px " + (j.p.activeFont || j.p.font || ""); | |
b.fillStyle = "node" == j.p.labelHoverBGColor ? a.color || j.p.defaultNodeColor : j.p.defaultActiveLabelBGColor; | |
b.beginPath(); | |
j.p.labelActiveShadow && (b.shadowOffsetX = 0, b.shadowOffsetY = 0, b.shadowBlur = 4, b.shadowColor = j.p.labelActiveShadowColor); | |
sigma.tools.drawRoundRect(b, Math.round(a.displayX - d / 2 - 2), Math.round(a.displayY - d / 2 - 2), Math.round(b.measureText(a.label).width + 1.5 * a.displaySize + d / 2 + 4), Math.round(d + 4), Math.round(d / 2 + 2), "left"); | |
b.closePath(); | |
b.fill(); | |
b.shadowOffsetX = 0; | |
b.shadowOffsetY = 0; | |
b.shadowBlur = 0; | |
b.beginPath(); | |
b.fillStyle = "node" == j.p.nodeBorderColor ? a.color || j.p.defaultNodeColor : j.p.defaultNodeBorderColor; | |
b.arc(Math.round(a.displayX), Math.round(a.displayY), a.displaySize + j.p.borderSize, 0, 2 * Math.PI, !0); | |
b.closePath(); | |
b.fill(); | |
b.beginPath(); | |
b.fillStyle = "node" == j.p.nodeActiveColor ? a.color || j.p.defaultNodeColor : j.p.defaultNodeActiveColor; | |
b.arc(Math.round(a.displayX), Math.round(a.displayY), a.displaySize, 0, 2 * Math.PI, !0); | |
b.closePath(); | |
b.fill(); | |
b.fillStyle = "node" == j.p.labelActiveColor ? a.color || j.p.defaultNodeColor : j.p.defaultLabelActiveColor; | |
b.fillText(a.label, Math.round(a.displayX + 1.5 * a.displaySize), Math.round(a.displayY + d / 2 - 3)); | |
return j | |
}; | |
this.drawHoverNode = l; | |
this.isOnScreen = m; | |
this.resize = function (a, b) { | |
n = a; | |
y = b; | |
return j | |
} | |
} | |
function t(b, v) { | |
function h() { | |
sigma.chronos.removeTask("node_" + a.id, 2).removeTask("edge_" + a.id, 2).removeTask("label_" + a.id, 2).stopTasks(); | |
return a | |
} | |
function c(b, c) { | |
var d = document.createElement(c); | |
d.style.position = "absolute"; | |
d.setAttribute("id", "sigma_" + b + "_" + a.id); | |
d.setAttribute("class", "sigma_" + b + "_" + c); | |
d.setAttribute("width", a.width); | |
d.setAttribute("height", a.height); | |
a.domRoot.appendChild(d); | |
"undefined" != typeof G_vmlCanvasManager && "canvas" == c && (d = G_vmlCanvasManager.initElement(d)); | |
a.domElements[b] = d; | |
d.getContext && (a.contexts[b] = d.getContext("2d")); | |
return a | |
} | |
function d() { | |
a.p.drawHoverNodes && (a.graph.checkHover(a.mousecaptor.mouseX, a.mousecaptor.mouseY), a.domElements.mouse.style.cursor = "default", a.graph.nodes.forEach(function (b) { | |
b.hover && !b.active && (a.domElements.mouse.style.cursor = "pointer", a.plotter.drawHoverNode(b)) | |
})); | |
return a | |
} | |
function s() { | |
a.p.drawActiveNodes && a.graph.nodes.forEach(function (b) { | |
b.active && a.plotter.drawActiveNode(b) | |
}); | |
return a | |
} | |
sigma.classes.Cascade.call(this); | |
sigma.classes.EventDispatcher.call(this); | |
var a = this; | |
this.id = v.toString(); | |
this.p = { | |
auto: !0, | |
drawNodes: 2, | |
drawEdges: 1, | |
drawLabels: 2, | |
drawBG: 2, | |
lastNodes: 2, | |
lastEdges: 0, | |
lastLabels: 2, | |
lastBG: 2, | |
drawHoverNodes: !0, | |
drawActiveNodes: !0 | |
}; | |
this.domRoot = b; | |
this.width = this.domRoot.offsetWidth; | |
this.height = this.domRoot.offsetHeight; | |
this.graph = new n; | |
this.domElements = {}; | |
this.contexts = {}; | |
c("bg", "canvas"); | |
c("bg2", "canvas"); | |
c("edges", "canvas"); | |
c("nodes", "canvas"); | |
c("labels", "canvas"); | |
c("hover", "canvas"); | |
c("monitor", "div"); | |
c("mouse", "canvas"); | |
this.plotter = new o(this.contexts.nodes, this.contexts.edges, this.contexts.labels, this.contexts.hover, this.contexts.bg, this.contexts.bg2, this.graph, this.width, this.height); | |
this.monitor = new i(this, this.domElements.monitor); | |
this.mousecaptor = new k(this.domElements.mouse, this.id); | |
this.mousecaptor.bind("drag interpolate", function () { | |
a.draw(a.p.auto ? 2 : a.p.drawNodes, a.p.auto ? 0 : a.p.drawEdges, a.p.auto ? 2 : a.p.drawLabels, a.p.auto ? 2 : a.p.drawBG, !0) | |
}).bind("stopdrag stopinterpolate", function () { | |
a.draw(a.p.auto ? 2 : a.p.drawNodes, a.p.auto ? 1 : a.p.drawEdges, a.p.auto ? 2 : a.p.drawLabels, a.p.auto ? 2 : a.p.drawBG, !0) | |
}).bind("mousedown mouseup", function (b) { | |
var c = a.graph.nodes.filter(function (a) { | |
return !!a.hover | |
}).map(function (a) { | |
return a.id | |
}); | |
a.dispatch("mousedown" == b.type ? "downgraph" : "upgraph"); | |
c.length && a.dispatch("mousedown" == b.type ? "downnodes" : "upnodes", c) | |
}).bind("move", function () { | |
a.contexts.hover.clearRect(0, 0, a.domElements.hover.width, a.domElements.hover.height); | |
d(); | |
s() | |
}); | |
sigma.chronos.bind("startgenerators", function () { | |
sigma.chronos.getGeneratorsIDs().some(function (b) { | |
return !!b.match(RegExp("_ext_" + a.id + "$", "")) | |
}) && a.draw(a.p.auto ? 2 : a.p.drawNodes, a.p.auto ? 0 : a.p.drawEdges, a.p.auto ? 2 : a.p.drawLabels) | |
}).bind("stopgenerators", function () { | |
a.draw() | |
}); | |
for (var f = 0; f < g.length; f++) g[f](this); | |
this.draw = function (b, c, d, f, i) { | |
if (i && sigma.chronos.getGeneratorsIDs().some(function (b) { | |
return !!b.match(RegExp("_ext_" + a.id + "$", "")) | |
})) return a; | |
b = void 0 == b ? a.p.drawNodes : b; | |
c = void 0 == c ? a.p.drawEdges : c; | |
d = void 0 == d ? a.p.drawLabels : d; | |
f = void 0 == f ? a.p.drawBG : f; | |
i = { | |
nodes: b, | |
edges: c, | |
labels: d, | |
bg: f | |
}; | |
a.p.lastNodes = b; | |
a.p.lastEdges = c; | |
a.p.lastLabels = d; | |
a.p.lastBG = f; | |
h(); | |
a.graph.rescale(a.width, a.height, 0 < b, 0 < c, 0 < f).setBorders(); | |
a.mousecaptor.checkBorders(a.graph.borders, a.width, a.height); | |
a.graph.translate(a.mousecaptor.stageX, a.mousecaptor.stageY, a.mousecaptor.ratio, 0 < b, 0 < c, 0 < f); | |
a.dispatch("graphscaled"); | |
for (var g in a.domElements) "canvas" == a.domElements[g].nodeName.toLowerCase() && (void 0 == i[g] || 0 <= i[g]) && a.contexts[g].clearRect(0, 0, a.domElements[g].width, a.domElements[g].height); | |
a.plotter.currentEdgeIndex = 0; | |
a.plotter.currentNodeIndex = 0; | |
a.plotter.currentLabelIndex = 0; | |
a.plotter.currentBGIndex = 0; | |
g = null; | |
i = !1; | |
if (f) if (1 < f) for (; a.plotter.task_drawBG();); | |
else sigma.chronos.addTask(a.plotter.task_drawBG, "bg_" + a.id, !1), i = !0, g = "bg_" + a.id; | |
if (b) if (1 < b) for (; a.plotter.task_drawNode();); | |
else sigma.chronos.addTask(a.plotter.task_drawNode, "node_" + a.id, !1), i = !0, g = "node_" + a.id; | |
if (d) if (1 < d) for (; a.plotter.task_drawLabel();); | |
else g ? sigma.chronos.queueTask(a.plotter.task_drawLabel, "label_" + a.id, g) : sigma.chronos.addTask(a.plotter.task_drawLabel, "label_" + a.id, !1), i = !0, g = "label_" + a.id; | |
if (c) if (1 < c) for (; a.plotter.task_drawEdge();); | |
else g ? sigma.chronos.queueTask(a.plotter.task_drawEdge, "edge_" + a.id, g) : sigma.chronos.addTask(a.plotter.task_drawEdge, "edge_" + a.id, !1), i = !0, g = "edge_" + a.id; | |
a.dispatch("draw"); | |
a.refresh(); | |
i && sigma.chronos.runTasks(); | |
return a | |
}; | |
this.resize = function (b, c) { | |
var d = a.width, | |
f = a.height; | |
void 0 != b && void 0 != c ? (a.width = b, a.height = c) : (a.width = a.domRoot.offsetWidth, a.height = a.domRoot.offsetHeight); | |
if (d != a.width || f != a.height) { | |
for (var h in a.domElements) a.domElements[h].setAttribute("width", a.width + "px"), a.domElements[h].setAttribute("height", a.height + "px"); | |
a.plotter.resize(a.width, a.height); | |
a.draw(a.p.lastNodes, a.p.lastEdges, a.p.lastLabels, a.p.drawBG, !0) | |
} | |
return a | |
}; | |
this.refresh = function () { | |
a.contexts.hover.clearRect(0, 0, a.domElements.hover.width, a.domElements.hover.height); | |
d(); | |
s(); | |
return a | |
}; | |
this.drawHover = d; | |
this.drawActive = s; | |
this.clearSchedule = h; | |
window.addEventListener ? window.addEventListener("resize", function () { | |
a.resize() | |
}, !1) : window.attachEvent("onresize", function () { | |
a.resize() | |
}) | |
} | |
function s(b) { | |
var g = this; | |
sigma.classes.EventDispatcher.call(this); | |
this._core = b; | |
this.kill = function () {}; | |
this.getID = function () { | |
return b.id | |
}; | |
this.configProperties = function (h, c) { | |
var d = b.config(h, c); | |
return d == b ? g : d | |
}; | |
this.drawingProperties = function (h, c) { | |
var d = b.plotter.config(h, c); | |
return d == b.plotter ? g : d | |
}; | |
this.mouseProperties = function (h, c) { | |
var d = b.mousecaptor.config(h, c); | |
return d == b.mousecaptor ? g : d | |
}; | |
this.graphProperties = function (h, c) { | |
var d = b.graph.config(h, c); | |
return d == b.graph ? g : d | |
}; | |
this.getMouse = function () { | |
return { | |
mouseX: b.mousecaptor.mouseX, | |
mouseY: b.mousecaptor.mouseY, | |
down: b.mousecaptor.isMouseDown | |
} | |
}; | |
this.position = function (h, c, d) { | |
if (0 == arguments.length) return { | |
stageX: b.mousecaptor.stageX, | |
stageY: b.mousecaptor.stageY, | |
ratio: b.mousecaptor.ratio | |
}; | |
b.mousecaptor.stageX = void 0 != h ? h : b.mousecaptor.stageX; | |
b.mousecaptor.stageY = void 0 != c ? c : b.mousecaptor.stageY; | |
b.mousecaptor.ratio = void 0 != d ? d : b.mousecaptor.ratio; | |
return g | |
}; | |
this.goTo = function (h, c, d) { | |
b.mousecaptor.interpolate(h, c, d); | |
return g | |
}; | |
this.zoomTo = function (h, c, d) { | |
d = Math.min(Math.max(b.mousecaptor.config("minRatio"), d), b.mousecaptor.config("maxRatio")); | |
d == b.mousecaptor.ratio ? b.mousecaptor.interpolate(h - b.width / 2 + b.mousecaptor.stageX, c - b.height / 2 + b.mousecaptor.stageY) : b.mousecaptor.interpolate((d * h - b.mousecaptor.ratio * b.width / 2) / (d - b.mousecaptor.ratio), (d * c - b.mousecaptor.ratio * b.height / 2) / (d - b.mousecaptor.ratio), d); | |
return g | |
}; | |
this.resize = function (h, c) { | |
b.resize(h, c); | |
return g | |
}; | |
this.draw = function (h, c, d, i, a) { | |
b.draw(h, c, d, i, a); | |
return g | |
}; | |
this.refresh = function () { | |
b.refresh(); | |
return g | |
}; | |
this.addGenerator = function (h, c, d) { | |
sigma.chronos.addGenerator(h + "_ext_" + b.id, c, d); | |
return g | |
}; | |
this.removeGenerator = function (h) { | |
sigma.chronos.removeGenerator(h + "_ext_" + b.id); | |
return g | |
}; | |
this.addNode = function (h, c) { | |
b.graph.addNode(h, c); | |
return g | |
}; | |
this.addNodeBG = function (h, c) { | |
b.graph.addNodeBG(h, c); | |
return g | |
}; | |
this.addEdge = function (h, c, d, i) { | |
b.graph.addEdge(h, c, d, i); | |
return g | |
}; | |
this.dropNode = function (h) { | |
b.graph.dropNode(h); | |
return g | |
}; | |
this.dropEdge = function (h) { | |
b.graph.dropEdge(h); | |
return g | |
}; | |
this.pushGraph = function (h, c) { | |
h.nodes && h.nodes.forEach(function (d) { | |
d.id && (!c || !b.graph.nodesIndex[d.id]) && g.addNode(d.id, d) | |
}); | |
h.edges && h.edges.forEach(function (d) { | |
(validID = d.source && d.target && d.id) && (!c || !b.graph.edgesIndex[d.id]) && g.addNode(d.id, d.source, d.target, d) | |
}); | |
return g | |
}; | |
this.emptyGraph = function () { | |
b.graph.empty(); | |
return g | |
}; | |
this.getNodesCount = function () { | |
return b.graph.nodes.length | |
}; | |
this.getEdgesCount = function () { | |
return b.graph.edges.length | |
}; | |
this.iterNodes = function (h, c) { | |
b.graph.iterNodes(h, c); | |
return g | |
}; | |
this.iterEdges = function (h, c) { | |
b.graph.iterEdges(h, c); | |
return g | |
}; | |
this.getNodes = function (h) { | |
return b.graph.getNodes(h) | |
}; | |
this.getEdges = function (h) { | |
return b.graph.getEdges(h) | |
}; | |
this.activateMonitoring = function () { | |
return b.monitor.activate() | |
}; | |
this.desactivateMonitoring = function () { | |
return b.monitor.desactivate() | |
}; | |
b.bind("downnodes upnodes downgraph upgraph", function (b) { | |
g.dispatch(b.type, b.content) | |
}); | |
b.graph.bind("overnodes outnodes", function (b) { | |
g.dispatch(b.type, b.content) | |
}) | |
} | |
var C = 0; | |
g = void 0; | |
g = []; | |
sigma.init = function (b) { | |
b = new t(b, (++C).toString()); | |
sigma.instances[C] = new s(b); | |
return sigma.instances[C] | |
}; | |
sigma.addPlugin = function (b, i, h) { | |
s.prototype[b] = i; | |
g.push(h) | |
}; | |
sigma.chronos = new function () { | |
function b(a) { | |
window.setTimeout(a, 0); | |
return l | |
} | |
function g() { | |
for (l.dispatch("frameinserted"); m && r.length && h();); | |
!m || !r.length ? d() : (x = (new Date).getTime(), o++, B = w - q, s = q - B, l.dispatch("insertframe"), b(g)) | |
} | |
function h() { | |
t %= r.length; | |
if (!r[t].task()) { | |
var a = r[t].taskName; | |
z = z.filter(function (b) { | |
b.taskParent == a && r.push({ | |
taskName: b.taskName, | |
task: b.task | |
}); | |
return b.taskParent != a | |
}); | |
l.dispatch("killed", r.splice(t--, 1)[0]) | |
} | |
t++; | |
w = (new Date).getTime() - x; | |
return w <= s | |
} | |
function c() { | |
m = !0; | |
o = t = 0; | |
u = x = (new Date).getTime(); | |
l.dispatch("start"); | |
l.dispatch("insertframe"); | |
b(g); | |
return l | |
} | |
function d() { | |
l.dispatch("stop"); | |
m = !1; | |
return l | |
} | |
function i(a, b, d) { | |
if ("function" != typeof a) throw Error('Task "' + b + '" is not a function'); | |
r.push({ | |
taskName: b, | |
task: a | |
}); | |
m = !(!m && !(d && c() || 1)); | |
return l | |
} | |
function a(a) { | |
return a ? Object.keys(p).filter(function (a) { | |
return !!p[a].on | |
}).length : Object.keys(p).length | |
} | |
function f() { | |
Object.keys(p).length ? (l.dispatch("startgenerators"), l.unbind("killed", k), b(function () { | |
for (var a in p) p[a].on = !0, i(p[a].task, a, !1) | |
}), l.bind("killed", k).runTasks()) : l.dispatch("stopgenerators"); | |
return l | |
} | |
function k(b) { | |
void 0 != p[b.content.taskName] && (p[b.content.taskName].del || !p[b.content.taskName].condition() ? delete p[b.content.taskName] : p[b.content.taskName].on = !1, 0 == a(!0) && f()) | |
} | |
sigma.classes.EventDispatcher.call(this); | |
var l = this, | |
m = !1, | |
j = 80, | |
n = 0, | |
o = 0, | |
q = 1E3 / j, | |
s = q, | |
w = 0, | |
u = 0, | |
x = 0, | |
B = 0, | |
p = {}, | |
r = [], | |
z = [], | |
t = 0; | |
this.frequency = function (a) { | |
return void 0 != a ? (j = Math.abs(1 * a), q = 1E3 / j, o = 0, l) : j | |
}; | |
this.runTasks = c; | |
this.stopTasks = d; | |
this.insertFrame = b; | |
this.addTask = i; | |
this.queueTask = function (a, b, c) { | |
if ("function" != typeof a) throw Error('Task "' + b + '" is not a function'); | |
if (!r.concat(z).some(function (a) { | |
return a.taskName == c | |
})) throw Error('Parent task "' + c + '" of "' + b + '" is not attached.'); | |
z.push({ | |
taskParent: c, | |
taskName: b, | |
task: a | |
}); | |
return l | |
}; | |
this.removeTask = function (a, b) { | |
if (void 0 == a) r = [], 1 == b ? z = [] : 2 == b && (r = z, z = []), d(); | |
else { | |
var c = "string" == typeof a ? a : ""; | |
r = r.filter(function (b) { | |
return ("string" == typeof a ? b.taskName == a : b.task == a) ? (c = b.taskName, !1) : !0 | |
}); | |
0 < b && (z = z.filter(function (a) { | |
1 == b && a.taskParent == c && r.push(a); | |
return a.taskParent != c | |
})) | |
} | |
m = !(r.length && (!d() || 1)); | |
return l | |
}; | |
this.addGenerator = function (b, c, d) { | |
if (void 0 != p[b]) return l; | |
p[b] = { | |
task: c, | |
condition: d | |
}; | |
0 == a(!0) && f(); | |
return l | |
}; | |
this.removeGenerator = function (a) { | |
p[a] && (p[a].on = !1, p[a].del = !0); | |
return l | |
}; | |
this.startGenerators = f; | |
this.getGeneratorsIDs = function () { | |
return Object.keys(p) | |
}; | |
this.getFPS = function () { | |
m && (n = Math.round(1E4 * (o / ((new Date).getTime() - u))) / 10); | |
return n | |
}; | |
this.getTasksCount = function () { | |
return r.length | |
}; | |
this.getQueuedTasksCount = function () { | |
return z.length | |
}; | |
this.getExecutionTime = function () { | |
return x - u | |
}; | |
return this | |
}; | |
sigma.debugMode = 0; | |
sigma.log = function () { | |
if (1 == sigma.debugMode) for (var b in arguments) console.log(arguments[b]); | |
else if (1 < sigma.debugMode) for (b in arguments) throw Error(arguments[b]); | |
return sigma | |
}; | |
sigma.easing = { | |
linear: {}, | |
quadratic: {} | |
}; | |
sigma.easing.linear.easenone = function (b) { | |
return b | |
}; | |
sigma.easing.quadratic.easein = function (b) { | |
return b * b | |
}; | |
sigma.easing.quadratic.easeout = function (b) { | |
return -b * (b - 2) | |
}; | |
sigma.easing.quadratic.easeinout = function (b) { | |
return 1 > (b *= 2) ? 0.5 * b * b : -0.5 * (--b * (b - 2) - 1) | |
}; | |
sigma.tools.drawRoundRect = function (b, g, h, c, d) { | |
b.fillStyle = "#009BE1"; | |
b.fillRect(g + e, h + e, c, d) | |
}; | |
sigma.tools.getRGB = function (b, g) { | |
var b = b.toString(), | |
h = { | |
r: 0, | |
g: 0, | |
b: 0 | |
}; | |
if (3 <= b.length && "#" == b.charAt(0)) { | |
var c = b.length - 1; | |
6 == c ? h = { | |
r: parseInt(b.charAt(1) + b.charAt(2), 16), | |
g: parseInt(b.charAt(3) + b.charAt(4), 16), | |
b: parseInt(b.charAt(5) + b.charAt(5), 16) | |
} : 3 == c && (h = { | |
r: parseInt(b.charAt(1) + b.charAt(1), 16), | |
g: parseInt(b.charAt(2) + b.charAt(2), 16), | |
b: parseInt(b.charAt(3) + b.charAt(3), 16) | |
}) | |
} | |
g && (h = [h.r, h.g, h.b]); | |
return h | |
}; | |
sigma.tools.rgbToHex = function (b, g, h) { | |
return sigma.tools.toHex(b) + sigma.tools.toHex(g) + sigma.tools.toHex(h) | |
}; | |
sigma.tools.toHex = function (b) { | |
b = parseInt(b, 10); | |
if (isNaN(b)) return "00"; | |
b = Math.max(0, Math.min(b, 255)); | |
return "0123456789ABCDEF".charAt((b - b % 16) / 16) + "0123456789ABCDEF".charAt(b % 16) | |
}; | |
sigma.publicPrototype = s.prototype | |
})(); |