2023-09-29 12:56:26 -05:00
/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
! function ( a , b ) { "object" == typeof module && "object" == typeof module . exports ? module . exports = a . document ? b ( a , ! 0 ) : function ( a ) { if ( ! a . document ) throw new Error ( "jQuery requires a window with a document" ) ; return b ( a ) } : b ( a ) } ( "undefined" != typeof window ? window : this , function ( a , b ) { var c = [ ] , d = a . document , e = c . slice , f = c . concat , g = c . push , h = c . indexOf , i = { } , j = i . toString , k = i . hasOwnProperty , l = { } , m = "1.12.4" , n = function ( a , b ) { return new n . fn . init ( a , b ) } , o = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g , p = /^-ms-/ , q = /-([\da-z])/gi , r = function ( a , b ) { return b . toUpperCase ( ) } ; n . fn = n . prototype = { jquery : m , constructor : n , selector : "" , length : 0 , toArray : function ( ) { return e . call ( this ) } , get : function ( a ) { return null != a ? 0 > a ? this [ a + this . length ] : this [ a ] : e . call ( this ) } , pushStack : function ( a ) { var b = n . merge ( this . constructor ( ) , a ) ; return b . prevObject = this , b . context = this . context , b } , each : function ( a ) { return n . each ( this , a ) } , map : function ( a ) { return this . pushStack ( n . map ( this , function ( b , c ) { return a . call ( b , c , b ) } ) ) } , slice : function ( ) { return this . pushStack ( e . apply ( this , arguments ) ) } , first : function ( ) { return this . eq ( 0 ) } , last : function ( ) { return this . eq ( - 1 ) } , eq : function ( a ) { var b = this . length , c = + a + ( 0 > a ? b : 0 ) ; return this . pushStack ( c >= 0 && b > c ? [ this [ c ] ] : [ ] ) } , end : function ( ) { return this . prevObject || this . constructor ( ) } , push : g , sort : c . sort , splice : c . splice } , n . extend = n . fn . extend = function ( ) { var a , b , c , d , e , f , g = arguments [ 0 ] || { } , h = 1 , i = arguments . length , j = ! 1 ; for ( "boolean" == typeof g && ( j = g , g = arguments [ h ] || { } , h ++ ) , "object" == typeof g || n . isFunction ( g ) || ( g = { } ) , h === i && ( g = this , h -- ) ; i > h ; h ++ ) if ( null != ( e = arguments [ h ] ) ) for ( d in e ) a = g [ d ] , c = e [ d ] , g !== c && ( j && c && ( n . isPlainObject ( c ) || ( b = n . isArray ( c ) ) ) ? ( b ? ( b = ! 1 , f = a && n . isArray ( a ) ? a : [ ] ) : f = a && n . isPlainObject ( a ) ? a : { } , g [ d ] = n . extend ( j , f , c ) ) : void 0 !== c && ( g [ d ] = c ) ) ; return g } , n . extend ( { expando : "jQuery" + ( m + Math . random ( ) ) . replace ( /\D/g , "" ) , isReady : ! 0 , error : function ( a ) { throw new Error ( a ) } , noop : function ( ) { } , isFunction : function ( a ) { return "function" === n . type ( a ) } , isArray : Array . isArray || function ( a ) { return "array" === n . type ( a ) } , isWindow : function ( a ) { return null != a && a == a . window } , isNumeric : function ( a ) { var b = a && a . toString ( ) ; return ! n . isArray ( a ) && b - parseFloat ( b ) + 1 >= 0 } , isEmptyObject : function ( a ) { var b ; for ( b in a ) return ! 1 ; return ! 0 } , isPlainObject : function ( a ) { var b ; if ( ! a || "object" !== n . type ( a ) || a . nodeType || n . isWindow ( a ) ) return ! 1 ; try { if ( a . constructor && ! k . call ( a , "constructor" ) && ! k . call ( a . constructor . prototype , "isPrototypeOf" ) ) return ! 1 } catch ( c ) { return ! 1 } if ( ! l . ownFirst ) for ( b in a ) return k . call ( a , b ) ; for ( b in a ) ; return void 0 === b || k . call ( a , b ) } , type : function ( a ) { return null == a ? a + "" : "object" == typeof a || "function" == typeof a ? i [ j . call ( a ) ] || "object" : typeof a } , globalEval : function ( b ) { b && n . trim ( b ) && ( a . execScript || function ( b ) { a . eval . call ( a , b ) } ) ( b ) } , camelCase : function ( a ) { return a . replace ( p , "ms-" ) . replace ( q , r ) } , nodeName : function ( a , b ) { return a . nodeName && a . nodeName . toLowerCase ( ) === b . toLowerCase ( ) } , each : function ( a , b ) { var c , d = 0 ; if ( s ( a ) ) { for ( c = a . length ; c > d ; d ++ ) if ( b . call ( a [ d ] , d , a [ d ] ) === ! 1 ) break } else for ( d in a ) if ( b . call ( a [ d ] , d , a [ d ] ) === ! 1 ) break ; return a } , trim : function ( a ) { return null == a ? "" : ( a + "" ) . replace ( o , "" ) } , makeArray : function ( a , b ) { var c = b || [ ] ; return null != a && ( s ( Object ( a ) ) ? n . merge ( c , "string" == typeof a ? [ a ] : a ) : g . call ( c , a ) ) , c } , inArray : function ( a , b , c ) { var d ; if ( b ) { if ( h ) return h . call ( b , a , c ) ; for ( d = b . length , c = c ? 0 > c ? Math . max ( 0 , d + c ) : c : 0 ; d > c ; c ++ ) if ( c in b && b [ c ] === a ) return c } return - 1 } , merge : function ( a , b ) { var c = + b . length , d = 0 , e = a . length ; while ( c > d ) a [ e ++ ] = b [ d ++ ] ; if ( c !== c ) while ( void 0 !== b [ d ] ) a [ e ++ ] = b [ d ++ ] ; return a . length = e , a } , grep : function ( a , b , c ) { for ( var d , e = [ ] , f = 0 , g = a . length , h = ! c ; g > f ; f ++ ) d = ! b ( a [ f ] , f ) , d !== h && e . push ( a [ f ] ) ; return e } , map : function ( a , b , c ) { var d , e , g = 0 , h = [ ] ; if ( s ( a ) ) for ( d = a . length ; d > g ; g ++ ) e = b ( a [ g ] , g , c ) , null != e && h . push ( e ) ; else for ( g in a ) e = b ( a [ g ] , g , c ) , null != e && h . push ( e ) ; return f . apply ( [ ] , h ) } , guid : 1 , proxy : function ( a , b ) { var c , d , f ; return "string" == typeof b && ( f = a [ b ] , b = a , a = f ) , n . isFunction ( a ) ? ( c = e . call ( arguments , 2 ) , d = function ( ) { return a . apply ( b || this , c . concat ( e . call ( arguments ) ) ) } , d . guid = a . guid = a . guid || n . guid ++ , d ) : void 0 } , now : function ( ) { return + new Date } , support : l } ) , "function" == typeof Symbol && ( n . fn [ Symbol . iterator ] = c [ Symbol . iterator ] ) , n . each ( " Boolean Number String Function A
} return c } function Q ( a ) { var b ; for ( b in a ) if ( ( "data" !== b || ! n . isEmptyObject ( a [ b ] ) ) && "toJSON" !== b ) return ! 1 ; return ! 0 } function R ( a , b , d , e ) { if ( M ( a ) ) { var f , g , h = n . expando , i = a . nodeType , j = i ? n . cache : a , k = i ? a [ h ] : a [ h ] && h ; if ( k && j [ k ] && ( e || j [ k ] . data ) || void 0 !== d || "string" != typeof b ) return k || ( k = i ? a [ h ] = c . pop ( ) || n . guid ++ : h ) , j [ k ] || ( j [ k ] = i ? { } : { toJSON : n . noop } ) , "object" != typeof b && "function" != typeof b || ( e ? j [ k ] = n . extend ( j [ k ] , b ) : j [ k ] . data = n . extend ( j [ k ] . data , b ) ) , g = j [ k ] , e || ( g . data || ( g . data = { } ) , g = g . data ) , void 0 !== d && ( g [ n . camelCase ( b ) ] = d ) , "string" == typeof b ? ( f = g [ b ] , null == f && ( f = g [ n . camelCase ( b ) ] ) ) : f = g , f } } function S ( a , b , c ) { if ( M ( a ) ) { var d , e , f = a . nodeType , g = f ? n . cache : a , h = f ? a [ n . expando ] : n . expando ; if ( g [ h ] ) { if ( b && ( d = c ? g [ h ] : g [ h ] . data ) ) { n . isArray ( b ) ? b = b . concat ( n . map ( b , n . camelCase ) ) : b in d ? b = [ b ] : ( b = n . camelCase ( b ) , b = b in d ? [ b ] : b . split ( " " ) ) , e = b . length ; while ( e -- ) delete d [ b [ e ] ] ; if ( c ? ! Q ( d ) : ! n . isEmptyObject ( d ) ) return } ( c || ( delete g [ h ] . data , Q ( g [ h ] ) ) ) && ( f ? n . cleanData ( [ a ] , ! 0 ) : l . deleteExpando || g != g . window ? delete g [ h ] : g [ h ] = void 0 ) } } } n . extend ( { cache : { } , noData : { "applet " : ! 0 , "embed " : ! 0 , "object " : "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" } , hasData : function ( a ) { return a = a . nodeType ? n . cache [ a [ n . expando ] ] : a [ n . expando ] , ! ! a && ! Q ( a ) } , data : function ( a , b , c ) { return R ( a , b , c ) } , removeData : function ( a , b ) { return S ( a , b ) } , _data : function ( a , b , c ) { return R ( a , b , c , ! 0 ) } , _removeData : function ( a , b ) { return S ( a , b , ! 0 ) } } ) , n . fn . extend ( { data : function ( a , b ) { var c , d , e , f = this [ 0 ] , g = f && f . attributes ; if ( void 0 === a ) { if ( this . length && ( e = n . data ( f ) , 1 === f . nodeType && ! n . _data ( f , "parsedAttrs" ) ) ) { c = g . length ; while ( c -- ) g [ c ] && ( d = g [ c ] . name , 0 === d . indexOf ( "data-" ) && ( d = n . camelCase ( d . slice ( 5 ) ) , P ( f , d , e [ d ] ) ) ) ; n . _data ( f , "parsedAttrs" , ! 0 ) } return e } return "object" == typeof a ? this . each ( function ( ) { n . data ( this , a ) } ) : arguments . length > 1 ? this . each ( function ( ) { n . data ( this , a , b ) } ) : f ? P ( f , a , n . data ( f , a ) ) : void 0 } , removeData : function ( a ) { return this . each ( function ( ) { n . removeData ( this , a ) } ) } } ) , n . extend ( { queue : function ( a , b , c ) { var d ; return a ? ( b = ( b || "fx" ) + "queue" , d = n . _data ( a , b ) , c && ( ! d || n . isArray ( c ) ? d = n . _data ( a , b , n . makeArray ( c ) ) : d . push ( c ) ) , d || [ ] ) : void 0 } , dequeue : function ( a , b ) { b = b || "fx" ; var c = n . queue ( a , b ) , d = c . length , e = c . shift ( ) , f = n . _queueHooks ( a , b ) , g = function ( ) { n . dequeue ( a , b ) } ; "inprogress" === e && ( e = c . shift ( ) , d -- ) , e && ( "fx" === b && c . unshift ( "inprogress" ) , delete f . stop , e . call ( a , g , f ) ) , ! d && f && f . empty . fire ( ) } , _queueHooks : function ( a , b ) { var c = b + "queueHooks" ; return n . _data ( a , c ) || n . _data ( a , c , { empty : n . Callbacks ( "once memory" ) . add ( function ( ) { n . _removeData ( a , b + "queue" ) , n . _removeData ( a , c ) } ) } ) } } ) , n . fn . extend ( { queue : function ( a , b ) { var c = 2 ; return "string" != typeof a && ( b = a , a = "fx" , c -- ) , arguments . length < c ? n . queue ( this [ 0 ] , a ) : void 0 === b ? this : this . each ( function ( ) { var c = n . queue ( this , a , b ) ; n . _queueHooks ( this , a ) , "fx" === a && "inprogress" !== c [ 0 ] && n . dequeue ( this , a ) } ) } , dequeue : function ( a ) { return this . each ( function ( ) { n . dequeue ( this , a ) } ) } , clearQueue : function ( a ) { return this . queue ( a || "fx" , [ ] ) } , promise : function ( a , b ) { var c , d = 1 , e = n . Deferred ( ) , f = this , g = this . length , h = function ( ) { -- d || e . resolveWith ( f , [ f ] ) } ; "string" != typeof a && ( b = a , a = void 0 ) , a = a || "fx" ; while ( g -- ) c = n . _data ( f [ g ] , a + "queueHooks" ) , c && c . empty && ( d ++ , c . empty . add ( h ) ) ; return h ( ) , e . promise ( b ) } } ) , function ( ) { var a ; l . shrinkWrapBlocks = function ( ) { if ( null != a ) return a ; a = ! 1 ; var b , c , e ; return c = d . getElementsByTagName ( "body" ) [ 0 ] , c && c . style ? ( b = d . createElement ( "div" ) , e = d . createElement ( "div" ) , e . style . cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px" , c . appendChild ( e ) . appendChild ( b ) , "undefined" != typeof b . style . zoom && ( b . style . cssText = "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1" , b . appendChild ( d . createElement ( "div" ) ) . style . width = "5px" , a = 3 !== b . offsetWidth ) , c . removeChild ( e ) , a ) : void 0 } } ( ) ; var T = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ . source , U = new RegExp ( "^(?:([+-])=|)(" + T + ")([a-z%]*)$" , "i" ) , V = [ "Top" , "Right" , "Bottom" , "Left" ] , W = function ( a , b ) { return a = b || a , "none" === n . css ( a , "display" ) || ! n . contains ( a . ownerDocument , a ) } ; function X ( a , b , c , d ) { var e , f = 1 , g = 20 , h = d ? function ( ) { return d . cur ( ) } : function ( ) { return n . css ( a , b , "" ) } , i = h ( ) , j = c && c [ 3 ] || ( n . cssNumber [ b ] ? "" : "px" ) , k = ( n . cssNum
marginLeft : 0 } , function ( ) { return a . getBoundingClientRect ( ) . left } ) : 0 ) ) + "px" : void 0 } ) , n . each ( { margin : "" , padding : "" , border : "Width" } , function ( a , b ) { n . cssHooks [ a + b ] = { expand : function ( c ) { for ( var d = 0 , e = { } , f = "string" == typeof c ? c . split ( " " ) : [ c ] ; 4 > d ; d ++ ) e [ a + V [ d ] + b ] = f [ d ] || f [ d - 2 ] || f [ 0 ] ; return e } } , Na . test ( a ) || ( n . cssHooks [ a + b ] . set = db ) } ) , n . fn . extend ( { css : function ( a , b ) { return Y ( this , function ( a , b , c ) { var d , e , f = { } , g = 0 ; if ( n . isArray ( b ) ) { for ( d = Ra ( a ) , e = b . length ; e > g ; g ++ ) f [ b [ g ] ] = n . css ( a , b [ g ] , ! 1 , d ) ; return f } return void 0 !== c ? n . style ( a , b , c ) : n . css ( a , b ) } , a , b , arguments . length > 1 ) } , show : function ( ) { return cb ( this , ! 0 ) } , hide : function ( ) { return cb ( this ) } , toggle : function ( a ) { return "boolean" == typeof a ? a ? this . show ( ) : this . hide ( ) : this . each ( function ( ) { W ( this ) ? n ( this ) . show ( ) : n ( this ) . hide ( ) } ) } } ) ; function gb ( a , b , c , d , e ) { return new gb . prototype . init ( a , b , c , d , e ) } n . Tween = gb , gb . prototype = { constructor : gb , init : function ( a , b , c , d , e , f ) { this . elem = a , this . prop = c , this . easing = e || n . easing . _default , this . options = b , this . start = this . now = this . cur ( ) , this . end = d , this . unit = f || ( n . cssNumber [ c ] ? "" : "px" ) } , cur : function ( ) { var a = gb . propHooks [ this . prop ] ; return a && a . get ? a . get ( this ) : gb . propHooks . _default . get ( this ) } , run : function ( a ) { var b , c = gb . propHooks [ this . prop ] ; return this . options . duration ? this . pos = b = n . easing [ this . easing ] ( a , this . options . duration * a , 0 , 1 , this . options . duration ) : this . pos = b = a , this . now = ( this . end - this . start ) * b + this . start , this . options . step && this . options . step . call ( this . elem , this . now , this ) , c && c . set ? c . set ( this ) : gb . propHooks . _default . set ( this ) , this } } , gb . prototype . init . prototype = gb . prototype , gb . propHooks = { _default : { get : function ( a ) { var b ; return 1 !== a . elem . nodeType || null != a . elem [ a . prop ] && null == a . elem . style [ a . prop ] ? a . elem [ a . prop ] : ( b = n . css ( a . elem , a . prop , "" ) , b && "auto" !== b ? b : 0 ) } , set : function ( a ) { n . fx . step [ a . prop ] ? n . fx . step [ a . prop ] ( a ) : 1 !== a . elem . nodeType || null == a . elem . style [ n . cssProps [ a . prop ] ] && ! n . cssHooks [ a . prop ] ? a . elem [ a . prop ] = a . now : n . style ( a . elem , a . prop , a . now + a . unit ) } } } , gb . propHooks . scrollTop = gb . propHooks . scrollLeft = { set : function ( a ) { a . elem . nodeType && a . elem . parentNode && ( a . elem [ a . prop ] = a . now ) } } , n . easing = { linear : function ( a ) { return a } , swing : function ( a ) { return . 5 - Math . cos ( a * Math . PI ) / 2 } , _default : "swing" } , n . fx = gb . prototype . init , n . fx . step = { } ; var hb , ib , jb = /^(?:toggle|show|hide)$/ , kb = /queueHooks$/ ; function lb ( ) { return a . setTimeout ( function ( ) { hb = void 0 } ) , hb = n . now ( ) } function mb ( a , b ) { var c , d = { height : a } , e = 0 ; for ( b = b ? 1 : 0 ; 4 > e ; e += 2 - b ) c = V [ e ] , d [ "margin" + c ] = d [ "padding" + c ] = a ; return b && ( d . opacity = d . width = a ) , d } function nb ( a , b , c ) { for ( var d , e = ( qb . tweeners [ b ] || [ ] ) . concat ( qb . tweeners [ "*" ] ) , f = 0 , g = e . length ; g > f ; f ++ ) if ( d = e [ f ] . call ( c , b , a ) ) return d } function ob ( a , b , c ) { var d , e , f , g , h , i , j , k , m = this , o = { } , p = a . style , q = a . nodeType && W ( a ) , r = n . _data ( a , "fxshow" ) ; c . queue || ( h = n . _queueHooks ( a , "fx" ) , null == h . unqueued && ( h . unqueued = 0 , i = h . empty . fire , h . empty . fire = function ( ) { h . unqueued || i ( ) } ) , h . unqueued ++ , m . always ( function ( ) { m . always ( function ( ) { h . unqueued -- , n . queue ( a , "fx" ) . length || h . empty . fire ( ) } ) } ) ) , 1 === a . nodeType && ( "height" in b || "width" in b ) && ( c . overflow = [ p . overflow , p . overflowX , p . overflowY ] , j = n . css ( a , "display" ) , k = "none" === j ? n . _data ( a , "olddisplay" ) || Ma ( a . nodeName ) : j , "inline" === k && "none" === n . css ( a , "float" ) && ( l . inlineBlockNeedsLayout && "inline" !== Ma ( a . nodeName ) ? p . zoom = 1 : p . display = "inline-block" ) ) , c . overflow && ( p . overflow = "hidden" , l . shrinkWrapBlocks ( ) || m . always ( function ( ) { p . overflow = c . overflow [ 0 ] , p . overflowX = c . overflow [ 1 ] , p . overflowY = c . overflow [ 2 ] } ) ) ; for ( d in b ) if ( e = b [ d ] , jb . exec ( e ) ) { if ( delete b [ d ] , f = f || "toggle" === e , e === ( q ? "hide" : "show" ) ) { if ( "show" !== e || ! r || void 0 === r [ d ] ) continue ; q = ! 0 } o [ d ] = r && r [ d ] || n . style ( a , d ) } else j = void 0 ; if ( n . isEmptyObject ( o ) ) "inline" === ( "none" === j ? Ma ( a . nodeName ) : j ) && ( p . display = j ) ; else { r ? "hidden" in r && ( q = r . hidden ) : r = n . _data ( a , "fxshow" , { } ) , f && ( r . hidden = ! q ) , q ? n ( a ) . show ( ) : m . done ( function ( ) { n ( a ) . hide ( ) } ) , m . done ( function ( ) { var b ; n . _removeData ( a , "fxshow" ) ; for ( b in o ) n . style ( a , b , o [ b ] ) } ) ; for ( d in o ) g = nb ( q ? r [ d ] : 0 , d , m ) , d in r || ( r [ d ] = g . start , q && ( g . end = g . start , g . start = "width" === d || "height" === d ? 1 : 0 ) ) } } function pb ( a , b ) { var c , d , e , f , g ; for ( c in a ) if ( d = n . camelCase ( c ) , e = b [ d ] , f = a [ c ] , n . isArray ( f ) && ( e = f [ 1 ] , f = a [ c ] = f [ 0 ] ) , c !== d && ( a [ d ] = f , delete a [ c ] ) , g = n . cssHooks [ d ] , g && " expa
padding : "inner" + a , content : b , "" : "outer" + a } , function ( c , d ) { n . fn [ d ] = function ( d , e ) { var f = arguments . length && ( c || "boolean" != typeof d ) , g = c || ( d === ! 0 || e === ! 0 ? "margin" : "border" ) ; return Y ( this , function ( b , c , d ) { var e ; return n . isWindow ( b ) ? b . document . documentElement [ "client" + a ] : 9 === b . nodeType ? ( e = b . documentElement , Math . max ( b . body [ "scroll" + a ] , e [ "scroll" + a ] , b . body [ "offset" + a ] , e [ "offset" + a ] , e [ "client" + a ] ) ) : void 0 === d ? n . css ( b , c , g ) : n . style ( b , c , d , g ) } , b , f ? d : void 0 , f , null ) } } ) } ) , n . fn . extend ( { bind : function ( a , b , c ) { return this . on ( a , null , b , c ) } , unbind : function ( a , b ) { return this . off ( a , null , b ) } , delegate : function ( a , b , c , d ) { return this . on ( b , a , c , d ) } , undelegate : function ( a , b , c ) { return 1 === arguments . length ? this . off ( a , "**" ) : this . off ( b , a || "**" , c ) } } ) , n . fn . size = function ( ) { return this . length } , n . fn . andSelf = n . fn . addBack , "function" == typeof define && define . amd && define ( "jquery" , [ ] , function ( ) { return n } ) ; var nc = a . jQuery , oc = a . $ ; return n . noConflict = function ( b ) { return a . $ === n && ( a . $ = oc ) , b && a . jQuery === n && ( a . jQuery = nc ) , n } , b || ( a . jQuery = a . $ = n ) , n } ) ;
/ * !
* Bootstrap v3 . 4.1 ( https : //getbootstrap.com/)
* Copyright 2011 - 2019 Twitter , Inc .
* Licensed under the MIT license
* /
if ( "undefined" == typeof jQuery ) throw new Error ( "Bootstrap's JavaScript requires jQuery" ) ; ! function ( t ) { "use strict" ; var e = jQuery . fn . jquery . split ( " " ) [ 0 ] . split ( "." ) ; if ( e [ 0 ] < 2 && e [ 1 ] < 9 || 1 == e [ 0 ] && 9 == e [ 1 ] && e [ 2 ] < 1 || 3 < e [ 0 ] ) throw new Error ( "Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4" ) } ( ) , function ( n ) { "use strict" ; n . fn . emulateTransitionEnd = function ( t ) { var e = ! 1 , i = this ; n ( this ) . one ( "bsTransitionEnd" , function ( ) { e = ! 0 } ) ; return setTimeout ( function ( ) { e || n ( i ) . trigger ( n . support . transition . end ) } , t ) , this } , n ( function ( ) { n . support . transition = function o ( ) { var t = document . createElement ( "bootstrap" ) , e = { WebkitTransition : "webkitTransitionEnd" , MozTransition : "transitionend" , OTransition : "oTransitionEnd otransitionend" , transition : "transitionend" } ; for ( var i in e ) if ( t . style [ i ] !== undefined ) return { end : e [ i ] } ; return ! 1 } ( ) , n . support . transition && ( n . event . special . bsTransitionEnd = { bindType : n . support . transition . end , delegateType : n . support . transition . end , handle : function ( t ) { if ( n ( t . target ) . is ( this ) ) return t . handleObj . handler . apply ( this , arguments ) } } ) } ) } ( jQuery ) , function ( s ) { "use strict" ; var e = '[data-dismiss="alert"]' , a = function ( t ) { s ( t ) . on ( "click" , e , this . close ) } ; a . VERSION = "3.4.1" , a . TRANSITION _DURATION = 150 , a . prototype . close = function ( t ) { var e = s ( this ) , i = e . attr ( "data-target" ) ; i || ( i = ( i = e . attr ( "href" ) ) && i . replace ( /.*(?=#[^\s]*$)/ , "" ) ) , i = "#" === i ? [ ] : i ; var o = s ( document ) . find ( i ) ; function n ( ) { o . detach ( ) . trigger ( "closed.bs.alert" ) . remove ( ) } t && t . preventDefault ( ) , o . length || ( o = e . closest ( ".alert" ) ) , o . trigger ( t = s . Event ( "close.bs.alert" ) ) , t . isDefaultPrevented ( ) || ( o . removeClass ( "in" ) , s . support . transition && o . hasClass ( "fade" ) ? o . one ( "bsTransitionEnd" , n ) . emulateTransitionEnd ( a . TRANSITION _DURATION ) : n ( ) ) } ; var t = s . fn . alert ; s . fn . alert = function o ( i ) { return this . each ( function ( ) { var t = s ( this ) , e = t . data ( "bs.alert" ) ; e || t . data ( "bs.alert" , e = new a ( this ) ) , "string" == typeof i && e [ i ] . call ( t ) } ) } , s . fn . alert . Constructor = a , s . fn . alert . noConflict = function ( ) { return s . fn . alert = t , this } , s ( document ) . on ( "click.bs.alert.data-api" , e , a . prototype . close ) } ( jQuery ) , function ( s ) { "use strict" ; var n = function ( t , e ) { this . $element = s ( t ) , this . options = s . extend ( { } , n . DEFAULTS , e ) , this . isLoading = ! 1 } ; function i ( o ) { return this . each ( function ( ) { var t = s ( this ) , e = t . data ( "bs.button" ) , i = "object" == typeof o && o ; e || t . data ( "bs.button" , e = new n ( this , i ) ) , "toggle" == o ? e . toggle ( ) : o && e . setState ( o ) } ) } n . VERSION = "3.4.1" , n . DEFAULTS = { loadingText : "loading..." } , n . prototype . setState = function ( t ) { var e = "disabled" , i = this . $element , o = i . is ( "input" ) ? "val" : "html" , n = i . data ( ) ; t += "Text" , null == n . resetText && i . data ( "resetText" , i [ o ] ( ) ) , setTimeout ( s . proxy ( function ( ) { i [ o ] ( null == n [ t ] ? this . options [ t ] : n [ t ] ) , "loadingText" == t ? ( this . isLoading = ! 0 , i . addClass ( e ) . attr ( e , e ) . prop ( e , ! 0 ) ) : this . isLoading && ( this . isLoading = ! 1 , i . removeClass ( e ) . removeAttr ( e ) . prop ( e , ! 1 ) ) } , this ) , 0 ) } , n . prototype . toggle = function ( ) { var t = ! 0 , e = this . $element . closest ( '[data-toggle="buttons"]' ) ; if ( e . length ) { var i = this . $element . find ( "input" ) ; "radio" == i . prop ( "type" ) ? ( i . prop ( "checked" ) && ( t = ! 1 ) , e . find ( ".active" ) . removeClass ( "active" ) , this . $element . addClass ( "active" ) ) : "checkbox" == i . prop ( "type" ) && ( i . prop ( "checked" ) !== this . $element . hasClass ( "active" ) && ( t = ! 1 ) , this . $element . toggleClass ( "active" ) ) , i . prop ( "checked" , this . $element . hasClass ( "active" ) ) , t && i . trigger ( "change" ) } else this . $element . attr ( "aria-pressed" , ! this . $element . hasClass ( "active" ) ) , this . $element . toggleClass ( "active" ) } ; var t = s . fn . button ; s . fn . button = i , s . fn . button . Constructor = n , s . fn . button . noConflict = function ( ) { return s . fn . button = t , this } , s ( document ) . on ( "click.bs.button.data-api" , '[data-toggle^="button"]' , function ( t ) { var e = s ( t . target ) . closest ( ".btn" ) ; i . call ( e , "toggle" ) , s ( t . target ) . is ( 'input[type="radio"], input[type="checkbox"]' ) || ( t . preventDefault ( ) , e . is ( "input,button" ) ? e . trigger ( "focus" ) : e . find ( "input:visible,button:visible" ) . first ( ) . trigger ( "focus" ) ) } ) . on ( "focus.bs.button.data-api blur.bs.button.data-api" , '[data-toggle^="button"]' , function ( t ) { s ( t . target ) . closest ( ".btn" ) . toggleClass ( "focus" , /^focus(in)?$/ . test ( t . type ) ) } ) } ( jQuery ) , function ( p ) { "use strict" ; var c = function ( t , e ) { this . $element = p ( t ) , this . $indicators = this . $element . find ( " . carousel - indi
2023-11-08 00:26:35 +00:00
! function ( e , t ) { "object" == typeof exports && "undefined" != typeof module ? module . exports = t ( ) : "function" == typeof define && define . amd ? define ( t ) : e . moment = t ( ) } ( this , function ( ) { "use strict" ; var H ; function f ( ) { return H . apply ( null , arguments ) } function a ( e ) { return e instanceof Array || "[object Array]" === Object . prototype . toString . call ( e ) } function F ( e ) { return null != e && "[object Object]" === Object . prototype . toString . call ( e ) } function c ( e , t ) { return Object . prototype . hasOwnProperty . call ( e , t ) } function L ( e ) { if ( Object . getOwnPropertyNames ) return 0 === Object . getOwnPropertyNames ( e ) . length ; for ( var t in e ) if ( c ( e , t ) ) return ; return 1 } function o ( e ) { return void 0 === e } function u ( e ) { return "number" == typeof e || "[object Number]" === Object . prototype . toString . call ( e ) } function V ( e ) { return e instanceof Date || "[object Date]" === Object . prototype . toString . call ( e ) } function G ( e , t ) { for ( var n = [ ] , s = e . length , i = 0 ; i < s ; ++ i ) n . push ( t ( e [ i ] , i ) ) ; return n } function E ( e , t ) { for ( var n in t ) c ( t , n ) && ( e [ n ] = t [ n ] ) ; return c ( t , "toString" ) && ( e . toString = t . toString ) , c ( t , "valueOf" ) && ( e . valueOf = t . valueOf ) , e } function l ( e , t , n , s ) { return Pt ( e , t , n , s , ! 0 ) . utc ( ) } function m ( e ) { return null == e . _pf && ( e . _pf = { empty : ! 1 , unusedTokens : [ ] , unusedInput : [ ] , overflow : - 2 , charsLeftOver : 0 , nullInput : ! 1 , invalidEra : null , invalidMonth : null , invalidFormat : ! 1 , userInvalidated : ! 1 , iso : ! 1 , parsedDateParts : [ ] , era : null , meridiem : null , rfc2822 : ! 1 , weekdayMismatch : ! 1 } ) , e . _pf } function A ( e ) { if ( null == e . _isValid ) { var t = m ( e ) , n = j . call ( t . parsedDateParts , function ( e ) { return null != e } ) , n = ! isNaN ( e . _d . getTime ( ) ) && t . overflow < 0 && ! t . empty && ! t . invalidEra && ! t . invalidMonth && ! t . invalidWeekday && ! t . weekdayMismatch && ! t . nullInput && ! t . invalidFormat && ! t . userInvalidated && ( ! t . meridiem || t . meridiem && n ) ; if ( e . _strict && ( n = n && 0 === t . charsLeftOver && 0 === t . unusedTokens . length && void 0 === t . bigHour ) , null != Object . isFrozen && Object . isFrozen ( e ) ) return n ; e . _isValid = n } return e . _isValid } function I ( e ) { var t = l ( NaN ) ; return null != e ? E ( m ( t ) , e ) : m ( t ) . userInvalidated = ! 0 , t } var j = Array . prototype . some || function ( e ) { for ( var t = Object ( this ) , n = t . length >>> 0 , s = 0 ; s < n ; s ++ ) if ( s in t && e . call ( this , t [ s ] , s , t ) ) return ! 0 ; return ! 1 } , Z = f . momentProperties = [ ] , z = ! 1 ; function $ ( e , t ) { var n , s , i , r = Z . length ; if ( o ( t . _isAMomentObject ) || ( e . _isAMomentObject = t . _isAMomentObject ) , o ( t . _i ) || ( e . _i = t . _i ) , o ( t . _f ) || ( e . _f = t . _f ) , o ( t . _l ) || ( e . _l = t . _l ) , o ( t . _strict ) || ( e . _strict = t . _strict ) , o ( t . _tzm ) || ( e . _tzm = t . _tzm ) , o ( t . _isUTC ) || ( e . _isUTC = t . _isUTC ) , o ( t . _offset ) || ( e . _offset = t . _offset ) , o ( t . _pf ) || ( e . _pf = m ( t ) ) , o ( t . _locale ) || ( e . _locale = t . _locale ) , 0 < r ) for ( n = 0 ; n < r ; n ++ ) o ( i = t [ s = Z [ n ] ] ) || ( e [ s ] = i ) ; return e } function q ( e ) { $ ( this , e ) , this . _d = new Date ( null != e . _d ? e . _d . getTime ( ) : NaN ) , this . isValid ( ) || ( this . _d = new Date ( NaN ) ) , ! 1 === z && ( z = ! 0 , f . updateOffset ( this ) , z = ! 1 ) } function h ( e ) { return e instanceof q || null != e && null != e . _isAMomentObject } function B ( e ) { ! 1 === f . suppressDeprecationWarnings && "undefined" != typeof console && console . warn && console . warn ( "Deprecation warning: " + e ) } function e ( r , a ) { var o = ! 0 ; return E ( function ( ) { if ( null != f . deprecationHandler && f . deprecationHandler ( null , r ) , o ) { for ( var e , t , n = [ ] , s = arguments . length , i = 0 ; i < s ; i ++ ) { if ( e = "" , "object" == typeof arguments [ i ] ) { for ( t in e += "\n[" + i + "] " , arguments [ 0 ] ) c ( arguments [ 0 ] , t ) && ( e += t + ": " + arguments [ 0 ] [ t ] + ", " ) ; e = e . slice ( 0 , - 2 ) } else e = arguments [ i ] ; n . push ( e ) } B ( r + "\nArguments: " + Array . prototype . slice . call ( n ) . join ( "" ) + "\n" + ( new Error ) . stack ) , o = ! 1 } return a . apply ( this , arguments ) } , a ) } var J = { } ; function Q ( e , t ) { null != f . deprecationHandler && f . deprecationHandler ( e , t ) , J [ e ] || ( B ( t ) , J [ e ] = ! 0 ) } function d ( e ) { return "undefined" != typeof Function && e instanceof Function || "[object Function]" === Object . prototype . toString . call ( e ) } function X ( e , t ) { var n , s = E ( { } , e ) ; for ( n in t ) c ( t , n ) && ( F ( e [ n ] ) && F ( t [ n ] ) ? ( s [ n ] = { } , E ( s [ n ] , e [ n ] ) , E ( s [ n ] , t [ n ] ) ) : null != t [ n ] ? s [ n ] = t [ n ] : delete s [ n ] ) ; for ( n in e ) c ( e , n ) && ! c ( t , n ) && F ( e [ n ] ) && ( s [ n ] = E ( { } , s [ n ] ) ) ; return s } function K ( e ) { null != e && this . set ( e ) } f . suppressDeprecationWarnings = ! 1 , f . deprecationHandler = null ; var ee = Object . keys || function ( e ) { var t , n = [ ] ; for ( t in e ) c ( e , t ) && n . push ( t ) ; return n } ; function r ( e , t , n ) { var s = "" + Math . abs ( e ) ; return ( 0 <= e ? n ? "+" : "" : "-" ) + Math . pow ( 10 , Math . max ( 0 , t - s . length ) ) . toString ( ) . substr ( 1 ) + s } var te = / ( \ [ [ ^ \ [ ] * \ ] ) | ( \ \ ) ? ( [ H h ] m m ( s s ) ? | M o | M M ? M ? M ?
2023-09-29 12:56:26 -05:00
//# sourceMappingURL=moment.min.js.map
2023-11-08 00:26:35 +00:00
! function ( c , M ) { "use strict" ; "object" == typeof module && module . exports ? module . exports = M ( require ( "moment" ) ) : "function" == typeof define && define . amd ? define ( [ "moment" ] , M ) : M ( c . moment ) } ( this , function ( b ) { "use strict" ; void 0 === b . version && b . default && ( b = b . default ) ; var M , a = { } , p = { } , n = { } , i = { } , e = { } ; b && "string" == typeof b . version || R ( "Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/" ) ; var c = b . version . split ( "." ) , A = + c [ 0 ] , o = + c [ 1 ] ; function q ( c ) { return 96 < c ? c - 87 : 64 < c ? c - 29 : c - 48 } function z ( c ) { var M = 0 , A = c . split ( "." ) , o = A [ 0 ] , z = A [ 1 ] || "" , b = 1 , a = 0 , p = 1 ; for ( 45 === c . charCodeAt ( 0 ) && ( p = - ( M = 1 ) ) ; M < o . length ; M ++ ) a = 60 * a + q ( o . charCodeAt ( M ) ) ; for ( M = 0 ; M < z . length ; M ++ ) b /= 60 , a += q ( z . charCodeAt ( M ) ) * b ; return a * p } function L ( c ) { for ( var M = 0 ; M < c . length ; M ++ ) c [ M ] = z ( c [ M ] ) } function O ( c , M ) { var A , o = [ ] ; for ( A = 0 ; A < M . length ; A ++ ) o [ A ] = c [ M [ A ] ] ; return o } function r ( c ) { var M = c . split ( "|" ) , A = M [ 2 ] . split ( " " ) , o = M [ 3 ] . split ( "" ) , z = M [ 4 ] . split ( " " ) ; return L ( A ) , L ( o ) , L ( z ) , function ( c , M ) { for ( var A = 0 ; A < M ; A ++ ) c [ A ] = Math . round ( ( c [ A - 1 ] || 0 ) + 6e4 * c [ A ] ) ; c [ M - 1 ] = 1 / 0 } ( z , o . length ) , { name : M [ 0 ] , abbrs : O ( M [ 1 ] . split ( " " ) , o ) , offsets : O ( A , o ) , untils : z , population : 0 | M [ 5 ] } } function N ( c ) { c && this . _set ( r ( c ) ) } function d ( c , M ) { this . name = c , this . zones = M } function W ( c ) { var M = c . toTimeString ( ) , A = M . match ( /\([a-z ]+\)/i ) ; "GMT" === ( A = A && A [ 0 ] ? ( A = A [ 0 ] . match ( /[A-Z]/g ) ) ? A . join ( "" ) : void 0 : ( A = M . match ( /[A-Z]{3,5}/g ) ) ? A [ 0 ] : void 0 ) && ( A = void 0 ) , this . at = + c , this . abbr = A , this . offset = c . getTimezoneOffset ( ) } function f ( c ) { this . zone = c , this . offsetScore = 0 , this . abbrScore = 0 } function X ( c , M ) { for ( var A , o ; o = 6e4 * ( ( M . at - c . at ) / 12e4 | 0 ) ; ) ( A = new W ( new Date ( c . at + o ) ) ) . offset === c . offset ? c = A : M = A ; return c } function u ( c , M ) { return c . offsetScore !== M . offsetScore ? c . offsetScore - M . offsetScore : c . abbrScore !== M . abbrScore ? c . abbrScore - M . abbrScore : c . zone . population !== M . zone . population ? M . zone . population - c . zone . population : M . zone . name . localeCompare ( c . zone . name ) } function B ( c , M ) { var A , o ; for ( L ( M ) , A = 0 ; A < M . length ; A ++ ) o = M [ A ] , e [ o ] = e [ o ] || { } , e [ o ] [ c ] = ! 0 } function l ( ) { try { var c = Intl . DateTimeFormat ( ) . resolvedOptions ( ) . timeZone ; if ( c && 3 < c . length ) { var M = i [ T ( c ) ] ; if ( M ) return M ; R ( "Moment Timezone found " + c + " from the Intl api, but did not have that data loaded." ) } } catch ( c ) { } var A , o , z , b = function ( ) { var c , M , A , o = ( new Date ) . getFullYear ( ) - 2 , z = new W ( new Date ( o , 0 , 1 ) ) , b = [ z ] ; for ( A = 1 ; A < 48 ; A ++ ) ( M = new W ( new Date ( o , A , 1 ) ) ) . offset !== z . offset && ( c = X ( z , M ) , b . push ( c ) , b . push ( new W ( new Date ( c . at + 6e4 ) ) ) ) , z = M ; for ( A = 0 ; A < 4 ; A ++ ) b . push ( new W ( new Date ( o + A , 0 , 1 ) ) ) , b . push ( new W ( new Date ( o + A , 6 , 1 ) ) ) ; return b } ( ) , a = b . length , p = function ( c ) { var M , A , o , z = c . length , b = { } , a = [ ] ; for ( M = 0 ; M < z ; M ++ ) for ( A in o = e [ c [ M ] . offset ] || { } ) o . hasOwnProperty ( A ) && ( b [ A ] = ! 0 ) ; for ( M in b ) b . hasOwnProperty ( M ) && a . push ( i [ M ] ) ; return a } ( b ) , n = [ ] ; for ( o = 0 ; o < p . length ; o ++ ) { for ( A = new f ( s ( p [ o ] ) , a ) , z = 0 ; z < a ; z ++ ) A . scoreOffsetAt ( b [ z ] ) ; n . push ( A ) } return n . sort ( u ) , 0 < n . length ? n [ 0 ] . zone . name : void 0 } function T ( c ) { return ( c || "" ) . toLowerCase ( ) . replace ( /\//g , "_" ) } function t ( c ) { var M , A , o , z ; for ( "string" == typeof c && ( c = [ c ] ) , M = 0 ; M < c . length ; M ++ ) z = T ( A = ( o = c [ M ] . split ( "|" ) ) [ 0 ] ) , a [ z ] = c [ M ] , i [ z ] = A , B ( z , o [ 2 ] . split ( " " ) ) } function s ( c , M ) { c = T ( c ) ; var A , o = a [ c ] ; return o instanceof N ? o : "string" == typeof o ? ( o = new N ( o ) , a [ c ] = o ) : p [ c ] && M !== s && ( A = s ( p [ c ] , s ) ) ? ( ( o = a [ c ] = new N ) . _set ( A ) , o . name = i [ c ] , o ) : null } function m ( c ) { var M , A , o , z ; for ( "string" == typeof c && ( c = [ c ] ) , M = 0 ; M < c . length ; M ++ ) o = T ( ( A = c [ M ] . split ( "|" ) ) [ 0 ] ) , z = T ( A [ 1 ] ) , p [ o ] = z , i [ o ] = A [ 0 ] , p [ z ] = o , i [ z ] = A [ 1 ] } function C ( c ) { t ( c . zones ) , m ( c . links ) , function ( c ) { var M , A , o , z ; if ( c && c . length ) for ( M = 0 ; M < c . length ; M ++ ) A = ( z = c [ M ] . split ( "|" ) ) [ 0 ] . toUpperCase ( ) , o = z [ 1 ] . split ( " " ) , n [ A ] = new d ( A , o ) } ( c . countries ) , S . dataVersion = c . version } function E ( c ) { var M = "X" === c . _f || "x" === c . _f ; return ! ( ! c . _a || void 0 !== c . _tzm || M ) } function R ( c ) { "undefined" != typeof console && "function" == typeof console . error && console . error ( c ) } function S ( c ) { var M = Array . prototype . slice . call ( arguments , 0 , - 1 ) , A = arguments [ arguments . length - 1 ] , o = s ( A ) , z = b . utc . apply ( null , M ) ; return o && ! b . isMoment ( c ) && E ( z ) && z . add ( o . parse ( z ) , "minutes" ) , z . tz ( A ) , z } ( A < 2 || 2 == A && o < 6 ) && R ( "Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js " + b . version + ". See momentjs.com" ) , N . prototype = { _set : function ( c ) { this . name = c . name , this . abbrs = c . abbrs , this . u
2023-09-29 12:56:26 -05:00
/ * !
* bootstrap - fileinput v4 . 5.2
* http : //plugins.krajee.com/file-input
*
* Author : Kartik Visweswaran
* Copyright : 2014 - 2018 , Kartik Visweswaran , Krajee . com
*
* Licensed under the BSD 3 - Clause
* https : //github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
* /
! function ( e ) { "use strict" ; "function" == typeof define && define . amd ? define ( [ "jquery" ] , e ) : "object" == typeof module && module . exports ? module . exports = e ( require ( "jquery" ) ) : e ( window . jQuery ) } ( function ( e ) { "use strict" ; e . fn . fileinputLocales = { } , e . fn . fileinputThemes = { } , String . prototype . setTokens = function ( e ) { var t , i , a = this . toString ( ) ; for ( t in e ) e . hasOwnProperty ( t ) && ( i = new RegExp ( "{" + t + "}" , "g" ) , a = a . replace ( i , e [ t ] ) ) ; return a } ; var t , i ; t = { FRAMES : ".kv-preview-thumb" , SORT _CSS : "file-sortable" , OBJECT _PARAMS : '<param name="controller" value="true" />\n<param name="allowFullScreen" value="true" />\n<param name="allowScriptAccess" value="always" />\n<param name="autoPlay" value="false" />\n<param name="autoStart" value="false" />\n<param name="quality" value="high" />\n' , DEFAULT _PREVIEW : '<div class="file-preview-other">\n<span class="{previewFileIconClass}">{previewFileIcon}</span>\n</div>' , MODAL _ID : "kvFileinputModal" , MODAL _EVENTS : [ "show" , "shown" , "hide" , "hidden" , "loaded" ] , objUrl : window . URL || window . webkitURL , createObjectURL : function ( e ) { return t . objUrl && t . objUrl . createObjectURL && e ? t . objUrl . createObjectURL ( e ) : "" } , revokeObjectURL : function ( e ) { t . objUrl && t . objUrl . revokeObjectURL && e && t . objUrl . revokeObjectURL ( e ) } , compare : function ( e , t , i ) { return void 0 !== e && ( i ? e === t : e . match ( t ) ) } , isIE : function ( e ) { var t , i ; return "Microsoft Internet Explorer" !== navigator . appName ? ! 1 : 10 === e ? new RegExp ( "msie\\s" + e , "i" ) . test ( navigator . userAgent ) : ( t = document . createElement ( "div" ) , t . innerHTML = "<!--[if IE " + e + "]> <i></i> <![endif]-->" , i = t . getElementsByTagName ( "i" ) . length , document . body . appendChild ( t ) , t . parentNode . removeChild ( t ) , i ) } , canAssignFilesToInput : function ( ) { var e = document . createElement ( "input" ) ; try { return e . type = "file" , e . files = null , ! 0 } catch ( t ) { return ! 1 } } , getDragDropFolders : function ( e ) { var t , i , a = e ? e . length : 0 , r = 0 ; if ( a > 0 && e [ 0 ] . webkitGetAsEntry ( ) ) for ( t = 0 ; a > t ; t ++ ) i = e [ t ] . webkitGetAsEntry ( ) , i && i . isDirectory && r ++ ; return r } , initModal : function ( t ) { var i = e ( "body" ) ; i . length && t . appendTo ( i ) } , isEmpty : function ( t , i ) { return void 0 === t || null === t || 0 === t . length || i && "" === e . trim ( t ) } , isArray : function ( e ) { return Array . isArray ( e ) || "[object Array]" === Object . prototype . toString . call ( e ) } , ifSet : function ( e , t , i ) { return i = i || "" , t && "object" == typeof t && e in t ? t [ e ] : i } , cleanArray : function ( e ) { return e instanceof Array || ( e = [ ] ) , e . filter ( function ( e ) { return void 0 !== e && null !== e } ) } , spliceArray : function ( t , i , a ) { var r , n , o = 0 , l = [ ] ; if ( ! ( t instanceof Array ) ) return [ ] ; for ( n = e . extend ( ! 0 , [ ] , t ) , a && n . reverse ( ) , r = 0 ; r < n . length ; r ++ ) r !== i && ( l [ o ] = n [ r ] , o ++ ) ; return a && l . reverse ( ) , l } , getNum : function ( e , t ) { return t = t || 0 , "number" == typeof e ? e : ( "string" == typeof e && ( e = parseFloat ( e ) ) , isNaN ( e ) ? t : e ) } , hasFileAPISupport : function ( ) { return ! ( ! window . File || ! window . FileReader ) } , hasDragDropSupport : function ( ) { var e = document . createElement ( "div" ) ; return ! t . isIE ( 9 ) && ( void 0 !== e . draggable || void 0 !== e . ondragstart && void 0 !== e . ondrop ) } , hasFileUploadSupport : function ( ) { return t . hasFileAPISupport ( ) && window . FormData } , hasBlobSupport : function ( ) { try { return ! ! window . Blob && Boolean ( new Blob ) } catch ( e ) { return ! 1 } } , hasArrayBufferViewSupport : function ( ) { try { return 100 === new Blob ( [ new Uint8Array ( 100 ) ] ) . size } catch ( e ) { return ! 1 } } , dataURI2Blob : function ( e ) { var i , a , r , n , o , l , s = window . BlobBuilder || window . WebKitBlobBuilder || window . MozBlobBuilder || window . MSBlobBuilder , d = t . hasBlobSupport ( ) , c = ( d || s ) && window . atob && window . ArrayBuffer && window . Uint8Array ; if ( ! c ) return null ; for ( i = e . split ( "," ) [ 0 ] . indexOf ( "base64" ) >= 0 ? atob ( e . split ( "," ) [ 1 ] ) : decodeURIComponent ( e . split ( "," ) [ 1 ] ) , a = new ArrayBuffer ( i . length ) , r = new Uint8Array ( a ) , n = 0 ; n < i . length ; n += 1 ) r [ n ] = i . charCodeAt ( n ) ; return o = e . split ( "," ) [ 0 ] . split ( ":" ) [ 1 ] . split ( ";" ) [ 0 ] , d ? new Blob ( [ t . hasArrayBufferViewSupport ( ) ? r : a ] , { type : o } ) : ( l = new s , l . append ( a ) , l . getBlob ( o ) ) } , arrayBuffer2String : function ( e ) { if ( window . TextDecoder ) return new TextDecoder ( "utf-8" ) . decode ( e ) ; var t , i , a , r , n = Array . prototype . slice . apply ( new Uint8Array ( e ) ) , o = "" , l = 0 ; for ( t = n . length ; t > l ; ) switch ( i = n [ l ++ ] , i >> 4 ) { case 0 : case 1 : case 2 : case 3 : case 4 : case 5 : case 6 : case 7 : o += String . fromCharCode ( i ) ; break ; case 12 : case 13 : a = n [ l ++ ] , o += String . fromCharCode ( ( 31 & i ) << 6 | 63 & a ) ; break ; case 14 : a = n [ l ++ ] , r = n [ l ++ ] , o += String . fromCharCode (
a . _handler ( e ( window ) , "resize" , function ( ) { a . _listenFullScreen ( screen . width === window . innerWidth && screen . height === window . innerHeight ) } ) , i = "webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange" , a . _handler ( e ( document ) , i , function ( ) { a . _listenFullScreen ( t . checkFullScreen ( ) ) } ) , a . _autoFitContent ( ) , a . _initClickable ( ) , a . _refreshPreview ( ) } , _autoFitContent : function ( ) { var t , i = window . innerWidth || document . documentElement . clientWidth || document . body . clientWidth , a = this , r = 400 > i ? a . previewSettingsSmall || a . defaults . previewSettingsSmall : a . previewSettings || a . defaults . previewSettings ; e . each ( r , function ( e , i ) { t = ".file-preview-frame .file-preview-" + e , a . $preview . find ( t + ".kv-preview-data," + t + " .kv-preview-data" ) . css ( i ) } ) } , _scanDroppedItems : function ( e , t , i ) { i = i || "" ; var a , r , n , o = this , l = function ( e ) { o . _log ( "Error scanning dropped files!" ) , o . _log ( e ) } ; e . isFile ? e . file ( function ( e ) { t . push ( e ) } , l ) : e . isDirectory && ( r = e . createReader ( ) , ( n = function ( ) { r . readEntries ( function ( r ) { if ( r && r . length > 0 ) { for ( a = 0 ; a < r . length ; a ++ ) o . _scanDroppedItems ( r [ a ] , t , i + e . name + "/" ) ; n ( ) } return null } , l ) } ) ( ) ) } , _initDragDrop : function ( ) { var t = this , i = t . $dropZone ; t . dropZoneEnabled && t . showPreview && ( t . _handler ( i , "dragenter dragover" , e . proxy ( t . _zoneDragEnter , t ) ) , t . _handler ( i , "dragleave" , e . proxy ( t . _zoneDragLeave , t ) ) , t . _handler ( i , "drop" , e . proxy ( t . _zoneDrop , t ) ) , t . _handler ( e ( document ) , "dragenter dragover drop" , t . _zoneDragDropInit ) ) } , _zoneDragDropInit : function ( e ) { e . stopPropagation ( ) , e . preventDefault ( ) } , _zoneDragEnter : function ( i ) { var a = this , r = i . originalEvent . dataTransfer , n = e . inArray ( "Files" , r . types ) > - 1 ; return a . _zoneDragDropInit ( i ) , a . isDisabled || ! n ? ( i . originalEvent . dataTransfer . effectAllowed = "none" , void ( i . originalEvent . dataTransfer . dropEffect = "none" ) ) : void ( a . _raise ( "fileDragEnter" , { sourceEvent : i , files : r . types . Files } ) && t . addCss ( a . $dropZone , "file-highlighted" ) ) } , _zoneDragLeave : function ( e ) { var t = this ; t . _zoneDragDropInit ( e ) , t . isDisabled || t . _raise ( "fileDragLeave" , { sourceEvent : e } ) && t . $dropZone . removeClass ( "file-highlighted" ) } , _zoneDrop : function ( e ) { var i , a = this , r = a . $element , n = e . originalEvent . dataTransfer , o = n . files , l = n . items , s = t . getDragDropFolders ( l ) , d = function ( ) { a . isAjaxUpload ? a . _change ( e , o ) : ( a . changeTriggered = ! 0 , r . get ( 0 ) . files = o , setTimeout ( function ( ) { a . changeTriggered = ! 1 , r . trigger ( "change" + a . namespace ) } , 10 ) ) , a . $dropZone . removeClass ( "file-highlighted" ) } ; if ( e . preventDefault ( ) , ! a . isDisabled && ! t . isEmpty ( o ) && a . _raise ( "fileDragDrop" , { sourceEvent : e , files : o } ) ) if ( s > 0 ) { if ( ! a . isAjaxUpload ) return void a . _showFolderError ( s ) ; for ( o = [ ] , i = 0 ; i < l . length ; i ++ ) { var c = l [ i ] . webkitGetAsEntry ( ) ; c && a . _scanDroppedItems ( c , o ) } setTimeout ( function ( ) { d ( ) } , 500 ) } else d ( ) } , _uploadClick : function ( e ) { var i , a = this , r = a . $container . find ( ".fileinput-upload" ) , n = ! r . hasClass ( "disabled" ) && t . isEmpty ( r . attr ( "disabled" ) ) ; if ( ! e || ! e . isDefaultPrevented ( ) ) { if ( ! a . isAjaxUpload ) return void ( n && "submit" !== r . attr ( "type" ) && ( i = r . closest ( "form" ) , i . length && i . trigger ( "submit" ) , e . preventDefault ( ) ) ) ; e . preventDefault ( ) , n && a . upload ( ) } } , _submitForm : function ( ) { var e = this ; return e . _isFileSelectionValid ( ) && ! e . _abort ( { } ) } , _clearPreview : function ( ) { var i = this , a = i . $preview , r = i . showUploadedThumbs ? i . getFrames ( ":not(.file-preview-success)" ) : i . getFrames ( ) ; r . each ( function ( ) { var i = e ( this ) ; i . remove ( ) , t . cleanZoomCache ( a . find ( "#zoom-" + i . attr ( "id" ) ) ) } ) , i . getFrames ( ) . length && i . showPreview || i . _resetUpload ( ) , i . _validateDefaultPreview ( ) } , _initSortable : function ( ) { var i , a = this , r = a . $preview , n = "." + t . SORT _CSS , o = a . reversePreviewOrder ; window . KvSortable && 0 !== r . find ( n ) . length && ( i = { handle : ".drag-handle-init" , dataIdAttr : "data-preview-id" , scroll : ! 1 , draggable : n , onSort : function ( i ) { var r = i . oldIndex , n = i . newIndex , l = 0 ; a . initialPreview = t . moveArray ( a . initialPreview , r , n , o ) , a . initialPreviewConfig = t . moveArray ( a . initialPreviewConfig , r , n , o ) , a . previewCache . init ( ) , a . getFrames ( ".file-preview-initial" ) . each ( function ( ) { e ( this ) . attr ( "data-fileindex" , "init_" + l ) , l ++ } ) , a . _raise ( "filesorted" , { previewId : e ( i . item ) . attr ( "id" ) , oldIndex : r , newIndex : n , stack : a . initialPreviewConfig } ) } } , r . data ( "kvsortable" ) && r . kvsortable ( "destroy" ) , e . extend ( ! 0 , i , a . fileActionSettings . dragSettings ) , r . kvsortable ( i ) ) } , _setPreviewContent : function (
i . $previewStatus . html ( "" ) , i . $captionContainer . removeClass ( "icon-visible" ) ) : i . _showFileIcon ( ) , i . _setCaption ( d , i . isError ) , i . $container . removeClass ( "file-input-new file-input-ajax-new" ) , 1 === arguments . length && i . _raise ( "fileselect" , [ e , o ] ) , i . previewCache . count ( ) && i . _initPreviewActions ( ) } , _setThumbStatus : function ( e , t ) { var i = this ; if ( i . showPreview ) { var a = "indicator" + t , r = a + "Title" , n = "file-preview-" + t . toLowerCase ( ) , o = e . find ( ".file-upload-indicator" ) , l = i . fileActionSettings ; e . removeClass ( "file-preview-success file-preview-error file-preview-loading" ) , "Success" === t && e . find ( ".file-drag-handle" ) . remove ( ) , o . html ( l [ a ] ) , o . attr ( "title" , l [ r ] ) , e . addClass ( n ) , "Error" !== t || i . retryErrorUploads || e . find ( ".kv-file-upload" ) . attr ( "disabled" , ! 0 ) } } , _setProgressCancelled : function ( ) { var e = this ; e . _setProgress ( 101 , e . $progress , e . msgCancelled ) } , _setProgress : function ( e , i , a ) { var r , n = this , o = Math . min ( e , 100 ) , l = n . progressUploadThreshold , s = 100 >= e ? n . progressTemplate : n . progressCompleteTemplate , d = 100 > o ? n . progressTemplate : a ? n . progressErrorTemplate : s ; i = i || n . $progress , t . isEmpty ( d ) || ( r = l && o > l && 100 >= e ? d . setTokens ( { percent : l , status : n . msgUploadThreshold } ) : d . setTokens ( { percent : o , status : e > 100 ? n . msgUploadEnd : o + "%" } ) , i . html ( r ) , a && i . find ( '[role="progressbar"]' ) . html ( a ) ) } , _setFileDropZoneTitle : function ( ) { var e , i = this , a = i . $container . find ( ".file-drop-zone" ) , r = i . dropZoneTitle ; i . isClickable && ( e = t . isEmpty ( i . $element . attr ( "multiple" ) ) ? i . fileSingle : i . filePlural , r += i . dropZoneClickTitle . replace ( "{files}" , e ) ) , a . find ( "." + i . dropZoneTitleClass ) . remove ( ) , ! i . showPreview || 0 === a . length || i . getFileStack ( ) . length > 0 || ! i . dropZoneEnabled || ! i . isAjaxUpload && i . $element . files || ( 0 === a . find ( t . FRAMES ) . length && t . isEmpty ( i . defaultPreviewContent ) && a . prepend ( '<div class="' + i . dropZoneTitleClass + '">' + r + "</div>" ) , i . $container . removeClass ( "file-input-new" ) , t . addCss ( i . $container , "file-input-ajax-new" ) ) } , _setAsyncUploadStatus : function ( t , i , a ) { var r = this , n = 0 ; r . _setProgress ( i , e ( "#" + t ) . find ( ".file-thumb-progress" ) ) , r . uploadStatus [ t ] = i , e . each ( r . uploadStatus , function ( e , t ) { n += t } ) , r . _setProgress ( Math . floor ( n / a ) ) } , _validateMinCount : function ( ) { var e = this , t = e . isAjaxUpload ? e . getFileStack ( ) . length : e . _inputFileCount ( ) ; return e . validateInitialCount && e . minFileCount > 0 && e . _getFileCount ( t - 1 ) < e . minFileCount ? ( e . _noFilesError ( { } ) , ! 1 ) : ! 0 } , _getFileCount : function ( e ) { var t = this , i = 0 ; return t . validateInitialCount && ! t . overwriteInitial && ( i = t . previewCache . count ( ) , e += i ) , e } , _getFileId : function ( e ) { var t , i = this , a = i . generateFileId ; return "function" == typeof a ? a ( e , event ) : e ? ( t = String ( e . webkitRelativePath || e . fileName || e . name || null ) , t ? e . size + "-" + t . replace ( /[^0-9a-zA-Z_-]/gim , "" ) : null ) : null } , _getFileName : function ( e ) { return e && e . name ? this . slug ( e . name ) : void 0 } , _getFileIds : function ( e ) { var t = this ; return t . fileids . filter ( function ( t ) { return e ? void 0 !== t : void 0 !== t && null !== t } ) } , _getFileNames : function ( e ) { var t = this ; return t . filenames . filter ( function ( t ) { return e ? void 0 !== t : void 0 !== t && null !== t } ) } , _setPreviewError : function ( e , t , i , a ) { var r = this ; if ( void 0 !== t && r . updateStack ( t , i ) , r . showPreview ) { if ( r . removeFromPreviewOnError && ! a ) return void e . remove ( ) ; r . _setThumbStatus ( e , "Error" ) , r . _refreshUploadButton ( e , a ) } } , _refreshUploadButton : function ( e , t ) { var i = this , a = e . find ( ".kv-file-upload" ) , r = i . fileActionSettings , n = r . uploadIcon , o = r . uploadTitle ; a . length && ( t && ( n = r . uploadRetryIcon , o = r . uploadRetryTitle ) , a . attr ( "title" , o ) . html ( n ) ) } , _checkDimensions : function ( e , i , a , r , n , o , l ) { var s , d , c , p , u = this , f = "Small" === i ? "min" : "max" , m = u [ f + "Image" + o ] ; ! t . isEmpty ( m ) && a . length && ( c = a [ 0 ] , d = "Width" === o ? c . naturalWidth || c . width : c . naturalHeight || c . height , p = "Small" === i ? d >= m : m >= d , p || ( s = u [ "msgImage" + o + i ] . setTokens ( { name : n , size : m } ) , u . _showUploadError ( s , l ) , u . _setPreviewError ( r , e , null ) ) ) } , _getExifObj : function ( e ) { var t = this , i = null ; try { i = window . piexif ? window . piexif . load ( e ) : null } catch ( a ) { i = null } return i || t . _log ( "Error loading the piexif.js library." ) , i } , _validateImageOrientation : function ( e , i , a , r , n , o , l ) { var s , d , c = this ; return s = e . length && c . autoOrientImage ? c . _getExifObj ( l ) : null , ( d = s ? s [ "0th" ] [ piexif . ImageIFD . Orientation ] : null ) ? ( t . setImageOrientation ( e , c . $preview . find ( "#zoom-" + a + " img" ) , d ) , c . _raise ( "fileimageoriented" , { $img : e , file
var t = e ( "input.file[type=file]" ) ; t . length && t . fileinput ( ) } ) } ) ;
/ * ! j Q u e r y U I - v 1 . 1 2 . 1 - 2 0 2 1 - 0 7 - 1 4
* http : //jqueryui.com
* Includes : widget . js , position . js , jquery - 1 - 7. js , keycode . js , unique - id . js , widgets / autocomplete . js , widgets / menu . js
* Copyright jQuery Foundation and other contributors ; Licensed MIT * /
! function ( t ) { "function" == typeof define && define . amd ? define ( [ "jquery" ] , t ) : t ( jQuery ) } ( function ( x ) { x . ui = x . ui || { } ; x . ui . version = "1.12.1" ; var n , i = 0 , l = Array . prototype . slice ; x . cleanData = ( n = x . cleanData , function ( t ) { for ( var e , i , s = 0 ; null != ( i = t [ s ] ) ; s ++ ) try { ( e = x . _data ( i , "events" ) ) && e . remove && x ( i ) . triggerHandler ( "remove" ) } catch ( t ) { } n ( t ) } ) , x . widget = function ( t , i , e ) { var s , n , o , a = { } , l = t . split ( "." ) [ 0 ] , r = l + "-" + ( t = t . split ( "." ) [ 1 ] ) ; return e || ( e = i , i = x . Widget ) , x . isArray ( e ) && ( e = x . extend . apply ( null , [ { } ] . concat ( e ) ) ) , x . expr [ ":" ] [ r . toLowerCase ( ) ] = function ( t ) { return ! ! x . data ( t , r ) } , x [ l ] = x [ l ] || { } , s = x [ l ] [ t ] , n = x [ l ] [ t ] = function ( t , e ) { if ( ! this . _createWidget ) return new n ( t , e ) ; arguments . length && this . _createWidget ( t , e ) } , x . extend ( n , s , { version : e . version , _proto : x . extend ( { } , e ) , _childConstructors : [ ] } ) , ( o = new i ) . options = x . widget . extend ( { } , o . options ) , x . each ( e , function ( e , s ) { function n ( ) { return i . prototype [ e ] . apply ( this , arguments ) } function o ( t ) { return i . prototype [ e ] . apply ( this , t ) } x . isFunction ( s ) ? a [ e ] = function ( ) { var t , e = this . _super , i = this . _superApply ; return this . _super = n , this . _superApply = o , t = s . apply ( this , arguments ) , this . _super = e , this . _superApply = i , t } : a [ e ] = s } ) , n . prototype = x . widget . extend ( o , { widgetEventPrefix : s && o . widgetEventPrefix || t } , a , { constructor : n , namespace : l , widgetName : t , widgetFullName : r } ) , s ? ( x . each ( s . _childConstructors , function ( t , e ) { var i = e . prototype ; x . widget ( i . namespace + "." + i . widgetName , n , e . _proto ) } ) , delete s . _childConstructors ) : i . _childConstructors . push ( n ) , x . widget . bridge ( t , n ) , n } , x . widget . extend = function ( t ) { for ( var e , i , s = l . call ( arguments , 1 ) , n = 0 , o = s . length ; n < o ; n ++ ) for ( e in s [ n ] ) i = s [ n ] [ e ] , s [ n ] . hasOwnProperty ( e ) && void 0 !== i && ( x . isPlainObject ( i ) ? t [ e ] = x . isPlainObject ( t [ e ] ) ? x . widget . extend ( { } , t [ e ] , i ) : x . widget . extend ( { } , i ) : t [ e ] = i ) ; return t } , x . widget . bridge = function ( o , e ) { var a = e . prototype . widgetFullName || o ; x . fn [ o ] = function ( i ) { var t = "string" == typeof i , s = l . call ( arguments , 1 ) , n = this ; return t ? this . length || "instance" !== i ? this . each ( function ( ) { var t , e = x . data ( this , a ) ; return "instance" === i ? ( n = e , ! 1 ) : e ? x . isFunction ( e [ i ] ) && "_" !== i . charAt ( 0 ) ? ( t = e [ i ] . apply ( e , s ) ) !== e && void 0 !== t ? ( n = t && t . jquery ? n . pushStack ( t . get ( ) ) : t , ! 1 ) : void 0 : x . error ( "no such method '" + i + "' for " + o + " widget instance" ) : x . error ( "cannot call methods on " + o + " prior to initialization; attempted to call method '" + i + "'" ) } ) : n = void 0 : ( s . length && ( i = x . widget . extend . apply ( null , [ i ] . concat ( s ) ) ) , this . each ( function ( ) { var t = x . data ( this , a ) ; t ? ( t . option ( i || { } ) , t . _init && t . _init ( ) ) : x . data ( this , a , new e ( i , this ) ) } ) ) , n } } , x . Widget = function ( ) { } , x . Widget . _childConstructors = [ ] , x . Widget . prototype = { widgetName : "widget" , widgetEventPrefix : "" , defaultElement : "<div>" , options : { classes : { } , disabled : ! 1 , create : null } , _createWidget : function ( t , e ) { e = x ( e || this . defaultElement || this ) [ 0 ] , this . element = x ( e ) , this . uuid = i ++ , this . eventNamespace = "." + this . widgetName + this . uuid , this . bindings = x ( ) , this . hoverable = x ( ) , this . focusable = x ( ) , this . classesElementLookup = { } , e !== this && ( x . data ( e , this . widgetFullName , this ) , this . _on ( ! 0 , this . element , { remove : function ( t ) { t . target === e && this . destroy ( ) } } ) , this . document = x ( e . style ? e . ownerDocument : e . document || e ) , this . window = x ( this . document [ 0 ] . defaultView || this . document [ 0 ] . parentWindow ) ) , this . options = x . widget . extend ( { } , this . options , this . _getCreateOptions ( ) , t ) , this . _create ( ) , this . options . disabled && this . _setOptionDisabled ( this . options . disabled ) , this . _trigger ( "create" , null , this . _getCreateEventData ( ) ) , this . _init ( ) } , _getCreateOptions : function ( ) { return { } } , _getCreateEventData : x . noop , _create : x . noop , _init : x . noop , destroy : function ( ) { var i = this ; this . _destroy ( ) , x . each ( this . classesElementLookup , function ( t , e ) { i . _removeClass ( e , t ) } ) , this . element . off ( this . eventNamespace ) . removeData ( this . widgetFullName ) , this . widget ( ) . off ( this . eventNamespace ) . removeAttr ( "aria-disabled" ) , this . bindings . off ( this . eventNamespace ) } , _destroy : x . noop , widget : function ( ) { return this . element } , option : function ( t , e ) { var i , s , n , o = t ; if ( 0 === arguments . length ) return x . widget . extend ( { } , this . options ) ; if ( "string" == typeof t ) if ( o = { } , t = ( i = t . split ( "." ) ) . shift ( ) , i . length ) { for ( s = o [ t ] = x . widget . extend ( { } , this . options [ t ] ) , n = 0 ; n < i . length - 1 ; n ++ ) s [ i [ n ] ] = s [ i [ n ] ] || { } , s = s [ i [ n ] ] ; if ( t = i . pop ( ) , 1 === arguments . length ) return void 0 === s [ t ] ? nul
// DisplayShortTime displays HH:MM if the same day, otherwise displays the date. Hover displays the complete time.
// t is seconds or nanoseconds since unix epoch, depending on if isSecs is true or not
// tzstr is the timezone string
// includeTime defaults to true if we want to include the time
function DisplayShortTime ( t , isSecs , tzstr , dateFormat , timeFormat ) {
if ( t == 0 ) {
return ""
}
if ( typeof isSecs === "undefined" || isSecs == false ) {
isSecs = false ;
d = new Date ( t / 1000000 )
} else {
d = new Date ( t * 1000 )
}
if ( typeof tzstr === "undefined" || tzstr == "" ) {
tzstr = ""
momentDay = moment ( d ) ;
} else {
momentDay = moment . tz ( d , tzstr ) ;
}
if ( typeof dateFormat == "undefined" ) {
dateFormat = "M/DD/YY"
}
if ( typeof timeFormat == "undefined" ) {
timeFormat = "h:mma"
}
var today = moment ( ) ;
if ( today . isSame ( momentDay , 'd' ) ) {
dispTime = momentDay . format ( timeFormat ) ;
} else {
var today = moment ( ) ;
if ( today . isSame ( momentDay , 'y' ) ) {
dispTime = momentDay . format ( "MMM D" )
} else {
y = momentDay . year ( ) ;
if ( y > 1999 || dateFormat != "MM/DD/YY" ) {
dispTime = momentDay . format ( dateFormat )
} else {
// We know the dateFormat ends with YY, so we can safely add two more if needed
dispTime = momentDay . format ( dateFormat + "YY" )
}
// dispTime = momentDay.format("MMM 'YY")
}
}
absoluteTimeTitle = momentDay . format ( "MMM D, YYYY " + timeFormat ) ;
return '<span title="' + absoluteTimeTitle + '">' + dispTime + '</span>'
}
function DisplayFeedTime ( t , tzstr , dateFormat , timeFormat ) {
if ( t == 0 ) {
return ""
}
if ( typeof tzstr === "undefined" || tzstr == "" ) {
tzstr = ""
momentDay = moment ( t ) ;
} else {
momentDay = moment . tz ( t , tzstr ) ;
}
if ( typeof dateFormat == "undefined" ) {
dateFormat = "M/DD/YY"
}
if ( typeof timeFormat == "undefined" ) {
timeFormat = "h:mma"
}
var today = moment ( ) ;
if ( today . isSame ( momentDay , 'd' ) ) {
dispTime = momentDay . format ( timeFormat ) ;
} else {
var today = moment ( ) ;
if ( today . isSame ( momentDay , 'y' ) ) {
dispTime = momentDay . format ( "MMM D" )
} else {
y = momentDay . year ( ) ;
if ( y > 1999 || dateFormat != "MM/DD/YY" ) {
dispTime = momentDay . format ( dateFormat )
} else {
// We know the dateFormat ends with YY, so we can safely add two more if needed
dispTime = momentDay . format ( dateFormat + "YY" )
}
// dispTime = momentDay.format("MMM 'YY")
}
}
absoluteTimeTitle = momentDay . format ( "MMM D, YYYY " + timeFormat ) ;
return '<span title="' + absoluteTimeTitle + '">' + dispTime + '</span>'
}
function DisplayFullTime ( t , isSecs , tzstr , dateFormat , timeFormat ) {
if ( t == 0 ) {
return ""
}
if ( typeof isSecs === "undefined" || isSecs == false ) {
isSecs = false ;
d = new Date ( t / 1000000 )
} else {
d = new Date ( t * 1000 )
}
if ( typeof tzstr === "undefined" || tzstr == "" ) {
tzstr = ""
momentDay = moment ( d ) ;
} else {
momentDay = moment . tz ( d , tzstr ) ;
}
if ( typeof dateFormat == "undefined" ) {
dateFormat = "M/DD/YY"
}
if ( typeof timeFormat == "undefined" ) {
timeFormat = "h:mma"
}
if ( timeFormat != "" ) {
// add a space
timeFormat = " " + timeFormat ;
}
return momentDay . format ( dateFormat + timeFormat ) ;
}
// Used by chat
function CompareDates ( t1 , t2 ) {
var d1 = new Date ( t1 ) ;
moment1 = moment ( d1 ) ;
var d2 = new Date ( t2 ) ;
moment2 = moment ( d2 ) ;
return moment1 . isSame ( moment2 , 'day' ) ;
}
// Used by chat
function IsToday ( t ) {
var d = new Date ( t ) ;
m = moment ( d ) ;
return m . isSame ( moment ( ) , 'day' ) ;
}
// Used by chat
function DisplayDate ( t , tzstr ) {
var d = new Date ( t )
if ( tzstr == "" ) {
momentDay = moment ( d ) ;
} else {
momentDay = moment . tz ( d , tzstr ) ;
}
return momentDay . format ( "MMM D, YYYY" )
}
// Used by chat
function DisplayHoursMins ( t , isSecs , tzstr ) {
if ( typeof isSecs === "undefined" || isSecs == false ) {
d = new Date ( t )
} else {
d = new Date ( t / 1000000 )
}
if ( typeof tzstr === "undefined" || tzstr == "" ) {
momentDay = moment ( d ) ;
} else {
momentDay = moment . tz ( d , tzstr ) ;
}
return momentDay . format ( "h:mma" )
}
function checkAll ( bx ) {
var cbs = document . getElementsByTagName ( 'input' ) ;
for ( var i = 0 ; i < cbs . length ; i ++ ) {
if ( cbs [ i ] . type == 'checkbox' ) {
// TODO, make all checkboxes consistantly named 'id' and remove this special case.
if ( cbs [ i ] . name != "bccme" && cbs [ i ] . name != "bccall" ) {
cbs [ i ] . checked = bx . checked ;
}
}
}
}
/ *
* jQuery dotdotdot 1.8 . 1
*
* Copyright ( c ) Fred Heusschen
* www . frebsite . nl
*
* Plugin website :
* dotdotdot . frebsite . nl
*
* Licensed under the MIT license .
* http : //en.wikipedia.org/wiki/MIT_License
* /
! function ( t , e ) { function n ( t , e , n ) { var r = t . children ( ) , o = ! 1 ; t . empty ( ) ; for ( var i = 0 , d = r . length ; d > i ; i ++ ) { var l = r . eq ( i ) ; if ( t . append ( l ) , n && t . append ( n ) , a ( t , e ) ) { l . remove ( ) , o = ! 0 ; break } n && n . detach ( ) } return o } function r ( e , n , i , d , l ) { var s = ! 1 , c = "a, table, thead, tbody, tfoot, tr, col, colgroup, object, embed, param, ol, ul, dl, blockquote, select, optgroup, option, textarea, script, style" , u = "script, .dotdotdot-keep" ; return e . contents ( ) . detach ( ) . each ( function ( ) { var h = this , f = t ( h ) ; if ( "undefined" == typeof h ) return ! 0 ; if ( f . is ( u ) ) e . append ( f ) ; else { if ( s ) return ! 0 ; e . append ( f ) , ! l || f . is ( d . after ) || f . find ( d . after ) . length || e [ e . is ( c ) ? "after" : "append" ] ( l ) , a ( i , d ) && ( s = 3 == h . nodeType ? o ( f , n , i , d , l ) : r ( f , n , i , d , l ) ) , s || l && l . detach ( ) } } ) , n . addClass ( "is-truncated" ) , s } function o ( e , n , r , o , d ) { var c = e [ 0 ] ; if ( ! c ) return ! 1 ; var h = s ( c ) , f = - 1 !== h . indexOf ( " " ) ? " " : " " , p = "letter" == o . wrap ? "" : f , g = h . split ( p ) , v = - 1 , w = - 1 , b = 0 , y = g . length - 1 ; for ( o . fallbackToLetter && 0 == b && 0 == y && ( p = "" , g = h . split ( p ) , y = g . length - 1 ) ; y >= b && ( 0 != b || 0 != y ) ; ) { var m = Math . floor ( ( b + y ) / 2 ) ; if ( m == w ) break ; w = m , l ( c , g . slice ( 0 , w + 1 ) . join ( p ) + o . ellipsis ) , r . children ( ) . each ( function ( ) { t ( this ) . toggle ( ) . toggle ( ) } ) , a ( r , o ) ? ( y = w , o . fallbackToLetter && 0 == b && 0 == y && ( p = "" , g = g [ 0 ] . split ( p ) , v = - 1 , w = - 1 , b = 0 , y = g . length - 1 ) ) : ( v = w , b = w ) } if ( - 1 == v || 1 == g . length && 0 == g [ 0 ] . length ) { var x = e . parent ( ) ; e . detach ( ) ; var C = d && d . closest ( x ) . length ? d . length : 0 ; x . contents ( ) . length > C ? c = u ( x . contents ( ) . eq ( - 1 - C ) , n ) : ( c = u ( x , n , ! 0 ) , C || x . detach ( ) ) , c && ( h = i ( s ( c ) , o ) , l ( c , h ) , C && d && t ( c ) . parent ( ) . append ( d ) ) } else h = i ( g . slice ( 0 , v + 1 ) . join ( p ) , o ) , l ( c , h ) ; return ! 0 } function a ( t , e ) { return t . innerHeight ( ) > e . maxHeight } function i ( e , n ) { for ( ; t . inArray ( e . slice ( - 1 ) , n . lastCharacter . remove ) > - 1 ; ) e = e . slice ( 0 , - 1 ) ; return t . inArray ( e . slice ( - 1 ) , n . lastCharacter . noEllipsis ) < 0 && ( e += n . ellipsis ) , e } function d ( t ) { return { width : t . innerWidth ( ) , height : t . innerHeight ( ) } } function l ( t , e ) { t . innerText ? t . innerText = e : t . nodeValue ? t . nodeValue = e : t . textContent && ( t . textContent = e ) } function s ( t ) { return t . innerText ? t . innerText : t . nodeValue ? t . nodeValue : t . textContent ? t . textContent : "" } function c ( t ) { do t = t . previousSibling ; while ( t && 1 !== t . nodeType && 3 !== t . nodeType ) ; return t } function u ( e , n , r ) { var o , a = e && e [ 0 ] ; if ( a ) { if ( ! r ) { if ( 3 === a . nodeType ) return a ; if ( t . trim ( e . text ( ) ) ) return u ( e . contents ( ) . last ( ) , n ) } for ( o = c ( a ) ; ! o ; ) { if ( e = e . parent ( ) , e . is ( n ) || ! e . length ) return ! 1 ; o = c ( e [ 0 ] ) } if ( o ) return u ( t ( o ) , n ) } return ! 1 } function h ( e , n ) { return e ? "string" == typeof e ? ( e = t ( e , n ) , e . length ? e : ! 1 ) : e . jquery ? e : ! 1 : ! 1 } function f ( t ) { for ( var e = t . innerHeight ( ) , n = [ "paddingTop" , "paddingBottom" ] , r = 0 , o = n . length ; o > r ; r ++ ) { var a = parseInt ( t . css ( n [ r ] ) , 10 ) ; isNaN ( a ) && ( a = 0 ) , e -= a } return e } if ( ! t . fn . dotdotdot ) { t . fn . dotdotdot = function ( e ) { if ( 0 == this . length ) return t . fn . dotdotdot . debug ( 'No element found for "' + this . selector + '".' ) , this ; if ( this . length > 1 ) return this . each ( function ( ) { t ( this ) . dotdotdot ( e ) } ) ; var o = this , i = o . contents ( ) ; o . data ( "dotdotdot" ) && o . trigger ( "destroy.dot" ) , o . data ( "dotdotdot-style" , o . attr ( "style" ) || "" ) , o . css ( "word-wrap" , "break-word" ) , "nowrap" === o . css ( "white-space" ) && o . css ( "white-space" , "normal" ) , o . bind _events = function ( ) { return o . bind ( "update.dot" , function ( e , d ) { switch ( o . removeClass ( "is-truncated" ) , e . preventDefault ( ) , e . stopPropagation ( ) , typeof l . height ) { case "number" : l . maxHeight = l . height ; break ; case "function" : l . maxHeight = l . height . call ( o [ 0 ] ) ; break ; default : l . maxHeight = f ( o ) } l . maxHeight += l . tolerance , "undefined" != typeof d && ( ( "string" == typeof d || "nodeType" in d && 1 === d . nodeType ) && ( d = t ( "<div />" ) . append ( d ) . contents ( ) ) , d instanceof t && ( i = d ) ) , g = o . wrapInner ( '<div class="dotdotdot" />' ) . children ( ) , g . contents ( ) . detach ( ) . end ( ) . append ( i . clone ( ! 0 ) ) . find ( "br" ) . replaceWith ( " <br /> " ) . end ( ) . css ( { height : "auto" , width : "auto" , border : "none" , padding : 0 , margin : 0 } ) ; var c = ! 1 , u = ! 1 ; return s . afterElement && ( c = s . afterElement . clone ( ! 0 ) , c . show ( ) , s . afterElement . detach ( ) ) , a ( g , l ) && ( u = "children" == l . wrap ? n ( g , l , c ) : r ( g , o , g , l , c ) ) , g . replaceWith ( g . contents ( ) ) , g = null , t . isFunction ( l . callback ) && l . callback . call ( o [ 0 ] , u , i ) , s . isTruncated = u , u } ) . bind ( "isTruncated.dot" , function ( t , e ) { return t . preventDefault ( ) , t . stopPropagation ( ) , "function" == typeof e && e . call ( o [ 0 ] , s . isTruncated ) , s . isTruncated } ) . bind ( "originalContent.dot" , function ( t , e ) { return t . preventD
var drawer = function ( ) {
/ * *
* Element . closest ( ) polyfill
* https : //developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill
* /
if ( ! Element . prototype . closest ) {
if ( ! Element . prototype . matches ) {
Element . prototype . matches = Element . prototype . msMatchesSelector || Element . prototype . webkitMatchesSelector ;
}
Element . prototype . closest = function ( s ) {
var el = this ;
var ancestor = this ;
if ( ! document . documentElement . contains ( el ) ) return null ;
do {
if ( ancestor . matches ( s ) ) return ancestor ;
ancestor = ancestor . parentElement ;
} while ( ancestor !== null ) ;
return null ;
} ;
}
//
// Settings
//
var settings = {
speedOpen : 50 ,
speedClose : 350 ,
activeClass : 'is-active' ,
visibleClass : 'is-visible' ,
selectorTarget : '[data-drawer-target]' ,
selectorTrigger : '[data-drawer-trigger]' ,
selectorClose : '[data-drawer-close]' ,
} ;
//
// Methods
//
// Toggle accessibility
var toggleccessibility = function ( event ) {
if ( event . getAttribute ( 'aria-expanded' ) === 'true' ) {
event . setAttribute ( 'aria-expanded' , false ) ;
} else {
event . setAttribute ( 'aria-expanded' , true ) ;
}
} ;
// Open Drawer
var openDrawer = function ( trigger ) {
// Find target
var target = document . getElementById ( trigger . getAttribute ( 'aria-controls' ) ) ;
// Make it active
target . classList . add ( settings . activeClass ) ;
// Make body overflow hidden so it's not scrollable if we're not a bottom sheet
if ( ! target . classList . contains ( 'drawer--bottom' ) ) {
document . documentElement . style . overflow = 'hidden' ;
}
// Toggle accessibility
toggleccessibility ( trigger ) ;
// Make it visible
setTimeout ( function ( ) {
target . classList . add ( settings . visibleClass ) ;
} , settings . speedOpen ) ;
} ;
// Close Drawer
var closeDrawer = function ( event ) {
// Find target
var closestParent = event . closest ( settings . selectorTarget ) ,
childrenTrigger = document . querySelector ( '[aria-controls="' + closestParent . id + '"]' ) ;
// Make it not visible
closestParent . classList . remove ( settings . visibleClass ) ;
// Remove body overflow hidden if we're not a bottom sheet
if ( ! closestParent . classList . contains ( 'drawer--bottom' ) ) {
document . documentElement . style . overflow = '' ;
}
// Toggle accessibility
toggleccessibility ( childrenTrigger ) ;
// Make it not active
setTimeout ( function ( ) {
closestParent . classList . remove ( settings . activeClass ) ;
} , settings . speedClose ) ;
} ;
// Click Handler
var clickHandler = function ( event ) {
// Find elements
var toggle = event . target ,
open = toggle . closest ( settings . selectorTrigger ) ,
close = toggle . closest ( settings . selectorClose ) ;
// Open drawer when the open button is clicked
if ( open ) {
openDrawer ( open ) ;
}
// Close drawer when the close button (or overlay area) is clicked
if ( close ) {
closeDrawer ( close ) ;
}
// Prevent default link behavior
if ( open || close ) {
event . preventDefault ( ) ;
}
} ;
// Keydown Handler, handle Escape button
var keydownHandler = function ( event ) {
if ( event . key === 'Escape' || event . keyCode === 27 ) {
// Find all possible drawers
var drawers = document . querySelectorAll ( settings . selectorTarget ) ,
i ;
// Find active drawers and close them when escape is clicked
for ( i = 0 ; i < drawers . length ; ++ i ) {
if ( drawers [ i ] . classList . contains ( settings . activeClass ) ) {
closeDrawer ( drawers [ i ] ) ;
}
}
}
} ;
//
// Inits & Event Listeners
//
document . addEventListener ( 'click' , clickHandler , false ) ;
document . addEventListener ( 'keydown' , keydownHandler , false ) ;
// Return an object with the closeDrawer function
return {
closeDrawer : closeDrawer
} ;
} ;
var drawerObj = drawer ( ) ;
// Poll functions
function showResults ( mid , groupurl ) {
$ . ajax ( {
url : groupurl + "/pollresults?pollid=" + mid ,
cache : false ,
xhrFields : {
withCredentials : true
}
} ) . done ( function ( data ) {
var html = ""
$ . each ( data , function ( key , val ) {
html += val . Index + ". "
html += val . Answer
var count = ""
if ( val . Count == 1 ) {
count = " vote"
} else {
count = " votes"
}
html += '<span class="hidden-sm hidden-md hidden-lg"> - ' + val . Count + ' ' + count + '</span>'
html += '<div class="row"><div class="col-sm-10"><div class="progress"><div class="progress-bar" role="progressbar" aria-valuenow="' + val . Percentage + '" aria-valuemin="0" aria-valuemax="100" style="width: ' + val . Percentage + '%;">' + val . Percentage + '%</div></div></div><div class="col-sm-2 hidden-xs"><strong>' + val . Count + count + '</strong></div></div>'
} ) ;
$ ( "#barchart" + mid ) . html ( html )
$ ( "#vote" + mid ) . hide ( ) ;
$ ( "#results" + mid ) . show ( )
} ) ;
}
function showVote ( mid ) {
$ ( "#vote" + mid ) . show ( ) ;
$ ( "#results" + mid ) . hide ( )
$ ( "#thanks" + mid ) . hide ( )
}
function vote ( pollid , groupurl , csrf ) {
// get value of all check/radio boxes in form
var results = [ ]
$ ( '#pollform' + pollid + ' input:checkbox:checked' ) . each ( function ( ) {
mid = $ ( this ) . attr ( "name" ) . split ( "." ) [ 2 ]
results . push ( mid )
} ) ;
$ ( '#pollform' + pollid + ' input:radio:checked' ) . each ( function ( ) {
mid = $ ( this ) . attr ( "value" )
results . push ( mid )
} ) ;
let theurl = groupurl + "/toggleanswer?noredir=1&pollid=" + pollid + "&csrf=" + csrf + "&answerid=" + results ;
$ . ajax ( {
url : theurl ,
cache : false ,
xhrFields : {
withCredentials : true
}
} ) . done ( function ( data ) {
$ ( "#thanks" + pollid ) . show ( )
showResults ( pollid , groupurl ) ;
} ) ;
}
/ * !
* Fuel UX v3 . 1.0
* Copyright 2012 - 2014 ExactTarget
* Licensed under the BSD - 3 - Clause license ( )
* /
2023-11-01 00:28:09 +00:00
! function ( a ) { "function" == typeof define && define . amd ? define ( [ "jquery" , "bootstrap" ] , a ) : a ( jQuery ) } ( function ( a ) { if ( "undefined" == typeof a ) throw new Error ( "Fuel UX's JavaScript requires jQuery" ) ; if ( "undefined" == typeof a . fn . dropdown || "undefined" == typeof a . fn . collapse ) throw new Error ( "Fuel UX's JavaScript requires Bootstrap" ) ; ! function ( a ) { var b = a . fn . checkbox , c = function ( b , c ) { this . options = a . extend ( { } , a . fn . checkbox . defaults , c ) , this . $element = a ( b ) . is ( 'input[type="checkbox"]' ) ? a ( b ) : a ( b ) . find ( 'input[type="checkbox"]:first' ) , this . $label = this . $element . parent ( ) , this . $parent = this . $label . parent ( ".checkbox" ) , this . $toggleContainer = this . $element . attr ( "data-toggle" ) , this . state = { disabled : ! 1 , checked : ! 1 } , 0 === this . $parent . length && ( this . $parent = null ) , this . $toggleContainer = Boolean ( this . $toggleContainer ) ? a ( this . $toggleContainer ) : null , this . $element . on ( "change.fu.checkbox" , a . proxy ( this . itemchecked , this ) ) , this . setState ( ) } ; c . prototype = { constructor : c , setState : function ( a ) { a = a || this . $element , this . state . disabled = Boolean ( a . prop ( "disabled" ) ) , this . state . checked = Boolean ( a . is ( ":checked" ) ) , this . _resetClasses ( ) , this . _toggleCheckedState ( ) , this . _toggleDisabledState ( ) , this . toggleContainer ( ) } , enable : function ( ) { this . state . disabled = ! 1 , this . $element . attr ( "disabled" , ! 1 ) , this . _resetClasses ( ) , this . $element . trigger ( "enabled.fu.checkbox" ) } , disable : function ( ) { this . state . disabled = ! 0 , this . $element . attr ( "disabled" , ! 0 ) , this . _setDisabledClass ( ) , this . $element . trigger ( "disabled.fu.checkbox" ) } , check : function ( ) { this . state . checked = ! 0 , this . $element . prop ( "checked" , ! 0 ) , this . _setCheckedClass ( ) , this . $element . trigger ( "checked.fu.checkbox" ) } , uncheck : function ( ) { this . state . checked = ! 1 , this . $element . prop ( "checked" , ! 1 ) , this . _resetClasses ( ) , this . $element . trigger ( "unchecked.fu.checkbox" ) } , isChecked : function ( ) { return this . state . checked } , toggle : function ( ) { this . state . checked = ! this . state . checked , this . _toggleCheckedState ( ) } , toggleContainer : function ( ) { Boolean ( this . $toggleContainer ) && ( this . state . checked ? ( this . $toggleContainer . removeClass ( "hide" ) , this . $toggleContainer . attr ( "aria-hidden" , "false" ) ) : ( this . $toggleContainer . addClass ( "hide" ) , this . $toggleContainer . attr ( "aria-hidden" , "true" ) ) ) } , itemchecked : function ( b ) { this . setState ( a ( b . target ) ) } , destroy : function ( ) { return this . $parent . remove ( ) , this . $parent [ 0 ] . outerHTML } , _resetClasses : function ( ) { var a = [ ] ; this . state . checked || a . push ( "checked" ) , this . state . disabled || a . push ( "disabled" ) , a = a . join ( " " ) , this . $label . removeClass ( a ) , this . $parent && this . $parent . removeClass ( a ) } , _toggleCheckedState : function ( ) { this . state . checked ? this . check ( ) : this . uncheck ( ) } , _toggleDisabledState : function ( ) { this . state . disabled ? this . disable ( ) : this . enable ( ) } , _setCheckedClass : function ( ) { this . $label . addClass ( "checked" ) , this . $parent && this . $parent . addClass ( "checked" ) } , _setDisabledClass : function ( ) { this . $label . addClass ( "disabled" ) , this . $parent && this . $parent . addClass ( "disabled" ) } } , a . fn . checkbox = function ( b ) { var d , e = Array . prototype . slice . call ( arguments , 1 ) , f = this . each ( function ( ) { var f = a ( this ) , g = f . data ( "fu.checkbox" ) , h = "object" == typeof b && b ; g || f . data ( "fu.checkbox" , g = new c ( this , h ) ) , "string" == typeof b && ( d = g [ b ] . apply ( g , e ) ) } ) ; return void 0 === d ? f : d } , a . fn . checkbox . defaults = { } , a . fn . checkbox . Constructor = c , a . fn . checkbox . noConflict = function ( ) { return a . fn . checkbox = b , this } , a ( document ) . on ( "mouseover.fu.checkbox.data-api" , "[data-initialize=checkbox]" , function ( b ) { var c = a ( b . target ) . closest ( ".checkbox" ) . find ( "[type=checkbox]" ) ; c . data ( "fu.checkbox" ) || c . checkbox ( c . data ( ) ) } ) , a ( function ( ) { a ( "[data-initialize=checkbox] [type=checkbox]" ) . each ( function ( ) { var b = a ( this ) ; b . data ( "fu.checkbox" ) || b . checkbox ( b . data ( ) ) } ) } ) } ( a ) , function ( a ) { var b = a . fn . combobox , c = function ( b , c ) { this . $element = a ( b ) , this . options = a . extend ( { } , a . fn . combobox . defaults , c ) , this . $dropMenu = this . $element . find ( ".dropdown-menu" ) , this . $input = this . $element . find ( "input" ) , this . $button = this . $element . find ( ".btn" ) , this . $element . on ( "click.fu.combobox" , "a" , a . proxy ( this . itemclicked , this ) ) , this . $element . on ( "change.fu.combobox" , "input" , a . proxy ( this . inputchanged , this ) ) , this . $element . on ( "shown.bs.dropdown" , a . proxy ( this . menuShown , this ) ) , this . setDefaultSelection ( ) } ; c . prototype = { constructor : c , destroy :
2023-09-29 12:56:26 -05:00
} ) ; return void 0 === d ? f : d } , a . fn . search . defaults = { } , a . fn . search . Constructor = c , a . fn . search . noConflict = function ( ) { return a . fn . search = b , this } , a ( document ) . on ( "mousedown.fu.search.data-api" , "[data-initialize=search]" , function ( b ) { var c = a ( b . target ) . closest ( ".search" ) ; c . data ( "fu.search" ) || c . search ( c . data ( ) ) } ) , a ( function ( ) { a ( "[data-initialize=search]" ) . each ( function ( ) { var b = a ( this ) ; b . data ( "fu.search" ) || b . search ( b . data ( ) ) } ) } ) } ( a ) , function ( a ) { var b = a . fn . selectlist , c = function ( b , c ) { this . $element = a ( b ) , this . options = a . extend ( { } , a . fn . selectlist . defaults , c ) , this . $button = this . $element . find ( ".btn.dropdown-toggle" ) , this . $hiddenField = this . $element . find ( ".hidden-field" ) , this . $label = this . $element . find ( ".selected-label" ) , this . $element . on ( "click.fu.selectlist" , ".dropdown-menu a" , a . proxy ( this . itemClicked , this ) ) , this . setDefaultSelection ( ) , "auto" === c . resize && this . resize ( ) } ; c . prototype = { constructor : c , destroy : function ( ) { return this . $element . remove ( ) , this . $element [ 0 ] . outerHTML } , doSelect : function ( b ) { var c ; this . $selectedItem = c = b , this . $hiddenField . val ( this . $selectedItem . attr ( "data-value" ) ) , this . $label . html ( a ( this . $selectedItem . children ( ) [ 0 ] ) . html ( ) ) , this . $element . find ( "li" ) . each ( function ( ) { c . is ( a ( this ) ) ? a ( this ) . attr ( "data-selected" , ! 0 ) : a ( this ) . removeData ( "selected" ) . removeAttr ( "data-selected" ) } ) } , itemClicked : function ( b ) { this . $element . trigger ( "clicked.fu.selectlist" , this . $selectedItem ) , b . preventDefault ( ) , a ( b . target ) . parent ( ) . is ( this . $selectedItem ) || this . itemChanged ( b ) , this . $element . find ( ".dropdown-toggle" ) . focus ( ) } , itemChanged : function ( b ) { this . doSelect ( a ( b . target ) . closest ( "li" ) ) ; var c = this . selectedItem ( ) ; this . $element . trigger ( "changed.fu.selectlist" , c ) } , resize : function ( ) { var b = 0 , c = a ( "<div/>" ) . addClass ( "selectlist-sizer" ) , d = 0 ; Boolean ( a ( document ) . find ( "html" ) . hasClass ( "fuelux" ) ) ? a ( document . body ) . append ( c ) : a ( ".fuelux:first" ) . append ( c ) , this . $element . find ( "a" ) . each ( function ( ) { c . text ( a ( this ) . text ( ) ) , b = c . outerWidth ( ) , b > d && ( d = b ) } ) , c . remove ( ) , this . $label . width ( d ) } , selectedItem : function ( ) { var b = this . $selectedItem . text ( ) ; return a . extend ( { text : b } , this . $selectedItem . data ( ) ) } , selectByText : function ( b ) { var c = a ( [ ] ) ; this . $element . find ( "li" ) . each ( function ( ) { return ( this . textContent || this . innerText || a ( this ) . text ( ) || "" ) . toLowerCase ( ) === ( b || "" ) . toLowerCase ( ) ? ( c = a ( this ) , ! 1 ) : void 0 } ) , this . doSelect ( c ) } , selectByValue : function ( a ) { var b = 'li[data-value="' + a + '"]' ; this . selectBySelector ( b ) } , selectByIndex : function ( a ) { var b = "li:eq(" + a + ")" ; this . selectBySelector ( b ) } , selectBySelector : function ( a ) { var b = this . $element . find ( a ) ; this . doSelect ( b ) } , setDefaultSelection : function ( ) { var a = this . $element . find ( "li[data-selected=true]" ) . eq ( 0 ) ; 0 === a . length && ( a = this . $element . find ( "li" ) . has ( "a" ) . eq ( 0 ) ) , this . doSelect ( a ) } , enable : function ( ) { this . $element . removeClass ( "disabled" ) , this . $button . removeClass ( "disabled" ) } , disable : function ( ) { this . $element . addClass ( "disabled" ) , this . $button . addClass ( "disabled" ) } } , a . fn . selectlist = function ( b ) { var d , e = Array . prototype . slice . call ( arguments , 1 ) , f = this . each ( function ( ) { var f = a ( this ) , g = f . data ( "fu.selectlist" ) , h = "object" == typeof b && b ; g || f . data ( "fu.selectlist" , g = new c ( this , h ) ) , "string" == typeof b && ( d = g [ b ] . apply ( g , e ) ) } ) ; return void 0 === d ? f : d } , a . fn . selectlist . defaults = { } , a . fn . selectlist . Constructor = c , a . fn . selectlist . noConflict = function ( ) { return a . fn . selectlist = b , this } , a ( document ) . on ( "mousedown.fu.selectlist.data-api" , "[data-initialize=selectlist]" , function ( b ) { var c = a ( b . target ) . closest ( ".selectlist" ) ; c . data ( "fu.selectlist" ) || c . selectlist ( c . data ( ) ) } ) , a ( function ( ) { a ( "[data-initialize=selectlist]" ) . each ( function ( ) { var b = a ( this ) ; b . data ( "fu.selectlist" ) || b . selectlist ( b . data ( ) ) } ) } ) } ( a ) , function ( a ) { var b = a . fn . spinbox , c = function ( b , c ) { this . $element = a ( b ) , this . options = a . extend ( { } , a . fn . spinbox . defaults , c ) , this . $input = this . $element . find ( ".spinbox-input" ) , this . $element . on ( "focusin.fu.spinbox" , this . $input , a . proxy ( this . changeFlag , this ) ) , this . $element . on ( "focusout.fu.spinbox" , this . $input , a . proxy ( this . change , this ) ) , this . $element . on ( "keydown.fu.spinbox" , this . $input , a . proxy ( this . keydown , this ) ) , this . $element . on ( "keyup.fu.spinbox" , this . $input , a . proxy ( this . keyup , this ) ) , this . bindMousewheelListeners ( ) , this . mousewhee
} , _closeSuggestions : function ( ) { this . $suggest . html ( "" ) . parent ( ) . removeClass ( "open" ) } , _isSuggestionsOpen : function ( ) { return this . $suggest . parent ( ) . hasClass ( "open" ) } , _keySuggestions : function ( a ) { var b , c = this . $suggest . find ( "li.pillbox-suggest-sel" ) , d = 38 === a . keyCode ; a . preventDefault ( ) , c . length ? ( b = d ? c . prev ( ) : c . next ( ) , b . length || ( b = this . $suggest . find ( d ? "li:last" : "li:first" ) ) , b && ( b . addClass ( "pillbox-suggest-sel" ) , c . removeClass ( "pillbox-suggest-sel" ) ) ) : ( c = this . $suggest . find ( "li:first" ) , c . addClass ( "pillbox-suggest-sel" ) ) } } , a . fn . pillbox = function ( b ) { var d , e = Array . prototype . slice . call ( arguments , 1 ) , f = this . each ( function ( ) { var f = a ( this ) , g = f . data ( "fu.pillbox" ) , h = "object" == typeof b && b ; g || f . data ( "fu.pillbox" , g = new c ( this , h ) ) , "string" == typeof b && ( d = g [ b ] . apply ( g , e ) ) } ) ; return void 0 === d ? f : d } , a . fn . pillbox . defaults = { onAdd : void 0 , onRemove : void 0 , onKeyDown : void 0 , edit : ! 1 , readonly : - 1 , truncate : ! 1 , acceptKeyCodes : [ 13 , 188 ] } , a . fn . pillbox . Constructor = c , a . fn . pillbox . noConflict = function ( ) { return a . fn . pillbox = b , this } , a ( document ) . on ( "mousedown.fu.pillbox.data-api" , "[data-initialize=pillbox]" , function ( b ) { var c = a ( b . target ) . closest ( ".pillbox" ) ; c . data ( "fu.pillbox" ) || c . pillbox ( c . data ( ) ) } ) , a ( function ( ) { a ( "[data-initialize=pillbox]" ) . each ( function ( ) { var b = a ( this ) ; b . data ( "fu.pillbox" ) || b . pillbox ( b . data ( ) ) } ) } ) } ( a ) , function ( a ) { var b = a . fn . repeater , c = function ( b , c ) { var d , e , f = this ; this . $element = a ( b ) , this . $canvas = this . $element . find ( ".repeater-canvas" ) , this . $count = this . $element . find ( ".repeater-count" ) , this . $end = this . $element . find ( ".repeater-end" ) , this . $filters = this . $element . find ( ".repeater-filters" ) , this . $loader = this . $element . find ( ".repeater-loader" ) , this . $pageSize = this . $element . find ( ".repeater-itemization .selectlist" ) , this . $nextBtn = this . $element . find ( ".repeater-next" ) , this . $pages = this . $element . find ( ".repeater-pages" ) , this . $prevBtn = this . $element . find ( ".repeater-prev" ) , this . $primaryPaging = this . $element . find ( ".repeater-primaryPaging" ) , this . $search = this . $element . find ( ".repeater-search" ) . find ( ".search" ) , this . $secondaryPaging = this . $element . find ( ".repeater-secondaryPaging" ) , this . $start = this . $element . find ( ".repeater-start" ) , this . $viewport = this . $element . find ( ".repeater-viewport" ) , this . $views = this . $element . find ( ".repeater-views" ) , this . eventStamp = ( new Date ) . getTime ( ) + ( Math . floor ( 100 * Math . random ( ) ) + 1 ) , this . currentPage = 0 , this . currentView = null , this . infiniteScrollingCallback = function ( ) { } , this . infiniteScrollingCont = null , this . infiniteScrollingEnabled = ! 1 , this . infiniteScrollingEnd = null , this . infiniteScrollingOptions = { } , this . lastPageInput = 0 , this . options = a . extend ( { } , a . fn . repeater . defaults , c ) , this . pageIncrement = 0 , this . resizeTimeout = { } , this . staticHeight = - 1 === this . options . staticHeight ? this . $element . attr ( "data-staticheight" ) : this . options . staticHeight , this . $filters . selectlist ( ) , this . $pageSize . selectlist ( ) , this . $primaryPaging . find ( ".combobox" ) . combobox ( ) , this . $search . search ( ) , this . $filters . on ( "changed.fu.selectlist" , function ( a , b ) { f . $element . trigger ( "filtered.fu.repeater" , b ) , f . render ( { clearInfinite : ! 0 , pageIncrement : null } ) } ) , this . $nextBtn . on ( "click.fu.repeater" , a . proxy ( this . next , this ) ) , this . $pageSize . on ( "changed.fu.selectlist" , function ( a , b ) { f . $element . trigger ( "pageSizeChanged.fu.repeater" , b ) , f . render ( { pageIncrement : null } ) } ) , this . $prevBtn . on ( "click.fu.repeater" , a . proxy ( this . previous , this ) ) , this . $primaryPaging . find ( ".combobox" ) . on ( "changed.fu.combobox" , function ( a , b ) { f . $element . trigger ( "pageChanged.fu.repeater" , [ b . text , b ] ) , f . pageInputChange ( b . text ) } ) , this . $search . on ( "searched.fu.search cleared.fu.search" , function ( a , b ) { f . $element . trigger ( "searchChanged.fu.repeater" , b ) , f . render ( { clearInfinite : ! 0 , pageIncrement : null } ) } ) , this . $secondaryPaging . on ( "blur.fu.repeater" , function ( ) { f . pageInputChange ( f . $secondaryPaging . val ( ) ) } ) , this . $secondaryPaging . on ( "keyup" , function ( a ) { 13 === a . keyCode && f . pageInputChange ( f . $secondaryPaging . val ( ) ) } ) , this . $views . find ( "input" ) . on ( "change.fu.repeater" , a . proxy ( this . viewChanged , this ) ) , a ( window ) . on ( "resize.fu.repeater." + this . eventStamp , function ( ) { clearTimeout ( f . resizeTimeout ) , f . resizeTimeout = setTimeout ( function ( ) { f . resize ( ) , f . $element . trigger ( "resized.fu.repeater" ) } , 75 ) } ) , this . $loader . loade
i . COUNT ? ( this . $endAfter . spinbox ( "value" , parseInt ( i . COUNT , 10 ) ) , this . $endSelect . selectlist ( "selectByValue" , "after" ) ) : i . UNTIL && ( j = i . UNTIL , 8 === j . length && ( j = j . split ( "" ) , j . splice ( 4 , 0 , "-" ) , j . splice ( 7 , 0 , "-" ) , j = j . join ( "" ) ) , this . $endDate . datepicker ( "setDate" , j ) , this . $endSelect . selectlist ( "selectByValue" , "date" ) ) , this . endSelectChanged ( ) , i . INTERVAL && this . $repeatIntervalSpinbox . spinbox ( "value" , parseInt ( i . INTERVAL , 10 ) ) , this . $repeatIntervalSelect . selectlist ( "selectByValue" , e ) , this . repeatIntervalSelectChanged ( ) } } , toggleState : function ( a ) { this . $element . find ( ".combobox" ) . combobox ( a ) , this . $element . find ( ".datepicker" ) . datepicker ( a ) , this . $element . find ( ".selectlist" ) . selectlist ( a ) , this . $element . find ( ".spinbox" ) . spinbox ( a ) , this . $element . find ( "[type=radio]" ) . radio ( a ) , a = "disable" === a ? "addClass" : "removeClass" , this . $element . find ( ".repeat-days-of-the-week .btn-group" ) [ a ] ( "disabled" ) } , value : function ( a ) { return a ? this . setValue ( a ) : this . getValue ( ) } } , a . fn . scheduler = function ( b ) { var d , e = Array . prototype . slice . call ( arguments , 1 ) , f = this . each ( function ( ) { var f = a ( this ) , g = f . data ( "fu.scheduler" ) , h = "object" == typeof b && b ; g || f . data ( "fu.scheduler" , g = new c ( this , h ) ) , "string" == typeof b && ( d = g [ b ] . apply ( g , e ) ) } ) ; return void 0 === d ? f : d } , a . fn . scheduler . defaults = { } , a . fn . scheduler . Constructor = c , a . fn . scheduler . noConflict = function ( ) { return a . fn . scheduler = b , this } , a ( document ) . on ( "mousedown.fu.scheduler.data-api" , "[data-initialize=scheduler]" , function ( b ) { var c = a ( b . target ) . closest ( ".scheduler" ) ; c . data ( "fu.scheduler" ) || c . scheduler ( c . data ( ) ) } ) , a ( function ( ) { a ( "[data-initialize=scheduler]" ) . each ( function ( ) { var b = a ( this ) ; b . data ( "scheduler" ) || b . scheduler ( b . data ( ) ) } ) } ) } ( a ) } ) ;
/ * !
FullCalendar v5 . 10.1
Docs & License : https : //fullcalendar.io/
( c ) 2021 Adam Shaw
* /
var FullCalendar = function ( e ) { "use strict" ; var t = function ( e , n ) { return ( t = Object . setPrototypeOf || { _ _proto _ _ : [ ] } instanceof Array && function ( e , t ) { e . _ _proto _ _ = t } || function ( e , t ) { for ( var n in t ) Object . prototype . hasOwnProperty . call ( t , n ) && ( e [ n ] = t [ n ] ) } ) ( e , n ) } ; function n ( e , n ) { if ( "function" != typeof n && null !== n ) throw new TypeError ( "Class extends value " + String ( n ) + " is not a constructor or null" ) ; function r ( ) { this . constructor = e } t ( e , n ) , e . prototype = null === n ? Object . create ( n ) : ( r . prototype = n . prototype , new r ) } var r = function ( ) { return ( r = Object . assign || function ( e ) { for ( var t , n = 1 , r = arguments . length ; n < r ; n ++ ) for ( var o in t = arguments [ n ] ) Object . prototype . hasOwnProperty . call ( t , o ) && ( e [ o ] = t [ o ] ) ; return e } ) . apply ( this , arguments ) } ; function o ( e , t , n ) { if ( n || 2 === arguments . length ) for ( var r , o = 0 , i = t . length ; o < i ; o ++ ) ! r && o in t || ( r || ( r = Array . prototype . slice . call ( t , 0 , o ) ) , r [ o ] = t [ o ] ) ; return e . concat ( r || t ) } var i , a , s , l , u , c = { } , d = [ ] , p = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i ; function f ( e , t ) { for ( var n in t ) e [ n ] = t [ n ] ; return e } function h ( e ) { var t = e . parentNode ; t && t . removeChild ( e ) } function v ( e , t , n ) { var r , o , i , a = arguments , s = { } ; for ( i in t ) "key" == i ? r = t [ i ] : "ref" == i ? o = t [ i ] : s [ i ] = t [ i ] ; if ( arguments . length > 3 ) for ( n = [ n ] , i = 3 ; i < arguments . length ; i ++ ) n . push ( a [ i ] ) ; if ( null != n && ( s . children = n ) , "function" == typeof e && null != e . defaultProps ) for ( i in e . defaultProps ) void 0 === s [ i ] && ( s [ i ] = e . defaultProps [ i ] ) ; return g ( e , s , r , o , null ) } function g ( e , t , n , r , o ) { var a = { type : e , props : t , key : n , ref : r , _ _k : null , _ _ : null , _ _b : 0 , _ _e : null , _ _d : void 0 , _ _c : null , _ _h : null , constructor : void 0 , _ _v : null == o ? ++ i . _ _v : o } ; return null != i . vnode && i . vnode ( a ) , a } function m ( e ) { return e . children } function y ( e , t ) { this . props = e , this . context = t } function E ( e , t ) { if ( null == t ) return e . _ _ ? E ( e . _ _ , e . _ _ . _ _k . indexOf ( e ) + 1 ) : null ; for ( var n ; t < e . _ _k . length ; t ++ ) if ( null != ( n = e . _ _k [ t ] ) && null != n . _ _e ) return n . _ _e ; return "function" == typeof e . type ? E ( e ) : null } function S ( e ) { var t , n ; if ( null != ( e = e . _ _ ) && null != e . _ _c ) { for ( e . _ _e = e . _ _c . base = null , t = 0 ; t < e . _ _k . length ; t ++ ) if ( null != ( n = e . _ _k [ t ] ) && null != n . _ _e ) { e . _ _e = e . _ _c . base = n . _ _e ; break } return S ( e ) } } function b ( e ) { ( ! e . _ _d && ( e . _ _d = ! 0 ) && a . push ( e ) && ! D . _ _r ++ || l !== i . debounceRendering ) && ( ( l = i . debounceRendering ) || s ) ( D ) } function D ( ) { for ( var e ; D . _ _r = a . length ; ) e = a . sort ( ( function ( e , t ) { return e . _ _v . _ _b - t . _ _v . _ _b } ) ) , a = [ ] , e . some ( ( function ( e ) { var t , n , r , o , i , a ; e . _ _d && ( i = ( o = ( t = e ) . _ _v ) . _ _e , ( a = t . _ _P ) && ( n = [ ] , ( r = f ( { } , o ) ) . _ _v = o . _ _v + 1 , I ( a , o , r , t . _ _n , void 0 !== a . ownerSVGElement , null != o . _ _h ? [ i ] : null , n , null == i ? E ( o ) : i , o . _ _h ) , P ( n , o ) , o . _ _e != i && S ( o ) ) ) } ) ) } function C ( e , t , n , r , o , i , a , s , l , u ) { var p , f , h , v , y , S , b , D = r && r . _ _k || d , C = D . length ; for ( n . _ _k = [ ] , p = 0 ; p < t . length ; p ++ ) if ( null != ( v = n . _ _k [ p ] = null == ( v = t [ p ] ) || "boolean" == typeof v ? null : "string" == typeof v || "number" == typeof v || "bigint" == typeof v ? g ( null , v , null , null , v ) : Array . isArray ( v ) ? g ( m , { children : v } , null , null , null ) : v . _ _b > 0 ? g ( v . type , v . props , v . key , null , v . _ _v ) : v ) ) { if ( v . _ _ = n , v . _ _b = n . _ _b + 1 , null === ( h = D [ p ] ) || h && v . key == h . key && v . type === h . type ) D [ p ] = void 0 ; else for ( f = 0 ; f < C ; f ++ ) { if ( ( h = D [ f ] ) && v . key == h . key && v . type === h . type ) { D [ f ] = void 0 ; break } h = null } I ( e , v , h = h || c , o , i , a , s , l , u ) , y = v . _ _e , ( f = v . ref ) && h . ref != f && ( b || ( b = [ ] ) , h . ref && b . push ( h . ref , null , v ) , b . push ( f , v . _ _c || y , v ) ) , null != y ? ( null == S && ( S = y ) , "function" == typeof v . type && null != v . _ _k && v . _ _k === h . _ _k ? v . _ _d = l = w ( v , l , e ) : l = _ ( e , v , h , D , y , l ) , u || "option" !== n . type ? "function" == typeof n . type && ( n . _ _d = l ) : e . value = "" ) : l && h . _ _e == l && l . parentNode != e && ( l = E ( h ) ) } for ( n . _ _e = S , p = C ; p -- ; ) null != D [ p ] && ( "function" == typeof n . type && null != D [ p ] . _ _e && D [ p ] . _ _e == n . _ _d && ( n . _ _d = E ( r , p + 1 ) ) , O ( D [ p ] , D [ p ] ) ) ; if ( b ) for ( p = 0 ; p < b . length ; p ++ ) H ( b [ p ] , b [ ++ p ] , b [ ++ p ] ) } function w ( e , t , n ) { var r , o ; for ( r = 0 ; r < e . _ _k . length ; r ++ ) ( o = e . _ _k [ r ] ) && ( o . _ _ = e , t = "function" == typeof o . type ? w ( o , t , n ) : _ ( n , o , o , e . _ _k , o . _ _e , t ) ) ; return t } function R ( e , t ) { return t = t || [ ] , null == e || "boolean" == typeof e || ( Array . isArray ( e ) ? e . some ( ( function ( e ) { R ( e , t ) } ) ) : t . push ( e ) ) , t } function _ ( e , t , n , r , o , i ) { var a , s , l ; if ( void 0 !== t . _ _d ) a = t . _ _d , t . _ _d = void 0 ; else if ( null == n || o != i || null == o . parentNode ) e : if ( null == i || i . parentNode !== e ) e . appendChild ( o ) , a = null ; else { for ( s = i , l = 0 ; ( s = s . nextSibling ) && l < r . length ; l += 2 ) if ( s == o ) break e ; e . insertBefore ( o , i ) , a = i } return void 0 !== a ? a : o . nextSibling } function T ( e , t , n ) { "-" === t [ 0 ] ?
/ * *
* @ license
* Video . js 8.3 . 0 < http : //videojs.com/>
* Copyright Brightcove , Inc . < https : //www.brightcove.com/>
* Available under Apache License Version 2.0
* < https : //github.com/videojs/video.js/blob/main/LICENSE>
*
* Includes vtt . js < https : //github.com/mozilla/vtt.js>
* Available under Apache License Version 2.0
* < https : //github.com/mozilla/vtt.js/blob/main/LICENSE>
* /
! function ( e , t ) { "object" == typeof exports && "undefined" != typeof module ? module . exports = t ( ) : "function" == typeof define && define . amd ? define ( t ) : ( e = "undefined" != typeof globalThis ? globalThis : e || self ) . videojs = t ( ) } ( this , function ( ) { "use strict" ; var R = "8.3.0" ; const U = { } , B = function ( e , t ) { return U [ e ] = U [ e ] || [ ] , t && ( U [ e ] = U [ e ] . concat ( t ) ) , U [ e ] } ; function F ( e , t ) { return ! ( ( t = B ( e ) . indexOf ( t ) ) <= - 1 || ( U [ e ] = U [ e ] . slice ( ) , U [ e ] . splice ( t , 1 ) , 0 ) ) } const j = { prefixed : ! 0 } ; var H = [ [ "requestFullscreen" , "exitFullscreen" , "fullscreenElement" , "fullscreenEnabled" , "fullscreenchange" , "fullscreenerror" , "fullscreen" ] , [ "webkitRequestFullscreen" , "webkitExitFullscreen" , "webkitFullscreenElement" , "webkitFullscreenEnabled" , "webkitfullscreenchange" , "webkitfullscreenerror" , "-webkit-full-screen" ] , [ "mozRequestFullScreen" , "mozCancelFullScreen" , "mozFullScreenElement" , "mozFullScreenEnabled" , "mozfullscreenchange" , "mozfullscreenerror" , "-moz-full-screen" ] , [ "msRequestFullscreen" , "msExitFullscreen" , "msFullscreenElement" , "msFullscreenEnabled" , "MSFullscreenChange" , "MSFullscreenError" , "-ms-fullscreen" ] ] , q = H [ 0 ] ; let V ; for ( let e = 0 ; e < H . length ; e ++ ) if ( H [ e ] [ 1 ] in document ) { V = H [ e ] ; break } if ( V ) { for ( let e = 0 ; e < V . length ; e ++ ) j [ q [ e ] ] = V [ e ] ; j . prefixed = V [ 0 ] !== q [ 0 ] } let l = [ ] ; function $ ( e ) { return K ( e ) ? Object . keys ( e ) : [ ] } const d = function t ( i ) { let s = "info" , r ; function n ( ... e ) { r ( "log" , s , e ) } var a , o ; return r = ( a = i , ( t , i , s ) => { var e , i = o . levels [ i ] , r = new RegExp ( ` ^( ${ i } ) $ ` ) ; if ( "log" !== t && s . unshift ( t . toUpperCase ( ) + ":" ) , s . unshift ( a + ":" ) , l && ( l . push ( [ ] . concat ( s ) ) , e = l . length - 1e3 , l . splice ( 0 , 0 < e ? e : 0 ) ) , window . console ) { let e = window . console [ t ] ; ( e = e || "debug" !== t ? e : window . console . info || window . console . log ) && i && r . test ( t ) && e [ Array . isArray ( s ) ? "apply" : "call" ] ( window . console , s ) } } ) , ( o = n ) . createLogger = e => t ( i + ": " + e ) , n . levels = { all : "debug|log|warn|error" , off : "" , debug : "debug|log|warn|error" , info : "log|warn|error" , warn : "warn|error" , error : "error" , DEFAULT : s } , n . level = e => { if ( "string" == typeof e ) { if ( ! n . levels . hasOwnProperty ( e ) ) throw new Error ( ` " ${ e } " in not a valid log level ` ) ; s = e } return s } , n . history = ( ) => l ? [ ] . concat ( l ) : [ ] , n . history . filter = t => ( l || [ ] ) . filter ( e => new RegExp ( ` .* ${ t } .* ` ) . test ( e [ 0 ] ) ) , n . history . clear = ( ) => { l && ( l . length = 0 ) } , n . history . disable = ( ) => { null !== l && ( l . length = 0 , l = null ) } , n . history . enable = ( ) => { null === l && ( l = [ ] ) } , n . error = ( ... e ) => r ( "error" , s , e ) , n . warn = ( ... e ) => r ( "warn" , s , e ) , n . debug = ( ... e ) => r ( "debug" , s , e ) , n } ( "VIDEOJS" ) , W = d . createLogger , G = Object . prototype . toString ; function z ( t , i ) { $ ( t ) . forEach ( e => i ( t [ e ] , e ) ) } function X ( i , s , e = 0 ) { return $ ( i ) . reduce ( ( e , t ) => s ( e , i [ t ] , t ) , e ) } function K ( e ) { return ! ! e && "object" == typeof e } function Y ( e ) { return K ( e ) && "[object Object]" === G . call ( e ) && e . constructor === Object } function h ( ... e ) { const i = { } ; return e . forEach ( e => { e && z ( e , ( e , t ) => { Y ( e ) ? ( Y ( i [ t ] ) || ( i [ t ] = { } ) , i [ t ] = h ( i [ t ] , e ) ) : i [ t ] = e } ) } ) , i } function Q ( t , i , s , e = ! 0 ) { const r = e => Object . defineProperty ( t , i , { value : e , enumerable : ! 0 , writable : ! 0 } ) ; var n = { configurable : ! 0 , enumerable : ! 0 , get ( ) { var e = s ( ) ; return r ( e ) , e } } ; return e && ( n . set = r ) , Object . defineProperty ( t , i , n ) } var J = Object . freeze ( { _ _proto _ _ : null , each : z , reduce : X , isObject : K , isPlain : Y , merge : h , defineLazyProperty : Q } ) ; let Z = ! 1 , ee = null , te = ! 1 , ie , se = ! 1 , re = ! 1 , ne = ! 1 , ae = ! 1 , oe = null , le = null , de = null , he = ! 1 , ue = ! 1 , ce = ! 1 , pe = ! 1 ; const me = Boolean ( _e ( ) && ( "ontouchstart" in window || window . navigator . maxTouchPoints || window . DocumentTouch && window . document instanceof window . DocumentTouch ) ) ; var ge , e = window . navigator && window . navigator . userAgentData ; if ( e && ( te = "Android" === e . platform , re = Boolean ( e . brands . find ( e => "Microsoft Edge" === e . brand ) ) , ne = Boolean ( e . brands . find ( e => "Chromium" === e . brand ) ) , ae = ! re && ne , oe = le = ( e . brands . find ( e => "Chromium" === e . brand ) || { } ) . version || null , ue = "Windows" === e . platform ) , ! ne ) { const M = window . navigator && window . navigator . userAgent || "" ; Z = /iPod/i . test ( M ) , ee = ( e = M . match ( /OS (\d+)_/i ) ) && e [ 1 ] ? e [ 1 ] : null , te = /Android/i . test ( M ) , ie = ( e = M . match ( /Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i ) ) ? ( mt = e [ 1 ] && parseFloat ( e [ 1 ] ) , ge = e [ 2 ] && parseFloat ( e [ 2 ] ) , mt && ge ? parseFloat ( e [ 1 ] + "." + e [ 2 ] ) : mt || null ) : null , se = /Firefox/i . test ( M ) , re = /Edg/i . test ( M ) , ne = /Chrome/i . test ( M ) || /CriOS/i . test ( M ) , ae = ! re && ne , oe = le = ( ge = M . match ( /(Chrome|CriOS)\/(\d+)/ ) ) && ge [ 2 ] ? parseFloat ( ge [ 2 ] ) : null , de = function ( ) { var e = / M S I E \ s ( \ d + ) \
. $ { s } {
width : $ { e } px ;
height : $ { t } px ;
}
. $ { s } . vjs - fluid : not ( . vjs - audio - only - mode ) {
padding - top : $ { 100 * r } % ;
}
` )}}loadTech_(e,t){this.tech_&&this.unloadTech_();var i=g(e),s=e.charAt(0).toLowerCase()+e.slice(1);"Html5"!==i&&this.tag&&(_.getTech("Html5").disposeMediaElement(this.tag),this.tag.player=null,this.tag=null),this.techName_=i,this.isReady_=!1;let r=this.autoplay();const n={source:t,autoplay:r="string"==typeof this.autoplay()||!0===this.autoplay()&&this.options_.normalizeAutoplay?!1:r,nativeControlsForTouch:this.options_.nativeControlsForTouch,playerId:this.id(),techId:this.id()+ ` _$ { s } _api ` ,playsinline:this.options_.playsinline,preload:this.options_.preload,loop:this.options_.loop,disablePictureInPicture:this.options_.disablePictureInPicture,muted:this.options_.muted,poster:this.poster(),language:this.language(),playerElIngest:this.playerElIngest_||!1,"vtt.js":this.options_["vtt.js"],canOverridePoster:!!this.options_.techCanOverridePoster,enableSourceset:this.options_.enableSourceset};a.names.forEach(e=>{e=a[e];n[e.getterName]=this[e.privateName]}),Object.assign(n,this.options_[i]),Object.assign(n,this.options_[s]),Object.assign(n,this.options_[e.toLowerCase()]),this.tag&&(n.tag=this.tag),t&&t.src===this.cache_.src&&0<this.cache_.currentTime&&(n.startTime=this.cache_.currentTime);s=_.getTech(e);if(!s)throw new Error( ` No Tech named '${i}' exists ! '${i}' should be registered using videojs . registerTech ( ) '`);this.tech_=new s(n),this.tech_.ready(m(this,this.handleTechReady_),!0),Kt(this.textTracksJson_||[],this.tech_),Qr.forEach(t=>{this.on(this.tech_,t,e=>this[`handleTech${g(t)}_`](e))}),Object.keys(Jr).forEach(t=>{this.on(this.tech_,t,e=>{0===this.tech_.playbackRate()&&this.tech_.seeking()?this.queuedCallbacks_.push({callback:this[`handleTech${Jr[t]}_`].bind(this),event:e}):this[`handleTech${Jr[t]}_`](e)})}),this.on(this.tech_,"loadstart",e=>this.handleTechLoadStart_(e)),this.on(this.tech_,"sourceset",e=>this.handleTechSourceset_(e)),this.on(this.tech_,"waiting",e=>this.handleTechWaiting_(e)),this.on(this.tech_,"ended",e=>this.handleTechEnded_(e)),this.on(this.tech_,"seeking",e=>this.handleTechSeeking_(e)),this.on(this.tech_,"play",e=>this.handleTechPlay_(e)),this.on(this.tech_,"pause",e=>this.handleTechPause_(e)),this.on(this.tech_,"durationchange",e=>this.handleTechDurationChange_(e)),this.on(this.tech_,"fullscreenchange",(e,t)=>this.handleTechFullscreenChange_(e,t)),this.on(this.tech_,"fullscreenerror",(e,t)=>this.handleTechFullscreenError_(e,t)),this.on(this.tech_,"enterpictureinpicture",e=>this.handleTechEnterPictureInPicture_(e)),this.on(this.tech_,"leavepictureinpicture",e=>this.handleTechLeavePictureInPicture_(e)),this.on(this.tech_,"error",e=>this.handleTechError_(e)),this.on(this.tech_,"posterchange",e=>this.handleTechPosterChange_(e)),this.on(this.tech_,"textdata",e=>this.handleTechTextData_(e)),this.on(this.tech_,"ratechange",e=>this.handleTechRateChange_(e)),this.on(this.tech_,"loadedmetadata",this.boundUpdateStyleEl_),this.usingNativeControls(this.techGet_("controls")),this.controls()&&!this.usingNativeControls()&&this.addTechControlsListeners_(),this.tech_.el().parentNode===this.el()||"Html5"===i&&this.tag||we(this.tech_.el(),this.el()),this.tag&&(this.tag.player=null,this.tag=null)}unloadTech_(){a.names.forEach(e=>{e=a[e];this[e.privateName]=this[e.getterName]()}),this.textTracksJson_=Xt(this.tech_),this.isReady_=!1,this.tech_.dispose(),this.tech_=!1,this.isPosterFromTech_&&(this.poster_="",this.trigger("posterchange")),this.isPosterFromTech_=!1}tech(e){return void 0===e&&d.warn("Using the tech directly can be dangerous. I hope you know what you' re doing . \ nSee https : //github.com/videojs/video.js/issues/2617 for more info.\n"),this.tech_}addTechControlsListeners_(){this.removeTechControlsListeners_(),this.on(this.tech_,"click",this.boundHandleTechClick_),this.on(this.tech_,"dblclick",this.boundHandleTechDoubleClick_),this.on(this.tech_,"touchstart",this.boundHandleTechTouchStart_),this.on(this.tech_,"touchmove",this.boundHandleTechTouchMove_),this.on(this.tech_,"touchend",this.boundHandleTechTouchEnd_),this.on(this.tech_,"tap",this.boundHandleTechTap_)}removeTechControlsListeners_(){this.off(this.tech_,"t
. video - js {
width : 300 px ;
height : 150 px ;
}
. vjs - fluid : not ( . vjs - audio - only - mode ) {
padding - top : 56.25 %
}
` )),Qe(1,T),T.VERSION=R,T.options=b.prototype.options_,T.getPlayers=()=>b.players,T.getPlayer=e=>{var t=b.players;let i;if("string"==typeof e){var s=mn(e),r=t[s];if(r)return r;i= $ e("#"+s)}else i=e;if(ve(i)){var{player:r,playerId:s}=i;if(r||t[s])return r||t[s]}},T.getAllPlayers=()=>Object.keys(b.players).map(e=>b.players[e]).filter(Boolean),T.players=b.players,T.getComponent=f.getComponent,T.registerComponent=(e,t)=>{_.isTech(t)&&d.warn( ` The $ { e } tech was registered as a component . It should instead be registered using videojs . registerTech ( name , tech ) ` ),f.registerComponent.call(f,e,t)},T.getTech=_.getTech,T.registerTech=_.registerTech,T.use=function(e,t){hs[e]=hs[e]||[],hs[e].push(t)},Object.defineProperty(T,"middleware",{value:{},writeable:!1,enumerable:!0}),Object.defineProperty(T.middleware,"TERMINATOR",{value:cs,writeable:!1,enumerable:!0}),T.browser=e,T.obj=J,T.mergeOptions=pn(9,"videojs.mergeOptions","videojs.obj.merge",h),T.defineLazyProperty=pn(9,"videojs.defineLazyProperty","videojs.obj.defineLazyProperty",Q),T.bind=pn(9,"videojs.bind","native Function.prototype.bind",m),T.registerPlugin=cn.registerPlugin,T.deregisterPlugin=cn.deregisterPlugin,T.plugin=(e,t)=>(d.warn("videojs.plugin() is deprecated; use videojs.registerPlugin() instead"),cn.registerPlugin(e,t)),T.getPlugins=cn.getPlugins,T.getPlugin=cn.getPlugin,T.getPluginVersion=cn.getPluginVersion,T.addLanguage=function(e,t){return e=(""+e).toLowerCase(),T.options.languages=h(T.options.languages,{[e]:t}),T.options.languages[e]},T.log=d,T.createLogger=W,T.time=qt,T.createTimeRange=pn(9,"videojs.createTimeRange","videojs.time.createTimeRanges",Rt),T.createTimeRanges=pn(9,"videojs.createTimeRanges","videojs.time.createTimeRanges",Rt),T.formatTime=pn(9,"videojs.formatTime","videojs.time.formatTime",Ht),T.setFormatTime=pn(9,"videojs.setFormatTime","videojs.time.setFormatTime",Ft),T.resetFormatTime=pn(9,"videojs.resetFormatTime","videojs.time.resetFormatTime",jt),T.parseUrl=pn(9,"videojs.parseUrl","videojs.url.parseUrl",li),T.isCrossOrigin=pn(9,"videojs.isCrossOrigin","videojs.url.isCrossOrigin",hi),T.EventTarget=ft,T.any=ht,T.on=ot,T.one=dt,T.off=p,T.trigger=lt,T.xhr=bi,T.TextTrack=Ai,T.AudioTrack=Pi,T.VideoTrack=Li,["isEl","isTextNode","createEl","hasClass","addClass","removeClass","toggleClass","setAttributes","getAttributes","emptyEl","appendContent","insertContent"].forEach(e=>{T[e]=function(){return d.warn( ` videojs . $ { e } ( ) is deprecated ; use videojs . dom . $ { e } ( ) instead ` ),ze[e].apply(null,arguments)}}),T.computedStyle=pn(9,"videojs.computedStyle","videojs.dom.computedStyle",Ge),T.dom=ze,T.fn=mt,T.num=pi,T.str=Lt,T.url=ci,Dt(function(e,t){
/*! @name videojs-contrib-quality-levels @version 3.0.0 @license Apache-2.0 */
e . exports = function ( e ) { function t ( e ) { return e && typeof e === "object" && "default" in e ? e : { default : e } } var i = t ( e ) ; class s { constructor ( e ) { let t = this ; t . id = e . id ; t . label = t . id ; t . width = e . width ; t . height = e . height ; t . bitrate = e . bandwidth ; t . frameRate = e . frameRate ; t . enabled _ = e . enabled ; Object . defineProperty ( t , "enabled" , { get ( ) { return t . enabled _ ( ) } , set ( e ) { t . enabled _ ( e ) } } ) ; return t } } class n extends i [ "default" ] . EventTarget { constructor ( ) { super ( ) ; let e = this ; e . levels _ = [ ] ; e . selectedIndex _ = - 1 ; Object . defineProperty ( e , "selectedIndex" , { get ( ) { return e . selectedIndex _ } } ) ; Object . defineProperty ( e , "length" , { get ( ) { return e . levels _ . length } } ) ; return e } addQualityLevel ( e ) { let t = this . getQualityLevelById ( e . id ) ; if ( t ) return t ; const i = this . levels _ . length ; t = new s ( e ) ; if ( ! ( "" + i in this ) ) Object . defineProperty ( this , i , { get ( ) { return this . levels _ [ i ] } } ) ; this . levels _ . push ( t ) ; this . trigger ( { qualityLevel : t , type : "addqualitylevel" } ) ; return t } removeQualityLevel ( i ) { let s = null ; for ( let e = 0 , t = this . length ; e < t ; e ++ ) if ( this [ e ] === i ) { s = this . levels _ . splice ( e , 1 ) [ 0 ] ; if ( this . selectedIndex _ === e ) this . selectedIndex _ = - 1 ; else if ( this . selectedIndex _ > e ) this . selectedIndex _ -- ; break } if ( s ) this . trigger ( { qualityLevel : i , type : "removequalitylevel" } ) ; return s } getQualityLevelById ( i ) { for ( let e = 0 , t = this . length ; e < t ; e ++ ) { const s = this [ e ] ; if ( s . id === i ) return s } return null } dispose ( ) { this . selectedIndex _ = - 1 ; this . levels _ . length = 0 } } n . prototype . allowedEvents _ = { change : "change" , addqualitylevel : "addqualitylevel" , removequalitylevel : "removequalitylevel" } ; for ( const d in n . prototype . allowedEvents _ ) n . prototype [ "on" + d ] = null ; var a = "3.0.0" ; const r = i [ "default" ] . registerPlugin || i [ "default" ] . plugin , o = function ( e , t ) { const i = e . qualityLevels ; const s = new n ; const r = function ( ) { s . dispose ( ) ; e . qualityLevels = i ; e . off ( "dispose" , r ) } ; e . on ( "dispose" , r ) ; e . qualityLevels = ( ) => s ; e . qualityLevels . VERSION = a ; return s } , l = function ( e ) { return o ( this , i [ "default" ] . mergeOptions ( { } , e ) ) } ; return r ( "qualityLevels" , l ) , l . VERSION = a , l } ( T ) } ) ; var gn = Dt ( function ( e , t ) { var i , n , s , r , a ; i = /^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/ , n = /^(?=([^\/?#]*))\1([^]*)$/ , s = /(?:\/|^)\.(?=\/)/g , r = /(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g , a = { buildAbsoluteURL : function ( e , t , i ) { if ( i = i || { } , e = e . trim ( ) , ! ( t = t . trim ( ) ) ) { if ( ! i . alwaysNormalize ) return e ; var s = a . parseURL ( e ) ; if ( s ) return s . path = a . normalizePath ( s . path ) , a . buildURLFromParts ( s ) ; throw new Error ( "Error trying to parse base URL." ) } s = a . parseURL ( t ) ; if ( ! s ) throw new Error ( "Error trying to parse relative URL." ) ; if ( s . scheme ) return i . alwaysNormalize ? ( s . path = a . normalizePath ( s . path ) , a . buildURLFromParts ( s ) ) : t ; t = a . parseURL ( e ) ; if ( ! t ) throw new Error ( "Error trying to parse base URL." ) ; ! t . netLoc && t . path && "/" !== t . path [ 0 ] && ( e = n . exec ( t . path ) , t . netLoc = e [ 1 ] , t . path = e [ 2 ] ) , t . netLoc && ! t . path && ( t . path = "/" ) ; var r , e = { scheme : t . scheme , netLoc : s . netLoc , path : null , params : s . params , query : s . query , fragment : s . fragment } ; return s . netLoc || ( e . netLoc = t . netLoc , "/" !== s . path [ 0 ] && ( s . path ? ( r = ( r = t . path ) . substring ( 0 , r . lastIndexOf ( "/" ) + 1 ) + s . path , e . path = a . normalizePath ( r ) ) : ( e . path = t . path , s . params || ( e . params = t . params , s . query ) || ( e . query = t . query ) ) ) ) , null === e . path && ( e . path = i . alwaysNormalize ? a . normalizePath ( s . path ) : s . path ) , a . buildURLFromParts ( e ) } , parseURL : function ( e ) { e = i . exec ( e ) ; return e ? { scheme : e [ 1 ] || "" , netLoc : e [ 2 ] || "" , path : e [ 3 ] || "" , params : e [ 4 ] || "" , query : e [ 5 ] || "" , fragment : e [ 6 ] || "" } : null } , normalizePath : function ( e ) { for ( e = e . split ( "" ) . reverse ( ) . join ( "" ) . replace ( s , "" ) ; e . length !== ( e = e . replace ( r , "" ) ) . length ; ) ; return e . split ( "" ) . reverse ( ) . join ( "" ) } , buildURLFromParts : function ( e ) { return e . scheme + e . netLoc + e . path + e . params + e . query + e . fragment } } , e . exports = a } ) , fn = "http://example.com" , Lr = function ( ) { function e ( ) { this . listeners = { } } var t = e . prototype ; return t . on = function ( e , t ) { this . listeners [ e ] || ( this . listeners [ e ] = [ ] ) , this . listeners [ e ] . push ( t ) } , t . off = function ( e , t ) { return ! ! this . listeners [ e ] && ( t = this . listeners [ e ] . indexOf ( t ) , this . listeners [ e ] = this . listeners [ e ] . slice ( 0 ) , this . listeners [ e ] . splice ( t , 1 ) , - 1 < t ) } , t . trigger = function ( e ) { var t = this . listeners [ e ] ; if ( t ) if ( 2 === arguments . length ) for ( var i = t . length , s = 0 ; s < i ; ++ s ) t [ s ] . call ( this , arguments [ 1 ] ) ; else for ( var r = Array
/*! @name m3u8-parser @version 6.0.0 @license Apache-2.0 */ class _n extends Lr { constructor ( ) { super ( ) , this . buffer = "" } push ( e ) { let t ; for ( this . buffer += e , t = this . buffer . indexOf ( "\n" ) ; - 1 < t ; t = this . buffer . indexOf ( "\n" ) ) this . trigger ( "data" , this . buffer . substring ( 0 , t ) ) , this . buffer = this . buffer . substring ( t + 1 ) } } function vn ( e ) { var e = /([0-9.]*)?@?([0-9.]*)?/ . exec ( e || "" ) , t = { } ; return e [ 1 ] && ( t . length = parseInt ( e [ 1 ] , 10 ) ) , e [ 2 ] && ( t . offset = parseInt ( e [ 2 ] , 10 ) ) , t } function bn ( t ) { var i = { } ; if ( t ) { var s , r = t . split ( new RegExp ( '(?:^|,)((?:[^=]*)=(?:"[^"]*"|[^,]*))' ) ) ; let e = r . length ; for ( ; e -- ; ) "" !== r [ e ] && ( ( s = /([^=]*)=(.*)/ . exec ( r [ e ] ) . slice ( 1 ) ) [ 0 ] = s [ 0 ] . replace ( /^\s+|\s+$/g , "" ) , s [ 1 ] = s [ 1 ] . replace ( /^\s+|\s+$/g , "" ) , s [ 1 ] = s [ 1 ] . replace ( /^['"](.*)['"]$/g , "$1" ) , i [ s [ 0 ] ] = s [ 1 ] ) } return i } const Tn = String . fromCharCode ( 9 ) ; class Sn extends Lr { constructor ( ) { super ( ) , this . customParsers = [ ] , this . tagMappers = [ ] } push ( i ) { let s , r ; 0 !== ( i = i . trim ( ) ) . length && ( "#" !== i [ 0 ] ? this . trigger ( "data" , { type : "uri" , uri : i } ) : this . tagMappers . reduce ( ( e , t ) => { t = t ( i ) ; return t === i ? e : e . concat ( [ t ] ) } , [ i ] ) . forEach ( t => { for ( let e = 0 ; e < this . customParsers . length ; e ++ ) if ( this . customParsers [ e ] . call ( this , t ) ) return ; var e , i ; 0 !== t . indexOf ( "#EXT" ) ? this . trigger ( "data" , { type : "comment" , text : t . slice ( 1 ) } ) : ( t = t . replace ( "\r" , "" ) , ( s = /^#EXTM3U/ . exec ( t ) ) ? this . trigger ( "data" , { type : "tag" , tagType : "m3u" } ) : ( s = /^#EXTINF:([0-9\.]*)?,?(.*)?$/ . exec ( t ) ) ? ( r = { type : "tag" , tagType : "inf" } , s [ 1 ] && ( r . duration = parseFloat ( s [ 1 ] ) ) , s [ 2 ] && ( r . title = s [ 2 ] ) , this . trigger ( "data" , r ) ) : ( s = /^#EXT-X-TARGETDURATION:([0-9.]*)?/ . exec ( t ) ) ? ( r = { type : "tag" , tagType : "targetduration" } , s [ 1 ] && ( r . duration = parseInt ( s [ 1 ] , 10 ) ) , this . trigger ( "data" , r ) ) : ( s = /^#EXT-X-VERSION:([0-9.]*)?/ . exec ( t ) ) ? ( r = { type : "tag" , tagType : "version" } , s [ 1 ] && ( r . version = parseInt ( s [ 1 ] , 10 ) ) , this . trigger ( "data" , r ) ) : ( s = /^#EXT-X-MEDIA-SEQUENCE:(\-?[0-9.]*)?/ . exec ( t ) ) ? ( r = { type : "tag" , tagType : "media-sequence" } , s [ 1 ] && ( r . number = parseInt ( s [ 1 ] , 10 ) ) , this . trigger ( "data" , r ) ) : ( s = /^#EXT-X-DISCONTINUITY-SEQUENCE:(\-?[0-9.]*)?/ . exec ( t ) ) ? ( r = { type : "tag" , tagType : "discontinuity-sequence" } , s [ 1 ] && ( r . number = parseInt ( s [ 1 ] , 10 ) ) , this . trigger ( "data" , r ) ) : ( s = /^#EXT-X-PLAYLIST-TYPE:(.*)?$/ . exec ( t ) ) ? ( r = { type : "tag" , tagType : "playlist-type" } , s [ 1 ] && ( r . playlistType = s [ 1 ] ) , this . trigger ( "data" , r ) ) : ( s = /^#EXT-X-BYTERANGE:(.*)?$/ . exec ( t ) ) ? ( r = fi ( vn ( s [ 1 ] ) , { type : "tag" , tagType : "byterange" } ) , this . trigger ( "data" , r ) ) : ( s = /^#EXT-X-ALLOW-CACHE:(YES|NO)?/ . exec ( t ) ) ? ( r = { type : "tag" , tagType : "allow-cache" } , s [ 1 ] && ( r . allowed = ! /NO/ . test ( s [ 1 ] ) ) , this . trigger ( "data" , r ) ) : ( s = /^#EXT-X-MAP:(.*)$/ . exec ( t ) ) ? ( r = { type : "tag" , tagType : "map" } , s [ 1 ] && ( ( i = bn ( s [ 1 ] ) ) . URI && ( r . uri = i . URI ) , i . BYTERANGE ) && ( r . byterange = vn ( i . BYTERANGE ) ) , this . trigger ( "data" , r ) ) : ( s = /^#EXT-X-STREAM-INF:(.*)$/ . exec ( t ) ) ? ( r = { type : "tag" , tagType : "stream-inf" } , s [ 1 ] && ( r . attributes = bn ( s [ 1 ] ) , r . attributes . RESOLUTION && ( i = { } , ( e = r . attributes . RESOLUTION . split ( "x" ) ) [ 0 ] && ( i . width = parseInt ( e [ 0 ] , 10 ) ) , e [ 1 ] && ( i . height = parseInt ( e [ 1 ] , 10 ) ) , r . attributes . RESOLUTION = i ) , r . attributes . BANDWIDTH && ( r . attributes . BANDWIDTH = parseInt ( r . attributes . BANDWIDTH , 10 ) ) , r . attributes [ "FRAME-RATE" ] && ( r . attributes [ "FRAME-RATE" ] = parseFloat ( r . attributes [ "FRAME-RATE" ] ) ) , r . attributes [ "PROGRAM-ID" ] ) && ( r . attributes [ "PROGRAM-ID" ] = parseInt ( r . attributes [ "PROGRAM-ID" ] , 10 ) ) , this . trigger ( "data" , r ) ) : ( s = /^#EXT-X-MEDIA:(.*)$/ . exec ( t ) ) ? ( r = { type : "tag" , tagType : "media" } , s [ 1 ] && ( r . attributes = bn ( s [ 1 ] ) ) , this . trigger ( "data" , r ) ) : ( s = /^#EXT-X-ENDLIST/ . exec ( t ) ) ? this . trigger ( "data" , { type : "tag" , tagType : "endlist" } ) : ( s = /^#EXT-X-DISCONTINUITY/ . exec ( t ) ) ? this . trigger ( "data" , { type : "tag" , tagType : "discontinuity" } ) : ( s = /^#EXT-X-PROGRAM-DATE-TIME:(.*)$/ . exec ( t ) ) ? ( r = { type : "tag" , tagType : "program-date-time" } , s [ 1 ] && ( r . dateTimeString = s [ 1 ] , r . dateTimeObject = new Date ( s [ 1 ] ) ) , this . trigger ( "data" , r ) ) : ( s = /^#EXT-X-KEY:(.*)$/ . exec ( t ) ) ? ( r = { type : "tag" , tagType : "key" } , s [ 1 ] && ( r . attributes = bn ( s [ 1 ] ) , r . attributes . IV ) && ( "0x" === r . attributes . IV . substring ( 0 , 2 ) . toLowerCase ( ) && ( r . attributes . IV = r . attributes . IV . substring ( 2 ) ) , r . attributes . IV = r . attributes . IV . match ( /.{8}/g ) , r . attributes . IV [ 0 ] = parseInt ( r . attributes . IV [ 0 ] , 16 ) , r . attributes . IV [ 1 ] = parseInt ( r . attributes . IV [ 1 ] , 16 ) , r . attributes . IV [ 2 ] = parseInt ( r . attributes . IV [ 2 ] , 16 ) , r . attributes . IV [ 3 ] = pa
/*! @name mpd-parser @version 1.0.1 @license Apache-2.0 */
const wo = e => ! ! e && "object" == typeof e , x = ( ... e ) => e . reduce ( ( t , i ) => ( "object" == typeof i && Object . keys ( i ) . forEach ( e => { Array . isArray ( t [ e ] ) && Array . isArray ( i [ e ] ) ? t [ e ] = t [ e ] . concat ( i [ e ] ) : wo ( t [ e ] ) && wo ( i [ e ] ) ? t [ e ] = x ( t [ e ] , i [ e ] ) : t [ e ] = i [ e ] } ) , t ) , { } ) , Eo = t => Object . keys ( t ) . map ( e => t [ e ] ) , ko = e => e . reduce ( ( e , t ) => e . concat ( t ) , [ ] ) , Co = t => { if ( ! t . length ) return [ ] ; var i = [ ] ; for ( let e = 0 ; e < t . length ; e ++ ) i . push ( t [ e ] ) ; return i } ; var Io = { INVALID _NUMBER _OF _PERIOD : "INVALID_NUMBER_OF_PERIOD" , DASH _EMPTY _MANIFEST : "DASH_EMPTY_MANIFEST" , DASH _INVALID _XML : "DASH_INVALID_XML" , NO _BASE _URL : "NO_BASE_URL" , MISSING _SEGMENT _INFORMATION : "MISSING_SEGMENT_INFORMATION" , SEGMENT _TIME _UNSPECIFIED : "SEGMENT_TIME_UNSPECIFIED" , UNSUPPORTED _UTC _TIMING _SCHEME : "UNSUPPORTED_UTC_TIMING_SCHEME" } ; const xo = ( { baseUrl : s = "" , source : r = "" , range : n = "" , indexRange : a = "" } ) => { s = { uri : r , resolvedUri : On ( s || "" , r ) } ; if ( n || a ) { r = ( n || a ) . split ( "-" ) ; let e = window . BigInt ? window . BigInt ( r [ 0 ] ) : parseInt ( r [ 0 ] , 10 ) , t = window . BigInt ? window . BigInt ( r [ 1 ] ) : parseInt ( r [ 1 ] , 10 ) ; e < Number . MAX _SAFE _INTEGER && "bigint" == typeof e && ( e = Number ( e ) ) , t < Number . MAX _SAFE _INTEGER && "bigint" == typeof t && ( t = Number ( t ) ) ; let i ; "bigint" == typeof ( i = "bigint" == typeof t || "bigint" == typeof e ? window . BigInt ( t ) - window . BigInt ( e ) + window . BigInt ( 1 ) : t - e + 1 ) && i < Number . MAX _SAFE _INTEGER && ( i = Number ( i ) ) , s . byterange = { length : i , offset : e } } return s } , Ao = e => ( e && "number" != typeof e && ( e = parseInt ( e , 10 ) ) , isNaN ( e ) ? null : e ) , Po = { static ( e ) { var { duration : t , timescale : i = 1 , sourceDuration : s , periodDuration : r } = e , e = Ao ( e . endNumber ) , t = t / i ; return "number" == typeof e ? { start : 0 , end : e } : "number" == typeof r ? { start : 0 , end : r / t } : { start : 0 , end : s / t } } , dynamic ( e ) { var { NOW : t , clientOffset : i , availabilityStartTime : s , timescale : r = 1 , duration : n , periodStart : a = 0 , minimumUpdatePeriod : o = 0 , timeShiftBufferDepth : l = 1 / 0 } = e , e = Ao ( e . endNumber ) , t = ( t + i ) / 1e3 , i = s + a , s = Math . ceil ( ( t + o - i ) * r / n ) , a = Math . floor ( ( t - i - l ) * r / n ) , o = Math . floor ( ( t - i ) * r / n ) ; return { start : Math . max ( 0 , a ) , end : "number" == typeof e ? e : Math . min ( s , o ) } } } , Lo = e => { var n , { type : t , duration : i , timescale : s = 1 , periodDuration : r , sourceDuration : a } = e , { start : o , end : l } = Po [ t ] ( e ) , o = ( ( t , i ) => { var s = [ ] ; for ( let e = t ; e < i ; e ++ ) s . push ( e ) ; return s } ) ( o , l ) . map ( ( n = e , e => { var { duration : t , timescale : i = 1 , periodStart : s , startNumber : r = 1 } = n ; return { number : r + e , duration : t / i , timeline : s , time : e * t } } ) ) ; return "static" === t && ( o [ l = o . length - 1 ] . duration = ( "number" == typeof r ? r : a ) - i / s * l ) , o } , Oo = e => { var { baseUrl : t , initialization : i = { } , sourceDuration : s , indexRange : r = "" , periodStart : n , presentationTime : a , number : o = 0 , duration : l } = e ; if ( t ) return i = xo ( { baseUrl : t , source : i . sourceURL , range : i . range } ) , ( t = xo ( { baseUrl : t , source : t , indexRange : r } ) ) . map = i , l ? ( r = Lo ( e ) ) . length && ( t . duration = r [ 0 ] . duration , t . timeline = r [ 0 ] . timeline ) : s && ( t . duration = s , t . timeline = n ) , t . presentationTime = a || n , t . number = o , [ t ] ; throw new Error ( Io . NO _BASE _URL ) } , Do = ( e , i , s ) => { var r = e . sidx . map || null , n = e . sidx . duration , a = e . timeline || 0 , t = e . sidx . byterange , t = t . offset + t . length , o = i . timescale , l = i . references . filter ( e => 1 !== e . referenceType ) , d = [ ] , h = e . endList ? "static" : "dynamic" , u = e . sidx . timeline ; let c = u , p = e . mediaSequence || 0 , m ; m = "bigint" == typeof i . firstOffset ? window . BigInt ( t ) + i . firstOffset : t + i . firstOffset ; for ( let t = 0 ; t < l . length ; t ++ ) { var g = i . references [ t ] , f = g . referencedSize , g = g . subsegmentDuration ; let e ; e = "bigint" == typeof m ? m + window . BigInt ( f ) - window . BigInt ( 1 ) : m + f - 1 ; var y = m + "-" + e , y = { baseUrl : s , timescale : o , timeline : a , periodStart : u , presentationTime : c , number : p , duration : g , sourceDuration : n , indexRange : y , type : h } , y = Oo ( y ) [ 0 ] ; r && ( y . map = r ) , d . push ( y ) , "bigint" == typeof m ? m += window . BigInt ( f ) : m += f , c += g / o , p ++ } return e . segments = d , e } , No = [ "AUDIO" , "SUBTITLES" ] , Mo = e => { return e = e , i = ( { timeline : e } ) => e , Eo ( e . reduce ( ( t , e ) => ( e . forEach ( e => { t [ i ( e ) ] = e } ) , t ) , { } ) ) . sort ( ( e , t ) => e . timeline > t . timeline ? 1 : - 1 ) ; var i } , Ro = e => { let r = [ ] ; var n , a ; return n = e , e = No , a = ( e , t , i , s ) => { r = r . concat ( e . playlists || [ ] ) } , e . forEach ( function ( e ) { for ( var t in n . mediaGroups [ e ] ) for ( var i in n . mediaGroups [ e ] [ t ] ) { var s = n . mediaGroups [ e ] [ t ] [ i ] ; a ( s , e , t , i ) } } ) , r } , Uo = ( { playlist : i , mediaSequence : e } ) => { i . mediaSequence = e , i . segments . forEach ( ( e , t ) => { e . number = i . mediaSequence + t } ) } , Bo = ( { oldManifest : e , newManifest : t } ) => { var r , n , i = e . playlists . concat ( Ro ( e ) ) , s = t . playlists . concat ( Ro ( t ) ) ; return t . timelineStarts = Mo ( [ e . timelineStarts , t . timelin
/*! @name @videojs/http-streaming @version 3.0.2 @license Apache-2.0 */
const Rl = function ( e , t ) { if ( /^[a-z]+:/i . test ( t ) ) return t ; /^data:/ . test ( e ) && ( e = window . location && window . location . href || "" ) ; var i = "function" == typeof window . URL , s = /^\/\// . test ( e ) , r = ! window . location && ! /\/\//i . test ( e ) ; return i ? e = new window . URL ( e , window . location || fn ) : /\/\//i . test ( e ) || ( e = gn . buildAbsoluteURL ( window . location && window . location . href || "" , e ) ) , i ? ( i = new URL ( t , e ) , r ? i . href . slice ( fn . length ) : s ? i . href . slice ( i . protocol . length ) : i . href ) : gn . buildAbsoluteURL ( e , t ) } , Ul = ( e , t ) => t && t . responseURL && e !== t . responseURL ? t . responseURL : e , Bl = e => T . log . debug ? T . log . debug . bind ( T , "VHS:" , e + " >" ) : function ( ) { } ; function O ( ... e ) { var t = T . obj || T ; return ( t . merge || t . mergeOptions ) . apply ( t , e ) } function Fl ( ... e ) { var t = T . time || T ; return ( t . createTimeRanges || t . createTimeRanges ) . apply ( t , e ) } function jl ( e , i ) { return Xl ( e , function ( e , t ) { return e - zl <= i && t + zl >= i } ) } function Hl ( e , t ) { return Xl ( e , function ( e ) { return e - Gl >= t } ) } function ql ( e ) { if ( e && e . length && e . end ) return e . end ( e . length - 1 ) } function Vl ( t , i ) { let s = 0 ; if ( t && t . length ) for ( let e = 0 ; e < t . length ; e ++ ) { var r = t . start ( e ) , n = t . end ( e ) ; n < i || ( s += r < i && i <= n ? n - i : n - r ) } return s } function $l ( { defaultDuration : t , durationList : i , startIndex : s , endIndex : r } ) { let n = 0 ; if ( r < s && ( [ s , r ] = [ r , s ] ) , s < 0 ) { for ( let e = s ; e < Math . min ( 0 , r ) ; e ++ ) n += t ; s = 0 } for ( let e = s ; e < r ; e ++ ) n += i [ e ] . duration ; return n } function Wl ( e , t , i , s ) { if ( ! e || ! e . segments ) return null ; if ( e . endList ) return nd ( e ) ; if ( null === t ) return null ; t = t || 0 ; let r = rd ( e , e . mediaSequence + e . segments . length , t ) ; return i && ( s = "number" == typeof s ? s : td ( null , e ) , r -= s ) , Math . max ( 0 , r ) } const Gl = 1 / 30 , zl = 3 * Gl , Xl = function ( e , t ) { var i = [ ] ; let s ; if ( e && e . length ) for ( s = 0 ; s < e . length ; s ++ ) t ( e . start ( s ) , e . end ( s ) ) && i . push ( [ e . start ( s ) , e . end ( s ) ] ) ; return Fl ( i ) } , Kl = t => { var i = [ ] ; if ( ! t || ! t . length ) return "" ; for ( let e = 0 ; e < t . length ; e ++ ) i . push ( t . start ( e ) + " => " + t . end ( e ) ) ; return i . join ( ", " ) } , Yl = t => { var i = [ ] ; for ( let e = 0 ; e < t . length ; e ++ ) i . push ( { start : t . start ( e ) , end : t . end ( e ) } ) ; return i } , Ql = ( t , e ) => { if ( ! e . preload ) return e . duration ; let i = 0 ; return ( e . parts || [ ] ) . forEach ( function ( e ) { i += e . duration } ) , ( e . preloadHints || [ ] ) . forEach ( function ( e ) { "PART" === e . type && ( i += t . partTargetDuration ) } ) , i } , Jl = e => ( e . segments || [ ] ) . reduce ( ( i , s , r ) => ( s . parts ? s . parts . forEach ( function ( e , t ) { i . push ( { duration : e . duration , segmentIndex : r , partIndex : t , part : e , segment : s } ) } ) : i . push ( { duration : s . duration , segmentIndex : r , partIndex : null , segment : s , part : null } ) , i ) , [ ] ) , Zl = e => { e = e . segments && e . segments . length && e . segments [ e . segments . length - 1 ] ; return e && e . parts || [ ] } , ed = ( { preloadSegment : e } ) => { var t ; if ( e ) return { parts : e , preloadHints : t } = e , ( t || [ ] ) . reduce ( ( e , t ) => e + ( "PART" === t . type ? 1 : 0 ) , 0 ) + ( e && e . length ? e . length : 0 ) } , td = ( e , t ) => { return t . endList ? 0 : e && e . suggestedPresentationDelay ? e . suggestedPresentationDelay : ( e = 0 < Zl ( t ) . length ) && t . serverControl && t . serverControl . partHoldBack ? t . serverControl . partHoldBack : e && t . partTargetDuration ? 3 * t . partTargetDuration : t . serverControl && t . serverControl . holdBack ? t . serverControl . holdBack : t . targetDuration ? 3 * t . targetDuration : 0 } , id = function ( e , t ) { let i = 0 , s = t - e . mediaSequence , r = e . segments [ s ] ; if ( r ) { if ( "undefined" != typeof r . start ) return { result : r . start , precise : ! 0 } ; if ( "undefined" != typeof r . end ) return { result : r . end - r . duration , precise : ! 0 } } for ( ; s -- ; ) { if ( "undefined" != typeof ( r = e . segments [ s ] ) . end ) return { result : i + r . end , precise : ! 0 } ; if ( i += Ql ( e , r ) , "undefined" != typeof r . start ) return { result : i + r . start , precise : ! 0 } } return { result : i , precise : ! 1 } } , sd = function ( e , t ) { let i = 0 ; var s ; let r = t - e . mediaSequence ; for ( ; r < e . segments . length ; r ++ ) { if ( "undefined" != typeof ( s = e . segments [ r ] ) . start ) return { result : s . start - i , precise : ! 0 } ; if ( i += Ql ( e , s ) , "undefined" != typeof s . end ) return { result : s . end - i , precise : ! 0 } } return { result : - 1 , precise : ! 1 } } , rd = function ( e , t , i ) { var s ; return ( t = "undefined" == typeof t ? e . mediaSequence + e . segments . length : t ) < e . mediaSequence ? 0 : ( s = id ( e , t ) ) . precise ? s . result : ( e = sd ( e , t ) ) . precise ? e . result : s . result + i } , nd = function ( e , t , i ) { if ( ! e ) return 0 ; if ( "number" != typeof i && ( i = 0 ) , "undefined" == typeof t ) { if ( e . totalDuration ) return e . totalDuration ; if ( ! e . endList ) return window . Infinity } return rd ( e , t , i ) } ; function ad ( e ) { return e . excludeUntil && e . excludeUntil > Date . now ( ) } function od ( e ) { return e . excludeUntil && e . excludeUntil === 1 / 0 } function ld ( e ) { var t = ad ( e ) ; return ! e . disabled && ! t } funct
` +"browserWorkerPolyFill(self); \n "+e}function eh(e){return e.toString().replace(/^function.+?{/,"").slice(0,-1)}var th=Jd(Zd(eh(function(){function e(){this.init=function(){var n={};this.on=function(e,t){n[e]||(n[e]=[]),n[e]=n[e].concat(t)},this.off=function(e,t){return!!n[e]&&(t=n[e].indexOf(t),n[e]=n[e].slice(),n[e].splice(t,1),-1<t)},this.trigger=function(e){var t,i,s,r=n[e];if(r)if(2===arguments.length)for(i=r.length,t=0;t<i;++t)r[t].call(this,arguments[1]);else{for(s=[],t=arguments.length,t=1;t<arguments.length;++t)s.push(arguments[t]);for(i=r.length,t=0;t<i;++t)r[t].apply(this,s)}},this.dispose=function(){n={}}}}var l,R,U,B,F,j,H,q,V, $ ,W,G,z,X,K,Y,Q,J,Z,ee,d,te,ie,se,re,ne,ae,oe,t,le,de,he,ue,ce,pe,me,ge,fe="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},i=(e.prototype.pipe=function(t){return this.on("data",function(e){t.push(e)}),this.on("done",function(e){t.flush(e)}),this.on("partialdone",function(e){t.partialFlush(e)}),this.on("endedtimeline",function(e){t.endTimeline(e)}),this.on("reset",function(e){t.reset(e)}),t},e.prototype.push=function(e){this.trigger("data",e)},e.prototype.flush=function(e){this.trigger("done",e)},e.prototype.partialFlush=function(e){this.trigger("partialdone",e)},e.prototype.endTimeline=function(e){this.trigger("endedtimeline",e)},e.prototype.reset=function(e){this.trigger("reset",e)},e),ye=Math.pow(2,32),_e={getUint64:function(e){var t,e=new DataView(e.buffer,e.byteOffset,e.byteLength);return e.getBigUint64?(t=e.getBigUint64(0))<Number.MAX_SAFE_INTEGER?Number(t):t:e.getUint32(0)*ye+e.getUint32(4)},MAX_UINT32:ye},ve=_e.MAX_UINT32;if(d={avc1:[],avcC:[],btrt:[],dinf:[],dref:[],esds:[],ftyp:[],hdlr:[],mdat:[],mdhd:[],mdia:[],mfhd:[],minf:[],moof:[],moov:[],mp4a:[],mvex:[],mvhd:[],pasp:[],sdtp:[],smhd:[],stbl:[],stco:[],stsc:[],stsd:[],stsz:[],stts:[],styp:[],tfdt:[],tfhd:[],traf:[],trak:[],trun:[],trex:[],tkhd:[],vmhd:[]},"undefined"!=typeof Uint8Array){for(var s in d)d.hasOwnProperty(s)&&(d[s]=[s.charCodeAt(0),s.charCodeAt(1),s.charCodeAt(2),s.charCodeAt(3)]);te=new Uint8Array(["i".charCodeAt(0),"s".charCodeAt(0),"o".charCodeAt(0),"m".charCodeAt(0)]),se=new Uint8Array(["a".charCodeAt(0),"v".charCodeAt(0),"c".charCodeAt(0),"1".charCodeAt(0)]),ie=new Uint8Array([0,0,0,1]),Ce=new Uint8Array([0,0,0,0,0,0,0,0,118,105,100,101,0,0,0,0,0,0,0,0,0,0,0,0,86,105,100,101,111,72,97,110,100,108,101,114,0]),xe=new Uint8Array([0,0,0,0,0,0,0,0,115,111,117,110,0,0,0,0,0,0,0,0,0,0,0,0,83,111,117,110,100,72,97,110,100,108,101,114,0]),re={video:Ce,audio:xe},oe=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,12,117,114,108,32,0,0,0,1]),ae=new Uint8Array([0,0,0,0,0,0,0,0]),t=new Uint8Array([0,0,0,0,0,0,0,0]),le=t,de=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0]),he=t,ne=new Uint8Array([0,0,0,1,0,0,0,0,0,0,0,0])}l=function(e){for(var t,i=[],s=0,r=1;r<arguments.length;r++)i.push(arguments[r]);for(r=i.length;r--;)s+=i[r].byteLength;for(t=new Uint8Array(s+8),new DataView(t.buffer,t.byteOffset,t.byteLength).setUint32(0,t.byteLength),t.set(e,4),r=0,s=8;r<i.length;r++)t.set(i[r],s),s+=i[r].byteLength;return t},R=function(){return l(d.dinf,l(d.dref,oe))},U=function(e){return l(d.esds,new Uint8Array([0,0,0,0,3,25,0,0,0,4,17,64,21,0,6,0,0,0,218,192,0,0,218,192,5,2,e.audioobjecttype<<3|e.samplingfrequencyindex>>>1,e.samplingfrequencyindex<<7|e.channelcount<<3,6,1,2]))},X=function(e){return l(d.hdlr,re[e])},z=function(e){var t=new Uint8Array([0,0,0,0,0,0,0,2,0,0,0,3,0,1,95,144,e.duration>>>24&255,e.duration>>>16&255,e.duration>>>8&255,255&e.duration,85,196,0,0]);return e.samplerate&&(t[12]=e.samplerate>>>24&255,t[13]=e.samplerate>>>16&255,t[14]=e.samplerate>>>8&255,t[15]=255&e.samplerate),l(d.mdhd,t)},G=function(e){return l(d.mdia,z(e),X(e.type),j(e))},F=function(e){return l(d.mfhd,new Uint8Array([0,0,0,0,(4278190080&e)>>24,(16711680&e)>>16,(65280&e)>>8,255&e]))},j=function(e){return l(d.minf,"video"===e.type?l(d.vmhd,ne):l(d.smhd,ae),R(),Y(e))},q=function(e){for(var t=e.length,i=[];t--;)i[t]=Z(e[t]);return l.apply(null,[d.mvex].concat(i))},V=f
/*! @name pkcs7 @version 1.0.4 @license Apache-2.0 */ let h = null ; class g { constructor ( e ) { h = h || function ( ) { var e = [ [ [ ] , [ ] , [ ] , [ ] , [ ] ] , [ [ ] , [ ] , [ ] , [ ] , [ ] ] ] , t = e [ 0 ] , i = e [ 1 ] , s = t [ 4 ] , r = i [ 4 ] ; let n , a , o ; var l , d , h , u , c = [ ] , p = [ ] ; let m , g ; for ( n = 0 ; n < 256 ; n ++ ) p [ ( c [ n ] = n << 1 ^ 283 * ( n >> 7 ) ) ^ n ] = n ; for ( a = o = 0 ; ! s [ a ] ; a ^= l || 1 , o = p [ o ] || 1 ) for ( u = ( u = o ^ o << 1 ^ o << 2 ^ o << 3 ^ o << 4 ) >> 8 ^ 255 & u ^ 99 , h = c [ d = c [ l = c [ r [ s [ a ] = u ] = a ] ] ] , g = 16843009 * h ^ 65537 * d ^ 257 * l ^ 16843008 * a , m = 257 * c [ u ] ^ 16843008 * u , n = 0 ; n < 4 ; n ++ ) t [ n ] [ a ] = m = m << 24 ^ m >>> 8 , i [ n ] [ u ] = g = g << 24 ^ g >>> 8 ; for ( n = 0 ; n < 5 ; n ++ ) t [ n ] = t [ n ] . slice ( 0 ) , i [ n ] = i [ n ] . slice ( 0 ) ; return e } ( ) , this . _tables = [ [ h [ 0 ] [ 0 ] . slice ( ) , h [ 0 ] [ 1 ] . slice ( ) , h [ 0 ] [ 2 ] . slice ( ) , h [ 0 ] [ 3 ] . slice ( ) , h [ 0 ] [ 4 ] . slice ( ) ] , [ h [ 1 ] [ 0 ] . slice ( ) , h [ 1 ] [ 1 ] . slice ( ) , h [ 1 ] [ 2 ] . slice ( ) , h [ 1 ] [ 3 ] . slice ( ) , h [ 1 ] [ 4 ] . slice ( ) ] ] ; let t , i , s ; var r = this . _tables [ 0 ] [ 4 ] , n = this . _tables [ 1 ] , a = e . length ; let o = 1 ; if ( 4 !== a && 6 !== a && 8 !== a ) throw new Error ( "Invalid aes key size" ) ; var l = e . slice ( 0 ) , d = [ ] ; for ( this . _key = [ l , d ] , t = a ; t < 4 * a + 28 ; t ++ ) s = l [ t - 1 ] , ( t % a == 0 || 8 === a && t % a == 4 ) && ( s = r [ s >>> 24 ] << 24 ^ r [ s >> 16 & 255 ] << 16 ^ r [ s >> 8 & 255 ] << 8 ^ r [ 255 & s ] , t % a == 0 ) && ( s = s << 8 ^ s >>> 24 ^ o << 24 , o = o << 1 ^ 283 * ( o >> 7 ) ) , l [ t ] = l [ t - a ] ^ s ; for ( i = 0 ; t ; i ++ , t -- ) s = l [ 3 & i ? t : t - 4 ] , t <= 4 || i < 4 ? d [ i ] = s : d [ i ] = n [ 0 ] [ r [ s >>> 24 ] ] ^ n [ 1 ] [ r [ s >> 16 & 255 ] ] ^ n [ 2 ] [ r [ s >> 8 & 255 ] ] ^ n [ 3 ] [ r [ 255 & s ] ] } decrypt ( e , t , i , s , r , n ) { var a , o , l = this . _key [ 1 ] ; let d = e ^ l [ 0 ] , h = s ^ l [ 1 ] , u = i ^ l [ 2 ] , c = t ^ l [ 3 ] , p ; var m = l . length / 4 - 2 ; let g , f = 4 ; var e = this . _tables [ 1 ] , y = e [ 0 ] , _ = e [ 1 ] , v = e [ 2 ] , b = e [ 3 ] , T = e [ 4 ] ; for ( g = 0 ; g < m ; g ++ ) p = y [ d >>> 24 ] ^ _ [ h >> 16 & 255 ] ^ v [ u >> 8 & 255 ] ^ b [ 255 & c ] ^ l [ f ] , a = y [ h >>> 24 ] ^ _ [ u >> 16 & 255 ] ^ v [ c >> 8 & 255 ] ^ b [ 255 & d ] ^ l [ f + 1 ] , o = y [ u >>> 24 ] ^ _ [ c >> 16 & 255 ] ^ v [ d >> 8 & 255 ] ^ b [ 255 & h ] ^ l [ f + 2 ] , c = y [ c >>> 24 ] ^ _ [ d >> 16 & 255 ] ^ v [ h >> 8 & 255 ] ^ b [ 255 & u ] ^ l [ f + 3 ] , f += 4 , d = p , h = a , u = o ; for ( g = 0 ; g < 4 ; g ++ ) r [ ( 3 & - g ) + n ] = T [ d >>> 24 ] << 24 ^ T [ h >> 16 & 255 ] << 16 ^ T [ u >> 8 & 255 ] << 8 ^ T [ 255 & c ] ^ l [ f ++ ] , p = d , d = h , h = u , u = c , c = p } } class l extends e { constructor ( ) { super ( e ) , this . jobs = [ ] , this . delay = 1 , this . timeout _ = null } processJob _ ( ) { this . jobs . shift ( ) ( ) , this . jobs . length ? this . timeout _ = setTimeout ( this . processJob _ . bind ( this ) , this . delay ) : this . timeout _ = null } push ( e ) { this . jobs . push ( e ) , this . timeout _ || ( this . timeout _ = setTimeout ( this . processJob _ . bind ( this ) , this . delay ) ) } } function f ( e ) { return e << 24 | ( 65280 & e ) << 8 | ( 16711680 & e ) >> 8 | e >>> 24 } class d { constructor ( e , t , i , s ) { var r = d . STEP , n = new Int32Array ( e . buffer ) ; const a = new Uint8Array ( e . byteLength ) ; let o = 0 ; for ( this . asyncStream _ = new l , this . asyncStream _ . push ( this . decryptChunk _ ( n . subarray ( o , o + r ) , t , i , a ) ) , o = r ; o < n . length ; o += r ) i = new Uint32Array ( [ f ( n [ o - 4 ] ) , f ( n [ o - 3 ] ) , f ( n [ o - 2 ] ) , f ( n [ o - 1 ] ) ] ) , this . asyncStream _ . push ( this . decryptChunk _ ( n . subarray ( o , o + r ) , t , i , a ) ) ; this . asyncStream _ . push ( function ( ) { var e ;
/*! @name aes-decrypter @version 4.0.1 @license Apache-2.0 */ s ( null , ( e = a ) . subarray ( 0 , e . byteLength - e [ e . byteLength - 1 ] ) ) } ) } static get STEP ( ) { return 32e3 } decryptChunk _ ( t , i , s , r ) { return function ( ) { var e = function ( e , t , i ) { var s , r , n , a , o = new Int32Array ( e . buffer , e . byteOffset , e . byteLength >> 2 ) , l = new g ( Array . prototype . slice . call ( t ) ) , t = new Uint8Array ( e . byteLength ) , d = new Int32Array ( t . buffer ) ; let h , u , c , p , m ; for ( h = i [ 0 ] , u = i [ 1 ] , c = i [ 2 ] , p = i [ 3 ] , m = 0 ; m < o . length ; m += 4 ) s = f ( o [ m ] ) , r = f ( o [ m + 1 ] ) , n = f ( o [ m + 2 ] ) , a = f ( o [ m + 3 ] ) , l . decrypt ( s , r , n , a , d , m ) , d [ m ] = f ( d [ m ] ^ h ) , d [ m + 1 ] = f ( d [ m + 1 ] ^ u ) , d [ m + 2 ] = f ( d [ m + 2 ] ^ c ) , d [ m + 3 ] = f ( d [ m + 3 ] ^ p ) , h = s , u = r , c = n , p = a ; return t } ( t , i , s ) ; r . set ( e , t . byteOffset ) } } } var t = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : { } , t = "undefined" != typeof window ? window : "undefined" != typeof t ? t : "undefined" != typeof self ? self : { } , t = t . BigInt || Number ; t ( "0x1" ) , t ( "0x100" ) , t ( "0x10000" ) , t ( "0x1000000" ) , t ( "0x100000000" ) , t ( "0x10000000000" ) , t ( "0x1000000000000" ) , t ( "0x100000000000000" ) , t ( "0x10000000000000000" ) , t = new Uint16Array ( [ 65484 ] ) , 255 !== ( t = new Uint8Array ( t . buffer , t . byteOffset , t . byteLength ) ) [ 0 ] && t [ 0 ] ; function r ( s ) { const r = { } ; return Object . keys ( s ) . forEach ( e => { var t , i = s [ e ] ; t = i , ( "function" === ArrayBuffer . isView ? ArrayBuffer . isView ( t ) : t && t . buffer instanceof ArrayBuffer ) ? r [ e ] = { bytes : i . buffer , byteOffset : i . byteOffset , byteLength : i . byteLength } : r [ e ] = i } ) , r } self . onmessage = function ( e ) { const i = e . data ; var e = new Uint8Array ( i . encrypted . bytes , i . encrypted . byteOffset , i . encrypted . byteLength ) , t = new Uint32Array ( i . key . bytes , i . key . byteOffset , i . key . byteLength / 4 ) , s = new Uint32Array ( i . iv . bytes , i . iv . byteOffset , i . iv . byteLength / 4 ) ; new d ( e , t , s , function ( e , t ) { self . postMessage ( r ( { source : i . source , decrypted : t } ) , [ t . buffer ] ) } ) } } ) ) ) ; const uu = ( e , t ) => { e . abort ( ) , e . pause ( ) , t && t . activePlaylistLoader && ( t . activePlaylistLoader . pause ( ) , t . activePlaylistLoader = null ) } , cu = ( e , t ) => { ( t . activePlaylistLoader = e ) . load ( ) } , pu = { AUDIO : ( a , o ) => ( ) => { var { segmentLoaders : { [ a ] : e } , mediaTypes : { [ a ] : t } , excludePlaylist : i } = o , e = ( uu ( e , t ) , t . activeTrack ( ) ) , s = t . activeGroup ( ) , s = ( s . filter ( e => e . default ) [ 0 ] || s [ 0 ] ) . id , r = t . tracks [ s ] ; if ( e === r ) i ( { error : { message : "Problem encountered loading the default audio track." } } ) ; else { T . log . warn ( "Problem encountered loading the alternate audio track.Switching back to default." ) ; for ( const n in t . tracks ) t . tracks [ n ] . enabled = t . tracks [ n ] === r ; t . onTrackChanged ( ) } } , SUBTITLES : ( i , s ) => ( ) => { var { segmentLoaders : { [ i ] : e } , mediaTypes : { [ i ] : t } } = s , e = ( T . log . warn ( "Problem encountered loading the subtitle track.Disabling subtitle track." ) , uu ( e , t ) , t . activeTrack ( ) ) ; e && ( e . mode = "disabled" ) , t . onTrackChanged ( ) } } , mu = { AUDIO : ( e , t , i ) => { if ( ! t ) return ; const { tech : s , requestOptions : r , segmentLoaders : { [ e ] : n } } = i ; t . on ( "loadedmetadata" , ( ) => { var e = t . media ( ) ; n . playlist ( e , r ) , ( ! s . paused ( ) || e . endList && "none" !== s . preload ( ) ) && n . load ( ) } ) , t . on ( "loadedplaylist" , ( ) => { n . playlist ( t . media ( ) , r ) , s . paused ( ) || n . load ( ) } ) , t . on ( "error" , pu [ e ] ( e , i ) ) } , SUBTITLES : ( e , t , i ) => { const { tech : s , requestOptions : r , segmentLoaders : { [ e ] : n } , mediaTypes : { [ e ] : a } } = i ; t . on ( "loadedmetadata" , ( ) => { var e = t . media ( ) ; n . playlist ( e , r ) , n . track ( a . activeTrack ( ) ) , ( ! s . paused ( ) || e . endList && "none" !== s . preload ( ) ) && n . load ( ) } ) , t . on ( "loadedplaylist" , ( ) => { n . playlist ( t . media ( ) , r ) , s . paused ( ) || n . load ( ) } ) , t . on ( "error" , pu [ e ] ( e , i ) ) } } , gu = { AUDIO : ( i , s ) => { var r , { vhs : n , sourceType : a , segmentLoaders : { [ i ] : e } , requestOptions : o , main : { mediaGroups : l } , mediaTypes : { [ i ] : { groups : d , tracks : h , logger _ : u } } , mainPlaylistLoader : c } = s , p = pd ( c . main ) ; l [ i ] && 0 !== Object . keys ( l [ i ] ) . length || ( l [ i ] = { main : { default : { default : ! 0 } } } , p && ( l [ i ] . main . default . playlists = c . main . playlists ) ) ; for ( const m in l [ i ] ) { d [ m ] || ( d [ m ] = [ ] ) ; for ( const g in l [ i ] [ m ] ) { let e = l [ i ] [ m ] [ g ] , t ; t = p ? ( u ( ` AUDIO group ' ${ m } ' label ' ${ g } ' is a main playlist ` ) , e . isMainPlaylist = ! 0 , null ) : "vhs-json" === a && e . playlists ? new Cd ( e . playlists [ 0 ] , n , o ) : e . resolvedUri ? new Cd ( e . resolvedUri , n , o ) : e . playlists && "dash" === a ? new Kd ( e . playlists [ 0 ] , n , o , c ) : null , e = O ( { id : g , playlistLoader : t } , e ) , mu [ i ] ( i , e . playlistLoader , s ) , d [ m ] . push ( e ) , "undefined" == typeof h [ g ] && ( r = new T . AudioTrack ( { id : g , kind : ( e => { let t = e . default ? "main" : "alternative" ; return t = e . characteristics && 0 <= e . ch
/ * !
* clipboard . js v1 . 6.1
* https : //zenorocha.github.io/clipboard.js
*
* Licensed MIT © Zeno Rocha
* /
! function ( e ) { if ( "object" == typeof exports && "undefined" != typeof module ) module . exports = e ( ) ; else if ( "function" == typeof define && define . amd ) define ( [ ] , e ) ; else { var t ; t = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this , t . Clipboard = e ( ) } } ( function ( ) { var e , t , n ; return function e ( t , n , o ) { function i ( a , c ) { if ( ! n [ a ] ) { if ( ! t [ a ] ) { var l = "function" == typeof require && require ; if ( ! c && l ) return l ( a , ! 0 ) ; if ( r ) return r ( a , ! 0 ) ; var u = new Error ( "Cannot find module '" + a + "'" ) ; throw u . code = "MODULE_NOT_FOUND" , u } var s = n [ a ] = { exports : { } } ; t [ a ] [ 0 ] . call ( s . exports , function ( e ) { var n = t [ a ] [ 1 ] [ e ] ; return i ( n ? n : e ) } , s , s . exports , e , t , n , o ) } return n [ a ] . exports } for ( var r = "function" == typeof require && require , a = 0 ; a < o . length ; a ++ ) i ( o [ a ] ) ; return i } ( { 1 : [ function ( e , t , n ) { function o ( e , t ) { for ( ; e && e . nodeType !== i ; ) { if ( e . matches ( t ) ) return e ; e = e . parentNode } } var i = 9 ; if ( "undefined" != typeof Element && ! Element . prototype . matches ) { var r = Element . prototype ; r . matches = r . matchesSelector || r . mozMatchesSelector || r . msMatchesSelector || r . oMatchesSelector || r . webkitMatchesSelector } t . exports = o } , { } ] , 2 : [ function ( e , t , n ) { function o ( e , t , n , o , r ) { var a = i . apply ( this , arguments ) ; return e . addEventListener ( n , a , r ) , { destroy : function ( ) { e . removeEventListener ( n , a , r ) } } } function i ( e , t , n , o ) { return function ( n ) { n . delegateTarget = r ( n . target , t ) , n . delegateTarget && o . call ( e , n ) } } var r = e ( "./closest" ) ; t . exports = o } , { "./closest" : 1 } ] , 3 : [ function ( e , t , n ) { n . node = function ( e ) { return void 0 !== e && e instanceof HTMLElement && 1 === e . nodeType } , n . nodeList = function ( e ) { var t = Object . prototype . toString . call ( e ) ; return void 0 !== e && ( "[object NodeList]" === t || "[object HTMLCollection]" === t ) && "length" in e && ( 0 === e . length || n . node ( e [ 0 ] ) ) } , n . string = function ( e ) { return "string" == typeof e || e instanceof String } , n . fn = function ( e ) { var t = Object . prototype . toString . call ( e ) ; return "[object Function]" === t } } , { } ] , 4 : [ function ( e , t , n ) { function o ( e , t , n ) { if ( ! e && ! t && ! n ) throw new Error ( "Missing required arguments" ) ; if ( ! c . string ( t ) ) throw new TypeError ( "Second argument must be a String" ) ; if ( ! c . fn ( n ) ) throw new TypeError ( "Third argument must be a Function" ) ; if ( c . node ( e ) ) return i ( e , t , n ) ; if ( c . nodeList ( e ) ) return r ( e , t , n ) ; if ( c . string ( e ) ) return a ( e , t , n ) ; throw new TypeError ( "First argument must be a String, HTMLElement, HTMLCollection, or NodeList" ) } function i ( e , t , n ) { return e . addEventListener ( t , n ) , { destroy : function ( ) { e . removeEventListener ( t , n ) } } } function r ( e , t , n ) { return Array . prototype . forEach . call ( e , function ( e ) { e . addEventListener ( t , n ) } ) , { destroy : function ( ) { Array . prototype . forEach . call ( e , function ( e ) { e . removeEventListener ( t , n ) } ) } } } function a ( e , t , n ) { return l ( document . body , e , t , n ) } var c = e ( "./is" ) , l = e ( "delegate" ) ; t . exports = o } , { "./is" : 3 , delegate : 2 } ] , 5 : [ function ( e , t , n ) { function o ( e ) { var t ; if ( "SELECT" === e . nodeName ) e . focus ( ) , t = e . value ; else if ( "INPUT" === e . nodeName || "TEXTAREA" === e . nodeName ) { var n = e . hasAttribute ( "readonly" ) ; n || e . setAttribute ( "readonly" , "" ) , e . select ( ) , e . setSelectionRange ( 0 , e . value . length ) , n || e . removeAttribute ( "readonly" ) , t = e . value } else { e . hasAttribute ( "contenteditable" ) && e . focus ( ) ; var o = window . getSelection ( ) , i = document . createRange ( ) ; i . selectNodeContents ( e ) , o . removeAllRanges ( ) , o . addRange ( i ) , t = o . toString ( ) } return t } t . exports = o } , { } ] , 6 : [ function ( e , t , n ) { function o ( ) { } o . prototype = { on : function ( e , t , n ) { var o = this . e || ( this . e = { } ) ; return ( o [ e ] || ( o [ e ] = [ ] ) ) . push ( { fn : t , ctx : n } ) , this } , once : function ( e , t , n ) { function o ( ) { i . off ( e , o ) , t . apply ( n , arguments ) } var i = this ; return o . _ = t , this . on ( e , o , n ) } , emit : function ( e ) { var t = [ ] . slice . call ( arguments , 1 ) , n = ( ( this . e || ( this . e = { } ) ) [ e ] || [ ] ) . slice ( ) , o = 0 , i = n . length ; for ( o ; o < i ; o ++ ) n [ o ] . fn . apply ( n [ o ] . ctx , t ) ; return this } , off : function ( e , t ) { var n = this . e || ( this . e = { } ) , o = n [ e ] , i = [ ] ; if ( o && t ) for ( var r = 0 , a = o . length ; r < a ; r ++ ) o [ r ] . fn !== t && o [ r ] . fn . _ !== t && i . push ( o [ r ] ) ; return i . length ? n [ e ] = i : delete n [ e ] , this } } , t . exports = o } , { } ] , 7 : [ function ( t , n , o ) { ! function ( i , r ) { if ( "function" == typeof e && e . amd ) e ( [ "module" , "select" ] , r ) ; else if ( "undefined" != typeof o ) r ( n , t ( "select" ) ) ; else { var a = { exports : { } } ; r ( a , i . select ) , i . clipboardAction = a . exports } } ( this , function ( e , t ) { "use strict" ; function n ( e ) { return e && e . _ _esModule ? e : { default : e } } function o ( e , t ) { if ( ! ( e instanceof t ) ) throw new TypeErr
/ * !
* jQuery Plugin : Are - You - Sure ( Dirty Form Detection )
* https : //github.com/codedance/jquery.AreYouSure/
*
* Copyright ( c ) 2012 - 2014 , Chris Dance and PaperCut Software http : //www.papercut.com/
* Dual licensed under the MIT or GPL Version 2 licenses .
* http : //jquery.org/license
*
* Author : chris . dance @ papercut . com
* Version : 1.9 . 0
* Date : 13 th August 2014
* /
( function ( $ ) {
$ . fn . areYouSure = function ( options ) {
var settings = $ . extend (
{
'message' : 'You have unsaved changes!' ,
'dirtyClass' : 'dirty' ,
'change' : null ,
'silent' : false ,
'addRemoveFieldsMarksDirty' : false ,
'fieldEvents' : 'change keyup propertychange input' ,
'fieldSelector' : ":input:not(input[type=submit]):not(input[type=button])"
} , options ) ;
var getValue = function ( $field ) {
if ( $field . hasClass ( 'ays-ignore' )
|| $field . hasClass ( 'aysIgnore' )
|| $field . attr ( 'data-ays-ignore' )
|| $field . attr ( 'name' ) === undefined ) {
return null ;
}
if ( $field . is ( ':disabled' ) ) {
return 'ays-disabled' ;
}
var val ;
var type = $field . attr ( 'type' ) ;
if ( $field . is ( 'select' ) ) {
type = 'select' ;
}
switch ( type ) {
case 'checkbox' :
case 'radio' :
val = $field . is ( ':checked' ) ;
break ;
case 'select' :
val = '' ;
$field . find ( 'option' ) . each ( function ( o ) {
var $option = $ ( this ) ;
if ( $option . is ( ':selected' ) ) {
val += $option . val ( ) ;
}
} ) ;
break ;
default :
val = $field . val ( ) ;
}
return val ;
} ;
var storeOrigValue = function ( $field ) {
$field . data ( 'ays-orig' , getValue ( $field ) ) ;
} ;
var checkForm = function ( evt ) {
var isFieldDirty = function ( $field ) {
var origValue = $field . data ( 'ays-orig' ) ;
if ( undefined === origValue ) {
return false ;
}
return ( getValue ( $field ) != origValue ) ;
} ;
var $form = ( $ ( this ) . is ( 'form' ) )
? $ ( this )
: $ ( this ) . parents ( 'form' ) ;
// Test on the target first as it's the most likely to be dirty
if ( isFieldDirty ( $ ( evt . target ) ) ) {
setDirtyStatus ( $form , true ) ;
return ;
}
$fields = $form . find ( settings . fieldSelector ) ;
if ( settings . addRemoveFieldsMarksDirty ) {
// Check if field count has changed
var origCount = $form . data ( "ays-orig-field-count" ) ;
if ( origCount != $fields . length ) {
setDirtyStatus ( $form , true ) ;
return ;
}
}
// Brute force - check each field
var isDirty = false ;
$fields . each ( function ( ) {
$field = $ ( this ) ;
if ( isFieldDirty ( $field ) ) {
isDirty = true ;
return false ; // break
}
} ) ;
setDirtyStatus ( $form , isDirty ) ;
} ;
var initForm = function ( $form ) {
var fields = $form . find ( settings . fieldSelector ) ;
$ ( fields ) . each ( function ( ) { storeOrigValue ( $ ( this ) ) ; } ) ;
$ ( fields ) . unbind ( settings . fieldEvents , checkForm ) ;
$ ( fields ) . bind ( settings . fieldEvents , checkForm ) ;
$form . data ( "ays-orig-field-count" , $ ( fields ) . length ) ;
setDirtyStatus ( $form , false ) ;
} ;
var setDirtyStatus = function ( $form , isDirty ) {
var changed = isDirty != $form . hasClass ( settings . dirtyClass ) ;
$form . toggleClass ( settings . dirtyClass , isDirty ) ;
// Fire change event if required
if ( changed ) {
if ( settings . change ) settings . change . call ( $form , $form ) ;
if ( isDirty ) $form . trigger ( 'dirty.areYouSure' , [ $form ] ) ;
if ( ! isDirty ) $form . trigger ( 'clean.areYouSure' , [ $form ] ) ;
$form . trigger ( 'change.areYouSure' , [ $form ] ) ;
}
} ;
var rescan = function ( ) {
var $form = $ ( this ) ;
var fields = $form . find ( settings . fieldSelector ) ;
$ ( fields ) . each ( function ( ) {
var $field = $ ( this ) ;
if ( ! $field . data ( 'ays-orig' ) ) {
storeOrigValue ( $field ) ;
$field . bind ( settings . fieldEvents , checkForm ) ;
}
} ) ;
// Check for changes while we're here
$form . trigger ( 'checkform.areYouSure' ) ;
} ;
var reinitialize = function ( ) {
initForm ( $ ( this ) ) ;
}
if ( ! settings . silent && ! window . aysUnloadSet ) {
window . aysUnloadSet = true ;
$ ( window ) . bind ( 'beforeunload' , function ( ) {
$dirtyForms = $ ( "form" ) . filter ( '.' + settings . dirtyClass ) ;
if ( $dirtyForms . length == 0 ) {
return ;
}
// Prevent multiple prompts - seen on Chrome and IE
if ( navigator . userAgent . toLowerCase ( ) . match ( /msie|chrome/ ) ) {
if ( window . aysHasPrompted ) {
return ;
}
window . aysHasPrompted = true ;
window . setTimeout ( function ( ) { window . aysHasPrompted = false ; } , 900 ) ;
}
return settings . message ;
} ) ;
}
return this . each ( function ( elem ) {
if ( ! $ ( this ) . is ( 'form' ) ) {
return ;
}
var $form = $ ( this ) ;
$form . submit ( function ( ) {
$form . removeClass ( settings . dirtyClass ) ;
} ) ;
$form . bind ( 'reset' , function ( ) { setDirtyStatus ( $form , false ) ; } ) ;
// Add a custom events
$form . bind ( 'rescan.areYouSure' , rescan ) ;
$form . bind ( 'reinitialize.areYouSure' , reinitialize ) ;
$form . bind ( 'checkform.areYouSure' , checkForm ) ;
initForm ( $form ) ;
} ) ;
} ;
} ) ( jQuery ) ;
! function ( e ) { e . fn . shorten = function ( s ) { "use strict" ; var t = { showChars : 100 , minHideChars : 10 , ellipsesText : " ... " , moreText : "more" , lessText : "less" , onLess : function ( ) { } , onMore : function ( ) { } , errMsg : null , force : ! 1 } ; return s && e . extend ( t , s ) , ! ( e ( this ) . data ( "jquery.shorten" ) && ! t . force ) && ( e ( this ) . data ( "jquery.shorten" , ! 0 ) , e ( document ) . off ( "click" , ".morelink" ) , e ( document ) . on ( { click : function ( ) { var s = e ( this ) ; return s . hasClass ( "less" ) ? ( s . removeClass ( "less" ) , s . html ( t . moreText ) , s . parent ( ) . prev ( ) . animate ( { height : "0%" } , function ( ) { s . parent ( ) . prev ( ) . prev ( ) . show ( ) } ) . hide ( "fast" , function ( ) { t . onLess ( ) ; s . trigger ( 'shorten::collapse' ) ; } ) ) : ( s . addClass ( "less" ) , s . html ( t . lessText ) , s . parent ( ) . prev ( ) . animate ( { height : "100%" } , function ( ) { s . parent ( ) . prev ( ) . prev ( ) . hide ( ) } ) . show ( "fast" , function ( ) { t . onMore ( ) ; s . trigger ( 'shorten::expand' ) ; } ) ) , ! 1 } } , ".morelink" ) , this . each ( function ( ) { var s = e ( this ) , n = s . html ( ) ; if ( s . text ( ) . length > t . showChars + t . minHideChars ) { var r = n . substr ( 0 , t . showChars ) ; if ( r . indexOf ( "<" ) >= 0 ) { for ( var a = ! 1 , o = "" , h = 0 , i = [ ] , l = null , c = 0 , f = 0 ; f <= t . showChars ; c ++ ) if ( "<" != n [ c ] || a || ( a = ! 0 , "/" == ( l = n . substring ( c + 1 , n . indexOf ( ">" , c ) ) ) [ 0 ] ? l != "/" + i [ 0 ] ? t . errMsg = "ERROR en HTML: the top of the stack should be the tag that closes" : i . shift ( ) : "br" != l . toLowerCase ( ) && i . unshift ( l ) ) , a && ">" == n [ c ] && ( a = ! 1 ) , a ) o += n . charAt ( c ) ; else if ( f ++ , h <= t . showChars ) o += n . charAt ( c ) , h ++ ; else if ( i . length > 0 ) { for ( j = 0 ; j < i . length ; j ++ ) o += "</" + i [ j ] + ">" ; break } r = e ( "<span/>" ) . html ( o + '<span class="ellip">' + t . ellipsesText + "</span>" ) . html ( ) } else r += t . ellipsesText ; var p = '<span class="shortcontent">' + r + '</span><span class="allcontent">' + n + '</span><span><a href="javascript://nop/" class="morelink">' + t . moreText + "</a></span>" ; s . html ( p ) , s . find ( ".allcontent" ) . hide ( ) , e ( ".shortcontent p:last" , s ) . css ( "margin-bottom" , 0 ) } } ) ) } } ( jQuery ) ;
/*! jsTimezoneDetect - v1.0.5 - 2013-04-01 */
( function ( e ) { var t = function ( ) { "use strict" ; var e = "s" , n = 2011 , r = function ( e ) { var t = - e . getTimezoneOffset ( ) ; return t !== null ? t : 0 } , i = function ( e , t , n ) { var r = new Date ; return e !== undefined && r . setFullYear ( e ) , r . setDate ( n ) , r . setMonth ( t ) , r } , s = function ( e ) { return r ( i ( e , 0 , 2 ) ) } , o = function ( e ) { return r ( i ( e , 5 , 2 ) ) } , u = function ( e ) { var t = e . getMonth ( ) > 7 ? o ( e . getFullYear ( ) ) : s ( e . getFullYear ( ) ) , n = r ( e ) ; return t - n !== 0 } , a = function ( ) { var t = s ( n ) , r = o ( n ) , i = t - r ; return i < 0 ? t + ",1" : i > 0 ? r + ",1," + e : t + ",0" } , f = function ( ) { var e = a ( ) ; return new t . TimeZone ( t . olson . timezones [ e ] ) } , l = function ( e ) { var t = new Date ( 2010 , 6 , 15 , 1 , 0 , 0 , 0 ) , n = { "America/Denver" : new Date ( 2011 , 2 , 13 , 3 , 0 , 0 , 0 ) , "America/Mazatlan" : new Date ( 2011 , 3 , 3 , 3 , 0 , 0 , 0 ) , "America/Chicago" : new Date ( 2011 , 2 , 13 , 3 , 0 , 0 , 0 ) , "America/Mexico_City" : new Date ( 2011 , 3 , 3 , 3 , 0 , 0 , 0 ) , "America/Asuncion" : new Date ( 2012 , 9 , 7 , 3 , 0 , 0 , 0 ) , "America/Santiago" : new Date ( 2012 , 9 , 3 , 3 , 0 , 0 , 0 ) , "America/Campo_Grande" : new Date ( 2012 , 9 , 21 , 5 , 0 , 0 , 0 ) , "America/Montevideo" : new Date ( 2011 , 9 , 2 , 3 , 0 , 0 , 0 ) , "America/Sao_Paulo" : new Date ( 2011 , 9 , 16 , 5 , 0 , 0 , 0 ) , "America/Los_Angeles" : new Date ( 2011 , 2 , 13 , 8 , 0 , 0 , 0 ) , "America/Santa_Isabel" : new Date ( 2011 , 3 , 5 , 8 , 0 , 0 , 0 ) , "America/Havana" : new Date ( 2012 , 2 , 10 , 2 , 0 , 0 , 0 ) , "America/New_York" : new Date ( 2012 , 2 , 10 , 7 , 0 , 0 , 0 ) , "Asia/Beirut" : new Date ( 2011 , 2 , 27 , 1 , 0 , 0 , 0 ) , "Europe/Helsinki" : new Date ( 2011 , 2 , 27 , 4 , 0 , 0 , 0 ) , "Europe/Istanbul" : new Date ( 2011 , 2 , 28 , 5 , 0 , 0 , 0 ) , "Asia/Damascus" : new Date ( 2011 , 3 , 1 , 2 , 0 , 0 , 0 ) , "Asia/Jerusalem" : new Date ( 2011 , 3 , 1 , 6 , 0 , 0 , 0 ) , "Asia/Gaza" : new Date ( 2009 , 2 , 28 , 0 , 30 , 0 , 0 ) , "Africa/Cairo" : new Date ( 2009 , 3 , 25 , 0 , 30 , 0 , 0 ) , "Pacific/Auckland" : new Date ( 2011 , 8 , 26 , 7 , 0 , 0 , 0 ) , "Pacific/Fiji" : new Date ( 2010 , 10 , 29 , 23 , 0 , 0 , 0 ) , "America/Halifax" : new Date ( 2011 , 2 , 13 , 6 , 0 , 0 , 0 ) , "America/Goose_Bay" : new Date ( 2011 , 2 , 13 , 2 , 1 , 0 , 0 ) , "America/Miquelon" : new Date ( 2011 , 2 , 13 , 5 , 0 , 0 , 0 ) , "America/Godthab" : new Date ( 2011 , 2 , 27 , 1 , 0 , 0 , 0 ) , "Europe/Moscow" : t , "Asia/Yekaterinburg" : t , "Asia/Omsk" : t , "Asia/Krasnoyarsk" : t , "Asia/Irkutsk" : t , "Asia/Yakutsk" : t , "Asia/Vladivostok" : t , "Asia/Kamchatka" : t , "Europe/Minsk" : t , "Pacific/Apia" : new Date ( 2010 , 10 , 1 , 1 , 0 , 0 , 0 ) , "Australia/Perth" : new Date ( 2008 , 10 , 1 , 1 , 0 , 0 , 0 ) } ; return n [ e ] } ; return { determine : f , date _is _dst : u , dst _start _for : l } } ( ) ; t . TimeZone = function ( e ) { "use strict" ; var n = { "America/Denver" : [ "America/Denver" , "America/Mazatlan" ] , "America/Chicago" : [ "America/Chicago" , "America/Mexico_City" ] , "America/Santiago" : [ "America/Santiago" , "America/Asuncion" , "America/Campo_Grande" ] , "America/Montevideo" : [ "America/Montevideo" , "America/Sao_Paulo" ] , "Asia/Beirut" : [ "Asia/Beirut" , "Europe/Helsinki" , "Europe/Istanbul" , "Asia/Damascus" , "Asia/Jerusalem" , "Asia/Gaza" ] , "Pacific/Auckland" : [ "Pacific/Auckland" , "Pacific/Fiji" ] , "America/Los_Angeles" : [ "America/Los_Angeles" , "America/Santa_Isabel" ] , "America/New_York" : [ "America/Havana" , "America/New_York" ] , "America/Halifax" : [ "America/Goose_Bay" , "America/Halifax" ] , "America/Godthab" : [ "America/Miquelon" , "America/Godthab" ] , "Asia/Dubai" : [ "Europe/Moscow" ] , "Asia/Dhaka" : [ "Asia/Yekaterinburg" ] , "Asia/Jakarta" : [ "Asia/Omsk" ] , "Asia/Shanghai" : [ "Asia/Krasnoyarsk" , "Australia/Perth" ] , "Asia/Tokyo" : [ "Asia/Irkutsk" ] , "Australia/Brisbane" : [ "Asia/Yakutsk" ] , "Pacific/Noumea" : [ "Asia/Vladivostok" ] , "Pacific/Tarawa" : [ "Asia/Kamchatka" ] , "Pacific/Tongatapu" : [ "Pacific/Apia" ] , "Africa/Johannesburg" : [ "Asia/Gaza" , "Africa/Cairo" ] , "Asia/Baghdad" : [ "Europe/Minsk" ] } , r = e , i = function ( ) { var e = n [ r ] , i = e . length , s = 0 , o = e [ 0 ] ; for ( ; s < i ; s += 1 ) { o = e [ s ] ; if ( t . date _is _dst ( t . dst _start _for ( o ) ) ) { r = o ; return } } } , s = function ( ) { return typeof n [ r ] != "undefined" } ; return s ( ) && i ( ) , { name : function ( ) { return r } } } , t . olson = { } , t . olson . timezones = { "-720,0" : "Pacific/Majuro" , "-660,0" : "Pacific/Pago_Pago" , "-600,1" : "America/Adak" , "-600,0" : "Pacific/Honolulu" , "-570,0" : "Pacific/Marquesas" , "-540,0" : "Pacific/Gambier" , "-540,1" : "America/Anchorage" , "-480,1" : "America/Los_Angeles" , "-480,0" : "Pacific/Pitcairn" , "-420,0" : "America/Phoenix" , "-420,1" : "America/Denver" , "-360,0" : "America/Guatemala" , "-360,1" : "America/Chicago" , "-360,1,s" : "Pacific/Easter" , "-300,0" : "America/Bogota" , "-300,1" : "America/New_York" , "-270,0" : "America/Caracas" , "-240,1" : "America/Halifax" , "-240,0" : "America/Santo_Domingo" , "-240,1,s" : "America/Santiago" , "-210,1" : "America/St_Johns" , "-180,1" : "America/Godthab" ,
/ *
* A colorselector for Twitter Bootstrap which lets you select a color from a predefined set of colors only .
* https : //github.com/flaute/bootstrap-colorselector
*
* Copyright ( C ) 2014 Flaute
*
* Licensed under the MIT license
* /
( function ( $ ) {
"use strict" ;
var ColorSelector = function ( select , options ) {
this . options = options ;
this . $select = $ ( select ) ;
this . _init ( ) ;
} ;
ColorSelector . prototype = {
constructor : ColorSelector ,
_init : function ( ) {
var callback = this . options . callback ;
var selectValue = this . $select . val ( ) ;
var selectColor = this . $select . find ( "option:selected" ) . data ( "color" ) ;
var $markupUl = $ ( "<ul>" ) . addClass ( "dropdown-menu" ) . addClass ( "dropdown-caret" ) ;
var $markupDiv = $ ( "<div>" ) . addClass ( "dropdown" ) . addClass ( "dropdown-colorselector" ) ;
var $markupSpan = $ ( "<span>" ) . addClass ( "btn-colorselector" ) . css ( "background-color" , selectColor ) ;
var $markupA = $ ( "<a>" ) . attr ( "data-toggle" , "dropdown" ) . addClass ( "dropdown-toggle" ) . attr ( "href" , "#" ) . append ( $markupSpan ) ;
// create an li-tag for every option of the select
$ ( "option" , this . $select ) . each ( function ( ) {
var option = $ ( this ) ;
var value = option . attr ( "value" ) ;
var color = option . data ( "color" ) ;
var title = option . text ( ) ;
// create a-tag
var $markupA = $ ( "<a>" ) . addClass ( "color-btn" ) ;
if ( option . prop ( "selected" ) === true || selectValue === color ) {
$markupA . addClass ( "selected" ) ;
}
$markupA . css ( "background-color" , color ) ;
$markupA . attr ( "href" , "#" ) . attr ( "data-color" , color ) . attr ( "data-value" , value ) . attr ( "title" , title ) ;
// create li-tag
$markupUl . append ( $ ( "<li>" ) . append ( $markupA ) ) ;
} ) ;
// append the colorselector
$markupDiv . append ( $markupA ) ;
// append the colorselector-dropdown
$markupDiv . append ( $markupUl ) ;
// hide the select
this . $select . hide ( ) ;
// insert the colorselector
this . $selector = $ ( $markupDiv ) . insertAfter ( this . $select ) ;
// register change handler
this . $select . on ( "change" , function ( ) {
var value = $ ( this ) . val ( ) ;
var color = $ ( this ) . find ( "option[value='" + value + "']" ) . data ( "color" ) ;
var title = $ ( this ) . find ( "option[value='" + value + "']" ) . text ( ) ;
// remove old and set new selected color
$ ( this ) . next ( ) . find ( "ul" ) . find ( "li" ) . find ( ".selected" ) . removeClass ( "selected" ) ;
$ ( this ) . next ( ) . find ( "ul" ) . find ( "li" ) . find ( "a[data-color='" + color + "']" ) . addClass ( "selected" ) ;
$ ( this ) . next ( ) . find ( ".btn-colorselector" ) . css ( "background-color" , color ) ;
callback ( value , color , title ) ;
} ) ;
// register click handler
$markupUl . on ( 'click.colorselector' , $ . proxy ( this . _clickColor , this ) ) ;
} ,
_clickColor : function ( e ) {
var a = $ ( e . target ) ;
if ( ! a . is ( ".color-btn" ) ) {
return false ;
}
this . $select . val ( a . data ( "value" ) ) . change ( ) ;
e . preventDefault ( ) ;
return true ;
} ,
setColor : function ( color ) {
// find value for color
var value = $ ( this . $selector ) . find ( "li" ) . find ( "a[data-color='" + color + "']" ) . data ( "value" ) ;
this . setValue ( value ) ;
} ,
setValue : function ( value ) {
this . $select . val ( value ) . change ( ) ;
} ,
} ;
$ . fn . colorselector = function ( option ) {
var args = Array . apply ( null , arguments ) ;
args . shift ( ) ;
return this . each ( function ( ) {
var $this = $ ( this ) , data = $this . data ( "colorselector" ) , options = $ . extend ( { } , $ . fn . colorselector . defaults , $this . data ( ) , typeof option == "object" && option ) ;
if ( ! data ) {
$this . data ( "colorselector" , ( data = new ColorSelector ( this , options ) ) ) ;
}
if ( typeof option == "string" ) {
data [ option ] . apply ( data , args ) ;
}
} ) ;
} ;
$ . fn . colorselector . defaults = {
callback : function ( value , color , title ) {
} ,
colorsPerRow : 8
} ;
$ . fn . colorselector . Constructor = ColorSelector ;
} ) ( jQuery , window , document ) ;
// MIT License:
//
// Copyright (c) 2010-2012, Joe Walnes
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
/ * *
* This behaves like a WebSocket in every way , except if it fails to connect ,
* or it gets disconnected , it will repeatedly poll until it successfully connects
* again .
*
* It is API compatible , so when you have :
* ws = new WebSocket ( 'ws://....' ) ;
* you can replace with :
* ws = new ReconnectingWebSocket ( 'ws://....' ) ;
*
* The event stream will typically look like :
* onconnecting
* onopen
* onmessage
* onmessage
* onclose // lost connection
* onconnecting
* onopen // sometime later...
* onmessage
* onmessage
* etc ...
*
* It is API compatible with the standard WebSocket API , apart from the following members :
*
* - ` bufferedAmount `
* - ` extensions `
* - ` binaryType `
*
* Latest version : https : //github.com/joewalnes/reconnecting-websocket/
* - Joe Walnes
*
* Syntax
* === ===
* var socket = new ReconnectingWebSocket ( url , protocols , options ) ;
*
* Parameters
* === === === =
* url - The url you are connecting to .
* protocols - Optional string or array of protocols .
* options - See below
*
* Options
* === === =
* Options can either be passed upon instantiation or set after instantiation :
*
* var socket = new ReconnectingWebSocket ( url , null , { debug : true , reconnectInterval : 4000 } ) ;
*
* or
*
* var socket = new ReconnectingWebSocket ( url ) ;
* socket . debug = true ;
* socket . reconnectInterval = 4000 ;
*
* debug
* - Whether this instance should log debug messages . Accepts true or false . Default : false .
*
* automaticOpen
* - Whether or not the websocket should attempt to connect immediately upon instantiation . The socket can be manually opened or closed at any time using ws . open ( ) and ws . close ( ) .
*
* reconnectInterval
* - The number of milliseconds to delay before attempting to reconnect . Accepts integer . Default : 1000.
*
* maxReconnectInterval
* - The maximum number of milliseconds to delay a reconnection attempt . Accepts integer . Default : 30000.
*
* reconnectDecay
* - The rate of increase of the reconnect delay . Allows reconnect attempts to back off when problems persist . Accepts integer or float . Default : 1.5 .
*
* timeoutInterval
* - The maximum time in milliseconds to wait for a connection to succeed before closing and retrying . Accepts integer . Default : 2000.
*
* /
( function ( global , factory ) {
if ( typeof define === 'function' && define . amd ) {
define ( [ ] , factory ) ;
} else if ( typeof module !== 'undefined' && module . exports ) {
module . exports = factory ( ) ;
} else {
global . ReconnectingWebSocket = factory ( ) ;
}
} ) ( this , function ( ) {
if ( ! ( 'WebSocket' in window ) ) {
return ;
}
function ReconnectingWebSocket ( url , protocols , options ) {
// Default settings
var settings = {
/** Whether this instance should log debug messages. */
debug : false ,
/** Whether or not the websocket should attempt to connect immediately upon instantiation. */
automaticOpen : true ,
/** The number of milliseconds to delay before attempting to reconnect. */
reconnectInterval : 1000 ,
/** The maximum number of milliseconds to delay a reconnection attempt. */
maxReconnectInterval : 30000 ,
/** The rate of increase of the reconnect delay. Allows reconnect attempts to back off when problems persist. */
reconnectDecay : 1.5 ,
/** The maximum time in milliseconds to wait for a connection to succeed before closing and retrying. */
timeoutInterval : 2000 ,
/** The maximum number of reconnection attempts to make. Unlimited if null. */
maxReconnectAttempts : null ,
/** The binary type, possible values 'blob' or 'arraybuffer', default 'blob'. */
binaryType : 'blob'
}
if ( ! options ) { options = { } ; }
// Overwrite and define settings with options if they exist.
for ( var key in settings ) {
if ( typeof options [ key ] !== 'undefined' ) {
this [ key ] = options [ key ] ;
} else {
this [ key ] = settings [ key ] ;
}
}
// These should be treated as read-only properties
/** The URL as resolved by the constructor. This is always an absolute URL. Read only. */
this . url = url ;
/** The number of attempted reconnects since starting, or the last successful connection. Read only. */
this . reconnectAttempts = 0 ;
/ * *
* The current state of the connection .
* Can be one of : WebSocket . CONNECTING , WebSocket . OPEN , WebSocket . CLOSING , WebSocket . CLOSED
* Read only .
* /
this . readyState = WebSocket . CONNECTING ;
/ * *
* A string indicating the name of the sub - protocol the server selected ; this will be one of
* the strings specified in the protocols parameter when creating the WebSocket object .
* Read only .
* /
this . protocol = null ;
// Private state variables
var self = this ;
var ws ;
var forcedClose = false ;
var timedOut = false ;
var eventTarget = document . createElement ( 'div' ) ;
// Wire up "on*" properties as event handlers
eventTarget . addEventListener ( 'open' , function ( event ) { self . onopen ( event ) ; } ) ;
eventTarget . addEventListener ( 'close' , function ( event ) { self . onclose ( event ) ; } ) ;
eventTarget . addEventListener ( 'connecting' , function ( event ) { self . onconnecting ( event ) ; } ) ;
eventTarget . addEventListener ( 'message' , function ( event ) { self . onmessage ( event ) ; } ) ;
eventTarget . addEventListener ( 'error' , function ( event ) { self . onerror ( event ) ; } ) ;
// Expose the API required by EventTarget
this . addEventListener = eventTarget . addEventListener . bind ( eventTarget ) ;
this . removeEventListener = eventTarget . removeEventListener . bind ( eventTarget ) ;
this . dispatchEvent = eventTarget . dispatchEvent . bind ( eventTarget ) ;
/ * *
* This function generates an event that is compatible with standard
* compliant browsers and IE9 - IE11
*
* This will prevent the error :
* Object doesn ' t support this action
*
* http : //stackoverflow.com/questions/19345392/why-arent-my-parameters-getting-passed-through-to-a-dispatched-event/19345563#19345563
* @ param s String The name that the event should use
* @ param args Object an optional object that the event will use
* /
function generateEvent ( s , args ) {
var evt = document . createEvent ( "CustomEvent" ) ;
evt . initCustomEvent ( s , false , false , args ) ;
return evt ;
} ;
this . open = function ( reconnectAttempt ) {
ws = new WebSocket ( self . url , protocols || [ ] ) ;
ws . binaryType = this . binaryType ;
if ( reconnectAttempt ) {
if ( this . maxReconnectAttempts && this . reconnectAttempts > this . maxReconnectAttempts ) {
return ;
}
} else {
eventTarget . dispatchEvent ( generateEvent ( 'connecting' ) ) ;
this . reconnectAttempts = 0 ;
}
if ( self . debug || ReconnectingWebSocket . debugAll ) {
console . debug ( 'ReconnectingWebSocket' , 'attempt-connect' , self . url ) ;
}
var localWs = ws ;
var timeout = setTimeout ( function ( ) {
if ( self . debug || ReconnectingWebSocket . debugAll ) {
console . debug ( 'ReconnectingWebSocket' , 'connection-timeout' , self . url ) ;
}
timedOut = true ;
localWs . close ( ) ;
timedOut = false ;
} , self . timeoutInterval ) ;
ws . onopen = function ( event ) {
clearTimeout ( timeout ) ;
if ( self . debug || ReconnectingWebSocket . debugAll ) {
console . debug ( 'ReconnectingWebSocket' , 'onopen' , self . url ) ;
}
self . protocol = ws . protocol ;
self . readyState = WebSocket . OPEN ;
self . reconnectAttempts = 0 ;
var e = generateEvent ( 'open' ) ;
e . isReconnect = reconnectAttempt ;
reconnectAttempt = false ;
eventTarget . dispatchEvent ( e ) ;
} ;
ws . onclose = function ( event ) {
clearTimeout ( timeout ) ;
ws = null ;
if ( forcedClose ) {
self . readyState = WebSocket . CLOSED ;
eventTarget . dispatchEvent ( generateEvent ( 'close' ) ) ;
} else {
self . readyState = WebSocket . CONNECTING ;
var e = generateEvent ( 'connecting' ) ;
e . code = event . code ;
e . reason = event . reason ;
e . wasClean = event . wasClean ;
eventTarget . dispatchEvent ( e ) ;
if ( ! reconnectAttempt && ! timedOut ) {
if ( self . debug || ReconnectingWebSocket . debugAll ) {
console . debug ( 'ReconnectingWebSocket' , 'onclose' , self . url ) ;
}
eventTarget . dispatchEvent ( generateEvent ( 'close' ) ) ;
}
var timeout = self . reconnectInterval * Math . pow ( self . reconnectDecay , self . reconnectAttempts ) ;
setTimeout ( function ( ) {
self . reconnectAttempts ++ ;
self . open ( true ) ;
} , timeout > self . maxReconnectInterval ? self . maxReconnectInterval : timeout ) ;
}
} ;
ws . onmessage = function ( event ) {
if ( self . debug || ReconnectingWebSocket . debugAll ) {
console . debug ( 'ReconnectingWebSocket' , 'onmessage' , self . url , event . data ) ;
}
var e = generateEvent ( 'message' ) ;
e . data = event . data ;
eventTarget . dispatchEvent ( e ) ;
} ;
ws . onerror = function ( event ) {
if ( self . debug || ReconnectingWebSocket . debugAll ) {
console . debug ( 'ReconnectingWebSocket' , 'onerror' , self . url , event ) ;
}
eventTarget . dispatchEvent ( generateEvent ( 'error' ) ) ;
} ;
}
// Whether or not to create a websocket upon instantiation
if ( this . automaticOpen == true ) {
this . open ( false ) ;
}
/ * *
* Transmits data to the server over the WebSocket connection .
*
* @ param data a text string , ArrayBuffer or Blob to send to the server .
* /
this . send = function ( data ) {
if ( ws ) {
if ( self . debug || ReconnectingWebSocket . debugAll ) {
console . debug ( 'ReconnectingWebSocket' , 'send' , self . url , data ) ;
}
return ws . send ( data ) ;
} else {
throw 'INVALID_STATE_ERR : Pausing to reconnect websocket' ;
}
} ;
/ * *
* Closes the WebSocket connection or connection attempt , if any .
* If the connection is already CLOSED , this method does nothing .
* /
this . close = function ( code , reason ) {
// Default CLOSE_NORMAL code
if ( typeof code == 'undefined' ) {
code = 1000 ;
}
forcedClose = true ;
if ( ws ) {
ws . close ( code , reason ) ;
}
} ;
/ * *
* Additional public API method to refresh the connection if still open ( close , re - open ) .
* For example , if the app suspects bad data / missed heart beats , it can try to refresh .
* /
this . refresh = function ( ) {
if ( ws ) {
ws . close ( ) ;
}
} ;
}
/ * *
* An event listener to be called when the WebSocket connection ' s readyState changes to OPEN ;
* this indicates that the connection is ready to send and receive data .
* /
ReconnectingWebSocket . prototype . onopen = function ( event ) { } ;
/** An event listener to be called when the WebSocket connection's readyState changes to CLOSED. */
ReconnectingWebSocket . prototype . onclose = function ( event ) { } ;
/** An event listener to be called when a connection begins being attempted. */
ReconnectingWebSocket . prototype . onconnecting = function ( event ) { } ;
/** An event listener to be called when a message is received from the server. */
ReconnectingWebSocket . prototype . onmessage = function ( event ) { } ;
/** An event listener to be called when an error occurs. */
ReconnectingWebSocket . prototype . onerror = function ( event ) { } ;
/ * *
* Whether all instances of ReconnectingWebSocket should log debug messages .
* Setting this to true is the equivalent of setting all instances of ReconnectingWebSocket . debug to true .
* /
ReconnectingWebSocket . debugAll = false ;
ReconnectingWebSocket . CONNECTING = WebSocket . CONNECTING ;
ReconnectingWebSocket . OPEN = WebSocket . OPEN ;
ReconnectingWebSocket . CLOSING = WebSocket . CLOSING ;
ReconnectingWebSocket . CLOSED = WebSocket . CLOSED ;
return ReconnectingWebSocket ;
} ) ;
/ * !
Autosize 3.0 . 17
license : MIT
http : //www.jacklmoore.com/autosize
* /
! function ( e , t ) { if ( "function" == typeof define && define . amd ) define ( [ "exports" , "module" ] , t ) ; else if ( "undefined" != typeof exports && "undefined" != typeof module ) t ( exports , module ) ; else { var n = { exports : { } } ; t ( n . exports , n ) , e . autosize = n . exports } } ( this , function ( e , t ) { "use strict" ; function n ( e ) { function t ( ) { var t = window . getComputedStyle ( e , null ) ; "vertical" === t . resize ? e . style . resize = "none" : "both" === t . resize && ( e . style . resize = "horizontal" ) , l = "content-box" === t . boxSizing ? - ( parseFloat ( t . paddingTop ) + parseFloat ( t . paddingBottom ) ) : parseFloat ( t . borderTopWidth ) + parseFloat ( t . borderBottomWidth ) , isNaN ( l ) && ( l = 0 ) , a ( ) } function n ( t ) { var n = e . style . width ; e . style . width = "0px" , e . offsetWidth , e . style . width = n , e . style . overflowY = t , r ( ) } function o ( e ) { for ( var t = [ ] ; e && e . parentNode && e . parentNode instanceof Element ; ) e . parentNode . scrollTop && t . push ( { node : e . parentNode , scrollTop : e . parentNode . scrollTop } ) , e = e . parentNode ; return t } function r ( ) { var t = e . style . height , n = o ( e ) , r = document . documentElement && document . documentElement . scrollTop ; e . style . height = "auto" ; var i = e . scrollHeight + l ; return 0 === e . scrollHeight ? void ( e . style . height = t ) : ( e . style . height = i + "px" , s = e . clientWidth , n . forEach ( function ( e ) { e . node . scrollTop = e . scrollTop } ) , void ( r && ( document . documentElement . scrollTop = r ) ) ) } function a ( ) { r ( ) ; var t = window . getComputedStyle ( e , null ) , o = Math . round ( parseFloat ( t . height ) ) , i = Math . round ( parseFloat ( e . style . height ) ) ; if ( o !== i ? "visible" !== t . overflowY && n ( "visible" ) : "hidden" !== t . overflowY && n ( "hidden" ) , u !== o ) { u = o ; var a = d ( "autosize:resized" ) ; e . dispatchEvent ( a ) } } if ( e && e . nodeName && "TEXTAREA" === e . nodeName && ! i . has ( e ) ) { var l = null , s = e . clientWidth , u = null , c = function ( ) { e . clientWidth !== s && a ( ) } , p = function ( t ) { window . removeEventListener ( "resize" , c , ! 1 ) , e . removeEventListener ( "input" , a , ! 1 ) , e . removeEventListener ( "keyup" , a , ! 1 ) , e . removeEventListener ( "autosize:destroy" , p , ! 1 ) , e . removeEventListener ( "autosize:update" , a , ! 1 ) , i [ "delete" ] ( e ) , Object . keys ( t ) . forEach ( function ( n ) { e . style [ n ] = t [ n ] } ) } . bind ( e , { height : e . style . height , resize : e . style . resize , overflowY : e . style . overflowY , overflowX : e . style . overflowX , wordWrap : e . style . wordWrap } ) ; e . addEventListener ( "autosize:destroy" , p , ! 1 ) , "onpropertychange" in e && "oninput" in e && e . addEventListener ( "keyup" , a , ! 1 ) , window . addEventListener ( "resize" , c , ! 1 ) , e . addEventListener ( "input" , a , ! 1 ) , e . addEventListener ( "autosize:update" , a , ! 1 ) , i . add ( e ) , e . style . overflowX = "hidden" , e . style . wordWrap = "break-word" , t ( ) } } function o ( e ) { if ( e && e . nodeName && "TEXTAREA" === e . nodeName ) { var t = d ( "autosize:destroy" ) ; e . dispatchEvent ( t ) } } function r ( e ) { if ( e && e . nodeName && "TEXTAREA" === e . nodeName ) { var t = d ( "autosize:update" ) ; e . dispatchEvent ( t ) } } var i = "function" == typeof Set ? new Set : function ( ) { var e = [ ] ; return { has : function ( t ) { return Boolean ( e . indexOf ( t ) > - 1 ) } , add : function ( t ) { e . push ( t ) } , "delete" : function ( t ) { e . splice ( e . indexOf ( t ) , 1 ) } } } ( ) , d = function ( e ) { return new Event ( e ) } ; try { new Event ( "test" ) } catch ( a ) { d = function ( e ) { var t = document . createEvent ( "Event" ) ; return t . initEvent ( e , ! 0 , ! 1 ) , t } } var l = null ; "undefined" == typeof window || "function" != typeof window . getComputedStyle ? ( l = function ( e ) { return e } , l . destroy = function ( e ) { return e } , l . update = function ( e ) { return e } ) : ( l = function ( e , t ) { return e && Array . prototype . forEach . call ( e . length ? e : [ e ] , function ( e ) { return n ( e , t ) } ) , e } , l . destroy = function ( e ) { return e && Array . prototype . forEach . call ( e . length ? e : [ e ] , o ) , e } , l . update = function ( e ) { return e && Array . prototype . forEach . call ( e . length ? e : [ e ] , r ) , e } ) , t . exports = l } ) ;
( function ( $ ) {
$ . fn . tableHeadFixer = function ( param ) {
return this . each ( function ( ) {
table . call ( this ) ;
} ) ;
function table ( ) {
{
var defaults = {
head : true ,
foot : false ,
left : 0 ,
right : 0 ,
'z-index' : 0
} ;
var settings = $ . extend ( { } , defaults , param ) ;
settings . table = this ;
settings . parent = $ ( settings . table ) . parent ( ) ;
setParent ( ) ;
if ( settings . head == true )
fixHead ( ) ;
if ( settings . foot == true )
fixFoot ( ) ;
if ( settings . left > 0 )
fixLeft ( ) ;
if ( settings . right > 0 )
fixRight ( ) ;
setCorner ( ) ;
$ ( settings . parent ) . trigger ( "scroll" ) ;
$ ( window ) . resize ( function ( ) {
$ ( settings . parent ) . trigger ( "scroll" ) ;
} ) ;
/ *
This function solver z - index problem in corner cell where fix row and column at the same time ,
set corner cells z - index 1 more then other fixed cells
* /
function setCorner ( ) {
var table = $ ( settings . table ) ;
if ( settings . head ) {
if ( settings . left > 0 ) {
var tr = table . find ( "thead tr" ) ;
tr . each ( function ( k , row ) {
solverLeftColspan ( row , function ( cell ) {
$ ( cell ) . css ( "z-index" , settings [ 'z-index' ] + 1 ) ;
} ) ;
} ) ;
}
if ( settings . right > 0 ) {
var tr = table . find ( "thead tr" ) ;
tr . each ( function ( k , row ) {
solveRightColspan ( row , function ( cell ) {
$ ( cell ) . css ( "z-index" , settings [ 'z-index' ] + 1 ) ;
} ) ;
} ) ;
}
}
if ( settings . foot ) {
if ( settings . left > 0 ) {
var tr = table . find ( "tfoot tr" ) ;
tr . each ( function ( k , row ) {
solverLeftColspan ( row , function ( cell ) {
$ ( cell ) . css ( "z-index" , settings [ 'z-index' ] ) ;
} ) ;
} ) ;
}
if ( settings . right > 0 ) {
var tr = table . find ( "tfoot tr" ) ;
tr . each ( function ( k , row ) {
solveRightColspan ( row , function ( cell ) {
$ ( cell ) . css ( "z-index" , settings [ 'z-index' ] ) ;
} ) ;
} ) ;
}
}
}
// Set style of table parent
function setParent ( ) {
var parent = $ ( settings . parent ) ;
var table = $ ( settings . table ) ;
parent . append ( table ) ;
parent
. css ( {
'overflow-x' : 'auto' ,
'overflow-y' : 'auto'
} ) ;
parent . scroll ( function ( ) {
var scrollWidth = parent [ 0 ] . scrollWidth ;
var clientWidth = parent [ 0 ] . clientWidth ;
var scrollHeight = parent [ 0 ] . scrollHeight ;
var clientHeight = parent [ 0 ] . clientHeight ;
var top = parent . scrollTop ( ) ;
var left = parent . scrollLeft ( ) ;
if ( settings . head )
this . find ( "thead tr > *" ) . css ( "top" , top ) ;
if ( settings . foot )
this . find ( "tfoot tr > *" ) . css ( "bottom" , scrollHeight - clientHeight - top ) ;
if ( settings . left > 0 )
settings . leftColumns . css ( "left" , left ) ;
if ( settings . right > 0 )
settings . rightColumns . css ( "right" , scrollWidth - clientWidth - left ) ;
} . bind ( table ) ) ;
}
// Set table head fixed
function fixHead ( ) {
var thead = $ ( settings . table ) . find ( "thead" ) ;
var tr = thead . find ( "tr" ) ;
var cells = thead . find ( "tr > *" ) ;
setBackground ( cells ) ;
cells . css ( {
'position' : 'relative'
} ) ;
}
// Set table foot fixed
function fixFoot ( ) {
var tfoot = $ ( settings . table ) . find ( "tfoot" ) ;
var tr = tfoot . find ( "tr" ) ;
var cells = tfoot . find ( "tr > *" ) ;
setBackground ( cells ) ;
cells . css ( {
'position' : 'relative'
} ) ;
}
// Set table left column fixed
function fixLeft ( ) {
var table = $ ( settings . table ) ;
// var fixColumn = settings.left;
settings . leftColumns = $ ( ) ;
var tr = table . find ( "tr" ) ;
tr . each ( function ( k , row ) {
solverLeftColspan ( row , function ( cell ) {
settings . leftColumns = settings . leftColumns . add ( cell ) ;
} ) ;
// var inc = 1;
// for(var i = 1; i <= fixColumn; i = i + inc) {
// var nth = inc > 1 ? i - 1 : i;
// var cell = $(row).find("*:nth-child(" + nth + ")");
// var colspan = cell.prop("colspan");
// settings.leftColumns = settings.leftColumns.add(cell);
// inc = colspan;
// }
} ) ;
var column = settings . leftColumns ;
column . each ( function ( k , cell ) {
var cell = $ ( cell ) ;
setBackground ( cell ) ;
cell . css ( {
'position' : 'relative'
} ) ;
} ) ;
}
// Set table right column fixed
function fixRight ( ) {
var table = $ ( settings . table ) ;
var fixColumn = settings . right ;
settings . rightColumns = $ ( ) ;
var tr = table . find ( "tr" ) ;
tr . each ( function ( k , row ) {
solveRightColspan ( row , function ( cell ) {
settings . rightColumns = settings . rightColumns . add ( cell ) ;
} ) ;
} ) ;
var column = settings . rightColumns ;
column . each ( function ( k , cell ) {
var cell = $ ( cell ) ;
setBackground ( cell ) ;
cell . css ( {
'position' : 'relative'
} ) ;
} ) ;
}
// Set fixed cells backgrounds
function setBackground ( elements ) {
elements . each ( function ( k , element ) {
var element = $ ( element ) ;
var parent = $ ( element ) . parent ( ) ;
var elementBackground = element . css ( "background-color" ) ;
elementBackground = ( elementBackground == "transparent" || elementBackground == "rgba(0, 0, 0, 0)" ) ? null : elementBackground ;
var parentBackground = parent . css ( "background-color" ) ;
parentBackground = ( parentBackground == "transparent" || parentBackground == "rgba(0, 0, 0, 0)" ) ? null : parentBackground ;
var background = parentBackground ? parentBackground : "white" ;
background = elementBackground ? elementBackground : background ;
element . css ( "background-color" , background ) ;
} ) ;
}
function solverLeftColspan ( row , action ) {
var fixColumn = settings . left ;
var inc = 1 ;
for ( var i = 1 ; i <= fixColumn ; i = i + inc ) {
var nth = inc > 1 ? i - 1 : i ;
var cell = $ ( row ) . find ( "> *:nth-child(" + nth + ")" ) ;
var colspan = cell . prop ( "colspan" ) ;
if ( cell . cellPos ( ) . left < fixColumn ) {
action ( cell ) ;
}
inc = colspan ;
}
}
function solveRightColspan ( row , action ) {
var fixColumn = settings . right ;
var inc = 1 ;
for ( var i = 1 ; i <= fixColumn ; i = i + inc ) {
var nth = inc > 1 ? i - 1 : i ;
var cell = $ ( row ) . find ( "> *:nth-last-child(" + nth + ")" ) ;
var colspan = cell . prop ( "colspan" ) ;
action ( cell ) ;
inc = colspan ;
}
}
}
}
} ;
} ) ( jQuery ) ;
/ * c e l l P o s j Q u e r y p l u g i n
-- -- -- -- -- -- -- -- -- -- -
Get visual position of cell in HTML table ( or its block like thead ) .
Return value is object with "top" and "left" properties set to row and column index of top - left cell corner .
Example of use :
$ ( "#myTable tbody td" ) . each ( function ( ) {
$ ( this ) . text ( $ ( this ) . cellPos ( ) . top + ", " + $ ( this ) . cellPos ( ) . left ) ;
} ) ;
* /
( function ( $ ) {
/* scan individual table and set "cellPos" data in the form { left: x-coord, top: y-coord } */
function scanTable ( $table ) {
var m = [ ] ;
$table . children ( "tr" ) . each ( function ( y , row ) {
$ ( row ) . children ( "td, th" ) . each ( function ( x , cell ) {
var $cell = $ ( cell ) ,
cspan = $cell . attr ( "colspan" ) | 0 ,
rspan = $cell . attr ( "rowspan" ) | 0 ,
tx , ty ;
cspan = cspan ? cspan : 1 ;
rspan = rspan ? rspan : 1 ;
for ( ; m [ y ] && m [ y ] [ x ] ; ++ x ) ; //skip already occupied cells in current row
for ( tx = x ; tx < x + cspan ; ++ tx ) { //mark matrix elements occupied by current cell with true
for ( ty = y ; ty < y + rspan ; ++ ty ) {
if ( ! m [ ty ] ) { //fill missing rows
m [ ty ] = [ ] ;
}
m [ ty ] [ tx ] = true ;
}
}
var pos = { top : y , left : x } ;
$cell . data ( "cellPos" , pos ) ;
} ) ;
} ) ;
} ;
/* plugin */
$ . fn . cellPos = function ( rescan ) {
var $cell = this . first ( ) ,
pos = $cell . data ( "cellPos" ) ;
if ( ! pos || rescan ) {
var $table = $cell . closest ( "table, thead, tbody, tfoot" ) ;
scanTable ( $table ) ;
}
pos = $cell . data ( "cellPos" ) ;
return pos ;
}
} ) ( jQuery ) ;
function updateAttachments ( id , draftid , csrf , groupurl ) {
// call the real function after 3 seconds to allow S3 to do whatever it needs to do to update
// results
setTimeout ( function ( ) { doUpdateAttachments ( id , draftid , csrf , groupurl ) ; } , 3000 ) ;
}
// doUpdateAttachments fetches a list of attachments and displays them on the page.
function doUpdateAttachments ( id , draftid , csrf , groupurl ) {
console . log ( 'in updateAttachments' ) ;
upload = { draftid : draftid , csrf : csrf , list : '1' } ;
$ . ajax ( {
url : groupurl + '/draftop' ,
cache : false ,
data : upload ,
method : 'POST' ,
xhrFields : {
withCredentials : true
} ,
dataType : 'json' ,
error : function ( xhr , ajaxOptions , thrownError ) {
createAlert ( "There was an error saving the draft. Please reload the page." , true , false )
}
} ) . done ( function ( response ) {
// Do something with the request
console . log ( 'update attachments' ) ;
// reload the page now
if ( response == null ) {
$ ( '#attachments' + id ) . replaceWith (
"<div id='attachments" + id + "'></div>"
) ;
} else {
wrap = '<div id="attachments' + id + '">Attachments:<ul>' ;
count = 0 ;
for ( i = 0 ; i < response . length ; i ++ ) {
if ( response [ i ] . Inline == false ) {
wrap +=
'<li>' +
response [ i ] . Name +
' (' +
response [ i ] . Size +
') <a href=\'javascript:deleteAttachment("' +
id +
'","' +
draftid +
'","' +
csrf +
'","' +
groupurl +
'","' +
response [ i ] . Num +
"\")'><i class='fa fa-times'></i></a></li>" ;
count ++ ;
}
}
wrap += '</ul><br /></div>' ;
if ( count > 0 ) {
$ ( '#attachments' + id ) . replaceWith ( wrap ) ;
} else {
$ ( '#attachments' + id ) . replaceWith (
"<div id='attachments" + id + "'></div>"
) ;
}
}
} ) ;
}
// deleteAttachment deletes the attachment num.
function deleteAttachment ( id , draftid , csrf , groupurl , num ) {
upload = { num : num , draftid : draftid , csrf : csrf , deleteattachment : '1' } ;
$ . ajax ( {
url : groupurl + '/draftop' ,
cache : false ,
data : upload ,
method : 'POST' ,
xhrFields : {
withCredentials : true
} ,
dataType : 'json' ,
error : function ( xhr , ajaxOptions , thrownError ) {
createAlert ( "There was an error saving the draft. Please reload the page." , true , false )
}
} ) . done ( function ( response ) {
// Do something with the request
console . log ( 'deletedDraft' ) ;
updateAttachments ( id , draftid , csrf , groupurl ) ;
} ) ;
}
tinymce . PluginManager . add ( 'SplitBlockquote' , function ( ed , url ) {
ed . on ( 'keyup' , function ( e ) {
var parts , i , node , bq _node , openTags , closeTags , splitToken ;
if ( e . keyCode != 13 ) {
return ; /* do nothing */
}
// get the top-most blockquote parent node
function getMostTopBlockquote ( n , r ) {
var last _bq = null ;
while ( n ) {
if ( n == r ) break ;
if ( n . nodeName === 'BLOCKQUOTE' ) last _bq = n ;
n = n . parentNode ;
}
return last _bq ;
}
function getClose ( n , r ) {
// get the htnk "close-tag" of a node
function getCloseTag ( n ) {
if ( n . nodeName === 'FONT' && ed . settings . convert _fonts _to _spans ) {
return '</span>' ;
} else {
return '</' + n . nodeName . toLowerCase ( ) + '>' ;
}
}
var result = '' ;
while ( n ) {
if ( n == r ) break ;
result += getCloseTag ( n ) ;
n = n . parentNode ;
}
return result ;
}
function getOpen ( n , r ) {
// get the html "open-tag" of a node
function getOpenTag ( n ) {
var attr , copy ;
copy = n . cloneNode ( false ) ;
copy . innerHTML = '' ;
attr = ed . dom
. getOuterHTML ( copy )
. replace ( new RegExp ( '<' + copy . nodeName , 'i' ) , '' )
. replace ( new RegExp ( '</' + copy . nodeName + '>' , 'i' ) , '' ) ;
return '<' + copy . nodeName . toLowerCase ( ) + attr ;
}
var result = '' ;
while ( n ) {
if ( n == r ) break ;
result = getOpenTag ( n ) + result ;
n = n . parentNode ;
}
return result ;
}
node = ed . selection . getNode ( ) ;
bq _node = getMostTopBlockquote ( node , ed . getBody ( ) ) ;
if ( ! bq _node )
// we aren't in a blockquote
return ;
/* Create an unique splitToken */
splitToken = '_$' + new Date ( ) . getTime ( ) + '$_' ;
ed . selection . setContent ( splitToken , { formar : 'raw' } ) ;
parts = ed . getContent ( ) . split ( splitToken ) ;
/ * b l o c k q u o t e c a n h a n d l e D O M t r e e . S o w e h a v e t o c l o s e
* and open DOM element correctly , and not wildly split
* the editor content . Plus , openTags has to keep all
* attributes to keep makeup of DOM elements , we split .
* /
openTags = getOpen ( node , bq _node ) ;
closeTags = getClose ( node , bq _node ) ;
if ( ed . settings . convert _fonts _to _spans && openTags != '' ) {
/ * j u s t c o n v e r t < / s p a n > t o < / f o n t >
* if < font > are converted to < span >
* as n . nodeName returns "FONT" for < span > node : /
* @ see tinymce . Editor . - _convertFonts ( ) for more information
* /
( function ( ) {
var font _count = ( openTags . match ( /<font/gi ) || [ ] ) . length ;
for ( i = 0 ; i < font _count ; ++ i ) {
start _idx = parts [ 1 ] . indexOf ( '</span>' ) ;
if ( start _idx != - 1 ) {
parts [ 1 ] =
parts [ 1 ] . substring ( 0 , start _idx ) +
'</font>' +
parts [ 1 ] . substring ( start _idx + 7 ) ;
}
}
} ) ( ) ;
}
/ * U p d a t e t h e e d i t o r c o n t e n t :
* - part [ 0 ] : content before the selection , before split
* - closeTags : < / t a g > t o c l o s e c o r r e c t l y h t m l t a g s
* - < / b l o c k q u o t e > : c l o s e t h e b l o c k q u o t e
* - < br id = '__' / > : < br / > are converted to "<p> </p>" . The id
* is used to change the location of the selection ( cursor )
* - < blockquote > : open the new blockquote
* - openTags : re - open splited DOM nodes correctly
* - part [ 1 ] : content after the selection , before split
* /
ed . setContent (
parts [ 0 ] +
closeTags +
'</blockquote><br id="__"><blockquote>' +
openTags +
parts [ 1 ]
) ;
/ * d e l e t e e m p t y < p > a r a g r a p h a t t h e e n d o f t h e f i r s t b l o c k q u o t e
* and at the beginning at the second blockquote .
* Delete id attributes to * /
function clean _node ( node ) {
var node _html ;
if ( node == null || ( node . nodeName != 'P' && node . nodeName != 'BR' ) ) {
return ;
}
node _html = node . innerHTML . trim ( ) ;
if (
node _html == '' ||
node _html == '<br mce_bogus="1">' ||
node _html == '<br>'
) {
ed . dom . remove ( node ) ;
}
}
bq _node = ed . getBody ( ) . getElementsByTagName ( 'blockquote' ) ;
for ( i = 0 ; i < bq _node . length ; ++ i ) {
if ( bq _node [ i ] == null ) {
continue ;
} /* paranoiac mode */
clean _node ( bq _node [ i ] . firstChild ) ;
clean _node ( bq _node [ i ] . lastChild ) ;
if ( bq _node [ i ] . innerHTML . trim ( ) === '' ) {
ed . dom . remove ( bq _node [ i ] ) ;
}
}
/* get the <br id="__"> element and put cursor on it */
node = ed . dom . get ( '__' ) ;
node . removeAttribute ( 'id' ) ;
ed . selection . select ( node ) ;
ed . selection . collapse ( true ) ;
/* Don't interpret <ENTER> again, to prevent a new "<p> </p>" to be added */
return tinymce . dom . Event . cancel ( e ) ;
} ) ;
} ) ;
/ *
Use https : //babeljs.io to compile this:
async function takePicture ( doctype , id , draftid , groupurl , csrf ) {
console . log ( "in takePicture" ) ;
try {
image = await Capacitor . Plugins . Camera . getPhoto ( {
quality : 90 ,
allowEditing : false ,
resultType : "uri"
} ) ;
console . log ( "got image" ) ;
uploadImage ( doctype , id , draftid , groupurl , csrf , image ) ;
} catch ( err ) {
console . log ( "catch err 1: " , err ) ;
}
}
async function uploadImage ( doctype , id , draftid , groupurl , csrf , image ) {
console . log ( "here0" ) ;
const controller = new AbortController ( ) ;
const formData = new FormData ( ) ;
console . log ( "here1" ) ;
formData . append ( "csrf" , csrf ) ;
formData . append ( "draftid" , draftid ) ;
formData . append ( "upload" , "1" ) ;
if ( doctype == "pictures" ) {
formData . append ( "inline" , "1" ) ;
}
console . log ( "FORMDATA:" , formData ) ;
console . log ( "here2" ) ;
blob = await fetch ( image . webPath ) . then ( r => r . blob ( ) ) ;
formData . append ( "fileupload" , blob , image . webPath . split ( "/" ) . pop ( ) ) ;
console . log ( "here3" ) ;
myRequest = new Request ( groupurl + '/draftop' , {
method : 'POST' ,
credentials : 'include' ,
body : formData ,
signal : controller . signal ,
mode : 'cors'
} ) ;
console . log ( "uploading" ) ;
fetch ( myRequest )
. then ( response => response . json ( ) )
. then ( result => {
if ( doctype == "pictures" ) {
console . log ( "picture processing" ) ;
for ( var i = result . length - 1 ; i >= 0 ; i -- ) {
console . log ( "Processing: " , i ) ;
fileurl = result [ i ] ;
console . log ( 'FILE: ' + result [ i ] ) ;
console . log ( 'URL: ' + fileurl ) ;
imghtml = '<img src="' + fileurl + '"/>' ;
console . log ( 'imghtml: ' + imghtml ) ;
tinymce . activeEditor . insertContent ( imghtml ) ;
}
} else {
console . log ( "attachment processing" ) ;
updateAttachments ( id , draftid , csrf , groupurl ) ;
console . log ( "attachment processing done" ) ;
}
} )
. catch ( error => {
console . error ( 'Error:' , error ) ;
} ) ;
}
* /
"use strict" ;
function asyncGeneratorStep ( gen , resolve , reject , _next , _throw , key , arg ) { try { var info = gen [ key ] ( arg ) ; var value = info . value ; } catch ( error ) { reject ( error ) ; return ; } if ( info . done ) { resolve ( value ) ; } else { Promise . resolve ( value ) . then ( _next , _throw ) ; } }
function _asyncToGenerator ( fn ) { return function ( ) { var self = this , args = arguments ; return new Promise ( function ( resolve , reject ) { var gen = fn . apply ( self , args ) ; function _next ( value ) { asyncGeneratorStep ( gen , resolve , reject , _next , _throw , "next" , value ) ; } function _throw ( err ) { asyncGeneratorStep ( gen , resolve , reject , _next , _throw , "throw" , err ) ; } _next ( undefined ) ; } ) ; } ; }
function takePicture ( _x , _x2 , _x3 , _x4 , _x5 ) {
return _takePicture . apply ( this , arguments ) ;
}
function _takePicture ( ) {
_takePicture = _asyncToGenerator ( function * ( doctype , id , draftid , groupurl , csrf ) {
console . log ( "in takePicture" ) ;
try {
image = yield Capacitor . Plugins . Camera . getPhoto ( {
quality : 90 ,
allowEditing : false ,
resultType : "uri"
} ) ;
console . log ( "got image" ) ;
uploadImage ( doctype , id , draftid , groupurl , csrf , image ) ;
} catch ( err ) {
console . log ( "catch err 1: " , err ) ;
}
} ) ;
return _takePicture . apply ( this , arguments ) ;
}
function uploadImage ( _x6 , _x7 , _x8 , _x9 , _x10 , _x11 ) {
return _uploadImage . apply ( this , arguments ) ;
}
function _uploadImage ( ) {
_uploadImage = _asyncToGenerator ( function * ( doctype , id , draftid , groupurl , csrf , image ) {
console . log ( "here0" ) ;
const controller = new AbortController ( ) ;
const formData = new FormData ( ) ;
console . log ( "here1" ) ;
formData . append ( "csrf" , csrf ) ;
formData . append ( "draftid" , draftid ) ;
formData . append ( "upload" , "1" ) ;
if ( doctype == "pictures" ) {
formData . append ( "inline" , "1" ) ;
}
console . log ( "FORMDATA:" , formData ) ;
console . log ( "here2" ) ;
blob = yield fetch ( image . webPath ) . then ( r => r . blob ( ) ) ;
formData . append ( "fileupload" , blob , image . webPath . split ( "/" ) . pop ( ) ) ;
console . log ( "here3" ) ;
myRequest = new Request ( groupurl + '/draftop' , {
method : 'POST' ,
credentials : 'include' ,
body : formData ,
signal : controller . signal ,
mode : 'cors'
} ) ;
console . log ( "uploading" ) ;
fetch ( myRequest ) . then ( response => response . json ( ) ) . then ( result => {
if ( doctype == "pictures" ) {
console . log ( "picture processing" ) ;
for ( var i = result . length - 1 ; i >= 0 ; i -- ) {
console . log ( "Processing: " , i ) ;
fileurl = result [ i ] ;
console . log ( 'FILE: ' + result [ i ] ) ;
console . log ( 'URL: ' + fileurl ) ;
imghtml = '<img src="' + fileurl + '"/>' ;
console . log ( 'imghtml: ' + imghtml ) ;
tinymce . activeEditor . insertContent ( imghtml ) ;
}
} else {
console . log ( "attachment processing" ) ;
updateAttachments ( id , draftid , csrf , groupurl ) ;
console . log ( "attachment processing done" ) ;
}
} ) . catch ( error => {
console . error ( 'Error:' , error ) ;
} ) ;
} ) ;
return _uploadImage . apply ( this , arguments ) ;
}
/** @preserve jQuery.floatThead 2.2.1 - https://mkoryak.github.io/floatThead/ - Copyright (c) 2012 - 2020 Misha Koryak **/
! function ( bt ) { bt . floatThead = bt . floatThead || { } , bt . floatThead . defaults = { headerCellSelector : "tr:visible:first>*:visible" , zIndex : 1001 , position : "auto" , top : 0 , bottom : 0 , scrollContainer : function ( t ) { return bt ( [ ] ) } , responsiveContainer : function ( t ) { return bt ( [ ] ) } , getSizingRow : function ( t , e , o ) { return t . find ( "tbody tr:visible:first>*:visible" ) } , ariaLabel : function ( t , e , o ) { return e . text ( ) } , floatTableClass : "floatThead-table" , floatWrapperClass : "floatThead-wrapper" , floatContainerClass : "floatThead-container" , copyTableClass : ! 0 , autoReflow : ! 1 , debug : ! 1 , support : { bootstrap : ! 0 , datatables : ! 0 , jqueryUI : ! 0 , perfectScrollbar : ! 0 } , floatContainerCss : { "overflow-x" : "hidden" } } ; var wt = function ( ) { var n = { } , o = Object . prototype . hasOwnProperty ; n . has = function ( t , e ) { return o . call ( t , e ) } , n . keys = Object . keys || function ( t ) { if ( t !== Object ( t ) ) throw new TypeError ( "Invalid object" ) ; var e = [ ] ; for ( var o in t ) n . has ( t , o ) && e . push ( o ) ; return e } ; var r = 0 ; return n . uniqueId = function ( t ) { var e = ++ r + "" ; return t ? t + e : e } , bt . each ( [ "Arguments" , "Function" , "String" , "Number" , "Date" , "RegExp" ] , function ( ) { var e = this ; n [ "is" + e ] = function ( t ) { return Object . prototype . toString . call ( t ) === "[object " + e + "]" } } ) , n . debounce = function ( o , n , r ) { var a , i , l , s , d ; return function ( ) { l = this , i = arguments , s = new Date ; var e = function ( ) { var t = new Date - s ; t < n ? a = setTimeout ( e , n - t ) : ( a = null , r || ( d = o . apply ( l , i ) ) ) } , t = r && ! a ; return a || ( a = setTimeout ( e , n ) ) , t && ( d = o . apply ( l , i ) ) , d } } , n } ( ) , gt = "undefined" != typeof MutationObserver , mt = function ( ) { for ( var t = 3 , e = document . createElement ( "b" ) , o = e . all || [ ] ; t = 1 + t , e . innerHTML = "\x3c!--[if gt IE " + t + "]><i><![endif]--\x3e" , o [ 0 ] ; ) ; return 4 < t ? t : document . documentMode } ( ) , t = /Gecko\// . test ( navigator . userAgent ) , yt = /WebKit\// . test ( navigator . userAgent ) , Tt = /rtl/i . test ( document . documentElement . dir || "" ) ; mt || t || yt || ( mt = 11 ) ; var l = function ( ) { if ( yt ) { var t = bt ( "<div>" ) . css ( "width" , 0 ) . append ( bt ( "<table>" ) . css ( "max-width" , "100%" ) . append ( bt ( "<tr>" ) . append ( bt ( "<th>" ) . append ( bt ( "<div>" ) . css ( "min-width" , 100 ) . text ( "X" ) ) ) ) ) ; bt ( "body" ) . append ( t ) ; var e = 0 === t . find ( "table" ) . width ( ) ; return t . remove ( ) , e } return ! 1 } , Ct = ! t && ! mt , xt = bt ( window ) , Lt = t && window . matchMedia ; if ( ! window . matchMedia || Lt ) { var e = window . onbeforeprint , o = window . onafterprint ; window . onbeforeprint = function ( ) { e && e ( ) , xt . triggerHandler ( "fth-beforeprint" ) } , window . onafterprint = function ( ) { o && o ( ) , xt . triggerHandler ( "fth-afterprint" ) } } function St ( t ) { var e = t [ 0 ] . parentElement ; do { if ( "visible" !== window . getComputedStyle ( e ) . getPropertyValue ( "overflow" ) ) break } while ( e = e . parentElement ) ; return e === document . body ? bt ( [ ] ) : bt ( e ) } function jt ( t ) { window && window . console && window . console . error && window . console . error ( "jQuery.floatThead: " + t ) } function zt ( t ) { var e = t . getBoundingClientRect ( ) ; return e . width || e . right - e . left } function It ( ) { var t = document . createElement ( "scrolltester" ) ; t . style . cssText = "width:100px;height:100px;overflow:scroll!important;position:absolute;top:-9999px;display:block" , document . body . appendChild ( t ) ; var e = t . offsetWidth - t . clientWidth ; return document . body . removeChild ( t ) , e } function Ht ( t , e , o ) { var n = o ? "outerWidth" : "width" ; if ( l && t . css ( "max-width" ) ) { var r = 0 ; o && ( r += parseInt ( t . css ( "borderLeft" ) , 10 ) , r += parseInt ( t . css ( "borderRight" ) , 10 ) ) ; for ( var a = 0 ; a < e . length ; a ++ ) r += zt ( e . get ( a ) ) ; return r } return t [ n ] ( ) } bt . fn . floatThead = function ( t ) { if ( t = t || { } , mt < 8 ) return this ; if ( wt . isFunction ( l ) && ( l = l ( ) ) , wt . isString ( t ) ) { var r = t , a = Array . prototype . slice . call ( arguments , 1 ) , i = this ; return this . filter ( "table" ) . each ( function ( ) { var t = bt ( this ) , e = t . data ( "floatThead-lazy" ) ; e && t . floatThead ( e ) ; var o = t . data ( "floatThead-attached" ) ; if ( o && wt . isFunction ( o [ r ] ) ) { var n = o [ r ] . apply ( this , a ) ; void 0 !== n && ( i = n ) } } ) , i } var vt = bt . extend ( { } , bt . floatThead . defaults || { } , t ) ; if ( bt . each ( t , function ( t , e ) { t in bt . floatThead . defaults || ! vt . debug || jt ( "Used [" + t + "] key to init plugin, but that param is not an option for the plugin. Valid options are: " + wt . keys ( bt . floatThead . defaults ) . join ( ", " ) ) } ) , vt . debug ) { var e = bt . fn . jquery . split ( "." ) ; 1 === parseInt ( e [ 0 ] , 10 ) && parseInt ( e [ 1 ] , 10 ) <= 7 && jt ( "jQuery version " + bt . fn . jquery + " detected! This plugin supports 1.8 or better, or 1.7.x with jQuery UI 1.8.24 -> http://jqueryui.com/resources/download/jquery-ui-1.8.24.zip" ) } return this . filter ( ":not(." + vt .
var retryTimer = null ;
// This is what tells JQuery to retry $.ajax requests
// Ideas for this borrowed from https://stackoverflow.com/a/12446363/491553
$ . ajaxPrefilter ( function ( opts , originalOpts , jqXHR ) {
// Our own deferred object to handle done/fail callbacks
let dfd = $ . Deferred ( ) ;
// If the request works, return normally
jqXHR . done ( dfd . resolve ) ;
if ( opts . retryCount === undefined ) {
console . log ( "no retryCount, returning" ) ;
return ;
}
// If the request fails, retry a few times, yet still resolve
jqXHR . fail ( ( xhr , textStatus , errorThrown ) => {
console . log ( "Caught error: " + JSON . stringify ( xhr ) + ", textStatus: " + textStatus + ", errorThrown: " + errorThrown ) ;
opts . retryCount --
if ( opts . retryCount < 0 ) {
// don't retry forever
console . log ( "Not retrying forever, giving up" ) ;
return ;
}
if ( opts . retryVerify !== undefined ) {
console . log ( "has opts.retryVerify" ) ;
if ( opts . retryVerify ( ) == false ) {
console . log ( "retryVerify returned false, stopping" ) ;
return
}
}
const RETRY _WAIT = [ 240 , 120 , 60 , 30 , 10 ] ;
let retrySecs = RETRY _WAIT [ opts . retryCount ] ;
console . log ( "Retrying after waiting " + retrySecs + " s..." ) ;
let msg = opts . retryMessage ;
if ( msg === undefined ) {
msg = "There was an error saving the draft."
}
alertPanel = createAlert ( msg + " We will retry again in <span id=\"retrySecs\">" + retrySecs + "</span> seconds." , true , false , true ) ;
retryTimer = setInterval ( ( ) => {
retrySecs -- ;
$ ( "#retrySecs" ) . text ( retrySecs ) ;
if ( retrySecs < 0 ) {
// Retry with a copied originalOpts with retryCount.
clearInterval ( retryTimer ) ;
retryTimer = null ;
alertPanel . remove ( ) ;
let newOpts = $ . extend ( { } , originalOpts , {
retryCount : opts . retryCount
} ) ;
$ . ajax ( newOpts ) . done ( dfd . resolve ) ;
}
} , 1000 ) ;
} ) ;
// NOW override the jqXHR's promise functions with our deferred
return dfd . promise ( jqXHR ) ;
} ) ;
2023-11-08 00:26:35 +00:00
// UMD insanity
// This code sets up support for (in order) AMD, ES6 modules, and globals.
( function ( root , factory ) {
//@ts-ignore
if ( typeof define === 'function' && define . amd ) {
// AMD. Register as an anonymous module.
//@ts-ignore
define ( [ ] , factory ) ;
} else if ( typeof module === 'object' && module . exports ) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module . exports = factory ( ) ;
} else {
// Browser globals
root . htmx = root . htmx || factory ( ) ;
}
} ( typeof self !== 'undefined' ? self : this , function ( ) {
return ( function ( ) {
'use strict' ;
// Public API
//** @type {import("./htmx").HtmxApi} */
// TODO: list all methods in public API
var htmx = {
onLoad : onLoadHelper ,
process : processNode ,
on : addEventListenerImpl ,
off : removeEventListenerImpl ,
trigger : triggerEvent ,
ajax : ajaxHelper ,
find : find ,
findAll : findAll ,
closest : closest ,
values : function ( elt , type ) {
var inputValues = getInputValues ( elt , type || "post" ) ;
return inputValues . values ;
} ,
remove : removeElement ,
addClass : addClassToElement ,
removeClass : removeClassFromElement ,
toggleClass : toggleClassOnElement ,
takeClass : takeClassForElement ,
defineExtension : defineExtension ,
removeExtension : removeExtension ,
logAll : logAll ,
logNone : logNone ,
logger : null ,
config : {
historyEnabled : true ,
historyCacheSize : 10 ,
refreshOnHistoryMiss : false ,
defaultSwapStyle : 'innerHTML' ,
defaultSwapDelay : 0 ,
defaultSettleDelay : 20 ,
includeIndicatorStyles : true ,
indicatorClass : 'htmx-indicator' ,
requestClass : 'htmx-request' ,
addedClass : 'htmx-added' ,
settlingClass : 'htmx-settling' ,
swappingClass : 'htmx-swapping' ,
allowEval : true ,
allowScriptTags : true ,
inlineScriptNonce : '' ,
attributesToSettle : [ "class" , "style" , "width" , "height" ] ,
withCredentials : false ,
timeout : 0 ,
wsReconnectDelay : 'full-jitter' ,
wsBinaryType : 'blob' ,
disableSelector : "[hx-disable], [data-hx-disable]" ,
useTemplateFragments : false ,
scrollBehavior : 'smooth' ,
defaultFocusScroll : false ,
getCacheBusterParam : false ,
globalViewTransitions : false ,
methodsThatUseUrlParams : [ "get" ] ,
selfRequestsOnly : false
} ,
parseInterval : parseInterval ,
_ : internalEval ,
createEventSource : function ( url ) {
return new EventSource ( url , { withCredentials : true } )
} ,
createWebSocket : function ( url ) {
var sock = new WebSocket ( url , [ ] ) ;
sock . binaryType = htmx . config . wsBinaryType ;
return sock ;
} ,
version : "1.9.6"
} ;
/** @type {import("./htmx").HtmxInternalApi} */
var internalAPI = {
addTriggerHandler : addTriggerHandler ,
bodyContains : bodyContains ,
canAccessLocalStorage : canAccessLocalStorage ,
findThisElement : findThisElement ,
filterValues : filterValues ,
hasAttribute : hasAttribute ,
getAttributeValue : getAttributeValue ,
getClosestAttributeValue : getClosestAttributeValue ,
getClosestMatch : getClosestMatch ,
getExpressionVars : getExpressionVars ,
getHeaders : getHeaders ,
getInputValues : getInputValues ,
getInternalData : getInternalData ,
getSwapSpecification : getSwapSpecification ,
getTriggerSpecs : getTriggerSpecs ,
getTarget : getTarget ,
makeFragment : makeFragment ,
mergeObjects : mergeObjects ,
makeSettleInfo : makeSettleInfo ,
oobSwap : oobSwap ,
querySelectorExt : querySelectorExt ,
selectAndSwap : selectAndSwap ,
settleImmediately : settleImmediately ,
shouldCancel : shouldCancel ,
triggerEvent : triggerEvent ,
triggerErrorEvent : triggerErrorEvent ,
withExtensions : withExtensions ,
}
var VERBS = [ 'get' , 'post' , 'put' , 'delete' , 'patch' ] ;
var VERB _SELECTOR = VERBS . map ( function ( verb ) {
return "[hx-" + verb + "], [data-hx-" + verb + "]"
} ) . join ( ", " ) ;
//====================================================================
// Utilities
//====================================================================
function parseInterval ( str ) {
if ( str == undefined ) {
return undefined
}
if ( str . slice ( - 2 ) == "ms" ) {
return parseFloat ( str . slice ( 0 , - 2 ) ) || undefined
}
if ( str . slice ( - 1 ) == "s" ) {
return ( parseFloat ( str . slice ( 0 , - 1 ) ) * 1000 ) || undefined
}
if ( str . slice ( - 1 ) == "m" ) {
return ( parseFloat ( str . slice ( 0 , - 1 ) ) * 1000 * 60 ) || undefined
}
return parseFloat ( str ) || undefined
}
/ * *
* @ param { HTMLElement } elt
* @ param { string } name
* @ returns { ( string | null ) }
* /
function getRawAttribute ( elt , name ) {
return elt . getAttribute && elt . getAttribute ( name ) ;
}
// resolve with both hx and data-hx prefixes
function hasAttribute ( elt , qualifiedName ) {
return elt . hasAttribute && ( elt . hasAttribute ( qualifiedName ) ||
elt . hasAttribute ( "data-" + qualifiedName ) ) ;
}
/ * *
*
* @ param { HTMLElement } elt
* @ param { string } qualifiedName
* @ returns { ( string | null ) }
* /
function getAttributeValue ( elt , qualifiedName ) {
return getRawAttribute ( elt , qualifiedName ) || getRawAttribute ( elt , "data-" + qualifiedName ) ;
}
/ * *
* @ param { HTMLElement } elt
* @ returns { HTMLElement | null }
* /
function parentElt ( elt ) {
return elt . parentElement ;
}
/ * *
* @ returns { Document }
* /
function getDocument ( ) {
return document ;
}
/ * *
* @ param { HTMLElement } elt
* @ param { ( e : HTMLElement ) => boolean } condition
* @ returns { HTMLElement | null }
* /
function getClosestMatch ( elt , condition ) {
while ( elt && ! condition ( elt ) ) {
elt = parentElt ( elt ) ;
}
return elt ? elt : null ;
}
function getAttributeValueWithDisinheritance ( initialElement , ancestor , attributeName ) {
var attributeValue = getAttributeValue ( ancestor , attributeName ) ;
var disinherit = getAttributeValue ( ancestor , "hx-disinherit" ) ;
if ( initialElement !== ancestor && disinherit && ( disinherit === "*" || disinherit . split ( " " ) . indexOf ( attributeName ) >= 0 ) ) {
return "unset" ;
} else {
return attributeValue
}
}
/ * *
* @ param { HTMLElement } elt
* @ param { string } attributeName
* @ returns { string | null }
* /
function getClosestAttributeValue ( elt , attributeName ) {
var closestAttr = null ;
getClosestMatch ( elt , function ( e ) {
return closestAttr = getAttributeValueWithDisinheritance ( elt , e , attributeName ) ;
} ) ;
if ( closestAttr !== "unset" ) {
return closestAttr ;
}
}
/ * *
* @ param { HTMLElement } elt
* @ param { string } selector
* @ returns { boolean }
* /
function matches ( elt , selector ) {
// @ts-ignore: non-standard properties for browser compatibility
// noinspection JSUnresolvedVariable
var matchesFunction = elt . matches || elt . matchesSelector || elt . msMatchesSelector || elt . mozMatchesSelector || elt . webkitMatchesSelector || elt . oMatchesSelector ;
return matchesFunction && matchesFunction . call ( elt , selector ) ;
}
/ * *
* @ param { string } str
* @ returns { string }
* /
function getStartTag ( str ) {
var tagMatcher = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i
var match = tagMatcher . exec ( str ) ;
if ( match ) {
return match [ 1 ] . toLowerCase ( ) ;
} else {
return "" ;
}
}
/ * *
*
* @ param { string } resp
* @ param { number } depth
* @ returns { Element }
* /
function parseHTML ( resp , depth ) {
var parser = new DOMParser ( ) ;
var responseDoc = parser . parseFromString ( resp , "text/html" ) ;
/** @type {Element} */
var responseNode = responseDoc . body ;
while ( depth > 0 ) {
depth -- ;
// @ts-ignore
responseNode = responseNode . firstChild ;
}
if ( responseNode == null ) {
// @ts-ignore
responseNode = getDocument ( ) . createDocumentFragment ( ) ;
}
return responseNode ;
}
function aFullPageResponse ( resp ) {
return resp . match ( /<body/ ) ;
}
/ * *
*
* @ param { string } resp
* @ returns { Element }
* /
function makeFragment ( resp ) {
var partialResponse = ! aFullPageResponse ( resp ) ;
if ( htmx . config . useTemplateFragments && partialResponse ) {
var documentFragment = parseHTML ( "<body><template>" + resp + "</template></body>" , 0 ) ;
// @ts-ignore type mismatch between DocumentFragment and Element.
// TODO: Are these close enough for htmx to use interchangeably?
return documentFragment . querySelector ( 'template' ) . content ;
} else {
var startTag = getStartTag ( resp ) ;
switch ( startTag ) {
case "thead" :
case "tbody" :
case "tfoot" :
case "colgroup" :
case "caption" :
return parseHTML ( "<table>" + resp + "</table>" , 1 ) ;
case "col" :
return parseHTML ( "<table><colgroup>" + resp + "</colgroup></table>" , 2 ) ;
case "tr" :
return parseHTML ( "<table><tbody>" + resp + "</tbody></table>" , 2 ) ;
case "td" :
case "th" :
return parseHTML ( "<table><tbody><tr>" + resp + "</tr></tbody></table>" , 3 ) ;
case "script" :
case "style" :
return parseHTML ( "<div>" + resp + "</div>" , 1 ) ;
default :
return parseHTML ( resp , 0 ) ;
}
}
}
/ * *
* @ param { Function } func
* /
function maybeCall ( func ) {
if ( func ) {
func ( ) ;
}
}
/ * *
* @ param { any } o
* @ param { string } type
* @ returns
* /
function isType ( o , type ) {
return Object . prototype . toString . call ( o ) === "[object " + type + "]" ;
}
/ * *
* @ param { * } o
* @ returns { o is Function }
* /
function isFunction ( o ) {
return isType ( o , "Function" ) ;
}
/ * *
* @ param { * } o
* @ returns { o is Object }
* /
function isRawObject ( o ) {
return isType ( o , "Object" ) ;
}
/ * *
* getInternalData retrieves "private" data stored by htmx within an element
* @ param { HTMLElement } elt
* @ returns { * }
* /
function getInternalData ( elt ) {
var dataProp = 'htmx-internal-data' ;
var data = elt [ dataProp ] ;
if ( ! data ) {
data = elt [ dataProp ] = { } ;
}
return data ;
}
/ * *
* toArray converts an ArrayLike object into a real array .
* @ param { ArrayLike } arr
* @ returns { any [ ] }
* /
function toArray ( arr ) {
var returnArr = [ ] ;
if ( arr ) {
for ( var i = 0 ; i < arr . length ; i ++ ) {
returnArr . push ( arr [ i ] ) ;
}
}
return returnArr
}
function forEach ( arr , func ) {
if ( arr ) {
for ( var i = 0 ; i < arr . length ; i ++ ) {
func ( arr [ i ] ) ;
}
}
}
function isScrolledIntoView ( el ) {
var rect = el . getBoundingClientRect ( ) ;
var elemTop = rect . top ;
var elemBottom = rect . bottom ;
return elemTop < window . innerHeight && elemBottom >= 0 ;
}
function bodyContains ( elt ) {
// IE Fix
if ( elt . getRootNode && elt . getRootNode ( ) instanceof window . ShadowRoot ) {
return getDocument ( ) . body . contains ( elt . getRootNode ( ) . host ) ;
} else {
return getDocument ( ) . body . contains ( elt ) ;
}
}
function splitOnWhitespace ( trigger ) {
return trigger . trim ( ) . split ( /\s+/ ) ;
}
/ * *
* mergeObjects takes all of the keys from
* obj2 and duplicates them into obj1
* @ param { Object } obj1
* @ param { Object } obj2
* @ returns { Object }
* /
function mergeObjects ( obj1 , obj2 ) {
for ( var key in obj2 ) {
if ( obj2 . hasOwnProperty ( key ) ) {
obj1 [ key ] = obj2 [ key ] ;
}
}
return obj1 ;
}
function parseJSON ( jString ) {
try {
return JSON . parse ( jString ) ;
} catch ( error ) {
logError ( error ) ;
return null ;
}
}
function canAccessLocalStorage ( ) {
var test = 'htmx:localStorageTest' ;
try {
localStorage . setItem ( test , test ) ;
localStorage . removeItem ( test ) ;
return true ;
} catch ( e ) {
return false ;
}
}
function normalizePath ( path ) {
try {
var url = new URL ( path ) ;
if ( url ) {
path = url . pathname + url . search ;
}
// remove trailing slash, unless index page
if ( ! path . match ( '^/$' ) ) {
path = path . replace ( /\/+$/ , '' ) ;
}
return path ;
} catch ( e ) {
// be kind to IE11, which doesn't support URL()
return path ;
}
}
//==========================================================================================
// public API
//==========================================================================================
function internalEval ( str ) {
return maybeEval ( getDocument ( ) . body , function ( ) {
return eval ( str ) ;
} ) ;
}
function onLoadHelper ( callback ) {
var value = htmx . on ( "htmx:load" , function ( evt ) {
callback ( evt . detail . elt ) ;
} ) ;
return value ;
}
function logAll ( ) {
htmx . logger = function ( elt , event , data ) {
if ( console ) {
console . log ( event , elt , data ) ;
}
}
}
function logNone ( ) {
htmx . logger = null
}
function find ( eltOrSelector , selector ) {
if ( selector ) {
return eltOrSelector . querySelector ( selector ) ;
} else {
return find ( getDocument ( ) , eltOrSelector ) ;
}
}
function findAll ( eltOrSelector , selector ) {
if ( selector ) {
return eltOrSelector . querySelectorAll ( selector ) ;
} else {
return findAll ( getDocument ( ) , eltOrSelector ) ;
}
}
function removeElement ( elt , delay ) {
elt = resolveTarget ( elt ) ;
if ( delay ) {
setTimeout ( function ( ) {
removeElement ( elt ) ;
elt = null ;
} , delay ) ;
} else {
elt . parentElement . removeChild ( elt ) ;
}
}
function addClassToElement ( elt , clazz , delay ) {
elt = resolveTarget ( elt ) ;
if ( delay ) {
setTimeout ( function ( ) {
addClassToElement ( elt , clazz ) ;
elt = null ;
} , delay ) ;
} else {
elt . classList && elt . classList . add ( clazz ) ;
}
}
function removeClassFromElement ( elt , clazz , delay ) {
elt = resolveTarget ( elt ) ;
if ( delay ) {
setTimeout ( function ( ) {
removeClassFromElement ( elt , clazz ) ;
elt = null ;
} , delay ) ;
} else {
if ( elt . classList ) {
elt . classList . remove ( clazz ) ;
// if there are no classes left, remove the class attribute
if ( elt . classList . length === 0 ) {
elt . removeAttribute ( "class" ) ;
}
}
}
}
function toggleClassOnElement ( elt , clazz ) {
elt = resolveTarget ( elt ) ;
elt . classList . toggle ( clazz ) ;
}
function takeClassForElement ( elt , clazz ) {
elt = resolveTarget ( elt ) ;
forEach ( elt . parentElement . children , function ( child ) {
removeClassFromElement ( child , clazz ) ;
} )
addClassToElement ( elt , clazz ) ;
}
function closest ( elt , selector ) {
elt = resolveTarget ( elt ) ;
if ( elt . closest ) {
return elt . closest ( selector ) ;
} else {
// TODO remove when IE goes away
do {
if ( elt == null || matches ( elt , selector ) ) {
return elt ;
}
}
while ( elt = elt && parentElt ( elt ) ) ;
return null ;
}
}
function startsWith ( str , prefix ) {
return str . substring ( 0 , prefix . length ) === prefix
}
function endsWith ( str , suffix ) {
return str . substring ( str . length - suffix . length ) === suffix
}
function normalizeSelector ( selector ) {
var trimmedSelector = selector . trim ( ) ;
if ( startsWith ( trimmedSelector , "<" ) && endsWith ( trimmedSelector , "/>" ) ) {
return trimmedSelector . substring ( 1 , trimmedSelector . length - 2 ) ;
} else {
return trimmedSelector ;
}
}
function querySelectorAllExt ( elt , selector ) {
if ( selector . indexOf ( "closest " ) === 0 ) {
return [ closest ( elt , normalizeSelector ( selector . substr ( 8 ) ) ) ] ;
} else if ( selector . indexOf ( "find " ) === 0 ) {
return [ find ( elt , normalizeSelector ( selector . substr ( 5 ) ) ) ] ;
} else if ( selector . indexOf ( "next " ) === 0 ) {
return [ scanForwardQuery ( elt , normalizeSelector ( selector . substr ( 5 ) ) ) ] ;
} else if ( selector . indexOf ( "previous " ) === 0 ) {
return [ scanBackwardsQuery ( elt , normalizeSelector ( selector . substr ( 9 ) ) ) ] ;
} else if ( selector === 'document' ) {
return [ document ] ;
} else if ( selector === 'window' ) {
return [ window ] ;
} else if ( selector === 'body' ) {
return [ document . body ] ;
} else {
return getDocument ( ) . querySelectorAll ( normalizeSelector ( selector ) ) ;
}
}
var scanForwardQuery = function ( start , match ) {
var results = getDocument ( ) . querySelectorAll ( match ) ;
for ( var i = 0 ; i < results . length ; i ++ ) {
var elt = results [ i ] ;
if ( elt . compareDocumentPosition ( start ) === Node . DOCUMENT _POSITION _PRECEDING ) {
return elt ;
}
}
}
var scanBackwardsQuery = function ( start , match ) {
var results = getDocument ( ) . querySelectorAll ( match ) ;
for ( var i = results . length - 1 ; i >= 0 ; i -- ) {
var elt = results [ i ] ;
if ( elt . compareDocumentPosition ( start ) === Node . DOCUMENT _POSITION _FOLLOWING ) {
return elt ;
}
}
}
function querySelectorExt ( eltOrSelector , selector ) {
if ( selector ) {
return querySelectorAllExt ( eltOrSelector , selector ) [ 0 ] ;
} else {
return querySelectorAllExt ( getDocument ( ) . body , eltOrSelector ) [ 0 ] ;
}
}
function resolveTarget ( arg2 ) {
if ( isType ( arg2 , 'String' ) ) {
return find ( arg2 ) ;
} else {
return arg2 ;
}
}
function processEventArgs ( arg1 , arg2 , arg3 ) {
if ( isFunction ( arg2 ) ) {
return {
target : getDocument ( ) . body ,
event : arg1 ,
listener : arg2
}
} else {
return {
target : resolveTarget ( arg1 ) ,
event : arg2 ,
listener : arg3
}
}
}
function addEventListenerImpl ( arg1 , arg2 , arg3 ) {
ready ( function ( ) {
var eventArgs = processEventArgs ( arg1 , arg2 , arg3 ) ;
eventArgs . target . addEventListener ( eventArgs . event , eventArgs . listener ) ;
} )
var b = isFunction ( arg2 ) ;
return b ? arg2 : arg3 ;
}
function removeEventListenerImpl ( arg1 , arg2 , arg3 ) {
ready ( function ( ) {
var eventArgs = processEventArgs ( arg1 , arg2 , arg3 ) ;
eventArgs . target . removeEventListener ( eventArgs . event , eventArgs . listener ) ;
} )
return isFunction ( arg2 ) ? arg2 : arg3 ;
}
//====================================================================
// Node processing
//====================================================================
var DUMMY _ELT = getDocument ( ) . createElement ( "output" ) ; // dummy element for bad selectors
function findAttributeTargets ( elt , attrName ) {
var attrTarget = getClosestAttributeValue ( elt , attrName ) ;
if ( attrTarget ) {
if ( attrTarget === "this" ) {
return [ findThisElement ( elt , attrName ) ] ;
} else {
var result = querySelectorAllExt ( elt , attrTarget ) ;
if ( result . length === 0 ) {
logError ( 'The selector "' + attrTarget + '" on ' + attrName + " returned no matches!" ) ;
return [ DUMMY _ELT ]
} else {
return result ;
}
}
}
}
function findThisElement ( elt , attribute ) {
return getClosestMatch ( elt , function ( elt ) {
return getAttributeValue ( elt , attribute ) != null ;
} )
}
function getTarget ( elt ) {
var targetStr = getClosestAttributeValue ( elt , "hx-target" ) ;
if ( targetStr ) {
if ( targetStr === "this" ) {
return findThisElement ( elt , 'hx-target' ) ;
} else {
return querySelectorExt ( elt , targetStr )
}
} else {
var data = getInternalData ( elt ) ;
if ( data . boosted ) {
return getDocument ( ) . body ;
} else {
return elt ;
}
}
}
function shouldSettleAttribute ( name ) {
var attributesToSettle = htmx . config . attributesToSettle ;
for ( var i = 0 ; i < attributesToSettle . length ; i ++ ) {
if ( name === attributesToSettle [ i ] ) {
return true ;
}
}
return false ;
}
function cloneAttributes ( mergeTo , mergeFrom ) {
forEach ( mergeTo . attributes , function ( attr ) {
if ( ! mergeFrom . hasAttribute ( attr . name ) && shouldSettleAttribute ( attr . name ) ) {
mergeTo . removeAttribute ( attr . name )
}
} ) ;
forEach ( mergeFrom . attributes , function ( attr ) {
if ( shouldSettleAttribute ( attr . name ) ) {
mergeTo . setAttribute ( attr . name , attr . value ) ;
}
} ) ;
}
function isInlineSwap ( swapStyle , target ) {
var extensions = getExtensions ( target ) ;
for ( var i = 0 ; i < extensions . length ; i ++ ) {
var extension = extensions [ i ] ;
try {
if ( extension . isInlineSwap ( swapStyle ) ) {
return true ;
}
} catch ( e ) {
logError ( e ) ;
}
}
return swapStyle === "outerHTML" ;
}
/ * *
*
* @ param { string } oobValue
* @ param { HTMLElement } oobElement
* @ param { * } settleInfo
* @ returns
* /
function oobSwap ( oobValue , oobElement , settleInfo ) {
var selector = "#" + getRawAttribute ( oobElement , "id" ) ;
var swapStyle = "outerHTML" ;
if ( oobValue === "true" ) {
// do nothing
} else if ( oobValue . indexOf ( ":" ) > 0 ) {
swapStyle = oobValue . substr ( 0 , oobValue . indexOf ( ":" ) ) ;
selector = oobValue . substr ( oobValue . indexOf ( ":" ) + 1 , oobValue . length ) ;
} else {
swapStyle = oobValue ;
}
var targets = getDocument ( ) . querySelectorAll ( selector ) ;
if ( targets ) {
forEach (
targets ,
function ( target ) {
var fragment ;
var oobElementClone = oobElement . cloneNode ( true ) ;
fragment = getDocument ( ) . createDocumentFragment ( ) ;
fragment . appendChild ( oobElementClone ) ;
if ( ! isInlineSwap ( swapStyle , target ) ) {
fragment = oobElementClone ; // if this is not an inline swap, we use the content of the node, not the node itself
}
var beforeSwapDetails = { shouldSwap : true , target : target , fragment : fragment } ;
if ( ! triggerEvent ( target , 'htmx:oobBeforeSwap' , beforeSwapDetails ) ) return ;
target = beforeSwapDetails . target ; // allow re-targeting
if ( beforeSwapDetails [ 'shouldSwap' ] ) {
swap ( swapStyle , target , target , fragment , settleInfo ) ;
}
forEach ( settleInfo . elts , function ( elt ) {
triggerEvent ( elt , 'htmx:oobAfterSwap' , beforeSwapDetails ) ;
} ) ;
}
) ;
oobElement . parentNode . removeChild ( oobElement ) ;
} else {
oobElement . parentNode . removeChild ( oobElement ) ;
triggerErrorEvent ( getDocument ( ) . body , "htmx:oobErrorNoTarget" , { content : oobElement } ) ;
}
return oobValue ;
}
function handleOutOfBandSwaps ( elt , fragment , settleInfo ) {
var oobSelects = getClosestAttributeValue ( elt , "hx-select-oob" ) ;
if ( oobSelects ) {
var oobSelectValues = oobSelects . split ( "," ) ;
for ( let i = 0 ; i < oobSelectValues . length ; i ++ ) {
var oobSelectValue = oobSelectValues [ i ] . split ( ":" , 2 ) ;
var id = oobSelectValue [ 0 ] . trim ( ) ;
if ( id . indexOf ( "#" ) === 0 ) {
id = id . substring ( 1 ) ;
}
var oobValue = oobSelectValue [ 1 ] || "true" ;
var oobElement = fragment . querySelector ( "#" + id ) ;
if ( oobElement ) {
oobSwap ( oobValue , oobElement , settleInfo ) ;
}
}
}
forEach ( findAll ( fragment , '[hx-swap-oob], [data-hx-swap-oob]' ) , function ( oobElement ) {
var oobValue = getAttributeValue ( oobElement , "hx-swap-oob" ) ;
if ( oobValue != null ) {
oobSwap ( oobValue , oobElement , settleInfo ) ;
}
} ) ;
}
function handlePreservedElements ( fragment ) {
forEach ( findAll ( fragment , '[hx-preserve], [data-hx-preserve]' ) , function ( preservedElt ) {
var id = getAttributeValue ( preservedElt , "id" ) ;
var oldElt = getDocument ( ) . getElementById ( id ) ;
if ( oldElt != null ) {
preservedElt . parentNode . replaceChild ( oldElt , preservedElt ) ;
}
} ) ;
}
function handleAttributes ( parentNode , fragment , settleInfo ) {
forEach ( fragment . querySelectorAll ( "[id]" ) , function ( newNode ) {
var id = getRawAttribute ( newNode , "id" )
if ( id && id . length > 0 ) {
var normalizedId = id . replace ( "'" , "\\'" ) ;
var normalizedTag = newNode . tagName . replace ( ':' , '\\:' ) ;
var oldNode = parentNode . querySelector ( normalizedTag + "[id='" + normalizedId + "']" ) ;
if ( oldNode && oldNode !== parentNode ) {
var newAttributes = newNode . cloneNode ( ) ;
cloneAttributes ( newNode , oldNode ) ;
settleInfo . tasks . push ( function ( ) {
cloneAttributes ( newNode , newAttributes ) ;
} ) ;
}
}
} ) ;
}
function makeAjaxLoadTask ( child ) {
return function ( ) {
removeClassFromElement ( child , htmx . config . addedClass ) ;
processNode ( child ) ;
processScripts ( child ) ;
processFocus ( child )
triggerEvent ( child , 'htmx:load' ) ;
} ;
}
function processFocus ( child ) {
var autofocus = "[autofocus]" ;
var autoFocusedElt = matches ( child , autofocus ) ? child : child . querySelector ( autofocus )
if ( autoFocusedElt != null ) {
autoFocusedElt . focus ( ) ;
}
}
function insertNodesBefore ( parentNode , insertBefore , fragment , settleInfo ) {
handleAttributes ( parentNode , fragment , settleInfo ) ;
while ( fragment . childNodes . length > 0 ) {
var child = fragment . firstChild ;
addClassToElement ( child , htmx . config . addedClass ) ;
parentNode . insertBefore ( child , insertBefore ) ;
if ( child . nodeType !== Node . TEXT _NODE && child . nodeType !== Node . COMMENT _NODE ) {
settleInfo . tasks . push ( makeAjaxLoadTask ( child ) ) ;
}
}
}
// based on https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0,
// derived from Java's string hashcode implementation
function stringHash ( string , hash ) {
var char = 0 ;
while ( char < string . length ) {
hash = ( hash << 5 ) - hash + string . charCodeAt ( char ++ ) | 0 ; // bitwise or ensures we have a 32-bit int
}
return hash ;
}
function attributeHash ( elt ) {
var hash = 0 ;
// IE fix
if ( elt . attributes ) {
for ( var i = 0 ; i < elt . attributes . length ; i ++ ) {
var attribute = elt . attributes [ i ] ;
if ( attribute . value ) { // only include attributes w/ actual values (empty is same as non-existent)
hash = stringHash ( attribute . name , hash ) ;
hash = stringHash ( attribute . value , hash ) ;
}
}
}
return hash ;
}
function deInitOnHandlers ( elt ) {
var internalData = getInternalData ( elt ) ;
if ( internalData . onHandlers ) {
for ( let i = 0 ; i < internalData . onHandlers . length ; i ++ ) {
const handlerInfo = internalData . onHandlers [ i ] ;
elt . removeEventListener ( handlerInfo . event , handlerInfo . listener ) ;
}
delete internalData . onHandlers
}
}
function deInitNode ( element ) {
var internalData = getInternalData ( element ) ;
if ( internalData . timeout ) {
clearTimeout ( internalData . timeout ) ;
}
if ( internalData . webSocket ) {
internalData . webSocket . close ( ) ;
}
if ( internalData . sseEventSource ) {
internalData . sseEventSource . close ( ) ;
}
if ( internalData . listenerInfos ) {
forEach ( internalData . listenerInfos , function ( info ) {
if ( info . on ) {
info . on . removeEventListener ( info . trigger , info . listener ) ;
}
} ) ;
}
if ( internalData . initHash ) {
internalData . initHash = null
}
deInitOnHandlers ( element ) ;
}
function cleanUpElement ( element ) {
triggerEvent ( element , "htmx:beforeCleanupElement" )
deInitNode ( element ) ;
if ( element . children ) { // IE
forEach ( element . children , function ( child ) { cleanUpElement ( child ) } ) ;
}
}
function swapOuterHTML ( target , fragment , settleInfo ) {
if ( target . tagName === "BODY" ) {
return swapInnerHTML ( target , fragment , settleInfo ) ;
} else {
// @type {HTMLElement}
var newElt
var eltBeforeNewContent = target . previousSibling ;
insertNodesBefore ( parentElt ( target ) , target , fragment , settleInfo ) ;
if ( eltBeforeNewContent == null ) {
newElt = parentElt ( target ) . firstChild ;
} else {
newElt = eltBeforeNewContent . nextSibling ;
}
getInternalData ( target ) . replacedWith = newElt ; // tuck away so we can fire events on it later
settleInfo . elts = settleInfo . elts . filter ( function ( e ) { return e != target } ) ;
while ( newElt && newElt !== target ) {
if ( newElt . nodeType === Node . ELEMENT _NODE ) {
settleInfo . elts . push ( newElt ) ;
}
newElt = newElt . nextElementSibling ;
}
cleanUpElement ( target ) ;
parentElt ( target ) . removeChild ( target ) ;
}
}
function swapAfterBegin ( target , fragment , settleInfo ) {
return insertNodesBefore ( target , target . firstChild , fragment , settleInfo ) ;
}
function swapBeforeBegin ( target , fragment , settleInfo ) {
return insertNodesBefore ( parentElt ( target ) , target , fragment , settleInfo ) ;
}
function swapBeforeEnd ( target , fragment , settleInfo ) {
return insertNodesBefore ( target , null , fragment , settleInfo ) ;
}
function swapAfterEnd ( target , fragment , settleInfo ) {
return insertNodesBefore ( parentElt ( target ) , target . nextSibling , fragment , settleInfo ) ;
}
function swapDelete ( target , fragment , settleInfo ) {
cleanUpElement ( target ) ;
return parentElt ( target ) . removeChild ( target ) ;
}
function swapInnerHTML ( target , fragment , settleInfo ) {
var firstChild = target . firstChild ;
insertNodesBefore ( target , firstChild , fragment , settleInfo ) ;
if ( firstChild ) {
while ( firstChild . nextSibling ) {
cleanUpElement ( firstChild . nextSibling )
target . removeChild ( firstChild . nextSibling ) ;
}
cleanUpElement ( firstChild )
target . removeChild ( firstChild ) ;
}
}
function maybeSelectFromResponse ( elt , fragment , selectOverride ) {
var selector = selectOverride || getClosestAttributeValue ( elt , "hx-select" ) ;
if ( selector ) {
var newFragment = getDocument ( ) . createDocumentFragment ( ) ;
forEach ( fragment . querySelectorAll ( selector ) , function ( node ) {
newFragment . appendChild ( node ) ;
} ) ;
fragment = newFragment ;
}
return fragment ;
}
function swap ( swapStyle , elt , target , fragment , settleInfo ) {
switch ( swapStyle ) {
case "none" :
return ;
case "outerHTML" :
swapOuterHTML ( target , fragment , settleInfo ) ;
return ;
case "afterbegin" :
swapAfterBegin ( target , fragment , settleInfo ) ;
return ;
case "beforebegin" :
swapBeforeBegin ( target , fragment , settleInfo ) ;
return ;
case "beforeend" :
swapBeforeEnd ( target , fragment , settleInfo ) ;
return ;
case "afterend" :
swapAfterEnd ( target , fragment , settleInfo ) ;
return ;
case "delete" :
swapDelete ( target , fragment , settleInfo ) ;
return ;
default :
var extensions = getExtensions ( elt ) ;
for ( var i = 0 ; i < extensions . length ; i ++ ) {
var ext = extensions [ i ] ;
try {
var newElements = ext . handleSwap ( swapStyle , target , fragment , settleInfo ) ;
if ( newElements ) {
if ( typeof newElements . length !== 'undefined' ) {
// if handleSwap returns an array (like) of elements, we handle them
for ( var j = 0 ; j < newElements . length ; j ++ ) {
var child = newElements [ j ] ;
if ( child . nodeType !== Node . TEXT _NODE && child . nodeType !== Node . COMMENT _NODE ) {
settleInfo . tasks . push ( makeAjaxLoadTask ( child ) ) ;
}
}
}
return ;
}
} catch ( e ) {
logError ( e ) ;
}
}
if ( swapStyle === "innerHTML" ) {
swapInnerHTML ( target , fragment , settleInfo ) ;
} else {
swap ( htmx . config . defaultSwapStyle , elt , target , fragment , settleInfo ) ;
}
}
}
function findTitle ( content ) {
if ( content . indexOf ( '<title' ) > - 1 ) {
var contentWithSvgsRemoved = content . replace ( /<svg(\s[^>]*>|>)([\s\S]*?)<\/svg>/gim , '' ) ;
var result = contentWithSvgsRemoved . match ( /<title(\s[^>]*>|>)([\s\S]*?)<\/title>/im ) ;
if ( result ) {
return result [ 2 ] ;
}
}
}
function selectAndSwap ( swapStyle , target , elt , responseText , settleInfo , selectOverride ) {
settleInfo . title = findTitle ( responseText ) ;
var fragment = makeFragment ( responseText ) ;
if ( fragment ) {
handleOutOfBandSwaps ( elt , fragment , settleInfo ) ;
fragment = maybeSelectFromResponse ( elt , fragment , selectOverride ) ;
handlePreservedElements ( fragment ) ;
return swap ( swapStyle , elt , target , fragment , settleInfo ) ;
}
}
function handleTrigger ( xhr , header , elt ) {
var triggerBody = xhr . getResponseHeader ( header ) ;
if ( triggerBody . indexOf ( "{" ) === 0 ) {
var triggers = parseJSON ( triggerBody ) ;
for ( var eventName in triggers ) {
if ( triggers . hasOwnProperty ( eventName ) ) {
var detail = triggers [ eventName ] ;
if ( ! isRawObject ( detail ) ) {
detail = { "value" : detail }
}
triggerEvent ( elt , eventName , detail ) ;
}
}
} else {
var eventNames = triggerBody . split ( "," )
for ( var i = 0 ; i < eventNames . length ; i ++ ) {
triggerEvent ( elt , eventNames [ i ] . trim ( ) , [ ] ) ;
}
}
}
var WHITESPACE = /\s/ ;
var WHITESPACE _OR _COMMA = /[\s,]/ ;
var SYMBOL _START = /[_$a-zA-Z]/ ;
var SYMBOL _CONT = /[_$a-zA-Z0-9]/ ;
var STRINGISH _START = [ '"' , "'" , "/" ] ;
var NOT _WHITESPACE = /[^\s]/ ;
function tokenizeString ( str ) {
var tokens = [ ] ;
var position = 0 ;
while ( position < str . length ) {
if ( SYMBOL _START . exec ( str . charAt ( position ) ) ) {
var startPosition = position ;
while ( SYMBOL _CONT . exec ( str . charAt ( position + 1 ) ) ) {
position ++ ;
}
tokens . push ( str . substr ( startPosition , position - startPosition + 1 ) ) ;
} else if ( STRINGISH _START . indexOf ( str . charAt ( position ) ) !== - 1 ) {
var startChar = str . charAt ( position ) ;
var startPosition = position ;
position ++ ;
while ( position < str . length && str . charAt ( position ) !== startChar ) {
if ( str . charAt ( position ) === "\\" ) {
position ++ ;
}
position ++ ;
}
tokens . push ( str . substr ( startPosition , position - startPosition + 1 ) ) ;
} else {
var symbol = str . charAt ( position ) ;
tokens . push ( symbol ) ;
}
position ++ ;
}
return tokens ;
}
function isPossibleRelativeReference ( token , last , paramName ) {
return SYMBOL _START . exec ( token . charAt ( 0 ) ) &&
token !== "true" &&
token !== "false" &&
token !== "this" &&
token !== paramName &&
last !== "." ;
}
function maybeGenerateConditional ( elt , tokens , paramName ) {
if ( tokens [ 0 ] === '[' ) {
tokens . shift ( ) ;
var bracketCount = 1 ;
var conditionalSource = " return (function(" + paramName + "){ return (" ;
var last = null ;
while ( tokens . length > 0 ) {
var token = tokens [ 0 ] ;
if ( token === "]" ) {
bracketCount -- ;
if ( bracketCount === 0 ) {
if ( last === null ) {
conditionalSource = conditionalSource + "true" ;
}
tokens . shift ( ) ;
conditionalSource += ")})" ;
try {
var conditionFunction = maybeEval ( elt , function ( ) {
return Function ( conditionalSource ) ( ) ;
} ,
function ( ) { return true } )
conditionFunction . source = conditionalSource ;
return conditionFunction ;
} catch ( e ) {
triggerErrorEvent ( getDocument ( ) . body , "htmx:syntax:error" , { error : e , source : conditionalSource } )
return null ;
}
}
} else if ( token === "[" ) {
bracketCount ++ ;
}
if ( isPossibleRelativeReference ( token , last , paramName ) ) {
conditionalSource += "((" + paramName + "." + token + ") ? (" + paramName + "." + token + ") : (window." + token + "))" ;
} else {
conditionalSource = conditionalSource + token ;
}
last = tokens . shift ( ) ;
}
}
}
function consumeUntil ( tokens , match ) {
var result = "" ;
while ( tokens . length > 0 && ! tokens [ 0 ] . match ( match ) ) {
result += tokens . shift ( ) ;
}
return result ;
}
var INPUT _SELECTOR = 'input, textarea, select' ;
/ * *
* @ param { HTMLElement } elt
* @ returns { import ( "./htmx" ) . HtmxTriggerSpecification [ ] }
* /
function getTriggerSpecs ( elt ) {
var explicitTrigger = getAttributeValue ( elt , 'hx-trigger' ) ;
var triggerSpecs = [ ] ;
if ( explicitTrigger ) {
var tokens = tokenizeString ( explicitTrigger ) ;
do {
consumeUntil ( tokens , NOT _WHITESPACE ) ;
var initialLength = tokens . length ;
var trigger = consumeUntil ( tokens , /[,\[\s]/ ) ;
if ( trigger !== "" ) {
if ( trigger === "every" ) {
var every = { trigger : 'every' } ;
consumeUntil ( tokens , NOT _WHITESPACE ) ;
every . pollInterval = parseInterval ( consumeUntil ( tokens , /[,\[\s]/ ) ) ;
consumeUntil ( tokens , NOT _WHITESPACE ) ;
var eventFilter = maybeGenerateConditional ( elt , tokens , "event" ) ;
if ( eventFilter ) {
every . eventFilter = eventFilter ;
}
triggerSpecs . push ( every ) ;
} else if ( trigger . indexOf ( "sse:" ) === 0 ) {
triggerSpecs . push ( { trigger : 'sse' , sseEvent : trigger . substr ( 4 ) } ) ;
} else {
var triggerSpec = { trigger : trigger } ;
var eventFilter = maybeGenerateConditional ( elt , tokens , "event" ) ;
if ( eventFilter ) {
triggerSpec . eventFilter = eventFilter ;
}
while ( tokens . length > 0 && tokens [ 0 ] !== "," ) {
consumeUntil ( tokens , NOT _WHITESPACE )
var token = tokens . shift ( ) ;
if ( token === "changed" ) {
triggerSpec . changed = true ;
} else if ( token === "once" ) {
triggerSpec . once = true ;
} else if ( token === "consume" ) {
triggerSpec . consume = true ;
} else if ( token === "delay" && tokens [ 0 ] === ":" ) {
tokens . shift ( ) ;
triggerSpec . delay = parseInterval ( consumeUntil ( tokens , WHITESPACE _OR _COMMA ) ) ;
} else if ( token === "from" && tokens [ 0 ] === ":" ) {
tokens . shift ( ) ;
var from _arg = consumeUntil ( tokens , WHITESPACE _OR _COMMA ) ;
if ( from _arg === "closest" || from _arg === "find" || from _arg === "next" || from _arg === "previous" ) {
tokens . shift ( ) ;
from _arg +=
" " +
consumeUntil (
tokens ,
WHITESPACE _OR _COMMA
) ;
}
triggerSpec . from = from _arg ;
} else if ( token === "target" && tokens [ 0 ] === ":" ) {
tokens . shift ( ) ;
triggerSpec . target = consumeUntil ( tokens , WHITESPACE _OR _COMMA ) ;
} else if ( token === "throttle" && tokens [ 0 ] === ":" ) {
tokens . shift ( ) ;
triggerSpec . throttle = parseInterval ( consumeUntil ( tokens , WHITESPACE _OR _COMMA ) ) ;
} else if ( token === "queue" && tokens [ 0 ] === ":" ) {
tokens . shift ( ) ;
triggerSpec . queue = consumeUntil ( tokens , WHITESPACE _OR _COMMA ) ;
} else if ( ( token === "root" || token === "threshold" ) && tokens [ 0 ] === ":" ) {
tokens . shift ( ) ;
triggerSpec [ token ] = consumeUntil ( tokens , WHITESPACE _OR _COMMA ) ;
} else {
triggerErrorEvent ( elt , "htmx:syntax:error" , { token : tokens . shift ( ) } ) ;
}
}
triggerSpecs . push ( triggerSpec ) ;
}
}
if ( tokens . length === initialLength ) {
triggerErrorEvent ( elt , "htmx:syntax:error" , { token : tokens . shift ( ) } ) ;
}
consumeUntil ( tokens , NOT _WHITESPACE ) ;
} while ( tokens [ 0 ] === "," && tokens . shift ( ) )
}
if ( triggerSpecs . length > 0 ) {
return triggerSpecs ;
} else if ( matches ( elt , 'form' ) ) {
return [ { trigger : 'submit' } ] ;
} else if ( matches ( elt , 'input[type="button"], input[type="submit"]' ) ) {
return [ { trigger : 'click' } ] ;
} else if ( matches ( elt , INPUT _SELECTOR ) ) {
return [ { trigger : 'change' } ] ;
} else {
return [ { trigger : 'click' } ] ;
}
}
function cancelPolling ( elt ) {
getInternalData ( elt ) . cancelled = true ;
}
function processPolling ( elt , handler , spec ) {
var nodeData = getInternalData ( elt ) ;
nodeData . timeout = setTimeout ( function ( ) {
if ( bodyContains ( elt ) && nodeData . cancelled !== true ) {
if ( ! maybeFilterEvent ( spec , elt , makeEvent ( 'hx:poll:trigger' , {
triggerSpec : spec ,
target : elt
} ) ) ) {
handler ( elt ) ;
}
processPolling ( elt , handler , spec ) ;
}
} , spec . pollInterval ) ;
}
function isLocalLink ( elt ) {
return location . hostname === elt . hostname &&
getRawAttribute ( elt , 'href' ) &&
getRawAttribute ( elt , 'href' ) . indexOf ( "#" ) !== 0 ;
}
function boostElement ( elt , nodeData , triggerSpecs ) {
if ( ( elt . tagName === "A" && isLocalLink ( elt ) && ( elt . target === "" || elt . target === "_self" ) ) || elt . tagName === "FORM" ) {
nodeData . boosted = true ;
var verb , path ;
if ( elt . tagName === "A" ) {
verb = "get" ;
path = getRawAttribute ( elt , 'href' )
} else {
var rawAttribute = getRawAttribute ( elt , "method" ) ;
verb = rawAttribute ? rawAttribute . toLowerCase ( ) : "get" ;
if ( verb === "get" ) {
}
path = getRawAttribute ( elt , 'action' ) ;
}
triggerSpecs . forEach ( function ( triggerSpec ) {
addEventListener ( elt , function ( elt , evt ) {
if ( closest ( elt , htmx . config . disableSelector ) ) {
cleanUpElement ( elt )
return
}
issueAjaxRequest ( verb , path , elt , evt )
} , nodeData , triggerSpec , true ) ;
} ) ;
}
}
/ * *
*
* @ param { Event } evt
* @ param { HTMLElement } elt
* @ returns
* /
function shouldCancel ( evt , elt ) {
if ( evt . type === "submit" || evt . type === "click" ) {
if ( elt . tagName === "FORM" ) {
return true ;
}
if ( matches ( elt , 'input[type="submit"], button' ) && closest ( elt , 'form' ) !== null ) {
return true ;
}
if ( elt . tagName === "A" && elt . href &&
( elt . getAttribute ( 'href' ) === '#' || elt . getAttribute ( 'href' ) . indexOf ( "#" ) !== 0 ) ) {
return true ;
}
}
return false ;
}
function ignoreBoostedAnchorCtrlClick ( elt , evt ) {
return getInternalData ( elt ) . boosted && elt . tagName === "A" && evt . type === "click" && ( evt . ctrlKey || evt . metaKey ) ;
}
function maybeFilterEvent ( triggerSpec , elt , evt ) {
var eventFilter = triggerSpec . eventFilter ;
if ( eventFilter ) {
try {
return eventFilter . call ( elt , evt ) !== true ;
} catch ( e ) {
triggerErrorEvent ( getDocument ( ) . body , "htmx:eventFilter:error" , { error : e , source : eventFilter . source } ) ;
return true ;
}
}
return false ;
}
function addEventListener ( elt , handler , nodeData , triggerSpec , explicitCancel ) {
var elementData = getInternalData ( elt ) ;
var eltsToListenOn ;
if ( triggerSpec . from ) {
eltsToListenOn = querySelectorAllExt ( elt , triggerSpec . from ) ;
} else {
eltsToListenOn = [ elt ] ;
}
// store the initial values of the elements, so we can tell if they change
if ( triggerSpec . changed ) {
eltsToListenOn . forEach ( function ( eltToListenOn ) {
var eltToListenOnData = getInternalData ( eltToListenOn ) ;
eltToListenOnData . lastValue = eltToListenOn . value ;
} )
}
forEach ( eltsToListenOn , function ( eltToListenOn ) {
var eventListener = function ( evt ) {
if ( ! bodyContains ( elt ) ) {
eltToListenOn . removeEventListener ( triggerSpec . trigger , eventListener ) ;
return ;
}
if ( ignoreBoostedAnchorCtrlClick ( elt , evt ) ) {
return ;
}
if ( explicitCancel || shouldCancel ( evt , elt ) ) {
evt . preventDefault ( ) ;
}
if ( maybeFilterEvent ( triggerSpec , elt , evt ) ) {
return ;
}
var eventData = getInternalData ( evt ) ;
eventData . triggerSpec = triggerSpec ;
if ( eventData . handledFor == null ) {
eventData . handledFor = [ ] ;
}
if ( eventData . handledFor . indexOf ( elt ) < 0 ) {
eventData . handledFor . push ( elt ) ;
if ( triggerSpec . consume ) {
evt . stopPropagation ( ) ;
}
if ( triggerSpec . target && evt . target ) {
if ( ! matches ( evt . target , triggerSpec . target ) ) {
return ;
}
}
if ( triggerSpec . once ) {
if ( elementData . triggeredOnce ) {
return ;
} else {
elementData . triggeredOnce = true ;
}
}
if ( triggerSpec . changed ) {
var eltToListenOnData = getInternalData ( eltToListenOn )
if ( eltToListenOnData . lastValue === eltToListenOn . value ) {
return ;
}
eltToListenOnData . lastValue = eltToListenOn . value
}
if ( elementData . delayed ) {
clearTimeout ( elementData . delayed ) ;
}
if ( elementData . throttle ) {
return ;
}
if ( triggerSpec . throttle ) {
if ( ! elementData . throttle ) {
handler ( elt , evt ) ;
elementData . throttle = setTimeout ( function ( ) {
elementData . throttle = null ;
} , triggerSpec . throttle ) ;
}
} else if ( triggerSpec . delay ) {
elementData . delayed = setTimeout ( function ( ) { handler ( elt , evt ) } , triggerSpec . delay ) ;
} else {
triggerEvent ( elt , 'htmx:trigger' )
handler ( elt , evt ) ;
}
}
} ;
if ( nodeData . listenerInfos == null ) {
nodeData . listenerInfos = [ ] ;
}
nodeData . listenerInfos . push ( {
trigger : triggerSpec . trigger ,
listener : eventListener ,
on : eltToListenOn
} )
eltToListenOn . addEventListener ( triggerSpec . trigger , eventListener ) ;
} ) ;
}
var windowIsScrolling = false // used by initScrollHandler
var scrollHandler = null ;
function initScrollHandler ( ) {
if ( ! scrollHandler ) {
scrollHandler = function ( ) {
windowIsScrolling = true
} ;
window . addEventListener ( "scroll" , scrollHandler )
setInterval ( function ( ) {
if ( windowIsScrolling ) {
windowIsScrolling = false ;
forEach ( getDocument ( ) . querySelectorAll ( "[hx-trigger='revealed'],[data-hx-trigger='revealed']" ) , function ( elt ) {
maybeReveal ( elt ) ;
} )
}
} , 200 ) ;
}
}
function maybeReveal ( elt ) {
if ( ! hasAttribute ( elt , 'data-hx-revealed' ) && isScrolledIntoView ( elt ) ) {
elt . setAttribute ( 'data-hx-revealed' , 'true' ) ;
var nodeData = getInternalData ( elt ) ;
if ( nodeData . initHash ) {
triggerEvent ( elt , 'revealed' ) ;
} else {
// if the node isn't initialized, wait for it before triggering the request
elt . addEventListener ( "htmx:afterProcessNode" , function ( evt ) { triggerEvent ( elt , 'revealed' ) } , { once : true } ) ;
}
}
}
//====================================================================
// Web Sockets
//====================================================================
function processWebSocketInfo ( elt , nodeData , info ) {
var values = splitOnWhitespace ( info ) ;
for ( var i = 0 ; i < values . length ; i ++ ) {
var value = values [ i ] . split ( /:(.+)/ ) ;
if ( value [ 0 ] === "connect" ) {
ensureWebSocket ( elt , value [ 1 ] , 0 ) ;
}
if ( value [ 0 ] === "send" ) {
processWebSocketSend ( elt ) ;
}
}
}
function ensureWebSocket ( elt , wssSource , retryCount ) {
if ( ! bodyContains ( elt ) ) {
return ; // stop ensuring websocket connection when socket bearing element ceases to exist
}
if ( wssSource . indexOf ( "/" ) == 0 ) { // complete absolute paths only
var base _part = location . hostname + ( location . port ? ':' + location . port : '' ) ;
if ( location . protocol == 'https:' ) {
wssSource = "wss://" + base _part + wssSource ;
} else if ( location . protocol == 'http:' ) {
wssSource = "ws://" + base _part + wssSource ;
}
}
var socket = htmx . createWebSocket ( wssSource ) ;
socket . onerror = function ( e ) {
triggerErrorEvent ( elt , "htmx:wsError" , { error : e , socket : socket } ) ;
maybeCloseWebSocketSource ( elt ) ;
} ;
socket . onclose = function ( e ) {
if ( [ 1006 , 1012 , 1013 ] . indexOf ( e . code ) >= 0 ) { // Abnormal Closure/Service Restart/Try Again Later
var delay = getWebSocketReconnectDelay ( retryCount ) ;
setTimeout ( function ( ) {
ensureWebSocket ( elt , wssSource , retryCount + 1 ) ; // creates a websocket with a new timeout
} , delay ) ;
}
} ;
socket . onopen = function ( e ) {
retryCount = 0 ;
}
getInternalData ( elt ) . webSocket = socket ;
socket . addEventListener ( 'message' , function ( event ) {
if ( maybeCloseWebSocketSource ( elt ) ) {
return ;
}
var response = event . data ;
withExtensions ( elt , function ( extension ) {
response = extension . transformResponse ( response , null , elt ) ;
} ) ;
var settleInfo = makeSettleInfo ( elt ) ;
var fragment = makeFragment ( response ) ;
var children = toArray ( fragment . children ) ;
for ( var i = 0 ; i < children . length ; i ++ ) {
var child = children [ i ] ;
oobSwap ( getAttributeValue ( child , "hx-swap-oob" ) || "true" , child , settleInfo ) ;
}
settleImmediately ( settleInfo . tasks ) ;
} ) ;
}
function maybeCloseWebSocketSource ( elt ) {
if ( ! bodyContains ( elt ) ) {
getInternalData ( elt ) . webSocket . close ( ) ;
return true ;
}
}
function processWebSocketSend ( elt ) {
var webSocketSourceElt = getClosestMatch ( elt , function ( parent ) {
return getInternalData ( parent ) . webSocket != null ;
} ) ;
if ( webSocketSourceElt ) {
elt . addEventListener ( getTriggerSpecs ( elt ) [ 0 ] . trigger , function ( evt ) {
var webSocket = getInternalData ( webSocketSourceElt ) . webSocket ;
var headers = getHeaders ( elt , webSocketSourceElt ) ;
var results = getInputValues ( elt , 'post' ) ;
var errors = results . errors ;
var rawParameters = results . values ;
var expressionVars = getExpressionVars ( elt ) ;
var allParameters = mergeObjects ( rawParameters , expressionVars ) ;
var filteredParameters = filterValues ( allParameters , elt ) ;
filteredParameters [ 'HEADERS' ] = headers ;
if ( errors && errors . length > 0 ) {
triggerEvent ( elt , 'htmx:validation:halted' , errors ) ;
return ;
}
webSocket . send ( JSON . stringify ( filteredParameters ) ) ;
if ( shouldCancel ( evt , elt ) ) {
evt . preventDefault ( ) ;
}
} ) ;
} else {
triggerErrorEvent ( elt , "htmx:noWebSocketSourceError" ) ;
}
}
function getWebSocketReconnectDelay ( retryCount ) {
var delay = htmx . config . wsReconnectDelay ;
if ( typeof delay === 'function' ) {
// @ts-ignore
return delay ( retryCount ) ;
}
if ( delay === 'full-jitter' ) {
var exp = Math . min ( retryCount , 6 ) ;
var maxDelay = 1000 * Math . pow ( 2 , exp ) ;
return maxDelay * Math . random ( ) ;
}
logError ( 'htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"' ) ;
}
//====================================================================
// Server Sent Events
//====================================================================
function processSSEInfo ( elt , nodeData , info ) {
var values = splitOnWhitespace ( info ) ;
for ( var i = 0 ; i < values . length ; i ++ ) {
var value = values [ i ] . split ( /:(.+)/ ) ;
if ( value [ 0 ] === "connect" ) {
processSSESource ( elt , value [ 1 ] ) ;
}
if ( ( value [ 0 ] === "swap" ) ) {
processSSESwap ( elt , value [ 1 ] )
}
}
}
function processSSESource ( elt , sseSrc ) {
var source = htmx . createEventSource ( sseSrc ) ;
source . onerror = function ( e ) {
triggerErrorEvent ( elt , "htmx:sseError" , { error : e , source : source } ) ;
maybeCloseSSESource ( elt ) ;
} ;
getInternalData ( elt ) . sseEventSource = source ;
}
function processSSESwap ( elt , sseEventName ) {
var sseSourceElt = getClosestMatch ( elt , hasEventSource ) ;
if ( sseSourceElt ) {
var sseEventSource = getInternalData ( sseSourceElt ) . sseEventSource ;
var sseListener = function ( event ) {
if ( maybeCloseSSESource ( sseSourceElt ) ) {
return ;
}
if ( ! bodyContains ( elt ) ) {
sseEventSource . removeEventListener ( sseEventName , sseListener ) ;
return ;
}
///////////////////////////
// TODO: merge this code with AJAX and WebSockets code in the future.
var response = event . data ;
withExtensions ( elt , function ( extension ) {
response = extension . transformResponse ( response , null , elt ) ;
} ) ;
var swapSpec = getSwapSpecification ( elt )
var target = getTarget ( elt )
var settleInfo = makeSettleInfo ( elt ) ;
selectAndSwap ( swapSpec . swapStyle , target , elt , response , settleInfo )
settleImmediately ( settleInfo . tasks )
triggerEvent ( elt , "htmx:sseMessage" , event )
} ;
getInternalData ( elt ) . sseListener = sseListener ;
sseEventSource . addEventListener ( sseEventName , sseListener ) ;
} else {
triggerErrorEvent ( elt , "htmx:noSSESourceError" ) ;
}
}
function processSSETrigger ( elt , handler , sseEventName ) {
var sseSourceElt = getClosestMatch ( elt , hasEventSource ) ;
if ( sseSourceElt ) {
var sseEventSource = getInternalData ( sseSourceElt ) . sseEventSource ;
var sseListener = function ( ) {
if ( ! maybeCloseSSESource ( sseSourceElt ) ) {
if ( bodyContains ( elt ) ) {
handler ( elt ) ;
} else {
sseEventSource . removeEventListener ( sseEventName , sseListener ) ;
}
}
} ;
getInternalData ( elt ) . sseListener = sseListener ;
sseEventSource . addEventListener ( sseEventName , sseListener ) ;
} else {
triggerErrorEvent ( elt , "htmx:noSSESourceError" ) ;
}
}
function maybeCloseSSESource ( elt ) {
if ( ! bodyContains ( elt ) ) {
getInternalData ( elt ) . sseEventSource . close ( ) ;
return true ;
}
}
function hasEventSource ( node ) {
return getInternalData ( node ) . sseEventSource != null ;
}
//====================================================================
function loadImmediately ( elt , handler , nodeData , delay ) {
var load = function ( ) {
if ( ! nodeData . loaded ) {
nodeData . loaded = true ;
handler ( elt ) ;
}
}
if ( delay ) {
setTimeout ( load , delay ) ;
} else {
load ( ) ;
}
}
function processVerbs ( elt , nodeData , triggerSpecs ) {
var explicitAction = false ;
forEach ( VERBS , function ( verb ) {
if ( hasAttribute ( elt , 'hx-' + verb ) ) {
var path = getAttributeValue ( elt , 'hx-' + verb ) ;
explicitAction = true ;
nodeData . path = path ;
nodeData . verb = verb ;
triggerSpecs . forEach ( function ( triggerSpec ) {
addTriggerHandler ( elt , triggerSpec , nodeData , function ( elt , evt ) {
if ( closest ( elt , htmx . config . disableSelector ) ) {
cleanUpElement ( elt )
return
}
issueAjaxRequest ( verb , path , elt , evt )
} )
} ) ;
}
} ) ;
return explicitAction ;
}
function addTriggerHandler ( elt , triggerSpec , nodeData , handler ) {
if ( triggerSpec . sseEvent ) {
processSSETrigger ( elt , handler , triggerSpec . sseEvent ) ;
} else if ( triggerSpec . trigger === "revealed" ) {
initScrollHandler ( ) ;
addEventListener ( elt , handler , nodeData , triggerSpec ) ;
maybeReveal ( elt ) ;
} else if ( triggerSpec . trigger === "intersect" ) {
var observerOptions = { } ;
if ( triggerSpec . root ) {
observerOptions . root = querySelectorExt ( elt , triggerSpec . root )
}
if ( triggerSpec . threshold ) {
observerOptions . threshold = parseFloat ( triggerSpec . threshold ) ;
}
var observer = new IntersectionObserver ( function ( entries ) {
for ( var i = 0 ; i < entries . length ; i ++ ) {
var entry = entries [ i ] ;
if ( entry . isIntersecting ) {
triggerEvent ( elt , "intersect" ) ;
break ;
}
}
} , observerOptions ) ;
observer . observe ( elt ) ;
addEventListener ( elt , handler , nodeData , triggerSpec ) ;
} else if ( triggerSpec . trigger === "load" ) {
if ( ! maybeFilterEvent ( triggerSpec , elt , makeEvent ( "load" , { elt : elt } ) ) ) {
loadImmediately ( elt , handler , nodeData , triggerSpec . delay ) ;
}
} else if ( triggerSpec . pollInterval ) {
nodeData . polling = true ;
processPolling ( elt , handler , triggerSpec ) ;
} else {
addEventListener ( elt , handler , nodeData , triggerSpec ) ;
}
}
function evalScript ( script ) {
if ( htmx . config . allowScriptTags && ( script . type === "text/javascript" || script . type === "module" || script . type === "" ) ) {
var newScript = getDocument ( ) . createElement ( "script" ) ;
forEach ( script . attributes , function ( attr ) {
newScript . setAttribute ( attr . name , attr . value ) ;
} ) ;
newScript . textContent = script . textContent ;
newScript . async = false ;
if ( htmx . config . inlineScriptNonce ) {
newScript . nonce = htmx . config . inlineScriptNonce ;
}
var parent = script . parentElement ;
try {
parent . insertBefore ( newScript , script ) ;
} catch ( e ) {
logError ( e ) ;
} finally {
// remove old script element, but only if it is still in DOM
if ( script . parentElement ) {
script . parentElement . removeChild ( script ) ;
}
}
}
}
function processScripts ( elt ) {
if ( matches ( elt , "script" ) ) {
evalScript ( elt ) ;
}
forEach ( findAll ( elt , "script" ) , function ( script ) {
evalScript ( script ) ;
} ) ;
}
function hasChanceOfBeingBoosted ( ) {
return document . querySelector ( "[hx-boost], [data-hx-boost]" ) ;
}
function findHxOnWildcardElements ( elt ) {
var node = null
var elements = [ ]
if ( document . evaluate ) {
var iter = document . evaluate ( '//*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") ]]' , elt )
while ( node = iter . iterateNext ( ) ) elements . push ( node )
} else {
var allElements = document . getElementsByTagName ( "*" )
for ( var i = 0 ; i < allElements . length ; i ++ ) {
var attributes = allElements [ i ] . attributes
for ( var j = 0 ; j < attributes . length ; j ++ ) {
var attrName = attributes [ j ] . name
if ( startsWith ( attrName , "hx-on:" ) || startsWith ( attrName , "data-hx-on:" ) ) {
elements . push ( allElements [ i ] )
}
}
}
}
return elements
}
function findElementsToProcess ( elt ) {
if ( elt . querySelectorAll ) {
var boostedElts = hasChanceOfBeingBoosted ( ) ? ", a" : "" ;
var results = elt . querySelectorAll ( VERB _SELECTOR + boostedElts + ", form, [type='submit'], [hx-sse], [data-hx-sse], [hx-ws]," +
" [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]" ) ;
return results ;
} else {
return [ ] ;
}
}
function initButtonTracking ( elt ) {
// Handle submit buttons/inputs that have the form attribute set
// see https://developer.mozilla.org/docs/Web/HTML/Element/button
var form = resolveTarget ( "#" + getRawAttribute ( elt , "form" ) ) || closest ( elt , "form" )
if ( ! form ) {
return
}
var maybeSetLastButtonClicked = function ( evt ) {
var elt = closest ( evt . target , "button, input[type='submit']" ) ;
if ( elt !== null ) {
var internalData = getInternalData ( form ) ;
internalData . lastButtonClicked = elt ;
}
} ;
// need to handle both click and focus in:
// focusin - in case someone tabs in to a button and hits the space bar
// click - on OSX buttons do not focus on click see https://bugs.webkit.org/show_bug.cgi?id=13724
elt . addEventListener ( 'click' , maybeSetLastButtonClicked )
elt . addEventListener ( 'focusin' , maybeSetLastButtonClicked )
elt . addEventListener ( 'focusout' , function ( evt ) {
var internalData = getInternalData ( form ) ;
internalData . lastButtonClicked = null ;
} )
}
function countCurlies ( line ) {
var tokens = tokenizeString ( line ) ;
var netCurlies = 0 ;
for ( let i = 0 ; i < tokens . length ; i ++ ) {
const token = tokens [ i ] ;
if ( token === "{" ) {
netCurlies ++ ;
} else if ( token === "}" ) {
netCurlies -- ;
}
}
return netCurlies ;
}
function addHxOnEventHandler ( elt , eventName , code ) {
var nodeData = getInternalData ( elt ) ;
nodeData . onHandlers = [ ] ;
var func ;
var listener = function ( e ) {
return maybeEval ( elt , function ( ) {
if ( ! func ) {
func = new Function ( "event" , code ) ;
}
func . call ( elt , e ) ;
} ) ;
} ;
elt . addEventListener ( eventName , listener ) ;
nodeData . onHandlers . push ( { event : eventName , listener : listener } ) ;
}
function processHxOn ( elt ) {
var hxOnValue = getAttributeValue ( elt , 'hx-on' ) ;
if ( hxOnValue ) {
var handlers = { }
var lines = hxOnValue . split ( "\n" ) ;
var currentEvent = null ;
var curlyCount = 0 ;
while ( lines . length > 0 ) {
var line = lines . shift ( ) ;
var match = line . match ( /^\s*([a-zA-Z:\-\.]+:)(.*)/ ) ;
if ( curlyCount === 0 && match ) {
line . split ( ":" )
currentEvent = match [ 1 ] . slice ( 0 , - 1 ) ; // strip last colon
handlers [ currentEvent ] = match [ 2 ] ;
} else {
handlers [ currentEvent ] += line ;
}
curlyCount += countCurlies ( line ) ;
}
for ( var eventName in handlers ) {
addHxOnEventHandler ( elt , eventName , handlers [ eventName ] ) ;
}
}
}
function processHxOnWildcard ( elt ) {
// wipe any previous on handlers so that this function takes precedence
deInitOnHandlers ( elt )
for ( var i = 0 ; i < elt . attributes . length ; i ++ ) {
var name = elt . attributes [ i ] . name
var value = elt . attributes [ i ] . value
if ( startsWith ( name , "hx-on:" ) || startsWith ( name , "data-hx-on:" ) ) {
let eventName = name . slice ( name . indexOf ( ":" ) + 1 )
// if the eventName starts with a colon, prepend "htmx" for shorthand support
if ( startsWith ( eventName , ":" ) ) eventName = "htmx" + eventName
addHxOnEventHandler ( elt , eventName , value )
}
}
}
function initNode ( elt ) {
if ( closest ( elt , htmx . config . disableSelector ) ) {
cleanUpElement ( elt )
return ;
}
var nodeData = getInternalData ( elt ) ;
if ( nodeData . initHash !== attributeHash ( elt ) ) {
// clean up any previously processed info
deInitNode ( elt ) ;
nodeData . initHash = attributeHash ( elt ) ;
processHxOn ( elt ) ;
triggerEvent ( elt , "htmx:beforeProcessNode" )
if ( elt . value ) {
nodeData . lastValue = elt . value ;
}
var triggerSpecs = getTriggerSpecs ( elt ) ;
var hasExplicitHttpAction = processVerbs ( elt , nodeData , triggerSpecs ) ;
if ( ! hasExplicitHttpAction ) {
if ( getClosestAttributeValue ( elt , "hx-boost" ) === "true" ) {
boostElement ( elt , nodeData , triggerSpecs ) ;
} else if ( hasAttribute ( elt , 'hx-trigger' ) ) {
triggerSpecs . forEach ( function ( triggerSpec ) {
// For "naked" triggers, don't do anything at all
addTriggerHandler ( elt , triggerSpec , nodeData , function ( ) {
} )
} )
}
}
// Handle submit buttons/inputs that have the form attribute set
// see https://developer.mozilla.org/docs/Web/HTML/Element/button
if ( elt . tagName === "FORM" || ( getRawAttribute ( elt , "type" ) === "submit" && hasAttribute ( elt , "form" ) ) ) {
initButtonTracking ( elt )
}
var sseInfo = getAttributeValue ( elt , 'hx-sse' ) ;
if ( sseInfo ) {
processSSEInfo ( elt , nodeData , sseInfo ) ;
}
var wsInfo = getAttributeValue ( elt , 'hx-ws' ) ;
if ( wsInfo ) {
processWebSocketInfo ( elt , nodeData , wsInfo ) ;
}
triggerEvent ( elt , "htmx:afterProcessNode" ) ;
}
}
function processNode ( elt ) {
elt = resolveTarget ( elt ) ;
if ( closest ( elt , htmx . config . disableSelector ) ) {
cleanUpElement ( elt )
return ;
}
initNode ( elt ) ;
forEach ( findElementsToProcess ( elt ) , function ( child ) { initNode ( child ) } ) ;
// Because it happens second, the new way of adding onHandlers superseeds the old one
// i.e. if there are any hx-on:eventName attributes, the hx-on attribute will be ignored
forEach ( findHxOnWildcardElements ( elt ) , processHxOnWildcard ) ;
}
//====================================================================
// Event/Log Support
//====================================================================
function kebabEventName ( str ) {
return str . replace ( /([a-z0-9])([A-Z])/g , '$1-$2' ) . toLowerCase ( ) ;
}
function makeEvent ( eventName , detail ) {
var evt ;
if ( window . CustomEvent && typeof window . CustomEvent === 'function' ) {
evt = new CustomEvent ( eventName , { bubbles : true , cancelable : true , detail : detail } ) ;
} else {
evt = getDocument ( ) . createEvent ( 'CustomEvent' ) ;
evt . initCustomEvent ( eventName , true , true , detail ) ;
}
return evt ;
}
function triggerErrorEvent ( elt , eventName , detail ) {
triggerEvent ( elt , eventName , mergeObjects ( { error : eventName } , detail ) ) ;
}
function ignoreEventForLogging ( eventName ) {
return eventName === "htmx:afterProcessNode"
}
/ * *
* ` withExtensions ` locates all active extensions for a provided element , then
* executes the provided function using each of the active extensions . It should
* be called internally at every extendable execution point in htmx .
*
* @ param { HTMLElement } elt
* @ param { ( extension : import ( "./htmx" ) . HtmxExtension ) => void } toDo
* @ returns void
* /
function withExtensions ( elt , toDo ) {
forEach ( getExtensions ( elt ) , function ( extension ) {
try {
toDo ( extension ) ;
} catch ( e ) {
logError ( e ) ;
}
} ) ;
}
function logError ( msg ) {
if ( console . error ) {
console . error ( msg ) ;
} else if ( console . log ) {
console . log ( "ERROR: " , msg ) ;
}
}
function triggerEvent ( elt , eventName , detail ) {
elt = resolveTarget ( elt ) ;
if ( detail == null ) {
detail = { } ;
}
detail [ "elt" ] = elt ;
var event = makeEvent ( eventName , detail ) ;
if ( htmx . logger && ! ignoreEventForLogging ( eventName ) ) {
htmx . logger ( elt , eventName , detail ) ;
}
if ( detail . error ) {
logError ( detail . error ) ;
triggerEvent ( elt , "htmx:error" , { errorInfo : detail } )
}
var eventResult = elt . dispatchEvent ( event ) ;
var kebabName = kebabEventName ( eventName ) ;
if ( eventResult && kebabName !== eventName ) {
var kebabedEvent = makeEvent ( kebabName , event . detail ) ;
eventResult = eventResult && elt . dispatchEvent ( kebabedEvent )
}
withExtensions ( elt , function ( extension ) {
eventResult = eventResult && ( extension . onEvent ( eventName , event ) !== false && ! event . defaultPrevented )
} ) ;
return eventResult ;
}
//====================================================================
// History Support
//====================================================================
var currentPathForHistory = location . pathname + location . search ;
function getHistoryElement ( ) {
var historyElt = getDocument ( ) . querySelector ( '[hx-history-elt],[data-hx-history-elt]' ) ;
return historyElt || getDocument ( ) . body ;
}
function saveToHistoryCache ( url , content , title , scroll ) {
if ( ! canAccessLocalStorage ( ) ) {
return ;
}
url = normalizePath ( url ) ;
var historyCache = parseJSON ( localStorage . getItem ( "htmx-history-cache" ) ) || [ ] ;
for ( var i = 0 ; i < historyCache . length ; i ++ ) {
if ( historyCache [ i ] . url === url ) {
historyCache . splice ( i , 1 ) ;
break ;
}
}
var newHistoryItem = { url : url , content : content , title : title , scroll : scroll } ;
triggerEvent ( getDocument ( ) . body , "htmx:historyItemCreated" , { item : newHistoryItem , cache : historyCache } )
historyCache . push ( newHistoryItem )
while ( historyCache . length > htmx . config . historyCacheSize ) {
historyCache . shift ( ) ;
}
while ( historyCache . length > 0 ) {
try {
localStorage . setItem ( "htmx-history-cache" , JSON . stringify ( historyCache ) ) ;
break ;
} catch ( e ) {
triggerErrorEvent ( getDocument ( ) . body , "htmx:historyCacheError" , { cause : e , cache : historyCache } )
historyCache . shift ( ) ; // shrink the cache and retry
}
}
}
function getCachedHistory ( url ) {
if ( ! canAccessLocalStorage ( ) ) {
return null ;
}
url = normalizePath ( url ) ;
var historyCache = parseJSON ( localStorage . getItem ( "htmx-history-cache" ) ) || [ ] ;
for ( var i = 0 ; i < historyCache . length ; i ++ ) {
if ( historyCache [ i ] . url === url ) {
return historyCache [ i ] ;
}
}
return null ;
}
function cleanInnerHtmlForHistory ( elt ) {
var className = htmx . config . requestClass ;
var clone = elt . cloneNode ( true ) ;
forEach ( findAll ( clone , "." + className ) , function ( child ) {
removeClassFromElement ( child , className ) ;
} ) ;
return clone . innerHTML ;
}
function saveCurrentPageToHistory ( ) {
var elt = getHistoryElement ( ) ;
var path = currentPathForHistory || location . pathname + location . search ;
// Allow history snapshot feature to be disabled where hx-history="false"
// is present *anywhere* in the current document we're about to save,
// so we can prevent privileged data entering the cache.
// The page will still be reachable as a history entry, but htmx will fetch it
// live from the server onpopstate rather than look in the localStorage cache
var disableHistoryCache
try {
disableHistoryCache = getDocument ( ) . querySelector ( '[hx-history="false" i],[data-hx-history="false" i]' )
} catch ( e ) {
// IE11: insensitive modifier not supported so fallback to case sensitive selector
disableHistoryCache = getDocument ( ) . querySelector ( '[hx-history="false"],[data-hx-history="false"]' )
}
if ( ! disableHistoryCache ) {
triggerEvent ( getDocument ( ) . body , "htmx:beforeHistorySave" , { path : path , historyElt : elt } ) ;
saveToHistoryCache ( path , cleanInnerHtmlForHistory ( elt ) , getDocument ( ) . title , window . scrollY ) ;
}
if ( htmx . config . historyEnabled ) history . replaceState ( { htmx : true } , getDocument ( ) . title , window . location . href ) ;
}
function pushUrlIntoHistory ( path ) {
// remove the cache buster parameter, if any
if ( htmx . config . getCacheBusterParam ) {
path = path . replace ( /org\.htmx\.cache-buster=[^&]*&?/ , '' )
if ( endsWith ( path , '&' ) || endsWith ( path , "?" ) ) {
path = path . slice ( 0 , - 1 ) ;
}
}
if ( htmx . config . historyEnabled ) {
history . pushState ( { htmx : true } , "" , path ) ;
}
currentPathForHistory = path ;
}
function replaceUrlInHistory ( path ) {
if ( htmx . config . historyEnabled ) history . replaceState ( { htmx : true } , "" , path ) ;
currentPathForHistory = path ;
}
function settleImmediately ( tasks ) {
forEach ( tasks , function ( task ) {
task . call ( ) ;
} ) ;
}
function loadHistoryFromServer ( path ) {
var request = new XMLHttpRequest ( ) ;
var details = { path : path , xhr : request } ;
triggerEvent ( getDocument ( ) . body , "htmx:historyCacheMiss" , details ) ;
request . open ( 'GET' , path , true ) ;
request . setRequestHeader ( "HX-History-Restore-Request" , "true" ) ;
request . onload = function ( ) {
if ( this . status >= 200 && this . status < 400 ) {
triggerEvent ( getDocument ( ) . body , "htmx:historyCacheMissLoad" , details ) ;
var fragment = makeFragment ( this . response ) ;
// @ts-ignore
fragment = fragment . querySelector ( '[hx-history-elt],[data-hx-history-elt]' ) || fragment ;
var historyElement = getHistoryElement ( ) ;
var settleInfo = makeSettleInfo ( historyElement ) ;
var title = findTitle ( this . response ) ;
if ( title ) {
var titleElt = find ( "title" ) ;
if ( titleElt ) {
titleElt . innerHTML = title ;
} else {
window . document . title = title ;
}
}
// @ts-ignore
swapInnerHTML ( historyElement , fragment , settleInfo )
settleImmediately ( settleInfo . tasks ) ;
currentPathForHistory = path ;
triggerEvent ( getDocument ( ) . body , "htmx:historyRestore" , { path : path , cacheMiss : true , serverResponse : this . response } ) ;
} else {
triggerErrorEvent ( getDocument ( ) . body , "htmx:historyCacheMissLoadError" , details ) ;
}
} ;
request . send ( ) ;
}
function restoreHistory ( path ) {
saveCurrentPageToHistory ( ) ;
path = path || location . pathname + location . search ;
var cached = getCachedHistory ( path ) ;
if ( cached ) {
var fragment = makeFragment ( cached . content ) ;
var historyElement = getHistoryElement ( ) ;
var settleInfo = makeSettleInfo ( historyElement ) ;
swapInnerHTML ( historyElement , fragment , settleInfo )
settleImmediately ( settleInfo . tasks ) ;
document . title = cached . title ;
setTimeout ( function ( ) {
window . scrollTo ( 0 , cached . scroll ) ;
} , 0 ) ; // next 'tick', so browser has time to render layout
currentPathForHistory = path ;
triggerEvent ( getDocument ( ) . body , "htmx:historyRestore" , { path : path , item : cached } ) ;
} else {
if ( htmx . config . refreshOnHistoryMiss ) {
// @ts-ignore: optional parameter in reload() function throws error
window . location . reload ( true ) ;
} else {
loadHistoryFromServer ( path ) ;
}
}
}
function addRequestIndicatorClasses ( elt ) {
var indicators = findAttributeTargets ( elt , 'hx-indicator' ) ;
if ( indicators == null ) {
indicators = [ elt ] ;
}
forEach ( indicators , function ( ic ) {
var internalData = getInternalData ( ic ) ;
internalData . requestCount = ( internalData . requestCount || 0 ) + 1 ;
ic . classList [ "add" ] . call ( ic . classList , htmx . config . requestClass ) ;
} ) ;
return indicators ;
}
function disableElements ( elt ) {
var disabledElts = findAttributeTargets ( elt , 'hx-disabled-elt' ) ;
if ( disabledElts == null ) {
disabledElts = [ ] ;
}
forEach ( disabledElts , function ( disabledElement ) {
var internalData = getInternalData ( disabledElement ) ;
internalData . requestCount = ( internalData . requestCount || 0 ) + 1 ;
disabledElement . setAttribute ( "disabled" , "" ) ;
} ) ;
return disabledElts ;
}
function removeRequestIndicators ( indicators , disabled ) {
forEach ( indicators , function ( ic ) {
var internalData = getInternalData ( ic ) ;
internalData . requestCount = ( internalData . requestCount || 0 ) - 1 ;
if ( internalData . requestCount === 0 ) {
ic . classList [ "remove" ] . call ( ic . classList , htmx . config . requestClass ) ;
}
} ) ;
forEach ( disabled , function ( disabledElement ) {
var internalData = getInternalData ( disabledElement ) ;
internalData . requestCount = ( internalData . requestCount || 0 ) - 1 ;
if ( internalData . requestCount === 0 ) {
disabledElement . removeAttribute ( 'disabled' ) ;
}
} ) ;
}
//====================================================================
// Input Value Processing
//====================================================================
function haveSeenNode ( processed , elt ) {
for ( var i = 0 ; i < processed . length ; i ++ ) {
var node = processed [ i ] ;
if ( node . isSameNode ( elt ) ) {
return true ;
}
}
return false ;
}
function shouldInclude ( elt ) {
if ( elt . name === "" || elt . name == null || elt . disabled ) {
return false ;
}
// ignore "submitter" types (see jQuery src/serialize.js)
if ( elt . type === "button" || elt . type === "submit" || elt . tagName === "image" || elt . tagName === "reset" || elt . tagName === "file" ) {
return false ;
}
if ( elt . type === "checkbox" || elt . type === "radio" ) {
return elt . checked ;
}
return true ;
}
function addValueToValues ( name , value , values ) {
// This is a little ugly because both the current value of the named value in the form
// and the new value could be arrays, so we have to handle all four cases :/
if ( name != null && value != null ) {
var current = values [ name ] ;
if ( current === undefined ) {
values [ name ] = value ;
} else if ( Array . isArray ( current ) ) {
if ( Array . isArray ( value ) ) {
values [ name ] = current . concat ( value ) ;
} else {
current . push ( value ) ;
}
} else {
if ( Array . isArray ( value ) ) {
values [ name ] = [ current ] . concat ( value ) ;
} else {
values [ name ] = [ current , value ] ;
}
}
}
}
function processInputValue ( processed , values , errors , elt , validate ) {
if ( elt == null || haveSeenNode ( processed , elt ) ) {
return ;
} else {
processed . push ( elt ) ;
}
if ( shouldInclude ( elt ) ) {
var name = getRawAttribute ( elt , "name" ) ;
var value = elt . value ;
if ( elt . multiple ) {
value = toArray ( elt . querySelectorAll ( "option:checked" ) ) . map ( function ( e ) { return e . value } ) ;
}
// include file inputs
if ( elt . files ) {
value = toArray ( elt . files ) ;
}
addValueToValues ( name , value , values ) ;
if ( validate ) {
validateElement ( elt , errors ) ;
}
}
if ( matches ( elt , 'form' ) ) {
var inputs = elt . elements ;
forEach ( inputs , function ( input ) {
processInputValue ( processed , values , errors , input , validate ) ;
} ) ;
}
}
function validateElement ( element , errors ) {
if ( element . willValidate ) {
triggerEvent ( element , "htmx:validation:validate" )
if ( ! element . checkValidity ( ) ) {
errors . push ( { elt : element , message : element . validationMessage , validity : element . validity } ) ;
triggerEvent ( element , "htmx:validation:failed" , { message : element . validationMessage , validity : element . validity } )
}
}
}
/ * *
* @ param { HTMLElement } elt
* @ param { string } verb
* /
function getInputValues ( elt , verb ) {
var processed = [ ] ;
var values = { } ;
var formValues = { } ;
var errors = [ ] ;
var internalData = getInternalData ( elt ) ;
// only validate when form is directly submitted and novalidate or formnovalidate are not set
// or if the element has an explicit hx-validate="true" on it
var validate = ( matches ( elt , 'form' ) && elt . noValidate !== true ) || getAttributeValue ( elt , "hx-validate" ) === "true" ;
if ( internalData . lastButtonClicked ) {
validate = validate && internalData . lastButtonClicked . formNoValidate !== true ;
}
// for a non-GET include the closest form
if ( verb !== 'get' ) {
processInputValue ( processed , formValues , errors , closest ( elt , 'form' ) , validate ) ;
}
// include the element itself
processInputValue ( processed , values , errors , elt , validate ) ;
// if a button or submit was clicked last, include its value
if ( internalData . lastButtonClicked || elt . tagName === "BUTTON" ||
( elt . tagName === "INPUT" && getRawAttribute ( elt , "type" ) === "submit" ) ) {
var button = internalData . lastButtonClicked || elt
var name = getRawAttribute ( button , "name" )
addValueToValues ( name , button . value , formValues )
}
// include any explicit includes
var includes = findAttributeTargets ( elt , "hx-include" ) ;
forEach ( includes , function ( node ) {
processInputValue ( processed , values , errors , node , validate ) ;
// if a non-form is included, include any input values within it
if ( ! matches ( node , 'form' ) ) {
forEach ( node . querySelectorAll ( INPUT _SELECTOR ) , function ( descendant ) {
processInputValue ( processed , values , errors , descendant , validate ) ;
} )
}
} ) ;
// form values take precedence, overriding the regular values
values = mergeObjects ( values , formValues ) ;
return { errors : errors , values : values } ;
}
function appendParam ( returnStr , name , realValue ) {
if ( returnStr !== "" ) {
returnStr += "&" ;
}
if ( String ( realValue ) === "[object Object]" ) {
realValue = JSON . stringify ( realValue ) ;
}
var s = encodeURIComponent ( realValue ) ;
returnStr += encodeURIComponent ( name ) + "=" + s ;
return returnStr ;
}
function urlEncode ( values ) {
var returnStr = "" ;
for ( var name in values ) {
if ( values . hasOwnProperty ( name ) ) {
var value = values [ name ] ;
if ( Array . isArray ( value ) ) {
forEach ( value , function ( v ) {
returnStr = appendParam ( returnStr , name , v ) ;
} ) ;
} else {
returnStr = appendParam ( returnStr , name , value ) ;
}
}
}
return returnStr ;
}
function makeFormData ( values ) {
var formData = new FormData ( ) ;
for ( var name in values ) {
if ( values . hasOwnProperty ( name ) ) {
var value = values [ name ] ;
if ( Array . isArray ( value ) ) {
forEach ( value , function ( v ) {
formData . append ( name , v ) ;
} ) ;
} else {
formData . append ( name , value ) ;
}
}
}
return formData ;
}
//====================================================================
// Ajax
//====================================================================
/ * *
* @ param { HTMLElement } elt
* @ param { HTMLElement } target
* @ param { string } prompt
* @ returns { Object } // TODO: Define/Improve HtmxHeaderSpecification
* /
function getHeaders ( elt , target , prompt ) {
var headers = {
"HX-Request" : "true" ,
"HX-Trigger" : getRawAttribute ( elt , "id" ) ,
"HX-Trigger-Name" : getRawAttribute ( elt , "name" ) ,
"HX-Target" : getAttributeValue ( target , "id" ) ,
"HX-Current-URL" : getDocument ( ) . location . href ,
}
getValuesForElement ( elt , "hx-headers" , false , headers )
if ( prompt !== undefined ) {
headers [ "HX-Prompt" ] = prompt ;
}
if ( getInternalData ( elt ) . boosted ) {
headers [ "HX-Boosted" ] = "true" ;
}
return headers ;
}
/ * *
* filterValues takes an object containing form input values
* and returns a new object that only contains keys that are
* specified by the closest "hx-params" attribute
* @ param { Object } inputValues
* @ param { HTMLElement } elt
* @ returns { Object }
* /
function filterValues ( inputValues , elt ) {
var paramsValue = getClosestAttributeValue ( elt , "hx-params" ) ;
if ( paramsValue ) {
if ( paramsValue === "none" ) {
return { } ;
} else if ( paramsValue === "*" ) {
return inputValues ;
} else if ( paramsValue . indexOf ( "not " ) === 0 ) {
forEach ( paramsValue . substr ( 4 ) . split ( "," ) , function ( name ) {
name = name . trim ( ) ;
delete inputValues [ name ] ;
} ) ;
return inputValues ;
} else {
var newValues = { }
forEach ( paramsValue . split ( "," ) , function ( name ) {
name = name . trim ( ) ;
newValues [ name ] = inputValues [ name ] ;
} ) ;
return newValues ;
}
} else {
return inputValues ;
}
}
function isAnchorLink ( elt ) {
return getRawAttribute ( elt , 'href' ) && getRawAttribute ( elt , 'href' ) . indexOf ( "#" ) >= 0
}
/ * *
*
* @ param { HTMLElement } elt
* @ param { string } swapInfoOverride
* @ returns { import ( "./htmx" ) . HtmxSwapSpecification }
* /
function getSwapSpecification ( elt , swapInfoOverride ) {
var swapInfo = swapInfoOverride ? swapInfoOverride : getClosestAttributeValue ( elt , "hx-swap" ) ;
var swapSpec = {
"swapStyle" : getInternalData ( elt ) . boosted ? 'innerHTML' : htmx . config . defaultSwapStyle ,
"swapDelay" : htmx . config . defaultSwapDelay ,
"settleDelay" : htmx . config . defaultSettleDelay
}
if ( getInternalData ( elt ) . boosted && ! isAnchorLink ( elt ) ) {
swapSpec [ "show" ] = "top"
}
if ( swapInfo ) {
var split = splitOnWhitespace ( swapInfo ) ;
if ( split . length > 0 ) {
for ( var i = 0 ; i < split . length ; i ++ ) {
var value = split [ i ] ;
if ( value . indexOf ( "swap:" ) === 0 ) {
swapSpec [ "swapDelay" ] = parseInterval ( value . substr ( 5 ) ) ;
} else if ( value . indexOf ( "settle:" ) === 0 ) {
swapSpec [ "settleDelay" ] = parseInterval ( value . substr ( 7 ) ) ;
} else if ( value . indexOf ( "transition:" ) === 0 ) {
swapSpec [ "transition" ] = value . substr ( 11 ) === "true" ;
} else if ( value . indexOf ( "ignoreTitle:" ) === 0 ) {
swapSpec [ "ignoreTitle" ] = value . substr ( 12 ) === "true" ;
} else if ( value . indexOf ( "scroll:" ) === 0 ) {
var scrollSpec = value . substr ( 7 ) ;
var splitSpec = scrollSpec . split ( ":" ) ;
var scrollVal = splitSpec . pop ( ) ;
var selectorVal = splitSpec . length > 0 ? splitSpec . join ( ":" ) : null ;
swapSpec [ "scroll" ] = scrollVal ;
swapSpec [ "scrollTarget" ] = selectorVal ;
} else if ( value . indexOf ( "show:" ) === 0 ) {
var showSpec = value . substr ( 5 ) ;
var splitSpec = showSpec . split ( ":" ) ;
var showVal = splitSpec . pop ( ) ;
var selectorVal = splitSpec . length > 0 ? splitSpec . join ( ":" ) : null ;
swapSpec [ "show" ] = showVal ;
swapSpec [ "showTarget" ] = selectorVal ;
} else if ( value . indexOf ( "focus-scroll:" ) === 0 ) {
var focusScrollVal = value . substr ( "focus-scroll:" . length ) ;
swapSpec [ "focusScroll" ] = focusScrollVal == "true" ;
} else if ( i == 0 ) {
swapSpec [ "swapStyle" ] = value ;
} else {
logError ( 'Unknown modifier in hx-swap: ' + value ) ;
}
}
}
}
return swapSpec ;
}
function usesFormData ( elt ) {
return getClosestAttributeValue ( elt , "hx-encoding" ) === "multipart/form-data" ||
( matches ( elt , "form" ) && getRawAttribute ( elt , 'enctype' ) === "multipart/form-data" ) ;
}
function encodeParamsForBody ( xhr , elt , filteredParameters ) {
var encodedParameters = null ;
withExtensions ( elt , function ( extension ) {
if ( encodedParameters == null ) {
encodedParameters = extension . encodeParameters ( xhr , filteredParameters , elt ) ;
}
} ) ;
if ( encodedParameters != null ) {
return encodedParameters ;
} else {
if ( usesFormData ( elt ) ) {
return makeFormData ( filteredParameters ) ;
} else {
return urlEncode ( filteredParameters ) ;
}
}
}
/ * *
*
* @ param { Element } target
* @ returns { import ( "./htmx" ) . HtmxSettleInfo }
* /
function makeSettleInfo ( target ) {
return { tasks : [ ] , elts : [ target ] } ;
}
function updateScrollState ( content , swapSpec ) {
var first = content [ 0 ] ;
var last = content [ content . length - 1 ] ;
if ( swapSpec . scroll ) {
var target = null ;
if ( swapSpec . scrollTarget ) {
target = querySelectorExt ( first , swapSpec . scrollTarget ) ;
}
if ( swapSpec . scroll === "top" && ( first || target ) ) {
target = target || first ;
target . scrollTop = 0 ;
}
if ( swapSpec . scroll === "bottom" && ( last || target ) ) {
target = target || last ;
target . scrollTop = target . scrollHeight ;
}
}
if ( swapSpec . show ) {
var target = null ;
if ( swapSpec . showTarget ) {
var targetStr = swapSpec . showTarget ;
if ( swapSpec . showTarget === "window" ) {
targetStr = "body" ;
}
target = querySelectorExt ( first , targetStr ) ;
}
if ( swapSpec . show === "top" && ( first || target ) ) {
target = target || first ;
target . scrollIntoView ( { block : 'start' , behavior : htmx . config . scrollBehavior } ) ;
}
if ( swapSpec . show === "bottom" && ( last || target ) ) {
target = target || last ;
target . scrollIntoView ( { block : 'end' , behavior : htmx . config . scrollBehavior } ) ;
}
}
}
/ * *
* @ param { HTMLElement } elt
* @ param { string } attr
* @ param { boolean = } evalAsDefault
* @ param { Object = } values
* @ returns { Object }
* /
function getValuesForElement ( elt , attr , evalAsDefault , values ) {
if ( values == null ) {
values = { } ;
}
if ( elt == null ) {
return values ;
}
var attributeValue = getAttributeValue ( elt , attr ) ;
if ( attributeValue ) {
var str = attributeValue . trim ( ) ;
var evaluateValue = evalAsDefault ;
if ( str === "unset" ) {
return null ;
}
if ( str . indexOf ( "javascript:" ) === 0 ) {
str = str . substr ( 11 ) ;
evaluateValue = true ;
} else if ( str . indexOf ( "js:" ) === 0 ) {
str = str . substr ( 3 ) ;
evaluateValue = true ;
}
if ( str . indexOf ( '{' ) !== 0 ) {
str = "{" + str + "}" ;
}
var varsValues ;
if ( evaluateValue ) {
varsValues = maybeEval ( elt , function ( ) { return Function ( "return (" + str + ")" ) ( ) ; } , { } ) ;
} else {
varsValues = parseJSON ( str ) ;
}
for ( var key in varsValues ) {
if ( varsValues . hasOwnProperty ( key ) ) {
if ( values [ key ] == null ) {
values [ key ] = varsValues [ key ] ;
}
}
}
}
return getValuesForElement ( parentElt ( elt ) , attr , evalAsDefault , values ) ;
}
function maybeEval ( elt , toEval , defaultVal ) {
if ( htmx . config . allowEval ) {
return toEval ( ) ;
} else {
triggerErrorEvent ( elt , 'htmx:evalDisallowedError' ) ;
return defaultVal ;
}
}
/ * *
* @ param { HTMLElement } elt
* @ param { * } expressionVars
* @ returns
* /
function getHXVarsForElement ( elt , expressionVars ) {
return getValuesForElement ( elt , "hx-vars" , true , expressionVars ) ;
}
/ * *
* @ param { HTMLElement } elt
* @ param { * } expressionVars
* @ returns
* /
function getHXValsForElement ( elt , expressionVars ) {
return getValuesForElement ( elt , "hx-vals" , false , expressionVars ) ;
}
/ * *
* @ param { HTMLElement } elt
* @ returns { Object }
* /
function getExpressionVars ( elt ) {
return mergeObjects ( getHXVarsForElement ( elt ) , getHXValsForElement ( elt ) ) ;
}
function safelySetHeaderValue ( xhr , header , headerValue ) {
if ( headerValue !== null ) {
try {
xhr . setRequestHeader ( header , headerValue ) ;
} catch ( e ) {
// On an exception, try to set the header URI encoded instead
xhr . setRequestHeader ( header , encodeURIComponent ( headerValue ) ) ;
xhr . setRequestHeader ( header + "-URI-AutoEncoded" , "true" ) ;
}
}
}
function getPathFromResponse ( xhr ) {
// NB: IE11 does not support this stuff
if ( xhr . responseURL && typeof ( URL ) !== "undefined" ) {
try {
var url = new URL ( xhr . responseURL ) ;
return url . pathname + url . search ;
} catch ( e ) {
triggerErrorEvent ( getDocument ( ) . body , "htmx:badResponseUrl" , { url : xhr . responseURL } ) ;
}
}
}
function hasHeader ( xhr , regexp ) {
return xhr . getAllResponseHeaders ( ) . match ( regexp ) ;
}
function ajaxHelper ( verb , path , context ) {
verb = verb . toLowerCase ( ) ;
if ( context ) {
if ( context instanceof Element || isType ( context , 'String' ) ) {
return issueAjaxRequest ( verb , path , null , null , {
targetOverride : resolveTarget ( context ) ,
returnPromise : true
} ) ;
} else {
return issueAjaxRequest ( verb , path , resolveTarget ( context . source ) , context . event ,
{
handler : context . handler ,
headers : context . headers ,
values : context . values ,
targetOverride : resolveTarget ( context . target ) ,
swapOverride : context . swap ,
returnPromise : true
} ) ;
}
} else {
return issueAjaxRequest ( verb , path , null , null , {
returnPromise : true
} ) ;
}
}
function hierarchyForElt ( elt ) {
var arr = [ ] ;
while ( elt ) {
arr . push ( elt ) ;
elt = elt . parentElement ;
}
return arr ;
}
function verifyPath ( elt , path , requestConfig ) {
var sameHost
var url
if ( typeof URL === "function" ) {
url = new URL ( path , document . location . href ) ;
var origin = document . location . origin ;
sameHost = origin === url . origin ;
} else {
// IE11 doesn't support URL
url = path
sameHost = startsWith ( path , document . location . origin )
}
if ( htmx . config . selfRequestsOnly ) {
if ( ! sameHost ) {
return false ;
}
}
return triggerEvent ( elt , "htmx:validateUrl" , mergeObjects ( { url : url , sameHost : sameHost } , requestConfig ) ) ;
}
function issueAjaxRequest ( verb , path , elt , event , etc , confirmed ) {
var resolve = null ;
var reject = null ;
etc = etc != null ? etc : { } ;
if ( etc . returnPromise && typeof Promise !== "undefined" ) {
var promise = new Promise ( function ( _resolve , _reject ) {
resolve = _resolve ;
reject = _reject ;
} ) ;
}
if ( elt == null ) {
elt = getDocument ( ) . body ;
}
var responseHandler = etc . handler || handleAjaxResponse ;
if ( ! bodyContains ( elt ) ) {
// do not issue requests for elements removed from the DOM
maybeCall ( resolve ) ;
return promise ;
}
var target = etc . targetOverride || getTarget ( elt ) ;
if ( target == null || target == DUMMY _ELT ) {
triggerErrorEvent ( elt , 'htmx:targetError' , { target : getAttributeValue ( elt , "hx-target" ) } ) ;
maybeCall ( reject ) ;
return promise ;
}
var eltData = getInternalData ( elt ) ;
var submitter = eltData . lastButtonClicked ;
if ( submitter ) {
var buttonPath = getRawAttribute ( submitter , "formaction" ) ;
if ( buttonPath != null ) {
path = buttonPath ;
}
var buttonVerb = getRawAttribute ( submitter , "formmethod" )
if ( buttonVerb != null ) {
verb = buttonVerb ;
}
}
// allow event-based confirmation w/ a callback
if ( ! confirmed ) {
var issueRequest = function ( ) {
return issueAjaxRequest ( verb , path , elt , event , etc , true ) ;
}
var confirmDetails = { target : target , elt : elt , path : path , verb : verb , triggeringEvent : event , etc : etc , issueRequest : issueRequest } ;
if ( triggerEvent ( elt , 'htmx:confirm' , confirmDetails ) === false ) {
maybeCall ( resolve ) ;
return promise ;
}
}
var syncElt = elt ;
var syncStrategy = getClosestAttributeValue ( elt , "hx-sync" ) ;
var queueStrategy = null ;
var abortable = false ;
if ( syncStrategy ) {
var syncStrings = syncStrategy . split ( ":" ) ;
var selector = syncStrings [ 0 ] . trim ( ) ;
if ( selector === "this" ) {
syncElt = findThisElement ( elt , 'hx-sync' ) ;
} else {
syncElt = querySelectorExt ( elt , selector ) ;
}
// default to the drop strategy
syncStrategy = ( syncStrings [ 1 ] || 'drop' ) . trim ( ) ;
eltData = getInternalData ( syncElt ) ;
if ( syncStrategy === "drop" && eltData . xhr && eltData . abortable !== true ) {
maybeCall ( resolve ) ;
return promise ;
} else if ( syncStrategy === "abort" ) {
if ( eltData . xhr ) {
maybeCall ( resolve ) ;
return promise ;
} else {
abortable = true ;
}
} else if ( syncStrategy === "replace" ) {
triggerEvent ( syncElt , 'htmx:abort' ) ; // abort the current request and continue
} else if ( syncStrategy . indexOf ( "queue" ) === 0 ) {
var queueStrArray = syncStrategy . split ( " " ) ;
queueStrategy = ( queueStrArray [ 1 ] || "last" ) . trim ( ) ;
}
}
if ( eltData . xhr ) {
if ( eltData . abortable ) {
triggerEvent ( syncElt , 'htmx:abort' ) ; // abort the current request and continue
} else {
if ( queueStrategy == null ) {
if ( event ) {
var eventData = getInternalData ( event ) ;
if ( eventData && eventData . triggerSpec && eventData . triggerSpec . queue ) {
queueStrategy = eventData . triggerSpec . queue ;
}
}
if ( queueStrategy == null ) {
queueStrategy = "last" ;
}
}
if ( eltData . queuedRequests == null ) {
eltData . queuedRequests = [ ] ;
}
if ( queueStrategy === "first" && eltData . queuedRequests . length === 0 ) {
eltData . queuedRequests . push ( function ( ) {
issueAjaxRequest ( verb , path , elt , event , etc )
} ) ;
} else if ( queueStrategy === "all" ) {
eltData . queuedRequests . push ( function ( ) {
issueAjaxRequest ( verb , path , elt , event , etc )
} ) ;
} else if ( queueStrategy === "last" ) {
eltData . queuedRequests = [ ] ; // dump existing queue
eltData . queuedRequests . push ( function ( ) {
issueAjaxRequest ( verb , path , elt , event , etc )
} ) ;
}
maybeCall ( resolve ) ;
return promise ;
}
}
var xhr = new XMLHttpRequest ( ) ;
eltData . xhr = xhr ;
eltData . abortable = abortable ;
var endRequestLock = function ( ) {
eltData . xhr = null ;
eltData . abortable = false ;
if ( eltData . queuedRequests != null &&
eltData . queuedRequests . length > 0 ) {
var queuedRequest = eltData . queuedRequests . shift ( ) ;
queuedRequest ( ) ;
}
}
var promptQuestion = getClosestAttributeValue ( elt , "hx-prompt" ) ;
if ( promptQuestion ) {
var promptResponse = prompt ( promptQuestion ) ;
// prompt returns null if cancelled and empty string if accepted with no entry
if ( promptResponse === null ||
! triggerEvent ( elt , 'htmx:prompt' , { prompt : promptResponse , target : target } ) ) {
maybeCall ( resolve ) ;
endRequestLock ( ) ;
return promise ;
}
}
var confirmQuestion = getClosestAttributeValue ( elt , "hx-confirm" ) ;
if ( confirmQuestion ) {
if ( ! confirm ( confirmQuestion ) ) {
maybeCall ( resolve ) ;
endRequestLock ( )
return promise ;
}
}
var headers = getHeaders ( elt , target , promptResponse ) ;
if ( etc . headers ) {
headers = mergeObjects ( headers , etc . headers ) ;
}
var results = getInputValues ( elt , verb ) ;
var errors = results . errors ;
var rawParameters = results . values ;
if ( etc . values ) {
rawParameters = mergeObjects ( rawParameters , etc . values ) ;
}
var expressionVars = getExpressionVars ( elt ) ;
var allParameters = mergeObjects ( rawParameters , expressionVars ) ;
var filteredParameters = filterValues ( allParameters , elt ) ;
if ( verb !== 'get' && ! usesFormData ( elt ) ) {
headers [ 'Content-Type' ] = 'application/x-www-form-urlencoded' ;
}
if ( htmx . config . getCacheBusterParam && verb === 'get' ) {
filteredParameters [ 'org.htmx.cache-buster' ] = getRawAttribute ( target , "id" ) || "true" ;
}
// behavior of anchors w/ empty href is to use the current URL
if ( path == null || path === "" ) {
path = getDocument ( ) . location . href ;
}
var requestAttrValues = getValuesForElement ( elt , 'hx-request' ) ;
var eltIsBoosted = getInternalData ( elt ) . boosted ;
var useUrlParams = htmx . config . methodsThatUseUrlParams . indexOf ( verb ) >= 0
var requestConfig = {
boosted : eltIsBoosted ,
useUrlParams : useUrlParams ,
parameters : filteredParameters ,
unfilteredParameters : allParameters ,
headers : headers ,
target : target ,
verb : verb ,
errors : errors ,
withCredentials : etc . credentials || requestAttrValues . credentials || htmx . config . withCredentials ,
timeout : etc . timeout || requestAttrValues . timeout || htmx . config . timeout ,
path : path ,
triggeringEvent : event
} ;
if ( ! triggerEvent ( elt , 'htmx:configRequest' , requestConfig ) ) {
maybeCall ( resolve ) ;
endRequestLock ( ) ;
return promise ;
}
// copy out in case the object was overwritten
path = requestConfig . path ;
verb = requestConfig . verb ;
headers = requestConfig . headers ;
filteredParameters = requestConfig . parameters ;
errors = requestConfig . errors ;
useUrlParams = requestConfig . useUrlParams ;
if ( errors && errors . length > 0 ) {
triggerEvent ( elt , 'htmx:validation:halted' , requestConfig )
maybeCall ( resolve ) ;
endRequestLock ( ) ;
return promise ;
}
var splitPath = path . split ( "#" ) ;
var pathNoAnchor = splitPath [ 0 ] ;
var anchor = splitPath [ 1 ] ;
var finalPath = path
if ( useUrlParams ) {
finalPath = pathNoAnchor ;
var values = Object . keys ( filteredParameters ) . length !== 0 ;
if ( values ) {
if ( finalPath . indexOf ( "?" ) < 0 ) {
finalPath += "?" ;
} else {
finalPath += "&" ;
}
finalPath += urlEncode ( filteredParameters ) ;
if ( anchor ) {
finalPath += "#" + anchor ;
}
}
}
if ( ! verifyPath ( elt , finalPath , requestConfig ) ) {
triggerErrorEvent ( elt , 'htmx:invalidPath' , requestConfig )
maybeCall ( reject ) ;
return promise ;
} ;
xhr . open ( verb . toUpperCase ( ) , finalPath , true ) ;
xhr . overrideMimeType ( "text/html" ) ;
xhr . withCredentials = requestConfig . withCredentials ;
xhr . timeout = requestConfig . timeout ;
// request headers
if ( requestAttrValues . noHeaders ) {
// ignore all headers
} else {
for ( var header in headers ) {
if ( headers . hasOwnProperty ( header ) ) {
var headerValue = headers [ header ] ;
safelySetHeaderValue ( xhr , header , headerValue ) ;
}
}
}
var responseInfo = {
xhr : xhr , target : target , requestConfig : requestConfig , etc : etc , boosted : eltIsBoosted ,
pathInfo : {
requestPath : path ,
finalRequestPath : finalPath ,
anchor : anchor
}
} ;
xhr . onload = function ( ) {
try {
var hierarchy = hierarchyForElt ( elt ) ;
responseInfo . pathInfo . responsePath = getPathFromResponse ( xhr ) ;
responseHandler ( elt , responseInfo ) ;
removeRequestIndicators ( indicators , disableElts ) ;
triggerEvent ( elt , 'htmx:afterRequest' , responseInfo ) ;
triggerEvent ( elt , 'htmx:afterOnLoad' , responseInfo ) ;
// if the body no longer contains the element, trigger the event on the closest parent
// remaining in the DOM
if ( ! bodyContains ( elt ) ) {
var secondaryTriggerElt = null ;
while ( hierarchy . length > 0 && secondaryTriggerElt == null ) {
var parentEltInHierarchy = hierarchy . shift ( ) ;
if ( bodyContains ( parentEltInHierarchy ) ) {
secondaryTriggerElt = parentEltInHierarchy ;
}
}
if ( secondaryTriggerElt ) {
triggerEvent ( secondaryTriggerElt , 'htmx:afterRequest' , responseInfo ) ;
triggerEvent ( secondaryTriggerElt , 'htmx:afterOnLoad' , responseInfo ) ;
}
}
maybeCall ( resolve ) ;
endRequestLock ( ) ;
} catch ( e ) {
triggerErrorEvent ( elt , 'htmx:onLoadError' , mergeObjects ( { error : e } , responseInfo ) ) ;
throw e ;
}
}
xhr . onerror = function ( ) {
removeRequestIndicators ( indicators , disableElts ) ;
triggerErrorEvent ( elt , 'htmx:afterRequest' , responseInfo ) ;
triggerErrorEvent ( elt , 'htmx:sendError' , responseInfo ) ;
maybeCall ( reject ) ;
endRequestLock ( ) ;
}
xhr . onabort = function ( ) {
removeRequestIndicators ( indicators , disableElts ) ;
triggerErrorEvent ( elt , 'htmx:afterRequest' , responseInfo ) ;
triggerErrorEvent ( elt , 'htmx:sendAbort' , responseInfo ) ;
maybeCall ( reject ) ;
endRequestLock ( ) ;
}
xhr . ontimeout = function ( ) {
removeRequestIndicators ( indicators , disableElts ) ;
triggerErrorEvent ( elt , 'htmx:afterRequest' , responseInfo ) ;
triggerErrorEvent ( elt , 'htmx:timeout' , responseInfo ) ;
maybeCall ( reject ) ;
endRequestLock ( ) ;
}
if ( ! triggerEvent ( elt , 'htmx:beforeRequest' , responseInfo ) ) {
maybeCall ( resolve ) ;
endRequestLock ( )
return promise
}
var indicators = addRequestIndicatorClasses ( elt ) ;
var disableElts = disableElements ( elt ) ;
forEach ( [ 'loadstart' , 'loadend' , 'progress' , 'abort' ] , function ( eventName ) {
forEach ( [ xhr , xhr . upload ] , function ( target ) {
target . addEventListener ( eventName , function ( event ) {
triggerEvent ( elt , "htmx:xhr:" + eventName , {
lengthComputable : event . lengthComputable ,
loaded : event . loaded ,
total : event . total
} ) ;
} )
} ) ;
} ) ;
triggerEvent ( elt , 'htmx:beforeSend' , responseInfo ) ;
var params = useUrlParams ? null : encodeParamsForBody ( xhr , elt , filteredParameters )
xhr . send ( params ) ;
return promise ;
}
function determineHistoryUpdates ( elt , responseInfo ) {
var xhr = responseInfo . xhr ;
//===========================================
// First consult response headers
//===========================================
var pathFromHeaders = null ;
var typeFromHeaders = null ;
if ( hasHeader ( xhr , /HX-Push:/i ) ) {
pathFromHeaders = xhr . getResponseHeader ( "HX-Push" ) ;
typeFromHeaders = "push" ;
} else if ( hasHeader ( xhr , /HX-Push-Url:/i ) ) {
pathFromHeaders = xhr . getResponseHeader ( "HX-Push-Url" ) ;
typeFromHeaders = "push" ;
} else if ( hasHeader ( xhr , /HX-Replace-Url:/i ) ) {
pathFromHeaders = xhr . getResponseHeader ( "HX-Replace-Url" ) ;
typeFromHeaders = "replace" ;
}
// if there was a response header, that has priority
if ( pathFromHeaders ) {
if ( pathFromHeaders === "false" ) {
return { }
} else {
return {
type : typeFromHeaders ,
path : pathFromHeaders
}
}
}
//===========================================
// Next resolve via DOM values
//===========================================
var requestPath = responseInfo . pathInfo . finalRequestPath ;
var responsePath = responseInfo . pathInfo . responsePath ;
var pushUrl = getClosestAttributeValue ( elt , "hx-push-url" ) ;
var replaceUrl = getClosestAttributeValue ( elt , "hx-replace-url" ) ;
var elementIsBoosted = getInternalData ( elt ) . boosted ;
var saveType = null ;
var path = null ;
if ( pushUrl ) {
saveType = "push" ;
path = pushUrl ;
} else if ( replaceUrl ) {
saveType = "replace" ;
path = replaceUrl ;
} else if ( elementIsBoosted ) {
saveType = "push" ;
path = responsePath || requestPath ; // if there is no response path, go with the original request path
}
if ( path ) {
// false indicates no push, return empty object
if ( path === "false" ) {
return { } ;
}
// true indicates we want to follow wherever the server ended up sending us
if ( path === "true" ) {
path = responsePath || requestPath ; // if there is no response path, go with the original request path
}
// restore any anchor associated with the request
if ( responseInfo . pathInfo . anchor &&
path . indexOf ( "#" ) === - 1 ) {
path = path + "#" + responseInfo . pathInfo . anchor ;
}
return {
type : saveType ,
path : path
}
} else {
return { } ;
}
}
function handleAjaxResponse ( elt , responseInfo ) {
var xhr = responseInfo . xhr ;
var target = responseInfo . target ;
var etc = responseInfo . etc ;
var requestConfig = responseInfo . requestConfig ;
if ( ! triggerEvent ( elt , 'htmx:beforeOnLoad' , responseInfo ) ) return ;
if ( hasHeader ( xhr , /HX-Trigger:/i ) ) {
handleTrigger ( xhr , "HX-Trigger" , elt ) ;
}
if ( hasHeader ( xhr , /HX-Location:/i ) ) {
saveCurrentPageToHistory ( ) ;
var redirectPath = xhr . getResponseHeader ( "HX-Location" ) ;
var swapSpec ;
if ( redirectPath . indexOf ( "{" ) === 0 ) {
swapSpec = parseJSON ( redirectPath ) ;
// what's the best way to throw an error if the user didn't include this
redirectPath = swapSpec [ 'path' ] ;
delete swapSpec [ 'path' ] ;
}
ajaxHelper ( 'GET' , redirectPath , swapSpec ) . then ( function ( ) {
pushUrlIntoHistory ( redirectPath ) ;
} ) ;
return ;
}
var shouldRefresh = hasHeader ( xhr , /HX-Refresh:/i ) && "true" === xhr . getResponseHeader ( "HX-Refresh" ) ;
if ( hasHeader ( xhr , /HX-Redirect:/i ) ) {
location . href = xhr . getResponseHeader ( "HX-Redirect" ) ;
shouldRefresh && location . reload ( ) ;
return ;
}
if ( shouldRefresh ) {
location . reload ( ) ;
return ;
}
if ( hasHeader ( xhr , /HX-Retarget:/i ) ) {
responseInfo . target = getDocument ( ) . querySelector ( xhr . getResponseHeader ( "HX-Retarget" ) ) ;
}
var historyUpdate = determineHistoryUpdates ( elt , responseInfo ) ;
// by default htmx only swaps on 200 return codes and does not swap
// on 204 'No Content'
// this can be ovverriden by responding to the htmx:beforeSwap event and
// overriding the detail.shouldSwap property
var shouldSwap = xhr . status >= 200 && xhr . status < 400 && xhr . status !== 204 ;
var serverResponse = xhr . response ;
var isError = xhr . status >= 400 ;
var ignoreTitle = htmx . config . ignoreTitle
var beforeSwapDetails = mergeObjects ( { shouldSwap : shouldSwap , serverResponse : serverResponse , isError : isError , ignoreTitle : ignoreTitle } , responseInfo ) ;
if ( ! triggerEvent ( target , 'htmx:beforeSwap' , beforeSwapDetails ) ) return ;
target = beforeSwapDetails . target ; // allow re-targeting
serverResponse = beforeSwapDetails . serverResponse ; // allow updating content
isError = beforeSwapDetails . isError ; // allow updating error
ignoreTitle = beforeSwapDetails . ignoreTitle ; // allow updating ignoring title
responseInfo . target = target ; // Make updated target available to response events
responseInfo . failed = isError ; // Make failed property available to response events
responseInfo . successful = ! isError ; // Make successful property available to response events
if ( beforeSwapDetails . shouldSwap ) {
if ( xhr . status === 286 ) {
cancelPolling ( elt ) ;
}
withExtensions ( elt , function ( extension ) {
serverResponse = extension . transformResponse ( serverResponse , xhr , elt ) ;
} ) ;
// Save current page if there will be a history update
if ( historyUpdate . type ) {
saveCurrentPageToHistory ( ) ;
}
var swapOverride = etc . swapOverride ;
if ( hasHeader ( xhr , /HX-Reswap:/i ) ) {
swapOverride = xhr . getResponseHeader ( "HX-Reswap" ) ;
}
var swapSpec = getSwapSpecification ( elt , swapOverride ) ;
if ( swapSpec . hasOwnProperty ( 'ignoreTitle' ) ) {
ignoreTitle = swapSpec . ignoreTitle ;
}
target . classList . add ( htmx . config . swappingClass ) ;
// optional transition API promise callbacks
var settleResolve = null ;
var settleReject = null ;
var doSwap = function ( ) {
try {
var activeElt = document . activeElement ;
var selectionInfo = { } ;
try {
selectionInfo = {
elt : activeElt ,
// @ts-ignore
start : activeElt ? activeElt . selectionStart : null ,
// @ts-ignore
end : activeElt ? activeElt . selectionEnd : null
} ;
} catch ( e ) {
// safari issue - see https://github.com/microsoft/playwright/issues/5894
}
var selectOverride ;
if ( hasHeader ( xhr , /HX-Reselect:/i ) ) {
selectOverride = xhr . getResponseHeader ( "HX-Reselect" ) ;
}
var settleInfo = makeSettleInfo ( target ) ;
selectAndSwap ( swapSpec . swapStyle , target , elt , serverResponse , settleInfo , selectOverride ) ;
if ( selectionInfo . elt &&
! bodyContains ( selectionInfo . elt ) &&
getRawAttribute ( selectionInfo . elt , "id" ) ) {
var newActiveElt = document . getElementById ( getRawAttribute ( selectionInfo . elt , "id" ) ) ;
var focusOptions = { preventScroll : swapSpec . focusScroll !== undefined ? ! swapSpec . focusScroll : ! htmx . config . defaultFocusScroll } ;
if ( newActiveElt ) {
// @ts-ignore
if ( selectionInfo . start && newActiveElt . setSelectionRange ) {
// @ts-ignore
try {
newActiveElt . setSelectionRange ( selectionInfo . start , selectionInfo . end ) ;
} catch ( e ) {
// the setSelectionRange method is present on fields that don't support it, so just let this fail
}
}
newActiveElt . focus ( focusOptions ) ;
}
}
target . classList . remove ( htmx . config . swappingClass ) ;
forEach ( settleInfo . elts , function ( elt ) {
if ( elt . classList ) {
elt . classList . add ( htmx . config . settlingClass ) ;
}
triggerEvent ( elt , 'htmx:afterSwap' , responseInfo ) ;
} ) ;
if ( hasHeader ( xhr , /HX-Trigger-After-Swap:/i ) ) {
var finalElt = elt ;
if ( ! bodyContains ( elt ) ) {
finalElt = getDocument ( ) . body ;
}
handleTrigger ( xhr , "HX-Trigger-After-Swap" , finalElt ) ;
}
var doSettle = function ( ) {
forEach ( settleInfo . tasks , function ( task ) {
task . call ( ) ;
} ) ;
forEach ( settleInfo . elts , function ( elt ) {
if ( elt . classList ) {
elt . classList . remove ( htmx . config . settlingClass ) ;
}
triggerEvent ( elt , 'htmx:afterSettle' , responseInfo ) ;
} ) ;
// if we need to save history, do so
if ( historyUpdate . type ) {
if ( historyUpdate . type === "push" ) {
pushUrlIntoHistory ( historyUpdate . path ) ;
triggerEvent ( getDocument ( ) . body , 'htmx:pushedIntoHistory' , { path : historyUpdate . path } ) ;
} else {
replaceUrlInHistory ( historyUpdate . path ) ;
triggerEvent ( getDocument ( ) . body , 'htmx:replacedInHistory' , { path : historyUpdate . path } ) ;
}
}
if ( responseInfo . pathInfo . anchor ) {
var anchorTarget = find ( "#" + responseInfo . pathInfo . anchor ) ;
if ( anchorTarget ) {
anchorTarget . scrollIntoView ( { block : 'start' , behavior : "auto" } ) ;
}
}
if ( settleInfo . title && ! ignoreTitle ) {
var titleElt = find ( "title" ) ;
if ( titleElt ) {
titleElt . innerHTML = settleInfo . title ;
} else {
window . document . title = settleInfo . title ;
}
}
updateScrollState ( settleInfo . elts , swapSpec ) ;
if ( hasHeader ( xhr , /HX-Trigger-After-Settle:/i ) ) {
var finalElt = elt ;
if ( ! bodyContains ( elt ) ) {
finalElt = getDocument ( ) . body ;
}
handleTrigger ( xhr , "HX-Trigger-After-Settle" , finalElt ) ;
}
maybeCall ( settleResolve ) ;
}
if ( swapSpec . settleDelay > 0 ) {
setTimeout ( doSettle , swapSpec . settleDelay )
} else {
doSettle ( ) ;
}
} catch ( e ) {
triggerErrorEvent ( elt , 'htmx:swapError' , responseInfo ) ;
maybeCall ( settleReject ) ;
throw e ;
}
} ;
var shouldTransition = htmx . config . globalViewTransitions
if ( swapSpec . hasOwnProperty ( 'transition' ) ) {
shouldTransition = swapSpec . transition ;
}
if ( shouldTransition &&
triggerEvent ( elt , 'htmx:beforeTransition' , responseInfo ) &&
typeof Promise !== "undefined" && document . startViewTransition ) {
var settlePromise = new Promise ( function ( _resolve , _reject ) {
settleResolve = _resolve ;
settleReject = _reject ;
} ) ;
// wrap the original doSwap() in a call to startViewTransition()
var innerDoSwap = doSwap ;
doSwap = function ( ) {
document . startViewTransition ( function ( ) {
innerDoSwap ( ) ;
return settlePromise ;
} ) ;
}
}
if ( swapSpec . swapDelay > 0 ) {
setTimeout ( doSwap , swapSpec . swapDelay )
} else {
doSwap ( ) ;
}
}
if ( isError ) {
triggerErrorEvent ( elt , 'htmx:responseError' , mergeObjects ( { error : "Response Status Error Code " + xhr . status + " from " + responseInfo . pathInfo . requestPath } , responseInfo ) ) ;
}
}
//====================================================================
// Extensions API
//====================================================================
/** @type {Object<string, import("./htmx").HtmxExtension>} */
var extensions = { } ;
/ * *
* extensionBase defines the default functions for all extensions .
* @ returns { import ( "./htmx" ) . HtmxExtension }
* /
function extensionBase ( ) {
return {
init : function ( api ) { return null ; } ,
onEvent : function ( name , evt ) { return true ; } ,
transformResponse : function ( text , xhr , elt ) { return text ; } ,
isInlineSwap : function ( swapStyle ) { return false ; } ,
handleSwap : function ( swapStyle , target , fragment , settleInfo ) { return false ; } ,
encodeParameters : function ( xhr , parameters , elt ) { return null ; }
}
}
/ * *
* defineExtension initializes the extension and adds it to the htmx registry
*
* @ param { string } name
* @ param { import ( "./htmx" ) . HtmxExtension } extension
* /
function defineExtension ( name , extension ) {
if ( extension . init ) {
extension . init ( internalAPI )
}
extensions [ name ] = mergeObjects ( extensionBase ( ) , extension ) ;
}
/ * *
* removeExtension removes an extension from the htmx registry
*
* @ param { string } name
* /
function removeExtension ( name ) {
delete extensions [ name ] ;
}
/ * *
* getExtensions searches up the DOM tree to return all extensions that can be applied to a given element
*
* @ param { HTMLElement } elt
* @ param { import ( "./htmx" ) . HtmxExtension [ ] = } extensionsToReturn
* @ param { import ( "./htmx" ) . HtmxExtension [ ] = } extensionsToIgnore
* /
function getExtensions ( elt , extensionsToReturn , extensionsToIgnore ) {
if ( elt == undefined ) {
return extensionsToReturn ;
}
if ( extensionsToReturn == undefined ) {
extensionsToReturn = [ ] ;
}
if ( extensionsToIgnore == undefined ) {
extensionsToIgnore = [ ] ;
}
var extensionsForElement = getAttributeValue ( elt , "hx-ext" ) ;
if ( extensionsForElement ) {
forEach ( extensionsForElement . split ( "," ) , function ( extensionName ) {
extensionName = extensionName . replace ( / /g , '' ) ;
if ( extensionName . slice ( 0 , 7 ) == "ignore:" ) {
extensionsToIgnore . push ( extensionName . slice ( 7 ) ) ;
return ;
}
if ( extensionsToIgnore . indexOf ( extensionName ) < 0 ) {
var extension = extensions [ extensionName ] ;
if ( extension && extensionsToReturn . indexOf ( extension ) < 0 ) {
extensionsToReturn . push ( extension ) ;
}
}
} ) ;
}
return getExtensions ( parentElt ( elt ) , extensionsToReturn , extensionsToIgnore ) ;
}
//====================================================================
// Initialization
//====================================================================
var isReady = false
getDocument ( ) . addEventListener ( 'DOMContentLoaded' , function ( ) {
isReady = true
} )
/ * *
* Execute a function now if DOMContentLoaded has fired , otherwise listen for it .
*
* This function uses isReady because there is no realiable way to ask the browswer whether
* the DOMContentLoaded event has already been fired ; there ' s a gap between DOMContentLoaded
* firing and readystate = complete .
* /
function ready ( fn ) {
// Checking readyState here is a failsafe in case the htmx script tag entered the DOM by
// some means other than the initial page load.
if ( isReady || getDocument ( ) . readyState === 'complete' ) {
fn ( ) ;
} else {
getDocument ( ) . addEventListener ( 'DOMContentLoaded' , fn ) ;
}
}
function insertIndicatorStyles ( ) {
if ( htmx . config . includeIndicatorStyles !== false ) {
getDocument ( ) . head . insertAdjacentHTML ( "beforeend" ,
" < style > \
. " + htmx.config.indicatorClass + " { opacity : 0 ; transition : opacity 200 ms ease - in ; } \
. " + htmx.config.requestClass + " . " + htmx.config.indicatorClass + " { opacity : 1 } \
. " + htmx.config.requestClass + " . " + htmx.config.indicatorClass + " { opacity : 1 } \
< / s t y l e > " ) ;
}
}
function getMetaConfig ( ) {
var element = getDocument ( ) . querySelector ( 'meta[name="htmx-config"]' ) ;
if ( element ) {
// @ts-ignore
return parseJSON ( element . content ) ;
} else {
return null ;
}
}
function mergeMetaConfig ( ) {
var metaConfig = getMetaConfig ( ) ;
if ( metaConfig ) {
htmx . config = mergeObjects ( htmx . config , metaConfig )
}
}
// initialize the document
ready ( function ( ) {
mergeMetaConfig ( ) ;
insertIndicatorStyles ( ) ;
var body = getDocument ( ) . body ;
processNode ( body ) ;
var restoredElts = getDocument ( ) . querySelectorAll (
"[hx-trigger='restored'],[data-hx-trigger='restored']"
) ;
body . addEventListener ( "htmx:abort" , function ( evt ) {
var target = evt . target ;
var internalData = getInternalData ( target ) ;
if ( internalData && internalData . xhr ) {
internalData . xhr . abort ( ) ;
}
} ) ;
var originalPopstate = window . onpopstate ;
window . onpopstate = function ( event ) {
if ( event . state && event . state . htmx ) {
restoreHistory ( ) ;
forEach ( restoredElts , function ( elt ) {
triggerEvent ( elt , 'htmx:restored' , {
'document' : getDocument ( ) ,
'triggerEvent' : triggerEvent
} ) ;
} ) ;
} else {
if ( originalPopstate ) {
originalPopstate ( event ) ;
}
}
} ;
setTimeout ( function ( ) {
triggerEvent ( body , 'htmx:load' , { } ) ; // give ready handlers a chance to load up before firing this event
body = null ; // kill reference for gc
} , 0 ) ;
} )
return htmx ;
}
) ( )
} ) ) ;
2023-09-29 12:56:26 -05:00
// This adds the "preload" extension to htmx. By default, this will
// preload the targets of any tags with `href` or `hx-get` attributes
// if they also have a `preload` attribute as well. See documentation
// for more details
htmx . defineExtension ( "preload" , {
onEvent : function ( name , event ) {
// Only take actions on "htmx:afterProcessNode"
if ( name !== "htmx:afterProcessNode" ) {
return ;
}
// SOME HELPER FUNCTIONS WE'LL NEED ALONG THE WAY
// attr gets the closest non-empty value from the attribute.
var attr = function ( node , property ) {
if ( node == undefined ) { return undefined ; }
return node . getAttribute ( property ) || node . getAttribute ( "data-" + property ) || attr ( node . parentElement , property )
}
// load handles the actual HTTP fetch, and uses htmx.ajax in cases where we're
// preloading an htmx resource (this sends the same HTTP headers as a regular htmx request)
var load = function ( node ) {
// Called after a successful AJAX request, to mark the
// content as loaded (and prevent additional AJAX calls.)
var done = function ( html ) {
if ( ! node . preloadAlways ) {
node . preloadState = "DONE"
}
if ( attr ( node , "preload-images" ) == "true" ) {
document . createElement ( "div" ) . innerHTML = html // create and populate a node to load linked resources, too.
}
}
return function ( ) {
// If this value has already been loaded, then do not try again.
if ( node . preloadState !== "READY" ) {
return ;
}
// Special handling for HX-GET - use built-in htmx.ajax function
// so that headers match other htmx requests, then set
// node.preloadState = TRUE so that requests are not duplicated
// in the future
var hxGet = node . getAttribute ( "hx-get" ) || node . getAttribute ( "data-hx-get" )
if ( hxGet ) {
htmx . ajax ( "GET" , hxGet , {
source : node ,
handler : function ( elt , info ) {
done ( info . xhr . responseText ) ;
}
} ) ;
return ;
}
// Otherwise, perform a standard xhr request, then set
// node.preloadState = TRUE so that requests are not duplicated
// in the future.
if ( node . getAttribute ( "href" ) ) {
var r = new XMLHttpRequest ( ) ;
r . open ( "GET" , node . getAttribute ( "href" ) ) ;
r . onload = function ( ) { done ( r . responseText ) ; } ;
r . send ( ) ;
return ;
}
}
}
// This function processes a specific node and sets up event handlers.
// We'll search for nodes and use it below.
var init = function ( node ) {
// If this node DOES NOT include a "GET" transaction, then there's nothing to do here.
if ( node . getAttribute ( "href" ) + node . getAttribute ( "hx-get" ) + node . getAttribute ( "data-hx-get" ) == "" ) {
return ;
}
// Guarantee that we only initialize each node once.
if ( node . preloadState !== undefined ) {
return ;
}
// Get event name from config.
var on = attr ( node , "preload" ) || "mousedown"
const always = on . indexOf ( "always" ) !== - 1
if ( always ) {
on = on . replace ( 'always' , '' ) . trim ( )
}
// FALL THROUGH to here means we need to add an EventListener
// Apply the listener to the node
node . addEventListener ( on , function ( evt ) {
if ( node . preloadState === "PAUSE" ) { // Only add one event listener
node . preloadState = "READY" ; // Required for the `load` function to trigger
// Special handling for "mouseover" events. Wait 100ms before triggering load.
if ( on === "mouseover" ) {
window . setTimeout ( load ( node ) , 100 ) ;
} else {
load ( node ) ( ) // all other events trigger immediately.
}
}
} )
// Special handling for certain built-in event handlers
switch ( on ) {
case "mouseover" :
// Mirror `touchstart` events (fires immediately)
node . addEventListener ( "touchstart" , load ( node ) ) ;
// WHhen the mouse leaves, immediately disable the preload
node . addEventListener ( "mouseout" , function ( evt ) {
if ( ( evt . target === node ) && ( node . preloadState === "READY" ) ) {
node . preloadState = "PAUSE" ;
}
} )
break ;
case "mousedown" :
// Mirror `touchstart` events (fires immediately)
node . addEventListener ( "touchstart" , load ( node ) ) ;
break ;
}
// Mark the node as ready to run.
node . preloadState = "PAUSE" ;
node . preloadAlways = always ;
htmx . trigger ( node , "preload:init" ) // This event can be used to load content immediately.
}
// Search for all child nodes that have a "preload" attribute
event . target . querySelectorAll ( "[preload]" ) . forEach ( function ( node ) {
// Initialize the node with the "preload" attribute
init ( node )
// Initialize all child elements that are anchors or have `hx-get` (use with care)
node . querySelectorAll ( "a,[hx-get],[data-hx-get]" ) . forEach ( init )
} )
}
} )
! function ( e ) { if ( ! e . hasInitialised ) { var t = { escapeRegExp : function ( e ) { return e . replace ( /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g , "\\$&" ) } , hasClass : function ( e , t ) { var i = " " ; return 1 === e . nodeType && ( i + e . className + i ) . replace ( /[\n\t]/g , i ) . indexOf ( i + t + i ) >= 0 } , addClass : function ( e , t ) { e . className += " " + t } , removeClass : function ( e , t ) { var i = new RegExp ( "\\b" + this . escapeRegExp ( t ) + "\\b" ) ; e . className = e . className . replace ( i , "" ) } , interpolateString : function ( e , t ) { var i = /{{([a-z][a-z0-9\-_]*)}}/gi ; return e . replace ( i , function ( e ) { return t ( arguments [ 1 ] ) || "" } ) } , getCookie : function ( e ) { var t = "; " + document . cookie , i = t . split ( "; " + e + "=" ) ; return i . length < 2 ? void 0 : i . pop ( ) . split ( ";" ) . shift ( ) } , setCookie : function ( e , t , i , n , o , s ) { var r = new Date ; r . setDate ( r . getDate ( ) + ( i || 365 ) ) ; var a = [ e + "=" + t , "expires=" + r . toUTCString ( ) , "path=" + ( o || "/" ) ] ; n && a . push ( "domain=" + n ) , s && a . push ( "secure" ) , document . cookie = a . join ( ";" ) } , deepExtend : function ( e , t ) { for ( var i in t ) t . hasOwnProperty ( i ) && ( i in e && this . isPlainObject ( e [ i ] ) && this . isPlainObject ( t [ i ] ) ? this . deepExtend ( e [ i ] , t [ i ] ) : e [ i ] = t [ i ] ) ; return e } , throttle : function ( e , t ) { var i = ! 1 ; return function ( ) { i || ( e . apply ( this , arguments ) , i = ! 0 , setTimeout ( function ( ) { i = ! 1 } , t ) ) } } , hash : function ( e ) { var t , i , n , o = 0 ; if ( 0 === e . length ) return o ; for ( t = 0 , n = e . length ; t < n ; ++ t ) i = e . charCodeAt ( t ) , o = ( o << 5 ) - o + i , o |= 0 ; return o } , normaliseHex : function ( e ) { return "#" == e [ 0 ] && ( e = e . substr ( 1 ) ) , 3 == e . length && ( e = e [ 0 ] + e [ 0 ] + e [ 1 ] + e [ 1 ] + e [ 2 ] + e [ 2 ] ) , e } , getContrast : function ( e ) { e = this . normaliseHex ( e ) ; var t = parseInt ( e . substr ( 0 , 2 ) , 16 ) , i = parseInt ( e . substr ( 2 , 2 ) , 16 ) , n = parseInt ( e . substr ( 4 , 2 ) , 16 ) , o = ( 299 * t + 587 * i + 114 * n ) / 1e3 ; return o >= 128 ? "#000" : "#fff" } , getLuminance : function ( e ) { var t = parseInt ( this . normaliseHex ( e ) , 16 ) , i = 38 , n = ( t >> 16 ) + i , o = ( t >> 8 & 255 ) + i , s = ( 255 & t ) + i , r = ( 16777216 + 65536 * ( n < 255 ? n < 1 ? 0 : n : 255 ) + 256 * ( o < 255 ? o < 1 ? 0 : o : 255 ) + ( s < 255 ? s < 1 ? 0 : s : 255 ) ) . toString ( 16 ) . slice ( 1 ) ; return "#" + r } , isMobile : function ( ) { return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i . test ( navigator . userAgent ) } , isPlainObject : function ( e ) { return "object" == typeof e && null !== e && e . constructor == Object } , traverseDOMPath : function ( e , i ) { return e && e . parentNode ? t . hasClass ( e , i ) ? e : this . traverseDOMPath ( e . parentNode , i ) : null } } ; e . status = { deny : "deny" , allow : "allow" , dismiss : "dismiss" } , e . transitionEnd = function ( ) { var e = document . createElement ( "div" ) , t = { t : "transitionend" , OT : "oTransitionEnd" , msT : "MSTransitionEnd" , MozT : "transitionend" , WebkitT : "webkitTransitionEnd" } ; for ( var i in t ) if ( t . hasOwnProperty ( i ) && "undefined" != typeof e . style [ i + "ransition" ] ) return t [ i ] ; return "" } ( ) , e . hasTransition = ! ! e . transitionEnd ; var i = Object . keys ( e . status ) . map ( t . escapeRegExp ) ; e . customStyles = { } , e . Popup = function ( ) { function n ( ) { this . initialise . apply ( this , arguments ) } function o ( e ) { this . openingTimeout = null , t . removeClass ( e , "cc-invisible" ) } function s ( t ) { t . style . display = "none" , t . removeEventListener ( e . transitionEnd , this . afterTransition ) , this . afterTransition = null } function r ( ) { var t = this . options . onInitialise . bind ( this ) ; if ( ! window . navigator . cookieEnabled ) return t ( e . status . deny ) , ! 0 ; if ( window . CookiesOK || window . navigator . CookiesOK ) return t ( e . status . allow ) , ! 0 ; var i = Object . keys ( e . status ) , n = this . getStatus ( ) , o = i . indexOf ( n ) >= 0 ; return o && t ( n ) , o } function a ( ) { var e = this . options . position . split ( "-" ) , t = [ ] ; return e . forEach ( function ( e ) { t . push ( "cc-" + e ) } ) , t } function c ( ) { var e = this . options , i = "top" == e . position || "bottom" == e . position ? "banner" : "floating" ; t . isMobile ( ) && ( i = "floating" ) ; var n = [ "cc-" + i , "cc-type-" + e . type , "cc-theme-" + e . theme ] ; e [ "static" ] && n . push ( "cc-static" ) , n . push . apply ( n , a . call ( this ) ) ; p . call ( this , this . options . palette ) ; return this . customStyleSelector && n . push ( this . customStyleSelector ) , n } function l ( ) { var e = { } , i = this . options ; i . showLink || ( i . elements . link = "" , i . elements . messagelink = i . elements . message ) , Object . keys ( i . elements ) . forEach ( function ( n ) { e [ n ] = t . interpolateString ( i . elements [ n ] , function ( e ) { var t = i . content [ e ] ; return e && "string" == typeof t && t . length ? t : "" } ) } ) ; var n = i . compliance [ i . type ] ; n || ( n = i . compliance . info ) , e . compliance = t . interpolateString ( n , function ( t ) { return e [ t ] } ) ; var o = i . layouts [ i . layout ] ; return o || ( o = i . layouts . basic ) , t . interpolateString ( o , function ( t ) { return e [ t ] } ) } function u ( i ) { var n = this . options , o = document . createE
function jsBundleVersion ( ) {
2023-11-08 00:26:35 +00:00
return "6b3b1791facc58d99b1e9c143e69bd45" ;
2023-09-29 12:56:26 -05:00
}