function BlinkStatus(x, y, w, h) { //Основной прямоугольник var rAll = new Rectangle(x, y, w, h); //Массив цветов статусов var statColor = []; //Текущий статус var status = -1; /*Проценты поднимаются снизу вверх (false) *или слева направо (true)*/ var rotate = false; /*Функции для работы с координатами * основного прямоугольника */ this.X = function (val) { if (val === undefined) return rAll().X(); rAll().X(val); }; this.Y = function (val) { if (val === undefined) return rAll().Y(); rAll().Y(val); }; this.W = function (val) { if (val === undefined) return rAll().W(); rAll().W(val); }; this.H = function (val) { if (val === undefined) return rAll().H(); rAll().H(val); }; //Установка статуса от -1 до (кол-во элементов в массиве статусов - 1) this.Status = function (val) { if (val === undefined) return status; var v = parseInt(val); status = (isNaN(v) || v < -1) ? -1 : v >= statColor.length ? (statColor.length - 1) : v; }; //Количество статусов this.StatCount = function () { return statColor.length; }; //Функция изменения начальной координаты и размеров прямоугольника this.RectParam = function (_x, _y, _w, _h) { rAll.RectParam(_x, _y, _w, _h); }; //Функция изменения прямоугольника по другому прямоугольнику this.Rect = function (val) { if (val === undefined) return rAll; rAll.Rect(val); }; //Изменение направления отрисовки текста this.Rotate = function (val) { if (val === undefined) return rotate; rotate = (typeof val === 'boolean') ? val : false; }; //Установка нового статуса this.AddStatus = function (index, color) { if (color === undefined) color = '#000'; var c = color.match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i); c = (c === null) ? '#000000' : c[0]; var idx = parseInt(index); if (isNaN(idx) || idx < 0 || idx > statColor.length - 1) statColor.push(c); else statColor.splice(idx, 0, c); }; //Изменение статуса this.ChangeStatus = function (index, color) { if (color === undefined) color = '#000'; var c = color.match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i); c = (c === null) ? '#000000' : c[0]; var idx = parseInt(index); if (!isNaN(idx) && idx >= 0 && idx < statColor.length) statColor.splice(idx, 1, c); }; //Удаление статуса this.DelStatus = function (index) { var idx = parseInt(index); if (!isNaN(idx) && idx >= 0 && idx < statColor.length) statColor.splice(idx, 1); else if (statColor.length > 0) statColor.pop(); }; //Заполнение мигалки по умолчанию this.BuildDefault = function () { var defaultColor = ['#00f', '#f00', '#0f0']; for (var i = 0; i < defaultColor.length; i++) this.AddStatus(0, defaultColor[i]); }; //Печать мигалки this.Print = function (ctx) { ctx.fillStyle = status >= 0 && status < statColor.length ? statColor[status] : '#ddd'; ctx.fillRect(rAll.X(), rAll.Y(), rAll.W(), rAll.H()); ctx.strokeStyle = '#000'; //'#333' ctx.strokeRect(rAll.X(), rAll.Y(), rAll.W(), rAll.H()); }; //Печать текста мигалки this.PrintText = function (ctx) { ctx.save(); ctx.translate(rAll.X() + rAll.W() / 2, rAll.Y() + rAll.H() / 2); if (rotate) ctx.rotate(3 * Math.PI / 2); ctx.fillStyle = '#888'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; if (rotate) ctx.font = (rAll.W() - 2 < 0 ? 0 : rAll.W() - 2) + 'px Arial'; else ctx.font = (rAll.H() - 2 < 0 ? 0 : rAll.H() - 2) + 'px Arial'; ctx.fillText((status + 1) + '/' + statColor.length, 0, 0); ctx.restore(); }; }