function renderSignalChart(elementClass) { var elements = document.querySelectorAll("." + elementClass); if (!elements) { return false; } for (var i = 0; i < elements.length; i++) { var points = elements[i].querySelector("input"), canvas = elements[i].querySelector("canvas"), t = 0, context, pointsCount, step, width, height, middleline, min, max, middleHeigh, equator, colors = {}; colors.bg = {}; colors.bg.red = '#fee8e8'; colors.bg.blue = '#e8f4fe'; colors.line = {}; colors.line.red = '#ff0000'; colors.line.blue = '#00afef'; width = elements[i].clientWidth - 4; height = elements[i].clientHeight - 4; middleHeigh = height / 2; points = points.value.split(","); points.shift(); pointsCount = points.length; min = points.min(); max = points.max(); middleline = (max + min) / 2; oneStepY = middleHeigh / (max - middleline); step = width / pointsCount; equator = middleHeigh + oneStepY * middleline; context = canvas.getContext("2d"); function createPointsCoord() { for (t; t < pointsCount; t++) { points[t] = { x: t * step, y: (middleHeigh - (points[t] - middleline) * oneStepY) }; } } createPointsCoord(); function quadraticBezier(p1, p2, p3, t) { return t * (t * (p3 - p2 * 2 + p1) + 2 * (p2 - p1)) + p1; } context.beginPath(); context.lineWidth = 2; context.strokeStyle = points[1].y > equator ? colors.line.red : colors.line.blue; context.fillStyle = points[1].y > equator ? colors.bg.red : colors.bg.blue; context.moveTo(points[0].x, points[0].y); var exit = false, liney = 0; for (t = 1; t < points.length - 2; t++) { var xc = (points[t].x + points[t + 1].x) / 2; var yc = (points[t].y + points[t + 1].y) / 2; liney++;