1
0
Fork 0
tera/Source/HTML/JS/diagram.js

456 lines
12 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

/*
* @project: TERA
* @version: Development (beta)
* @license: MIT (not for evil)
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
* Web: https://terafoundation.org
* Twitter: https://twitter.com/terafoundation
* Telegram: https://t.me/terafoundation
*/
var DiagramMap = {};
var DiagramMapId = {};
var LMouseOn = false;
if(!window.toStaticHTML)
toStaticHTML = function (Str)
{
return Str;
};
function Rigth(Str,Count)
{
if(Str.length < Count)
return Str;
else
return Str.substr(Str.length - Count);
};
function SetHTMLDiagramItem(Item,width)
{
Item.mouseX = width - 50;
if(Item.Extern || Item.Delete)
return ;
var MinHeight = 80;
if(!Item.id)
Item.id = "DgrmId" + Item.num;
DiagramMap[Item.name] = Item;
DiagramMapId[Item.id] = Item;
if(Item.isLine)
{
if(Item.text)
Str = "<BR><B>" + Item.text + '</B><INPUT type="button" class="delete" onclick="DeleteDiagram(\'' + Item.id + '\')" value="X">';
else
Str = "<HR>";
}
else
{
Str = '<BR><DIV>' + Item.text + '<INPUT type="button" class="delete" onclick="DeleteDiagram(\'' + Item.id + '\')" value="X"></DIV>\
<BR><canvas class="DIAGRAM" width="' + width + '" height="' + MinHeight + '" id="' + Item.id + '"></canvas>';
}
var ElBlock = document.getElementById("B" + Item.id);
if(ElBlock)
ElBlock.innerHTML = toStaticHTML(Str);
else
{
var diargams = document.getElementById("diargams");
diargams.innerHTML = toStaticHTML(diargams.innerHTML + "<DIV id='B" + Item.id + "'>" + Str + "</DIV>");
}
};
function SetDiagramMouseX(event,mode)
{
if(event.srcElement && event.srcElement.className && event.srcElement.className.indexOf && event.srcElement.className.indexOf("DIAGRAM") >= 0)
{
if(mode === "down")
LMouseOn = true;
else
if(mode === "up")
LMouseOn = false;
event.preventDefault();
if(LMouseOn === true)
{
var obj = event.srcElement;
var mouse = getMouse(obj, event);
if(event.ctrlKey === true)
{
for(var key in DiagramMapId)
{
var Item = DiagramMapId[key];
Item.mouseX = mouse.x;
DrawDiagram(Item);
}
}
else
{
var Item = DiagramMapId[obj.id];
if(Item)
{
Item.mouseX = mouse.x;
DrawDiagram(Item);
}
}
}
}
};
function DrawDiagram(Item)
{
if(Item.Delete)
return ;
var arr = Item.arr;
if(!arr)
arr = Item.ArrList;
var arrX = Item.arrX;
var GreenValue = Item.value;
var StepTime = Item.steptime;
var StartNumber = Item.startnumber;
var StartServer = Item.starttime;
var mouseX = Item.mouseX;
var KPrecision = Item.KPrecision;
if(!KPrecision)
KPrecision = 1;
if(!arr)
return ;
var obj = document.getElementById(Item.id);
var ctx = obj.getContext('2d');
var Left = 50;
var Top = 11;
var Button = 15;
var Right = 50;
if(Item.fillStyle)
ctx.fillStyle = Item.fillStyle;
else
ctx.fillStyle = "#FFF";
ctx.fillRect(0, 0, obj.width, obj.height);
if(arr.length <= 0)
return ;
var Pow2 = 0;
if(Item.name.substr(Item.name.length - 2) === "**")
Pow2 = 1;
var MaxValue = arr[0];
var MinValue = arr[0];
var AvgValue = 0;
for(var i = 0; i < arr.length; i++)
{
if(arr[i] > MaxValue)
MaxValue = arr[i];
if(arr[i] < MinValue)
MinValue = arr[i];
if(arr[i])
AvgValue += arr[i];
}
if(Item.name.substr(0, 4) !== "MAX:" || !Item.AvgValue)
AvgValue = AvgValue / arr.length;
else
AvgValue = Item.AvgValue;
if(Pow2 && AvgValue)
AvgValue = Math.pow(2, AvgValue) / 1000000;
if(AvgValue < 50)
AvgValue = AvgValue.toFixed(2);
else
AvgValue = Math.floor(AvgValue);
if(Item.MaxValue !== undefined)
MaxValue = Item.MaxValue;
if(Pow2 && MaxValue)
MaxValue = Math.pow(2, MaxValue) / 1000000;
var HValue = MaxValue;
if(HValue <= 0)
HValue = 1;
var KX = (obj.width - Left - Right) / arr.length;
var KY = (obj.height - Top - Button) / HValue;
var DeltaY = 0;
var bLine = Item.line;
if(Item.zero)
{
bLine = 1;
DeltaY -= Item.zero * KY;
MaxValue -= Item.zero;
AvgValue -= Item.zero;
}
MaxValue = Math.floor(MaxValue + 0.5);
if(bLine)
ctx.lineWidth = 3;
else
if(KX > 1)
ctx.lineWidth = KX;
else
ctx.lineWidth = 1;
var StartX = Left;
var StartY = obj.height - Button;
var mouseValueX = 0;
var mouseValue = undefined;
var mouseColor = undefined;
function DrawLines(arr,mode,color)
{
var WasMove0 = 0;
ctx.beginPath();
ctx.moveTo(Left, obj.height - Button);
ctx.strokeStyle = color;
var PrevX = undefined;
for(var i = 0; i < arr.length; i++)
{
var Value = arr[i];
if(!Value)
Value = 0;
if(Value)
{
if(Pow2)
Value = Math.pow(2, Value) / 1000000;
}
if(mode === "green")
{
if(Value > GreenValue)
continue;
}
else
if(mode === "red")
{
if(Value <= GreenValue)
continue;
}
var Value1 = Value;
if(Value1 > GreenValue)
Value1 = GreenValue;
var VX1 = Math.floor(Value1 * KY);
var VX2 = Math.floor(Value * KY);
if(VX1 === VX2)
VX1 -= 2;
var x = StartX + ctx.lineWidth / 2 + (i) * KX;
if(bLine)
{
if(!WasMove0)
{
WasMove0 = 1;
ctx.moveTo(x, StartY - VX2);
}
else
{
ctx.lineTo(x, StartY - VX2);
}
}
else
{
ctx.moveTo(x, StartY - VX1);
ctx.lineTo(x, StartY - VX2);
}
if(mouseX)
{
var deltaCur = Math.abs(x - mouseX);
var deltaWas = Math.abs(mouseValueX - mouseX);
if(deltaCur < deltaWas)
{
mouseValueX = x;
mouseValue = Value;
if(Item.zero)
mouseValue -= Item.zero;
mouseColor = color;
}
}
}
ctx.stroke();
};
if(!Item.red)
Item.red = "#A00";
if(bLine)
{
DrawLines(arr, "line", Item.red);
}
else
{
DrawLines(arr, "red", Item.red);
if(GreenValue > 0)
DrawLines(arr, "green", "#0A0");
}
var MaxValueText = GetValueByItemProperty(MaxValue, Item);
var AvgValueText = GetValueByItemProperty(AvgValue, Item);
ctx.lineWidth = 0.5;
ctx.beginPath();
ctx.strokeStyle = "#000";
Left--;
StartX--;
StartY += 2;
ctx.moveTo(Left, Top);
ctx.lineTo(StartX, StartY);
ctx.moveTo(StartX, StartY + DeltaY);
ctx.lineTo(obj.width - 10, StartY + DeltaY);
ctx.stroke();
if(mouseX !== undefined)
{
ctx.beginPath();
ctx.lineWidth = 0.5;
ctx.strokeStyle = "#00F";
ctx.moveTo(mouseX, Top);
ctx.lineTo(mouseX, StartY);
ctx.stroke();
if(mouseValue !== undefined)
{
ctx.fillStyle = mouseColor;
var Val = GetValueByItemProperty(mouseValue, Item);
var mouseTextX = mouseX;
if(Item.MouseText)
mouseTextX -= 3 * Item.MouseText.length;
else
Item.MouseText = "";
ctx.fillText("" + Val + Item.MouseText, mouseTextX - 3, Top - 2);
}
}
ctx.fillStyle = "#000";
if(!Item.NoTextMax)
ctx.fillText(Rigth("" + MaxValueText, 8), 0, Top - 3);
if(MaxValue > 0 && AvgValue > 0)
{
var heigh = StartY - Top;
var KKY = AvgValue / MaxValue;
var y = (heigh - Math.floor(KKY * heigh));
var yT = y;
if(yT < 10)
{
yT = 10;
}
ctx.beginPath();
ctx.moveTo(Left - 2, y + Top);
ctx.lineTo(Left + 2, y + Top);
ctx.stroke();
ctx.strokeStyle = "#00F";
ctx.fillText(Rigth("" + AvgValueText, 8), 0, yT + Top);
}
var CountNameX = 10;
if(arr.length < CountNameX)
CountNameX = arr.length;
var KX3 = (obj.width - Left - Right) / CountNameX;
var KDelitel = 1;
var Step = arr.length / CountNameX;
var StartTime, bNumber;
if(arrX)
{
}
else
if(StartNumber !== undefined)
{
bNumber = 1;
StartTime = StartNumber;
}
else
if(StartServer)
{
bNumber = 1;
StartTime = Math.floor(((Date.now() - StartServer) - StepTime * arr.length * 1000) / 1000);
if(StartTime < 0)
StartTime = 0;
var KDelitel = Math.floor(Step / 10) * 10;
if(KDelitel == 0)
KDelitel = 1;
}
else
{
bNumber = 0;
StartTime = Date.now() - StepTime * arr.length * 1000;
StartX = StartX - 16;
}
for(i = 0; i <= CountNameX; i++)
{
var Val;
if(i === CountNameX)
{
Val = arr.length * StepTime;
KDelitel = 1;
}
else
if(i === 0)
Val = 0;
else
Val = i * Step * StepTime;
var Str;
if(arrX)
{
Val = Math.floor(Val);
Str = arrX[Val];
if(Str === undefined)
Str = "";
}
else
if(bNumber)
{
Val = Math.floor((StartTime + Val) / KDelitel) * KDelitel;
Str = Val;
}
else
{
var Time = new Date(StartTime + Val * 1000);
Str = "" + Time.getHours();
Str += ":" + Rigth("0" + Time.getMinutes(), 2);
Str += ":" + Rigth("0" + Time.getSeconds(), 2);
}
ctx.fillText(Str, StartX + i * KX3, StartY + 10);
}
};
function GetValueByItemProperty(Value,Item)
{
if(Item.MathPow && Item.MathDiv)
{
Value = Math.pow(Item.MathPow, Value) / Item.MathDiv;
}
var KPrecision = Item.KPrecision;
if(!Item.KPrecision)
KPrecision = 1;
Value = Math.floor(Value * KPrecision + 0.5) / KPrecision;
return Value;
};
function InitDiagramByArr(Arr,width)
{
for(var i = 0; i < Arr.length; i++)
{
Arr[i].num = i + 1;
SetHTMLDiagramItem(Arr[i], width);
}
window.addEventListener('mousedown', function (event)
{
SetDiagramMouseX(event, "down");
}, false);
window.addEventListener('mouseup', function (event)
{
SetDiagramMouseX(event, "up");
}, false);
window.addEventListener('onmousemove', function (event)
{
SetDiagramMouseX(event, "move");
}, false);
};
function getMouse(canvas,e)
{
var x = e.clientX - getTrueOffsetLeft(canvas);
if(window.pageXOffset)
x = x + window.pageXOffset;
var y = e.clientY - getTrueOffsetTop(canvas);
if(window.pageYOffset)
y = y + window.pageYOffset;
var coord = {x:x, y:y};
return coord;
};
function getTrueOffsetLeft(ele)
{
var n = 0;
while(ele)
{
n += ele.offsetLeft || 0;
ele = ele.offsetParent;
}
return n;
};
function getTrueOffsetTop(ele)
{
var n = 0;
while(ele)
{
n += ele.offsetTop || 0;
ele = ele.offsetParent;
}
return n;
};