${this.content}
@@ -587,22 +586,18 @@ var ts = (function (exports, $) {
`);
}
open() {
- $('body')
- .css('padding-right', '13px')
- .css('overflow-x', 'hidden')
- .addClass('modal-open');
+ $('body').addClass('modal-open');
this.container.append(this.elem);
this.elem.show();
+ this.elem.modal('show');
this.is_open = true;
this.trigger('on_open');
}
close() {
if ($('.modal:visible').length === 1) {
- $('body')
- .css('padding-right', '')
- .css('overflow-x', 'auto')
- .removeClass('modal-open');
+ $('body').removeClass('modal-open');
}
+ this.elem.modal('hide');
this.elem.remove();
this.is_open = false;
this.trigger('on_close');
diff --git a/treibstoff/bundle/treibstoff.bundle.min.js b/treibstoff/bundle/treibstoff.bundle.min.js
index 9d9c479..b34aa71 100644
--- a/treibstoff/bundle/treibstoff.bundle.min.js
+++ b/treibstoff/bundle/treibstoff.bundle.min.js
@@ -1 +1 @@
-var ts=function(t,e){"use strict";function s(t,e,s){console.log(`DEPRECATED: ${t} is deprecated and will be removed as of ${s}. Use ${e} instead.`)}function i(t,s,i=!0){let n=e(t,s);if(i&&n.length>1)throw`Element by selector ${t} not unique.`;return n.length?n:null}function n(t,e,s=!0){let n=i(t,e,s);if(null===n)throw`Element by selector ${t} not found.`;return n}function r(t,e){e?t.removeClass("hidden"):t.addClass("hidden")}function a(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(t=>(t^crypto.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)))}function o(t,e,s){return void 0===t[e]&&(t[e]=s),t[e]}function l(t,e){return t.charAt(t.length-1)===e&&(t=t.substring(0,t.length-1)),t}function h(t){let e=document.createElement("a");e.href=t;let s=e.pathname;return l(t=e.protocol+"//"+e.host+s,"/")}function c(t,e){let s=document.createElement("a");s.href=t;let i=s.search;if(e)return i||"";let n={};if(i){let t=i.substring(1,i.length).split("&");for(let e=0;e
${e[1]}`);this.handle_input(t,e)}handle_button(t,e){let s=e["t-prop"];if(!s)return;let i=this.widget;new w(i,s,{ctx:t,ctxa:e["t-elem"],val:e["t-val"]});for(let t of["down","up","click"])if(e[`t-bind-${t}`]){let n=i[e[`t-bind-${t}`]].bind(i);this.widget.on(`on_${s}_${t}`,n)}}}function C(t,s,i){let n=e(s.trim());i&&i.append(n);let r=new k(t);return n.each((function(){r.walk(this)})),n}class $ extends y{}class A{constructor(){this._subscribers={},this._suppress_events=!1}on(t,e){let s=this._subscribers[t];return void 0===s&&(this._subscribers[t]=s=new Array),this._contains_subscriber(t,e)||s.push(e),this}off(t,e){let s=this._subscribers[t];if(void 0===s)return this;if(!e)return delete this._subscribers[t],this;let i=s.indexOf(e);return i>-1&&(s=s.splice(i,1)),this._subscribers[t]=s,this}trigger(t,...e){if(this._suppress_events)return;this[t]&&this[t](...e);let s=this._subscribers[t];if(!s)return this;for(let t=0;t\n \n
\n \n
${this.content}
\n \n
\n
\n \n `)}open(){e("body").css("padding-right","13px").css("overflow-x","hidden").addClass("modal-open"),this.container.append(this.elem),this.elem.show(),this.is_open=!0,this.trigger("on_open")}close(){1===e(".modal:visible").length&&e("body").css("padding-right","").css("overflow-x","auto").removeClass("modal-open"),this.elem.remove(),this.is_open=!1,this.trigger("on_close")}}function S(t){let s=e(`#${t}`);if(!s.length)return null;let i=s.data("overlay");return i||null}class T extends E{constructor(t){t.content=t.message?t.message:t.content,t.css=t.flavor?t.flavor:t.css,super(t),this.compile_actions()}compile_actions(){C(this,'\n
\n ',this.footer)}}function O(t){new T({title:t.title,message:t.message,flavor:t.flavor,on_open:function(t){e("button",t.elem).first().focus()}}).open()}function q(t){O({title:"Info",message:t,flavor:"info"})}function N(t){O({title:"Warning",message:t,flavor:"warning"})}function P(t){O({title:"Error",message:t,flavor:"error"})}class L extends T{constructor(t){o(t,"css","dialog"),super(t),this.bind_from_options(["on_confirm"],t)}compile_actions(){C(this,'\n
\n
\n ',this.footer)}on_ok_btn_click(){this.close(),this.trigger("on_confirm")}}function D(t){new L({title:t.title,message:t.message,on_confirm:t.on_confirm}).open()}class M{constructor(){this._count=0,this.compile()}compile(){C(this,'\n
\n

\n
\n ')}show(){this._count++,this._count>1||e("body").append(this.elem)}hide(t){if(this._count--,t)return this._count=0,void this.elem.remove();this._count<=0&&(this._count=0,this.elem.remove())}}const F=new M;class I{constructor(t){this.spinner=o(t,"spinner",null),this.default_403=o(t,"default_403","/login"),this._win=o(t,"win",window)}execute(t){if(-1!==t.url.indexOf("?")){let e=t.params;t.params=c(t.url),t.url=h(t.url);for(let s in e)t.params[s]=e[s]}else o(t,"params",{});o(t,"error",((t,e,s)=>{403!==parseInt(e,10)?P(`
${e}${s}`):this.redirect(this.default_403)})),this.show_spinner(),e.ajax({url:t.url,dataType:o(t,"type","html"),data:t.params,method:o(t,"method","GET"),success:(e,s,i)=>{this.hide_spinner(),t.success(e,s,i)},error:(e,s,i)=>{0!==e.status?(s=e.status||s,i=e.statusText||i,this.hide_spinner(!0),t.error(e,s,i)):this.hide_spinner(!0)},cache:o(t,"cache",!1)})}redirect(t){const e=this._win.location;e.hash="",e.pathname=t}show_spinner(){null!==this.spinner&&this.spinner.show()}hide_spinner(t){null!==this.spinner&&this.spinner.hide(t)}}function W(t){new I({spinner:o(t,"spinner",F),win:o(t,"win",window),default_403:o(t,"default_403","/login")}).execute(t)}class G extends A{parse_target(t){return{url:t?h(t):void 0,params:t?c(t):{},path:t?d(t):void 0,query:t?c(t,!0):void 0}}parse_definition(t){return t.replace(/\s+/g," ").split(" ")}action_target(t,e){return e.ajaxtarget?e.ajaxtarget:this.parse_target(t.attr("ajax:target"))}}class H extends G{constructor(t){super(),this.event=t.event,this.dispatcher=t.dispatcher,this.dispatcher.on(this.event,this.handle.bind(this))}execute(t){throw"Abstract AjaxOperation does not implement execute"}handle(t,e){throw"Abstract AjaxOperation does not implement handle"}}class R extends H{constructor(t){t.event="on_path",super(t),this.win=t.win,e(this.win).on("popstate",this.state_handle.bind(this))}execute(t){let e=this.win.history;if(void 0===e.pushState)return;let s="/"!==t.path.charAt(0)?`/${t.path}`:t.path;o(t,"target",this.win.location.origin+s),o(t,"replace",!1);let i=t.replace;delete t.path,delete t.replace,t._t_ajax=!0,i?e.replaceState(t,"",s):e.pushState(t,"",s)}state_handle(t){let e,s=t.originalEvent.state;s&&s._t_ajax&&(t.preventDefault(),e=s.target.url?s.target:this.parse_target(s.target),e.params.popstate="1",s.action&&this.dispatcher.trigger("on_action",{target:e,action:s.action}),s.event&&this.dispatcher.trigger("on_event",{target:e,event:s.event}),s.overlay&&this.dispatcher.trigger("on_overlay",{target:e,overlay:s.overlay,css:s.overlay_css,uid:s.overlay_uid,title:s.overlay_title}),s.action||s.event||s.overlay||(this.win.location=e.url))}handle(t,e){let s,i=e.elem,n=e.event,r=i.attr("ajax:path");if("href"===r){r=d(i.attr("href"),!0)}else if("target"===r){let t=this.action_target(i,n);r=t.path+t.query}if(this.has_attr(i,"ajax:path-target")){let t=i.attr("ajax:path-target");t&&(s=this.parse_target(t))}else s=this.action_target(i,n);let a={path:r,target:s};a.action=this.attr_val(i,"ajax:path-action","ajax:action"),a.event=this.attr_val(i,"ajax:path-event","ajax:event"),a.overlay=this.attr_val(i,"ajax:path-overlay","ajax:overlay"),a.overlay&&(a.overlay_css=this.attr_val(i,"ajax:path-overlay-css","ajax:overlay-css"),a.overlay_uid=this.attr_val(i,"ajax:path-overlay-uid","ajax:overlay-uid"),a.overlay_title=this.attr_val(i,"ajax:path-overlay-title","ajax:overlay-title")),this.execute(a)}has_attr(t,e){let s=t.attr(e);return void 0!==s&&!1!==s}attr_val(t,e,s){return this.has_attr(t,e)?t.attr(e):t.attr(s)}}class V extends H{constructor(t){o(t,"event","on_action"),super(t),this.spinner=t.spinner,this._handle=t.handle,this._request=t.request}execute(t){t.success=this.complete.bind(this),this.request(t)}request(t){t.params["ajax.action"]=t.name,t.params["ajax.mode"]=t.mode,t.params["ajax.selector"]=t.selector,this._request.execute({url:h(t.url)+"/ajaxaction",type:"json",params:t.params,success:t.success})}complete(t){t?(this._handle.update(t),this._handle.next(t.continuation)):(P("Empty Response"),this.spinner.hide())}handle(t,e){let s=e.target,i=e.action;for(let t of this.parse_definition(i)){let e=t.split(":");this.execute({name:e[0],selector:e[1],mode:e[2],url:s.url,params:s.params})}}}class B extends H{constructor(t){t.event="on_event",super(t)}execute(t){let s=this.create_event.bind(this);e(t.selector).each((function(){e(this).trigger(s(t.name,t.target,t.data))}))}create_event(t,s,i){let n=e.Event(t);return s.url?n.ajaxtarget=s:n.ajaxtarget=this.parse_target(s),n.ajaxdata=i,n}handle(t,e){let s=e.target,i=e.event;for(let t of this.parse_definition(i)){let e=t.split(":");this.execute({name:e[0],selector:e[1],target:s})}}}class z extends V{constructor(t){t.event="on_overlay",super(t),this.overlay_content_sel=".modal-body"}execute(t){let e,s,i;if(t.close)return e=S(t.uid),e&&e.close(),e;if(t.target){let e=t.target;e.url||(e=this.parse_target(e)),s=e.url,i=e.params}else s=t.url,i=t.params;let n=t.uid?t.uid:a();return i["ajax.overlay-uid"]=n,e=new E({uid:n,css:t.css,title:t.title,on_close:t.on_close}),this.request({name:t.action,selector:`#${n} ${this.overlay_content_sel}`,mode:"inner",url:s,params:i,success:function(t){t.payload?(e.open(),this.complete(t)):this.complete(t)}.bind(this)}),e}handle(t,e){let s=e.target,i=e.overlay;i.indexOf("CLOSE")>-1?this.execute({close:!0,uid:i.indexOf(":")>-1?i.split(":")[1]:e.uid}):this.execute({action:i,url:s.url,params:s.params,css:e.css,uid:e.uid,title:e.title})}}class J{constructor(t){this.handle=t.handle,this.spinner=t.spinner,this.afr=null}bind(t){this.afr||C(this,'\n
\n ',e("body")),e(t).append('
').attr("target","ajaxformresponse").off().on("submit",function(t){this.spinner.show()}.bind(this))}render(t){this.spinner.hide(),t.error||(this.afr.remove(),this.afr=null),t.payload&&this.handle.update(t),this.handle.next(t.next)}}class U extends G{bind(t,s){e(t).off(s).on(s,this.dispatch_handle.bind(this))}dispatch_handle(t){t.preventDefault(),t.stopPropagation();let s=e(t.currentTarget),i={elem:s,event:t};s.attr("ajax:confirm")?D({message:s.attr("ajax:confirm"),on_confirm:function(t){this.dispatch(i)}.bind(this)}):this.dispatch(i)}dispatch(t){let e=t.elem,s=t.event;e.attr("ajax:action")&&this.trigger("on_action",{target:this.action_target(e,s),action:e.attr("ajax:action")}),e.attr("ajax:event")&&this.trigger("on_event",{target:e.attr("ajax:target"),event:e.attr("ajax:event")}),e.attr("ajax:overlay")&&this.trigger("on_overlay",{target:this.action_target(e,s),overlay:e.attr("ajax:overlay"),css:e.attr("ajax:overlay-css"),uid:e.attr("ajax:overlay-uid"),title:e.attr("ajax:overlay-title")}),e.attr("ajax:path")&&this.trigger("on_path",{elem:e,event:s})}}class K extends b{parse(t){let e=t._ajax_attached;if(void 0!==e)for(let t of e)void 0!==t.destroy&&t.destroy()}}class X extends G{constructor(t){super(),this.ajax=t,this.spinner=t.spinner}destroy(t){let e=new K;t.each((function(){e.walk(this)}))}update(t){let s,i=t.payload,n=t.selector,r=t.mode;if("replace"===r){let t=e(n);this.destroy(t),t.replaceWith(i),s=e(n),s.length?this.ajax.bind(s.parent()):this.ajax.bind(e(document))}else"inner"===r&&(s=e(n),this.destroy(s.children()),s.html(i),this.ajax.bind(s))}next(t){if(t&&t.length){this.spinner.hide();for(let s of t){let t=s.type;if(delete s.type,"path"===t)this.ajax.path(s);else if("action"===t){let t=this.parse_target(s.target);s.url=t.url,s.params=t.params,this.ajax.action(s)}else if("event"===t)this.ajax.trigger(s);else if("overlay"===t){let t=this.parse_target(s.target);s.url=t.url,s.params=t.params,this.ajax.overlay(s)}else"message"===t&&(s.flavor?O({message:s.payload,flavor:s.flavor}):e(s.selector).html(s.payload))}}}}class Y extends b{constructor(t){super(),this.dispatcher=t.dispatcher,this.form=t.form}parse(t){let e=this.node_attrs(t);if(e["ajax:bind"]&&(e["ajax:action"]||e["ajax:event"]||e["ajax:overlay"])){let s=e["ajax:bind"];this.dispatcher.bind(t,s)}e["ajax:form"]&&this.form.bind(t),"form"===t.tagName.toLowerCase()&&t.className.split(" ").includes("ajax")&&this.form.bind(t)}}class Q extends G{constructor(t=window){super(),this.win=t,this.binders={};let e=this.spinner=F,s=this.dispatcher=new U,i=this._request=new I({win:t});this._path=new R({dispatcher:s,win:t}),this._event=new B({dispatcher:s});let n=new X(this),r={dispatcher:s,win:t,handle:n,spinner:e,request:i};this._action=new V(r),this._overlay=new z(r),this._form=new J({handle:n,spinner:e}),this._is_bound=!1}register(t,e){let s="binder_"+a();for(;void 0!==this.binders[s];)s="binder_"+a();this.binders[s]=t,e&&this._is_bound&&t()}bind(t){this._is_bound=!0;let e=new Y({dispatcher:this.dispatcher,form:this._form});t.each((function(){e.walk(this)}));for(let e in this.binders)try{this.binders[e](t)}catch(t){console.log(t)}return t}attach(t,s){if(s instanceof e){if(1!=s.length)throw"Instance can be attached to exactly one DOM element";s=s[0]}void 0===s._ajax_attached&&(s._ajax_attached=[]),s._ajax_attached.push(t)}path(t){this._path.execute(t)}action(t){this._action.execute(t)}trigger(t){arguments.length>1&&(s("Calling Ajax.event with positional arguments","opts","1.0"),t={name:arguments[0],selector:arguments[1],target:arguments[2],data:arguments[3]}),this._event.execute(t)}overlay(t){return this._overlay.execute(t)}form(t){this._form.render(t)}parseurl(t){return s("ts.ajax.parseurl","ts.parse_url","1.0"),h(t)}parsequery(t,e){return s("ts.ajax.parsequery","ts.parse_query","1.0"),c(t,e)}parsepath(t,e){return s("ts.ajax.parsepath","ts.parse_path","1.0"),d(t,e)}parsetarget(t){return s("ts.ajax.parsetarget","ts.ajax.parse_target","1.0"),this.parse_target(t)}message(t,e=""){s("ts.ajax.message","ts.show_message","1.0"),O({message:t,flavor:e})}info(t){s("ts.ajax.info","ts.show_info","1.0"),q(t)}warning(t){s("ts.ajax.warning","ts.show_warning","1.0"),N(t)}error(t){s("ts.ajax.error","ts.show_error","1.0"),P(t)}dialog(t,e){s("ts.ajax.dialog","ts.show_dialog","1.0"),D({message:t.message,on_confirm:function(){e(t)}})}request(t){s("ts.ajax.request","ts.http_request","1.0"),W(t)}}let Z=new Q;e.fn.tsajax=function(){return Z.bind(this),this};class tt{constructor(t,...e){this._request_id=window.requestAnimationFrame((s=>{t(s,...e)}))}cancel(){null!==this._request_id&&(window.cancelAnimationFrame(this._request_id),this._request_id=null)}}class et{constructor(t,e,...s){this._timeout_id=window.setTimeout((()=>{t(document.timeline.currentTime,...s)}),e)}cancel(){null!==this._timeout_id&&(window.clearTimeout(this._timeout_id),this._timeout_id=null)}}class st{constructor(t,e,...s){this._interval_id=window.setInterval((()=>{t(document.timeline.currentTime,this,...s)}),e)}cancel(){null!==this._interval_id&&(window.clearInterval(this._interval_id),this._interval_id=null)}}class it{schedule_frame(t,...e){return new tt(t,...e)}schedule_timeout(t,e,...s){return new et(t,e,...s)}schedule_interval(t,e,...s){return new st(t,e,...s)}}let nt=new it;function rt(t,e=null){if(!((e=e||A)===A||e.prototype instanceof A))throw"Base class must be subclass of or Events";return class extends e{constructor(s){e===A?super():super(s);let i=this.elem;if(i||void 0===s||(i=this.elem=s.elem),!i)throw"No element found";i.on(t,(e=>{this.trigger(`on_${t}`,e)}))}}}let at=rt("click"),ot=rt("change"),lt=t=>rt("change",t);class ht extends A{constructor(){super(),this._down_handle=null,this._down_scope=null,this._move_scope=null}reset_state(){this._move_handle=null,this._up_handle=null,this._prev_pos=null,this._motion=null}set_scope(t,s){if(this._up_handle)throw"Attempt to set motion scope while handling";this.reset_state(),this._down_handle&&e(this._down_scope).off("mousedown",this._down_handle),this._down_handle=this._mousedown.bind(this),this._down_scope=t,e(t).on("mousedown",this._down_handle),this._move_scope=s||null}_mousedown(t){t.stopPropagation(),this._motion=!1,this._prev_pos={x:t.pageX,y:t.pageY},this._move_scope&&(this._move_handle=this._mousemove.bind(this),e(this._move_scope).on("mousemove",this._move_handle)),this._up_handle=this._mouseup.bind(this),e(document).on("mouseup",this._up_handle),this.trigger("down",t)}_mousemove(t){t.stopPropagation(),this._motion=!0,t.motion=this._motion,t.prev_pos=this._prev_pos,this.trigger("move",t),this._prev_pos.x=t.pageX,this._prev_pos.y=t.pageY}_mouseup(t){t.stopPropagation(),this._move_scope&&e(this._move_scope).off("mousemove",this._move_handle),e(document).off("mouseup",this._up_handle),t.motion=this._motion,this.trigger("up",t),this.reset_state()}}class ct extends ht{constructor(t){super(),this.children=[],new g(this,"parent"),this.parent=t.parent||null}add_widget(t){t.parent=this,this.children.push(t)}remove_widget(t){t.parent=null,this.children.splice(this.children.indexOf(t),1)}acquire(t){let e=this.parent;for(;e&&e&&!(e instanceof t);)e=e.parent;return e}}class dt extends ct{constructor(t){super(t),this.elem=t.elem,new v(this,"x",{tgt:"left"}),new v(this,"y",{tgt:"top"}),new v(this,"width"),new v(this,"height")}get offset(){return e(this.elem).offset()}}class ut extends A{constructor(t){if(!t.elem)throw"No element given";super(),this.elem=t.elem}get visible(){return!this.elem.hasClass("hidden")}set visible(t){let e=t!==!this.elem.hasClass("hidden");r(this.elem,t),e&&this.trigger("on_visible",t)}get hidden(){return!this.visible}set hidden(t){this.visible=!t}}function _t(t,e){if(t.elem)return t.elem;let s=t.form,i=t.name;return n(`${e}-${s.name}-${i}`,s.elem,!0)}class pt extends A{constructor(t){super(),this.form=t.form,this.name=t.name,this.elem=_t(t,"#input")}get value(){return this.elem.val()}set value(t){this.elem.val(t)}get disabled(){return this.elem.prop("disabled")}set disabled(t){this.elem.prop("disabled",t)}}class mt extends(lt(pt)){constructor(t){t.elem=_t(t,"#input"),super(t)}get options(){return this.elem.prop("options")}set options(t){this.clear();let e=this.elem[0];for(let s of t)s instanceof Option?e.add(s):e.add(new Option(s[1],s[0]))}clear(){this.elem.empty()}}class gt extends(lt(pt)){constructor(t){t.elem=_t(t,"#input"),super(t)}get checked(){return this.elem.is(":checked")}set checked(t){return this.elem.prop("checked",t)}}return e((function(){Z.spinner.hide(),e(document).tsajax()})),t.Ajax=Q,t.AjaxAction=V,t.AjaxDestroy=K,t.AjaxDispatcher=U,t.AjaxEvent=B,t.AjaxForm=J,t.AjaxHandle=X,t.AjaxOperation=H,t.AjaxOverlay=z,t.AjaxParser=Y,t.AjaxPath=R,t.AjaxUtil=G,t.AttrProperty=class extends f{set(t){this.ctx.attr(this.tgt,t),super.set(t)}},t.BoundProperty=f,t.Button=class extends at{constructor(t){super(t),this.unselected_class="btn-primary",this.selected_class="btn-success"}get selected(){return this.elem.hasClass(this.selected_class)}set selected(t){t?this.elem.removeClass(this.unselected_class).addClass(this.selected_class):this.elem.removeClass(this.selected_class).addClass(this.unselected_class)}},t.ButtonProperty=w,t.CSSProperty=v,t.ChangeListener=ot,t.ClickListener=at,t.Clock=it,t.ClockFrameEvent=tt,t.ClockIntervalEvent=st,t.ClockTimeoutEvent=et,t.Collapsible=class{constructor(t){if(!t.elem)throw"No element given";this.elem=t.elem}get collapsed(){return!this.elem.hasClass("in")}set collapsed(t){t?this.elem.collapse("hide"):this.elem.collapse("show")}},t.DataProperty=class extends f{constructor(t,e,s){s?s.ctx=void 0!==s.ctx?s.ctx:t.data:s={ctx:t.data},s.ctxa="data",super(t,e,s)}set(t){this.ctx[this.tgt]=t,super.set(t)}},t.Dialog=L,t.Events=A,t.Form=class{static initialize(t,e,s){let n=i(`#form-${s}`,t,!0);if(!n)return;let r=new e({name:s,elem:n});n.data(s,r)}static instance(t){return e(`#form-${t}`).data(t)}constructor(t){this.name=t.name,this.elem=t.elem}set_field_visibility(t,e){for(let s of t)s.visible=e}},t.FormCheckbox=gt,t.FormField=class extends ut{constructor(t){t.elem=_t(t,"#field"),super(t),this.form=t.form,this.name=t.name;let e=t.input;!e||e instanceof pt||(e=new e({form:this.form,name:this.name})),this.input=e}get has_error(){return this.elem.hasClass("has-error")}set has_error(t){let e=this.elem;t?e.addClass("has-error"):e.removeClass("has-error")}reset(t=""){this.input.value=t,this.has_error=!1,e(".help-block",this.elem).remove()}},t.FormInput=pt,t.FormRemoteSelect=class extends mt{constructor(t){super(t),this.vocab=t.vocab}fetch(t){W({type:"json",url:this.vocab,params:t,success:function(t,e,s){this.options=t}.bind(this)})}},t.FormSelect=mt,t.HTMLParser=k,t.HTMLWidget=dt,t.HTTPRequest=I,t.InputProperty=x,t.KeyState=class extends A{constructor(t){super(),this.filter_keyevent=t,this._keys=[],this._add_key("ctrl",17),this._add_key("shift",16),this._add_key("alt",18),this._add_key("enter",13),this._add_key("esc",27),this._add_key("delete",46),this.bind()}unload(){e(window).off("keydown",this._on_dom_keydown).off("keyup",this._on_dom_keyup)}bind(){this._on_dom_keydown=this._on_dom_keydown.bind(this),this._on_dom_keyup=this._on_dom_keyup.bind(this),e(window).on("keydown",this._on_dom_keydown).on("keyup",this._on_dom_keyup)}_add_key(t,e){this._keys.push(t),this[`_${t}`]=!1,Object.defineProperty(this,t,{get:function(){return this[`_${t}`]},set:function(s){let i=this[`_${t}`];"keydown"==s.type?i||s.keyCode!=e||(this[`_${t}`]=!0):i&&s.keyCode==e&&(this[`_${t}`]=!1)}})}_set_keys(t){for(let e of this._keys)this[e]=t}_filter_event(t){return this.filter_keyevent&&this.filter_keyevent(t)}_on_dom_keydown(t){this._set_keys(t),this._filter_event(t)||this.trigger("keydown",t)}_on_dom_keyup(t){this._set_keys(t),this._filter_event(t)||this.trigger("keyup",t)}},t.LoadingSpinner=M,t.Message=T,t.Motion=ht,t.Overlay=E,t.Parser=b,t.Property=g,t.SVGContext=class extends dt{constructor(t){let e=t.parent.elem.get(0);t.elem=p("svg",{class:t.name},e),super(t),this.svg_ns=u,this.xyz={x:0,y:0,z:1}}svg_attrs(t,e){_(t,e)}svg_elem(t,e,s){return p(t,e,s)}},t.SVGParser=$,t.SVGProperty=class extends f{set(t){let e={};e[this._name]=t,_(this.ctx,e),super.set(t)}},t.TemplateParser=y,t.TextProperty=class extends f{set(t){this.ctx.text(t),super.set(t)}},t.Visibility=ut,t.WS_STATE_CLOSED=3,t.WS_STATE_CLOSING=2,t.WS_STATE_CONNECTING=0,t.WS_STATE_OPEN=1,t.Websocket=class extends A{constructor(t,e=WebSocket){super(),this._ws_factory=e,this.path=t,this.on_open=this.on_open.bind(this),this.on_close=this.on_close.bind(this),this.on_error=this.on_error.bind(this),this.on_message=this.on_message.bind(this),this.on_raw_message=this.on_raw_message.bind(this),this.sock=null}get uri(){let t;return t="http:"==window.location.protocol?"ws://":"wss://",t+window.location.hostname+this.path}get state(){return this.sock.readyState}open(){null!==this.sock&&this.sock.close();let t=this.sock=new this._ws_factory(this.uri);t.onopen=function(){this.trigger("on_open")}.bind(this),t.onclose=function(t){this.trigger("on_close",t)}.bind(this),t.onerror=function(){this.trigger("on_error")}.bind(this),t.onmessage=function(t){this.trigger("on_raw_message",t)}.bind(this)}send(t){this.sock.send(t)}send_json(t){this.sock.send(JSON.stringify(t))}close(){null!==this.sock&&(this.sock.close(),this.sock=null)}on_open(){}on_close(t){}on_error(){}on_message(t){}on_raw_message(t){let e=JSON.parse(t.data);void 0===e.HEARTBEAT&&this.trigger("on_message",e)}},t.Widget=ct,t.ajax=Z,t.changeListener=lt,t.clickListener=t=>rt("click",t),t.clock=nt,t.compile_svg=function(t,e,s){let i=m(e,s),n=new $(t);return i.forEach((function(t,e){n.walk(t)})),i},t.compile_template=C,t.create_cookie=function(t,e,s){var i,n;s?((i=new Date).setTime(i.getTime()+24*s*60*60*1e3),n="; expires="+i.toGMTString()):n="",document.cookie=t+"="+escape(e)+n+"; path=/;"},t.create_listener=rt,t.create_svg_elem=p,t.deprecate=s,t.extract_number=j,t.get_elem=n,t.get_overlay=S,t.http_request=W,t.json_merge=function(t,e){let s={};for(let i of[t,e])for(let t in i)s[t]=i[t];return s},t.load_svg=function(t,s){e.get(t,function(t){let i=e(t).find("svg");i.removeAttr("xmlns:a"),s(i)}.bind(this),"xml")},t.lookup_form_elem=_t,t.object_by_path=function(t){if(!t)return null;let e=window;for(const s of t.split("."))if(e=e[s],void 0===e)throw`Object by path not exists: ${t}`;return e},t.parse_path=d,t.parse_query=c,t.parse_svg=m,t.parse_url=h,t.query_elem=i,t.read_cookie=function(t){var e,s,i=t+"=",n=document.cookie.split(";");for(e=0;e
1)throw`Element by selector ${t} not unique.`;return n.length?n:null}function n(t,e,s=!0){let n=i(t,e,s);if(null===n)throw`Element by selector ${t} not found.`;return n}function r(t,e){e?t.removeClass("hidden"):t.addClass("hidden")}function a(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(t=>(t^crypto.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)))}function o(t,e,s){return void 0===t[e]&&(t[e]=s),t[e]}function l(t,e){return t.charAt(t.length-1)===e&&(t=t.substring(0,t.length-1)),t}function h(t){let e=document.createElement("a");e.href=t;let s=e.pathname;return l(t=e.protocol+"//"+e.host+s,"/")}function c(t,e){let s=document.createElement("a");s.href=t;let i=s.search;if(e)return i||"";let n={};if(i){let t=i.substring(1,i.length).split("&");for(let e=0;e${e[1]}`);this.handle_input(t,e)}handle_button(t,e){let s=e["t-prop"];if(!s)return;let i=this.widget;new w(i,s,{ctx:t,ctxa:e["t-elem"],val:e["t-val"]});for(let t of["down","up","click"])if(e[`t-bind-${t}`]){let n=i[e[`t-bind-${t}`]].bind(i);this.widget.on(`on_${s}_${t}`,n)}}}function C(t,s,i){let n=e(s.trim());i&&i.append(n);let r=new k(t);return n.each((function(){r.walk(this)})),n}class $ extends y{}class A{constructor(){this._subscribers={},this._suppress_events=!1}on(t,e){let s=this._subscribers[t];return void 0===s&&(this._subscribers[t]=s=new Array),this._contains_subscriber(t,e)||s.push(e),this}off(t,e){let s=this._subscribers[t];if(void 0===s)return this;if(!e)return delete this._subscribers[t],this;let i=s.indexOf(e);return i>-1&&(s=s.splice(i,1)),this._subscribers[t]=s,this}trigger(t,...e){if(this._suppress_events)return;this[t]&&this[t](...e);let s=this._subscribers[t];if(!s)return this;for(let t=0;t\n \n
\n \n
${this.content}
\n \n
\n
\n \n `)}open(){e("body").addClass("modal-open"),this.container.append(this.elem),this.elem.show(),this.elem.modal("show"),this.is_open=!0,this.trigger("on_open")}close(){1===e(".modal:visible").length&&e("body").removeClass("modal-open"),this.elem.modal("hide"),this.elem.remove(),this.is_open=!1,this.trigger("on_close")}}function S(t){let s=e(`#${t}`);if(!s.length)return null;let i=s.data("overlay");return i||null}class T extends E{constructor(t){t.content=t.message?t.message:t.content,t.css=t.flavor?t.flavor:t.css,super(t),this.compile_actions()}compile_actions(){C(this,'\n
\n ',this.footer)}}function O(t){new T({title:t.title,message:t.message,flavor:t.flavor,on_open:function(t){e("button",t.elem).first().focus()}}).open()}function q(t){O({title:"Info",message:t,flavor:"info"})}function N(t){O({title:"Warning",message:t,flavor:"warning"})}function P(t){O({title:"Error",message:t,flavor:"error"})}class L extends T{constructor(t){o(t,"css","dialog"),super(t),this.bind_from_options(["on_confirm"],t)}compile_actions(){C(this,'\n
\n
\n ',this.footer)}on_ok_btn_click(){this.close(),this.trigger("on_confirm")}}function D(t){new L({title:t.title,message:t.message,on_confirm:t.on_confirm}).open()}class M{constructor(){this._count=0,this.compile()}compile(){C(this,'\n
\n

\n
\n ')}show(){this._count++,this._count>1||e("body").append(this.elem)}hide(t){if(this._count--,t)return this._count=0,void this.elem.remove();this._count<=0&&(this._count=0,this.elem.remove())}}const F=new M;class I{constructor(t){this.spinner=o(t,"spinner",null),this.default_403=o(t,"default_403","/login"),this._win=o(t,"win",window)}execute(t){if(-1!==t.url.indexOf("?")){let e=t.params;t.params=c(t.url),t.url=h(t.url);for(let s in e)t.params[s]=e[s]}else o(t,"params",{});o(t,"error",((t,e,s)=>{403!==parseInt(e,10)?P(`
${e}${s}`):this.redirect(this.default_403)})),this.show_spinner(),e.ajax({url:t.url,dataType:o(t,"type","html"),data:t.params,method:o(t,"method","GET"),success:(e,s,i)=>{this.hide_spinner(),t.success(e,s,i)},error:(e,s,i)=>{0!==e.status?(s=e.status||s,i=e.statusText||i,this.hide_spinner(!0),t.error(e,s,i)):this.hide_spinner(!0)},cache:o(t,"cache",!1)})}redirect(t){const e=this._win.location;e.hash="",e.pathname=t}show_spinner(){null!==this.spinner&&this.spinner.show()}hide_spinner(t){null!==this.spinner&&this.spinner.hide(t)}}function W(t){new I({spinner:o(t,"spinner",F),win:o(t,"win",window),default_403:o(t,"default_403","/login")}).execute(t)}class G extends A{parse_target(t){return{url:t?h(t):void 0,params:t?c(t):{},path:t?d(t):void 0,query:t?c(t,!0):void 0}}parse_definition(t){return t.replace(/\s+/g," ").split(" ")}action_target(t,e){return e.ajaxtarget?e.ajaxtarget:this.parse_target(t.attr("ajax:target"))}}class H extends G{constructor(t){super(),this.event=t.event,this.dispatcher=t.dispatcher,this.dispatcher.on(this.event,this.handle.bind(this))}execute(t){throw"Abstract AjaxOperation does not implement execute"}handle(t,e){throw"Abstract AjaxOperation does not implement handle"}}class R extends H{constructor(t){t.event="on_path",super(t),this.win=t.win,e(this.win).on("popstate",this.state_handle.bind(this))}execute(t){let e=this.win.history;if(void 0===e.pushState)return;let s="/"!==t.path.charAt(0)?`/${t.path}`:t.path;o(t,"target",this.win.location.origin+s),o(t,"replace",!1);let i=t.replace;delete t.path,delete t.replace,t._t_ajax=!0,i?e.replaceState(t,"",s):e.pushState(t,"",s)}state_handle(t){let e,s=t.originalEvent.state;s&&s._t_ajax&&(t.preventDefault(),e=s.target.url?s.target:this.parse_target(s.target),e.params.popstate="1",s.action&&this.dispatcher.trigger("on_action",{target:e,action:s.action}),s.event&&this.dispatcher.trigger("on_event",{target:e,event:s.event}),s.overlay&&this.dispatcher.trigger("on_overlay",{target:e,overlay:s.overlay,css:s.overlay_css,uid:s.overlay_uid,title:s.overlay_title}),s.action||s.event||s.overlay||(this.win.location=e.url))}handle(t,e){let s,i=e.elem,n=e.event,r=i.attr("ajax:path");if("href"===r){r=d(i.attr("href"),!0)}else if("target"===r){let t=this.action_target(i,n);r=t.path+t.query}if(this.has_attr(i,"ajax:path-target")){let t=i.attr("ajax:path-target");t&&(s=this.parse_target(t))}else s=this.action_target(i,n);let a={path:r,target:s};a.action=this.attr_val(i,"ajax:path-action","ajax:action"),a.event=this.attr_val(i,"ajax:path-event","ajax:event"),a.overlay=this.attr_val(i,"ajax:path-overlay","ajax:overlay"),a.overlay&&(a.overlay_css=this.attr_val(i,"ajax:path-overlay-css","ajax:overlay-css"),a.overlay_uid=this.attr_val(i,"ajax:path-overlay-uid","ajax:overlay-uid"),a.overlay_title=this.attr_val(i,"ajax:path-overlay-title","ajax:overlay-title")),this.execute(a)}has_attr(t,e){let s=t.attr(e);return void 0!==s&&!1!==s}attr_val(t,e,s){return this.has_attr(t,e)?t.attr(e):t.attr(s)}}class V extends H{constructor(t){o(t,"event","on_action"),super(t),this.spinner=t.spinner,this._handle=t.handle,this._request=t.request}execute(t){t.success=this.complete.bind(this),this.request(t)}request(t){t.params["ajax.action"]=t.name,t.params["ajax.mode"]=t.mode,t.params["ajax.selector"]=t.selector,this._request.execute({url:h(t.url)+"/ajaxaction",type:"json",params:t.params,success:t.success})}complete(t){t?(this._handle.update(t),this._handle.next(t.continuation)):(P("Empty Response"),this.spinner.hide())}handle(t,e){let s=e.target,i=e.action;for(let t of this.parse_definition(i)){let e=t.split(":");this.execute({name:e[0],selector:e[1],mode:e[2],url:s.url,params:s.params})}}}class B extends H{constructor(t){t.event="on_event",super(t)}execute(t){let s=this.create_event.bind(this);e(t.selector).each((function(){e(this).trigger(s(t.name,t.target,t.data))}))}create_event(t,s,i){let n=e.Event(t);return s.url?n.ajaxtarget=s:n.ajaxtarget=this.parse_target(s),n.ajaxdata=i,n}handle(t,e){let s=e.target,i=e.event;for(let t of this.parse_definition(i)){let e=t.split(":");this.execute({name:e[0],selector:e[1],target:s})}}}class z extends V{constructor(t){t.event="on_overlay",super(t),this.overlay_content_sel=".modal-body"}execute(t){let e,s,i;if(t.close)return e=S(t.uid),e&&e.close(),e;if(t.target){let e=t.target;e.url||(e=this.parse_target(e)),s=e.url,i=e.params}else s=t.url,i=t.params;let n=t.uid?t.uid:a();return i["ajax.overlay-uid"]=n,e=new E({uid:n,css:t.css,title:t.title,on_close:t.on_close}),this.request({name:t.action,selector:`#${n} ${this.overlay_content_sel}`,mode:"inner",url:s,params:i,success:function(t){t.payload?(e.open(),this.complete(t)):this.complete(t)}.bind(this)}),e}handle(t,e){let s=e.target,i=e.overlay;i.indexOf("CLOSE")>-1?this.execute({close:!0,uid:i.indexOf(":")>-1?i.split(":")[1]:e.uid}):this.execute({action:i,url:s.url,params:s.params,css:e.css,uid:e.uid,title:e.title})}}class J{constructor(t){this.handle=t.handle,this.spinner=t.spinner,this.afr=null}bind(t){this.afr||C(this,'\n
\n ',e("body")),e(t).append('
').attr("target","ajaxformresponse").off().on("submit",function(t){this.spinner.show()}.bind(this))}render(t){this.spinner.hide(),t.error||(this.afr.remove(),this.afr=null),t.payload&&this.handle.update(t),this.handle.next(t.next)}}class U extends G{bind(t,s){e(t).off(s).on(s,this.dispatch_handle.bind(this))}dispatch_handle(t){t.preventDefault(),t.stopPropagation();let s=e(t.currentTarget),i={elem:s,event:t};s.attr("ajax:confirm")?D({message:s.attr("ajax:confirm"),on_confirm:function(t){this.dispatch(i)}.bind(this)}):this.dispatch(i)}dispatch(t){let e=t.elem,s=t.event;e.attr("ajax:action")&&this.trigger("on_action",{target:this.action_target(e,s),action:e.attr("ajax:action")}),e.attr("ajax:event")&&this.trigger("on_event",{target:e.attr("ajax:target"),event:e.attr("ajax:event")}),e.attr("ajax:overlay")&&this.trigger("on_overlay",{target:this.action_target(e,s),overlay:e.attr("ajax:overlay"),css:e.attr("ajax:overlay-css"),uid:e.attr("ajax:overlay-uid"),title:e.attr("ajax:overlay-title")}),e.attr("ajax:path")&&this.trigger("on_path",{elem:e,event:s})}}class K extends b{parse(t){let e=t._ajax_attached;if(void 0!==e)for(let t of e)void 0!==t.destroy&&t.destroy()}}class X extends G{constructor(t){super(),this.ajax=t,this.spinner=t.spinner}destroy(t){let e=new K;t.each((function(){e.walk(this)}))}update(t){let s,i=t.payload,n=t.selector,r=t.mode;if("replace"===r){let t=e(n);this.destroy(t),t.replaceWith(i),s=e(n),s.length?this.ajax.bind(s.parent()):this.ajax.bind(e(document))}else"inner"===r&&(s=e(n),this.destroy(s.children()),s.html(i),this.ajax.bind(s))}next(t){if(t&&t.length){this.spinner.hide();for(let s of t){let t=s.type;if(delete s.type,"path"===t)this.ajax.path(s);else if("action"===t){let t=this.parse_target(s.target);s.url=t.url,s.params=t.params,this.ajax.action(s)}else if("event"===t)this.ajax.trigger(s);else if("overlay"===t){let t=this.parse_target(s.target);s.url=t.url,s.params=t.params,this.ajax.overlay(s)}else"message"===t&&(s.flavor?O({message:s.payload,flavor:s.flavor}):e(s.selector).html(s.payload))}}}}class Y extends b{constructor(t){super(),this.dispatcher=t.dispatcher,this.form=t.form}parse(t){let e=this.node_attrs(t);if(e["ajax:bind"]&&(e["ajax:action"]||e["ajax:event"]||e["ajax:overlay"])){let s=e["ajax:bind"];this.dispatcher.bind(t,s)}e["ajax:form"]&&this.form.bind(t),"form"===t.tagName.toLowerCase()&&t.className.split(" ").includes("ajax")&&this.form.bind(t)}}class Q extends G{constructor(t=window){super(),this.win=t,this.binders={};let e=this.spinner=F,s=this.dispatcher=new U,i=this._request=new I({win:t});this._path=new R({dispatcher:s,win:t}),this._event=new B({dispatcher:s});let n=new X(this),r={dispatcher:s,win:t,handle:n,spinner:e,request:i};this._action=new V(r),this._overlay=new z(r),this._form=new J({handle:n,spinner:e}),this._is_bound=!1}register(t,e){let s="binder_"+a();for(;void 0!==this.binders[s];)s="binder_"+a();this.binders[s]=t,e&&this._is_bound&&t()}bind(t){this._is_bound=!0;let e=new Y({dispatcher:this.dispatcher,form:this._form});t.each((function(){e.walk(this)}));for(let e in this.binders)try{this.binders[e](t)}catch(t){console.log(t)}return t}attach(t,s){if(s instanceof e){if(1!=s.length)throw"Instance can be attached to exactly one DOM element";s=s[0]}void 0===s._ajax_attached&&(s._ajax_attached=[]),s._ajax_attached.push(t)}path(t){this._path.execute(t)}action(t){this._action.execute(t)}trigger(t){arguments.length>1&&(s("Calling Ajax.event with positional arguments","opts","1.0"),t={name:arguments[0],selector:arguments[1],target:arguments[2],data:arguments[3]}),this._event.execute(t)}overlay(t){return this._overlay.execute(t)}form(t){this._form.render(t)}parseurl(t){return s("ts.ajax.parseurl","ts.parse_url","1.0"),h(t)}parsequery(t,e){return s("ts.ajax.parsequery","ts.parse_query","1.0"),c(t,e)}parsepath(t,e){return s("ts.ajax.parsepath","ts.parse_path","1.0"),d(t,e)}parsetarget(t){return s("ts.ajax.parsetarget","ts.ajax.parse_target","1.0"),this.parse_target(t)}message(t,e=""){s("ts.ajax.message","ts.show_message","1.0"),O({message:t,flavor:e})}info(t){s("ts.ajax.info","ts.show_info","1.0"),q(t)}warning(t){s("ts.ajax.warning","ts.show_warning","1.0"),N(t)}error(t){s("ts.ajax.error","ts.show_error","1.0"),P(t)}dialog(t,e){s("ts.ajax.dialog","ts.show_dialog","1.0"),D({message:t.message,on_confirm:function(){e(t)}})}request(t){s("ts.ajax.request","ts.http_request","1.0"),W(t)}}let Z=new Q;e.fn.tsajax=function(){return Z.bind(this),this};class tt{constructor(t,...e){this._request_id=window.requestAnimationFrame((s=>{t(s,...e)}))}cancel(){null!==this._request_id&&(window.cancelAnimationFrame(this._request_id),this._request_id=null)}}class et{constructor(t,e,...s){this._timeout_id=window.setTimeout((()=>{t(document.timeline.currentTime,...s)}),e)}cancel(){null!==this._timeout_id&&(window.clearTimeout(this._timeout_id),this._timeout_id=null)}}class st{constructor(t,e,...s){this._interval_id=window.setInterval((()=>{t(document.timeline.currentTime,this,...s)}),e)}cancel(){null!==this._interval_id&&(window.clearInterval(this._interval_id),this._interval_id=null)}}class it{schedule_frame(t,...e){return new tt(t,...e)}schedule_timeout(t,e,...s){return new et(t,e,...s)}schedule_interval(t,e,...s){return new st(t,e,...s)}}let nt=new it;function rt(t,e=null){if(!((e=e||A)===A||e.prototype instanceof A))throw"Base class must be subclass of or Events";return class extends e{constructor(s){e===A?super():super(s);let i=this.elem;if(i||void 0===s||(i=this.elem=s.elem),!i)throw"No element found";i.on(t,(e=>{this.trigger(`on_${t}`,e)}))}}}let at=rt("click"),ot=rt("change"),lt=t=>rt("change",t);class ht extends A{constructor(){super(),this._down_handle=null,this._down_scope=null,this._move_scope=null}reset_state(){this._move_handle=null,this._up_handle=null,this._prev_pos=null,this._motion=null}set_scope(t,s){if(this._up_handle)throw"Attempt to set motion scope while handling";this.reset_state(),this._down_handle&&e(this._down_scope).off("mousedown",this._down_handle),this._down_handle=this._mousedown.bind(this),this._down_scope=t,e(t).on("mousedown",this._down_handle),this._move_scope=s||null}_mousedown(t){t.stopPropagation(),this._motion=!1,this._prev_pos={x:t.pageX,y:t.pageY},this._move_scope&&(this._move_handle=this._mousemove.bind(this),e(this._move_scope).on("mousemove",this._move_handle)),this._up_handle=this._mouseup.bind(this),e(document).on("mouseup",this._up_handle),this.trigger("down",t)}_mousemove(t){t.stopPropagation(),this._motion=!0,t.motion=this._motion,t.prev_pos=this._prev_pos,this.trigger("move",t),this._prev_pos.x=t.pageX,this._prev_pos.y=t.pageY}_mouseup(t){t.stopPropagation(),this._move_scope&&e(this._move_scope).off("mousemove",this._move_handle),e(document).off("mouseup",this._up_handle),t.motion=this._motion,this.trigger("up",t),this.reset_state()}}class ct extends ht{constructor(t){super(),this.children=[],new g(this,"parent"),this.parent=t.parent||null}add_widget(t){t.parent=this,this.children.push(t)}remove_widget(t){t.parent=null,this.children.splice(this.children.indexOf(t),1)}acquire(t){let e=this.parent;for(;e&&e&&!(e instanceof t);)e=e.parent;return e}}class dt extends ct{constructor(t){super(t),this.elem=t.elem,new v(this,"x",{tgt:"left"}),new v(this,"y",{tgt:"top"}),new v(this,"width"),new v(this,"height")}get offset(){return e(this.elem).offset()}}class ut extends A{constructor(t){if(!t.elem)throw"No element given";super(),this.elem=t.elem}get visible(){return!this.elem.hasClass("hidden")}set visible(t){let e=t!==!this.elem.hasClass("hidden");r(this.elem,t),e&&this.trigger("on_visible",t)}get hidden(){return!this.visible}set hidden(t){this.visible=!t}}function _t(t,e){if(t.elem)return t.elem;let s=t.form,i=t.name;return n(`${e}-${s.name}-${i}`,s.elem,!0)}class pt extends A{constructor(t){super(),this.form=t.form,this.name=t.name,this.elem=_t(t,"#input")}get value(){return this.elem.val()}set value(t){this.elem.val(t)}get disabled(){return this.elem.prop("disabled")}set disabled(t){this.elem.prop("disabled",t)}}class mt extends(lt(pt)){constructor(t){t.elem=_t(t,"#input"),super(t)}get options(){return this.elem.prop("options")}set options(t){this.clear();let e=this.elem[0];for(let s of t)s instanceof Option?e.add(s):e.add(new Option(s[1],s[0]))}clear(){this.elem.empty()}}class gt extends(lt(pt)){constructor(t){t.elem=_t(t,"#input"),super(t)}get checked(){return this.elem.is(":checked")}set checked(t){return this.elem.prop("checked",t)}}return e((function(){Z.spinner.hide(),e(document).tsajax()})),t.Ajax=Q,t.AjaxAction=V,t.AjaxDestroy=K,t.AjaxDispatcher=U,t.AjaxEvent=B,t.AjaxForm=J,t.AjaxHandle=X,t.AjaxOperation=H,t.AjaxOverlay=z,t.AjaxParser=Y,t.AjaxPath=R,t.AjaxUtil=G,t.AttrProperty=class extends f{set(t){this.ctx.attr(this.tgt,t),super.set(t)}},t.BoundProperty=f,t.Button=class extends at{constructor(t){super(t),this.unselected_class="btn-primary",this.selected_class="btn-success"}get selected(){return this.elem.hasClass(this.selected_class)}set selected(t){t?this.elem.removeClass(this.unselected_class).addClass(this.selected_class):this.elem.removeClass(this.selected_class).addClass(this.unselected_class)}},t.ButtonProperty=w,t.CSSProperty=v,t.ChangeListener=ot,t.ClickListener=at,t.Clock=it,t.ClockFrameEvent=tt,t.ClockIntervalEvent=st,t.ClockTimeoutEvent=et,t.Collapsible=class{constructor(t){if(!t.elem)throw"No element given";this.elem=t.elem}get collapsed(){return!this.elem.hasClass("in")}set collapsed(t){t?this.elem.collapse("hide"):this.elem.collapse("show")}},t.DataProperty=class extends f{constructor(t,e,s){s?s.ctx=void 0!==s.ctx?s.ctx:t.data:s={ctx:t.data},s.ctxa="data",super(t,e,s)}set(t){this.ctx[this.tgt]=t,super.set(t)}},t.Dialog=L,t.Events=A,t.Form=class{static initialize(t,e,s){let n=i(`#form-${s}`,t,!0);if(!n)return;let r=new e({name:s,elem:n});n.data(s,r)}static instance(t){return e(`#form-${t}`).data(t)}constructor(t){this.name=t.name,this.elem=t.elem}set_field_visibility(t,e){for(let s of t)s.visible=e}},t.FormCheckbox=gt,t.FormField=class extends ut{constructor(t){t.elem=_t(t,"#field"),super(t),this.form=t.form,this.name=t.name;let e=t.input;!e||e instanceof pt||(e=new e({form:this.form,name:this.name})),this.input=e}get has_error(){return this.elem.hasClass("has-error")}set has_error(t){let e=this.elem;t?e.addClass("has-error"):e.removeClass("has-error")}reset(t=""){this.input.value=t,this.has_error=!1,e(".help-block",this.elem).remove()}},t.FormInput=pt,t.FormRemoteSelect=class extends mt{constructor(t){super(t),this.vocab=t.vocab}fetch(t){W({type:"json",url:this.vocab,params:t,success:function(t,e,s){this.options=t}.bind(this)})}},t.FormSelect=mt,t.HTMLParser=k,t.HTMLWidget=dt,t.HTTPRequest=I,t.InputProperty=x,t.KeyState=class extends A{constructor(t){super(),this.filter_keyevent=t,this._keys=[],this._add_key("ctrl",17),this._add_key("shift",16),this._add_key("alt",18),this._add_key("enter",13),this._add_key("esc",27),this._add_key("delete",46),this.bind()}unload(){e(window).off("keydown",this._on_dom_keydown).off("keyup",this._on_dom_keyup)}bind(){this._on_dom_keydown=this._on_dom_keydown.bind(this),this._on_dom_keyup=this._on_dom_keyup.bind(this),e(window).on("keydown",this._on_dom_keydown).on("keyup",this._on_dom_keyup)}_add_key(t,e){this._keys.push(t),this[`_${t}`]=!1,Object.defineProperty(this,t,{get:function(){return this[`_${t}`]},set:function(s){let i=this[`_${t}`];"keydown"==s.type?i||s.keyCode!=e||(this[`_${t}`]=!0):i&&s.keyCode==e&&(this[`_${t}`]=!1)}})}_set_keys(t){for(let e of this._keys)this[e]=t}_filter_event(t){return this.filter_keyevent&&this.filter_keyevent(t)}_on_dom_keydown(t){this._set_keys(t),this._filter_event(t)||this.trigger("keydown",t)}_on_dom_keyup(t){this._set_keys(t),this._filter_event(t)||this.trigger("keyup",t)}},t.LoadingSpinner=M,t.Message=T,t.Motion=ht,t.Overlay=E,t.Parser=b,t.Property=g,t.SVGContext=class extends dt{constructor(t){let e=t.parent.elem.get(0);t.elem=p("svg",{class:t.name},e),super(t),this.svg_ns=u,this.xyz={x:0,y:0,z:1}}svg_attrs(t,e){_(t,e)}svg_elem(t,e,s){return p(t,e,s)}},t.SVGParser=$,t.SVGProperty=class extends f{set(t){let e={};e[this._name]=t,_(this.ctx,e),super.set(t)}},t.TemplateParser=y,t.TextProperty=class extends f{set(t){this.ctx.text(t),super.set(t)}},t.Visibility=ut,t.WS_STATE_CLOSED=3,t.WS_STATE_CLOSING=2,t.WS_STATE_CONNECTING=0,t.WS_STATE_OPEN=1,t.Websocket=class extends A{constructor(t,e=WebSocket){super(),this._ws_factory=e,this.path=t,this.on_open=this.on_open.bind(this),this.on_close=this.on_close.bind(this),this.on_error=this.on_error.bind(this),this.on_message=this.on_message.bind(this),this.on_raw_message=this.on_raw_message.bind(this),this.sock=null}get uri(){let t;return t="http:"==window.location.protocol?"ws://":"wss://",t+window.location.hostname+this.path}get state(){return this.sock.readyState}open(){null!==this.sock&&this.sock.close();let t=this.sock=new this._ws_factory(this.uri);t.onopen=function(){this.trigger("on_open")}.bind(this),t.onclose=function(t){this.trigger("on_close",t)}.bind(this),t.onerror=function(){this.trigger("on_error")}.bind(this),t.onmessage=function(t){this.trigger("on_raw_message",t)}.bind(this)}send(t){this.sock.send(t)}send_json(t){this.sock.send(JSON.stringify(t))}close(){null!==this.sock&&(this.sock.close(),this.sock=null)}on_open(){}on_close(t){}on_error(){}on_message(t){}on_raw_message(t){let e=JSON.parse(t.data);void 0===e.HEARTBEAT&&this.trigger("on_message",e)}},t.Widget=ct,t.ajax=Z,t.changeListener=lt,t.clickListener=t=>rt("click",t),t.clock=nt,t.compile_svg=function(t,e,s){let i=m(e,s),n=new $(t);return i.forEach((function(t,e){n.walk(t)})),i},t.compile_template=C,t.create_cookie=function(t,e,s){var i,n;s?((i=new Date).setTime(i.getTime()+24*s*60*60*1e3),n="; expires="+i.toGMTString()):n="",document.cookie=t+"="+escape(e)+n+"; path=/;"},t.create_listener=rt,t.create_svg_elem=p,t.deprecate=s,t.extract_number=j,t.get_elem=n,t.get_overlay=S,t.http_request=W,t.json_merge=function(t,e){let s={};for(let i of[t,e])for(let t in i)s[t]=i[t];return s},t.load_svg=function(t,s){e.get(t,function(t){let i=e(t).find("svg");i.removeAttr("xmlns:a"),s(i)}.bind(this),"xml")},t.lookup_form_elem=_t,t.object_by_path=function(t){if(!t)return null;let e=window;for(const s of t.split("."))if(e=e[s],void 0===e)throw`Object by path not exists: ${t}`;return e},t.parse_path=d,t.parse_query=c,t.parse_svg=m,t.parse_url=h,t.query_elem=i,t.read_cookie=function(t){var e,s,i=t+"=",n=document.cookie.split(";");for(e=0;e