(function(SKY){ class SKYEditor extends SKY.prototypes.SKYBase { constructor(placeholder,pattern){ super(); this.html($('')); if (pattern) this.html().attr("pattern", pattern); if (placeholder) this.html().attr("placeholder", placeholder); this.html().on("input", ()=>this.changed( this.html().data("value") != this.html().val() ) ); this.html().data("value", null); } id(id){ if (arguments.length) { this.html().attr("id", id); return this; } return this.html().attr("id"); } value(value){ if (arguments.length) { this._html .val(value) .data("value", value); return this; } return this._html.val(); } changed(changed){ if (arguments.length) { this._changed = (changed) ? true : false; if (this._changed) this.html().addClass("changed"); else this.html().removeClass("changed"); return this; } return this._changed; } valid(){ return this._html[0].checkValidity(); } } SKY.prototypes.SKYEditor = SKYEditor; class SKYSelector extends SKY.prototypes.SKYBase { constructor(){ super(); } value(value){ if (arguments.length){ return this; } return null; } appendTo(parent){ this.html().appendTo(parent); return this; } enable(en){ if (arguments.length) { this.enabled = en; if (en) this.html().removeAttr("disabled"); else this.html().attr("disabled", ""); return this; } return this.enabled; } } SKY.prototypes.SKYSelector = SKYSelector; class SKYIntEditor extends SKYEditor { constructor(){ super(); this._html.attr("type","number"); } } class SKYTimeSpanEditor extends SKYEditor { constructor(){ super("0d 00:00:00","^([0-9]{1,}d){0,1} {0,}([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})$"); } value(value){ if (arguments.length) { this._html .val(SKY.type("timespan").render(value)) .data("value", value); return this; } return SKY.type("timespan").parse(this._html.val()); } } class SKYType { constructor(name){ SKY.type(name,Object.getPrototypeOf(this)); } editor(id){ return new SKYEditor().id(id); } selector(id){ return null; } render(value){ return value; } parse(value){ return value; } } SKY.prototypes.SKYType = SKYType; class SKYIntType extends SKYType { constructor(){ super("int"); } editor(id){ return new SKYIntEditor().id(id); } } class SKYIPv4Type extends SKYType { constructor(){ super("ipv4"); } editor(id){ return new SKYEditor("000.000.000.000","^[0-9]([0-9]){0,2}\.[0-9]([0-9]){0,2}\.[0-9]([0-9]){0,2}\.[0-9]([0-9]){0,2}").id(id); } } class SKYNetwork4Type extends SKYType { constructor(){ super("network4"); } editor(id){ return new SKYEditor("000.000.000.000/00","^[0-9]([0-9]){0,2}\.[0-9]([0-9]){0,2}\.[0-9]([0-9]){0,2}\.[0-9]([0-9]){0,2}\/[0-9]([0-9]){0,1}$").id(id); } } class SKYTimeSpanType extends SKYType { constructor(){ super("timespan"); } editor(id){ return new SKYTimeSpanEditor().id(id); } render(value){ var days, hours, minutes, seconds; value = parseInt(value); days = parseInt(value / 86400); value %= 86400; hours = parseInt(value / 3600); value %= 3600; minutes = parseInt(value / 60); value %= 60; seconds = parseInt(value); var r = ""; if (days > 0) r += `${days}d `; r += `${SKY.tools.ntos(hours,2)}:${SKY.tools.ntos(minutes,2)}:${SKY.tools.ntos(seconds,2)}`; return r; } parse(t){ var tokens = t.match("^([0-9]{1,}d){0,1} {0,}([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})$"); var days,hours,minutes,seconds; days = tokens[1] ? tokens[1].substr(0,tokens[1].length-1) : 0; hours = tokens[2] || 0; minutes = tokens[3] || 0; seconds = tokens[4] || 0; return parseInt(days * 86400) + parseInt(hours * 3600) + parseInt(minutes * 60) + parseInt(seconds); } } new SKYType(null); new SKYIntType(); new SKYIPv4Type(); new SKYNetwork4Type(); new SKYTimeSpanType(); }(SKY));