diff --git a/README.md b/README.md index bcf6475..33a0bcf 100644 --- a/README.md +++ b/README.md @@ -267,6 +267,14 @@ Take the table below only as a overview of all options. false Indiactes whether the textarea height will be dynamic (content dependent). + + + inheritedAttrs + string / array / null + ["style", "class"] + During initialization: Attributes which the generated host-element shall inherit from from the target textarea-element.
+During destruction: Attributes which the target textarea-element shall inherit from from the generated host-element. + } diff --git a/css/OverlayScrollbars.css b/css/OverlayScrollbars.css index 73638da..58904ad 100644 --- a/css/OverlayScrollbars.css +++ b/css/OverlayScrollbars.css @@ -2,13 +2,13 @@ * OverlayScrollbars * https://github.com/KingSora/OverlayScrollbars * - * Version: 1.5.3 + * Version: 1.6.0 * * Copyright KingSora. * https://github.com/KingSora * * Released under the MIT license. - * Date: 07.11.2018 + * Date: 02.12.2018 */ /* @@ -39,7 +39,7 @@ body.os-dragging * { position: relative; overflow: visible !important; flex-direction: column; - flex-wrap: wrap; + flex-wrap: nowrap; justify-content: flex-start; align-content: flex-start; align-items: flex-start; @@ -51,6 +51,21 @@ body.os-dragging * { .os-host-flexbox > .os-padding > .os-viewport > .os-content { display: flex; } +.os-host-flexbox > .os-size-auto-observer { + height: inherit !important; +} +.os-host-flexbox > .os-content-glue { + flex-grow: 1; + flex-shrink: 0; +} +.os-host-flexbox > .os-size-auto-observer, +.os-host-flexbox > .os-content-glue { + min-height: 0; + min-width: 0; + flex-grow: 0; + flex-shrink: 1; + flex-basis: auto; +} #hs-dummy-scrollbar-size { position: fixed; opacity: 0; diff --git a/css/OverlayScrollbars.min.css b/css/OverlayScrollbars.min.css index d8b6a0f..59314a6 100644 --- a/css/OverlayScrollbars.min.css +++ b/css/OverlayScrollbars.min.css @@ -2,12 +2,12 @@ * OverlayScrollbars * https://github.com/KingSora/OverlayScrollbars * - * Version: 1.5.3 + * Version: 1.6.0 * * Copyright KingSora. * https://github.com/KingSora * * Released under the MIT license. - * Date: 07.11.2018 + * Date: 02.12.2018 */ -html.os-html,html.os-html>.os-host{display:block;overflow:hidden;box-sizing:border-box;height:100%!important;width:100%!important;min-width:100%!important;min-height:100%!important;margin:0!important;position:absolute!important}.os-padding,.os-viewport{top:0;left:0;right:0;margin:0;padding:0;bottom:0}html.os-html>.os-host>.os-padding{position:absolute}body.os-dragging,body.os-dragging *{cursor:default}.os-host,.os-host-textarea{position:relative;overflow:visible!important;flex-direction:column;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}.os-host-flexbox{overflow:hidden!important;display:flex}.os-host-flexbox>.os-padding>.os-viewport>.os-content{display:flex}#hs-dummy-scrollbar-size{position:fixed;opacity:0;-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=0)';visibility:hidden;overflow:scroll;height:500px;width:500px}#hs-dummy-scrollbar-size,.os-viewport{-ms-overflow-style:scrollbar!important}.os-viewport-native-scrollbars-invisible#hs-dummy-scrollbar-size::-webkit-scrollbar,.os-viewport-native-scrollbars-invisible#hs-dummy-scrollbar-size::-webkit-scrollbar-corner,.os-viewport-native-scrollbars-invisible.os-viewport::-webkit-scrollbar,.os-viewport-native-scrollbars-invisible.os-viewport::-webkit-scrollbar-corner{display:none!important;width:0!important;height:0!important;visibility:hidden!important;background:0 0!important}.os-content-glue{max-height:100%;max-width:100%;width:100%;pointer-events:none}.os-padding{direction:inherit;position:absolute;overflow:visible;width:auto!important;height:auto!important;z-index:1}.os-host-overflow>.os-padding,.os-viewport{overflow:hidden}.os-viewport{direction:inherit!important;box-sizing:inherit!important;resize:none!important;position:absolute;-webkit-overflow-scrolling:touch}.os-content-arrange{position:absolute;z-index:-1;min-height:1px;min-width:1px;pointer-events:none}.os-content{direction:inherit;box-sizing:border-box!important;position:relative;display:block;height:100%;width:100%;visibility:visible}.os-content>.os-textarea{direction:inherit!important;float:none!important;margin:0!important;max-height:none!important;max-width:none!important;border:none!important;border-radius:0!important;background:0 0!important;outline:transparent 0!important;overflow:hidden!important;resize:none!important;position:absolute!important;top:0!important;left:0!important;z-index:1;padding:0}.os-host-rtl>.os-padding>.os-viewport>.os-content>.os-textarea{right:0!important}.os-content>.os-textarea-cover{z-index:-1;pointer-events:none}.os-content>.os-textarea[wrap=off]{white-space:pre!important;margin:0!important}.os-text-inherit{font-family:inherit;font-size:inherit;font-weight:inherit;font-style:inherit;font-variant:inherit;text-transform:inherit;text-decoration:inherit;text-indent:inherit;text-align:inherit;text-shadow:inherit;text-overflow:inherit;letter-spacing:inherit;word-spacing:inherit;line-height:inherit;unicode-bidi:inherit;direction:inherit;color:inherit;cursor:text}.os-resize-observer,.os-resize-observer-host{box-sizing:inherit;display:block;opacity:0;position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1}.os-resize-observer-host{padding:inherit;border:solid inherit;box-sizing:border-box}.os-resize-observer-host:after{content:''}.os-resize-observer-host:after,.os-resize-observer-host>.os-resize-observer{height:200%;width:200%;padding:inherit;border:inherit;margin:0;display:block;box-sizing:content-box}.os-resize-observer.observed,object.os-resize-observer{box-sizing:border-box!important}.os-size-auto-observer{box-sizing:inherit!important;height:100%;width:inherit;max-width:1px;position:relative;float:left;max-height:1px;overflow:hidden;z-index:-1;padding:0;margin:0;pointer-events:none;flex-grow:inherit;flex-shrink:0;flex-basis:0}.os-size-auto-observer>.os-resize-observer{width:1000%;height:1000%;min-height:1px;min-width:1px}.os-resize-observer-item{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;z-index:-1;opacity:0;direction:ltr!important;-webkit-box-flex:0!important;-ms-flex:none!important;flex:none!important}.os-resize-observer-item-final{position:absolute;left:0;top:0;-webkit-transition:none!important;transition:none!important;-webkit-box-flex:0!important;-ms-flex:none!important;flex:none!important}.os-resize-observer{-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-name:hs-resize-observer-dummy-animation;animation-name:hs-resize-observer-dummy-animation}.os-host-transition>.os-scrollbar,.os-host-transition>.os-scrollbar-corner{-webkit-transition:opacity .3s,visibility .3s,top .3s,right .3s,bottom .3s,left .3s;transition:opacity .3s,visibility .3s,top .3s,right .3s,bottom .3s,left .3s}html.os-html>.os-host>.os-scrollbar{position:absolute;z-index:999999}.os-scrollbar,.os-scrollbar-corner{position:absolute;opacity:1;-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';z-index:1}.os-scrollbar-corner{bottom:0;right:0}.os-scrollbar{pointer-events:none}.os-scrollbar-handle,.os-scrollbar-track{pointer-events:auto;width:100%;height:100%}.os-scrollbar-track{position:relative;padding:0!important;border:none!important}.os-scrollbar-handle{position:absolute}.os-scrollbar-handle-off,.os-scrollbar-track-off{pointer-events:none}.os-scrollbar.os-scrollbar-unusable,.os-scrollbar.os-scrollbar-unusable *{pointer-events:none!important}.os-scrollbar.os-scrollbar-unusable .os-scrollbar-handle{opacity:0!important}.os-scrollbar-horizontal{bottom:0;left:0}.os-scrollbar-vertical{top:0;right:0}.os-host-rtl>.os-scrollbar-horizontal{right:0}.os-host-rtl>.os-scrollbar-corner,.os-host-rtl>.os-scrollbar-vertical{right:auto;left:0}.os-host-resize-disabled.os-host-scrollbar-horizontal-hidden>.os-scrollbar-corner,.os-host-resize-disabled.os-host-scrollbar-vertical-hidden>.os-scrollbar-corner,.os-host-scrollbar-horizontal-hidden>.os-scrollbar-horizontal,.os-host-scrollbar-vertical-hidden>.os-scrollbar-vertical,.os-padding+.os-scrollbar-corner,.os-scrollbar-auto-hidden,.os-scrollbar-horizontal+.os-scrollbar-vertical.os-scrollbar-auto-hidden+.os-scrollbar-corner,.os-scrollbar-horizontal.os-scrollbar-auto-hidden+.os-scrollbar-vertical+.os-scrollbar-corner,.os-scrollbar-horizontal.os-scrollbar-auto-hidden+.os-scrollbar-vertical.os-scrollbar-auto-hidden+.os-scrollbar-corner{opacity:0;visibility:hidden;pointer-events:none}.os-scrollbar-corner-resize-both{cursor:nwse-resize}.os-host-rtl>.os-scrollbar-corner-resize-both{cursor:nesw-resize}.os-scrollbar-corner-resize-horizontal{cursor:ew-resize}.os-scrollbar-corner-resize-vertical{cursor:ns-resize}.os-dragging .os-scrollbar-corner.os-scrollbar-corner-resize{cursor:default}.os-host-resize-disabled.os-host-scrollbar-horizontal-hidden>.os-scrollbar-vertical{top:0;bottom:0}.os-host-resize-disabled.os-host-scrollbar-vertical-hidden>.os-scrollbar-horizontal,.os-host-rtl.os-host-resize-disabled.os-host-scrollbar-vertical-hidden>.os-scrollbar-horizontal{right:0;left:0}.os-scrollbar-corner.os-scrollbar-corner-resize,.os-scrollbar:hover{opacity:1!important;visibility:visible!important}.os-scrollbar-corner.os-scrollbar-corner-resize{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgICB3aWR0aD0iMTAiICAgaGVpZ2h0PSIxMCIgICB2ZXJzaW9uPSIxLjEiPiAgPGcgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTEwNDIuMzYyMikiICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPiAgICA8cGF0aCAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQ5NDExNzY1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAgICAgICBkPSJtIDcuNDI0MjE4NywxMDQyLjM2MjIgYyAtMC43MjM1NzkyLDAgLTEuMzEwMTU2MiwwLjU4NjYgLTEuMzEwMTU2MiwxLjMxMDIgMCwwLjI5OSAwLjEwNDM0MTksMC41NzEgMC4yNzI5NDkyLDAuNzkxNSAwLjIwOTEwMjQsMC4xNDEzIDAuNDY1NjIwNiwwLjIxODQgMC43MzY5NjI5LDAuMjE4NCAwLjcyMzU3OTMsMCAxLjMxMDE1NjMsLTAuNTg2NiAxLjMxMDE1NjMsLTEuMzEwMiAwLC0wLjI3MTMgLTAuMDc3MDkzLC0wLjUyNzggLTAuMjE4MzU5NCwtMC43MzcgLTAuMjIwNDk0MSwtMC4xNjg2IC0wLjQ5MjU0NDMsLTAuMjcyOSAtMC43OTE1NTI4LC0wLjI3MjkgeiBtIDAsMy4wODQzIGMgLTAuNzIzNTc5MiwwIC0xLjMxMDE1NjIsMC41ODY2IC0xLjMxMDE1NjIsMS4zMTAyIDAsMC4yOTkgMC4xMDQzNDE5LDAuNTcxIDAuMjcyOTQ5MiwwLjc5MTUgMC4yMDkxMDI0LDAuMTQxMyAwLjQ2NTYyMDYsMC4yMTg0IDAuNzM2OTYyOSwwLjIxODQgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjYgMS4zMTAxNTYzLC0xLjMxMDIgMCwtMC4yNzEzIC0wLjA3NzA5MywtMC41Mjc4IC0wLjIxODM1OTQsLTAuNzM2OSAtMC4yMjA0OTQxLC0wLjE2ODYgLTAuNDkyNTQ0MywtMC4yNzMgLTAuNzkxNTUyOCwtMC4yNzMgeiBtIC0zLjA4NDMyNjEsMCBjIC0wLjcyMzU3OTMsMCAtMS4zMTAxNTYzLDAuNTg2NiAtMS4zMTAxNTYzLDEuMzEwMiAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MSAwLjI3Mjk0OTIsMC43OTE1IDAuMjA5MTAyNCwwLjE0MTMgMC40NjU2MjA3LDAuMjE4NCAwLjczNjk2MjksMC4yMTg0IDAuNzIzNTc5MywwIDEuMzEwMTU2MywtMC41ODY2IDEuMzEwMTU2MywtMS4zMTAyIDAsLTAuMjcxMyAtMC4wNzcwOTMsLTAuNTI3OCAtMC4yMTgzNTk0LC0wLjczNjkgLTAuMjIwNDk0LC0wLjE2ODYgLTAuNDkyNTQ0MiwtMC4yNzMgLTAuNzkxNTUyNywtMC4yNzMgeiBtIC0zLjAyOTczNjQsMy4wMjk4IEMgMC41ODY1NzY5MywxMDQ4LjQ3NjMgMCwxMDQ5LjA2MjggMCwxMDQ5Ljc4NjQgYyAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MTEgMC4yNzI5NDkyMiwwLjc5MTYgMC4yMDkxMDIyOSwwLjE0MTIgMC40NjU2MjA2NSwwLjIxODMgMC43MzY5NjI4OCwwLjIxODMgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjUgMS4zMTAxNTYzLC0xLjMxMDEgMCwtMC4yNzE0IC0wLjA3NzA5MywtMC41Mjc5IC0wLjIxODM1OTQsLTAuNzM3IC0wLjIyMDQ5NDEsLTAuMTY4NiAtMC40OTI1NDQzLC0wLjI3MjkgLTAuNzkxNTUyOCwtMC4yNzI5IHogbSAzLjAyOTczNjQsMCBjIC0wLjcyMzU3OTMsMCAtMS4zMTAxNTYzLDAuNTg2NSAtMS4zMTAxNTYzLDEuMzEwMSAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MTEgMC4yNzI5NDkyLDAuNzkxNiAwLjIwOTEwMjQsMC4xNDEyIDAuNDY1NjIwNywwLjIxODMgMC43MzY5NjI5LDAuMjE4MyAwLjcyMzU3OTMsMCAxLjMxMDE1NjMsLTAuNTg2NSAxLjMxMDE1NjMsLTEuMzEwMSAwLC0wLjI3MTQgLTAuMDc3MDkzLC0wLjUyNzkgLTAuMjE4MzU5NCwtMC43MzcgLTAuMjIwNDk0LC0wLjE2ODYgLTAuNDkyNTQ0MiwtMC4yNzI5IC0wLjc5MTU1MjcsLTAuMjcyOSB6IG0gMy4wODQzMjYxLDAgYyAtMC43MjM1NzkyLDAgLTEuMzEwMTU2MiwwLjU4NjUgLTEuMzEwMTU2MiwxLjMxMDEgMCwwLjI5OSAwLjEwNDM0MTksMC41NzExIDAuMjcyOTQ5MiwwLjc5MTYgMC4yMDkxMDI0LDAuMTQxMiAwLjQ2NTYyMDYsMC4yMTgzIDAuNzM2OTYyOSwwLjIxODMgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjUgMS4zMTAxNTYzLC0xLjMxMDEgMCwtMC4yNzE0IC0wLjA3NzA5MywtMC41Mjc5IC0wLjIxODM1OTQsLTAuNzM3IC0wLjIyMDQ5NDEsLTAuMTY4NiAtMC40OTI1NDQzLC0wLjI3MjkgLTAuNzkxNTUyOCwtMC4yNzI5IHoiLz4gIDwvZz4gIDxnICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPiAgICA8cGF0aCAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAgICAgICBkPSJtIDguMjE1NzcxNSwwLjI3Mjk0OTIyIGMgMC4xNDEyNjY3LDAuMjA5MTAyMjkgMC4yMTgzNTk0LDAuNDY1NjIwNjUgMC4yMTgzNTk0LDAuNzM2OTYyODggMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MyAtMS4zMTAxNTYzLDEuMzEwMTU2MyAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTk0IDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDc2IC0wLjIwNTUxNzYsLTAuNzk3Nzk2NTkgLTAuNTE4NjAzNSwtMS4wMzcyMDY5OCB6IG0gMCwzLjA4NDMyNjE4IGMgMC4xNDEyNjY3LDAuMjA5MTAyMyAwLjIxODM1OTQsMC40NjU2MjA2IDAuMjE4MzU5NCwwLjczNjk2MjkgMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MiAtMS4zMTAxNTYzLDEuMzEwMTU2MiAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTkzIDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY3IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogbSAtMy4wODQzMjYyLDAgYyAwLjE0MTI2NjcsMC4yMDkxMDIzIDAuMjE4MzU5NCwwLjQ2NTYyMDYgMC4yMTgzNTk0LDAuNzM2OTYyOSAwLDAuNzIzNTc5MyAtMC41ODY1NzcsMS4zMTAxNTYyIC0xLjMxMDE1NjMsMS4zMTAxNTYyIC0wLjI3MTM0MjIsMCAtMC41Mjc4NjA1LC0wLjA3NzA5MyAtMC43MzY5NjI5LC0wLjIxODM1OTMgMC4yMzk0MTA0LDAuMzEzMDg1OSAwLjYxMjYzNjMsMC41MTg2MDM1IDEuMDM3MjA3MSwwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYyLC0wLjU4NjU3NyAxLjMxMDE1NjIsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NSwtMC43OTc3OTY3IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogTSAyLjEwMTcwOSw2LjM4NzAxMTcgYyAwLjE0MTI2NjcsMC4yMDkxMDI0IDAuMjE4MzU5NCwwLjQ2NTYyMDYgMC4yMTgzNTk0LDAuNzM2OTYyOSAwLDAuNzIzNTc5MyAtMC41ODY1NzcsMS4zMTAxNTYzIC0xLjMxMDE1NjMsMS4zMTAxNTYzIC0wLjI3MTM0MjIzLDAgLTAuNTI3ODYwNTksLTAuMDc3MDkzIC0wLjczNjk2Mjg4LC0wLjIxODM1OTQgMC4yMzk0MTAzOSwwLjMxMzA4NTkgMC42MTI2MzYyMiwwLjUxODYwMzUgMS4wMzcyMDY5OCwwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY2IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogbSAzLjAyOTczNjMsMCBjIDAuMTQxMjY2NywwLjIwOTEwMjQgMC4yMTgzNTk0LDAuNDY1NjIwNiAwLjIxODM1OTQsMC43MzY5NjI5IDAsMC43MjM1NzkzIC0wLjU4NjU3NywxLjMxMDE1NjMgLTEuMzEwMTU2MywxLjMxMDE1NjMgLTAuMjcxMzQyMiwwIC0wLjUyNzg2MDUsLTAuMDc3MDkzIC0wLjczNjk2MjksLTAuMjE4MzU5NCAwLjIzOTQxMDQsMC4zMTMwODU5IDAuNjEyNjM2MywwLjUxODYwMzUgMS4wMzcyMDcxLDAuNTE4NjAzNSAwLjcyMzU3OTMsMCAxLjMxMDE1NjIsLTAuNTg2NTc3IDEuMzEwMTU2MiwtMS4zMTAxNTYzIDAsLTAuNDI0NTcwOCAtMC4yMDU1MTc1LC0wLjc5Nzc5NjYgLTAuNTE4NjAzNSwtMS4wMzcyMDcgeiBtIDMuMDg0MzI2MiwwIGMgMC4xNDEyNjY3LDAuMjA5MTAyNCAwLjIxODM1OTQsMC40NjU2MjA2IDAuMjE4MzU5NCwwLjczNjk2MjkgMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MyAtMS4zMTAxNTYzLDEuMzEwMTU2MyAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTk0IDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY2IC0wLjUxODYwMzUsLTEuMDM3MjA3IHoiIC8+ICA8L2c+PC9zdmc+);background-repeat:no-repeat;background-position:100% 100%;pointer-events:auto!important}.os-host-rtl>.os-scrollbar-corner.os-scrollbar-corner-resize{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.os-host-overflow{overflow:hidden!important}@-webkit-keyframes hs-resize-observer-dummy-animation{from{z-index:0}to{z-index:-1}}@keyframes hs-resize-observer-dummy-animation{from{z-index:0}to{z-index:-1}}.os-theme-none>.os-scrollbar-corner,.os-theme-none>.os-scrollbar-horizontal,.os-theme-none>.os-scrollbar-vertical{display:none!important}.os-theme-none>.os-scrollbar-corner-resize{display:block!important;min-width:10px;min-height:10px}.os-theme-dark>.os-scrollbar-horizontal,.os-theme-light>.os-scrollbar-horizontal{right:10px;height:10px}.os-theme-dark>.os-scrollbar-vertical,.os-theme-light>.os-scrollbar-vertical{bottom:10px;width:10px}.os-theme-dark.os-host-rtl>.os-scrollbar-horizontal,.os-theme-light.os-host-rtl>.os-scrollbar-horizontal{left:10px;right:0}.os-theme-dark>.os-scrollbar-corner,.os-theme-light>.os-scrollbar-corner{height:10px;width:10px;background-color:transparent}.os-theme-dark>.os-scrollbar,.os-theme-light>.os-scrollbar{padding:2px;box-sizing:border-box;background:0 0}.os-theme-dark>.os-scrollbar.os-scrollbar-unusable,.os-theme-dark>.os-scrollbar>.os-scrollbar-track,.os-theme-light>.os-scrollbar.os-scrollbar-unusable,.os-theme-light>.os-scrollbar>.os-scrollbar-track{background:0 0}.os-theme-dark>.os-scrollbar-horizontal>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light>.os-scrollbar-horizontal>.os-scrollbar-track>.os-scrollbar-handle{min-width:30px}.os-theme-dark>.os-scrollbar-vertical>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light>.os-scrollbar-vertical>.os-scrollbar-track>.os-scrollbar-handle{min-height:30px}.os-theme-dark.os-host-transition>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light.os-host-transition>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{-webkit-transition:background-color .3s;transition:background-color .3s}.os-theme-dark>.os-scrollbar>.os-scrollbar-track,.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light>.os-scrollbar>.os-scrollbar-track,.os-theme-light>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{border-radius:10px}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(0,0,0,.4)}.os-theme-light>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(255,255,255,.4)}.os-theme-dark>.os-scrollbar:hover>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(0,0,0,.55)}.os-theme-light>.os-scrollbar:hover>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(255,255,255,.55)}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle.active{background:rgba(0,0,0,.7)}.os-theme-light>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle.active{background:rgba(255,255,255,.7)}.os-theme-dark>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-dark>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-vertical .os-scrollbar-handle:before{content:'';position:absolute;left:0;right:0;top:0;bottom:0;display:block}.os-theme-dark.os-host-scrollbar-horizontal-hidden>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-dark.os-host-scrollbar-vertical-hidden>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-theme-light.os-host-scrollbar-horizontal-hidden>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-light.os-host-scrollbar-vertical-hidden>.os-scrollbar-vertical .os-scrollbar-handle:before{display:none}.os-theme-dark>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-horizontal .os-scrollbar-handle:before{top:-6px;bottom:-2px}.os-theme-dark>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-vertical .os-scrollbar-handle:before{left:-6px;right:-2px}.os-host-rtl.os-theme-dark>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-host-rtl.os-theme-light>.os-scrollbar-vertical .os-scrollbar-handle:before{right:-6px;left:-2px} \ No newline at end of file +html.os-html,html.os-html>.os-host{display:block;overflow:hidden;box-sizing:border-box;height:100%!important;width:100%!important;min-width:100%!important;min-height:100%!important;margin:0!important;position:absolute!important}html.os-html>.os-host>.os-padding{position:absolute}body.os-dragging,body.os-dragging *{cursor:default}.os-host,.os-host-textarea{position:relative;overflow:visible!important;flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}.os-host-flexbox{overflow:hidden!important;display:flex}.os-host-flexbox>.os-padding>.os-viewport>.os-content{display:flex}.os-host-flexbox>.os-size-auto-observer{height:inherit!important}.os-host-flexbox>.os-content-glue{flex-grow:1;flex-shrink:0}.os-host-flexbox>.os-size-auto-observer,.os-host-flexbox>.os-content-glue{min-height:0;min-width:0;flex-grow:0;flex-shrink:1;flex-basis:auto}#hs-dummy-scrollbar-size{position:fixed;opacity:0;-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=0)';visibility:hidden;overflow:scroll;height:500px;width:500px}#hs-dummy-scrollbar-size,.os-viewport{-ms-overflow-style:scrollbar!important}.os-viewport-native-scrollbars-invisible#hs-dummy-scrollbar-size::-webkit-scrollbar,.os-viewport-native-scrollbars-invisible.os-viewport::-webkit-scrollbar,.os-viewport-native-scrollbars-invisible#hs-dummy-scrollbar-size::-webkit-scrollbar-corner,.os-viewport-native-scrollbars-invisible.os-viewport::-webkit-scrollbar-corner{display:none!important;width:0px!important;height:0px!important;visibility:hidden!important;background:transparent!important}.os-content-glue{max-height:100%;max-width:100%;width:100%;pointer-events:none}.os-padding{direction:inherit;position:absolute;overflow:visible;padding:0;margin:0;left:0;top:0;bottom:0;right:0;width:auto!important;height:auto!important;z-index:1}.os-host-overflow>.os-padding{overflow:hidden}.os-viewport{direction:inherit!important;box-sizing:inherit!important;resize:none!important;position:absolute;overflow:hidden;top:0;left:0;bottom:0;right:0;padding:0;margin:0;-webkit-overflow-scrolling:touch}.os-content-arrange{position:absolute;z-index:-1;min-height:1px;min-width:1px;pointer-events:none}.os-content{direction:inherit;box-sizing:border-box!important;position:relative;display:block;height:100%;width:100%;height:100%;width:100%;visibility:visible}.os-content>.os-textarea{direction:inherit!important;float:none!important;margin:0!important;max-height:none!important;max-width:none!important;border:none!important;border-radius:0px!important;background:transparent!important;outline:0 none transparent!important;overflow:hidden!important;resize:none!important;position:absolute!important;top:0!important;left:0!important;z-index:1;padding:0}.os-host-rtl>.os-padding>.os-viewport>.os-content>.os-textarea{right:0!important}.os-content>.os-textarea-cover{z-index:-1;pointer-events:none}.os-content>.os-textarea[wrap='off']{white-space:pre!important;margin:0px!important}.os-text-inherit{font-family:inherit;font-size:inherit;font-weight:inherit;font-style:inherit;font-variant:inherit;text-transform:inherit;text-decoration:inherit;text-indent:inherit;text-align:inherit;text-shadow:inherit;text-overflow:inherit;letter-spacing:inherit;word-spacing:inherit;line-height:inherit;unicode-bidi:inherit;direction:inherit;color:inherit;cursor:text}.os-resize-observer,.os-resize-observer-host{box-sizing:inherit;display:block;opacity:0;position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1}.os-resize-observer-host{padding:inherit;border:inherit;border-color:transparent;border-style:solid;box-sizing:border-box}.os-resize-observer-host:after{content:''}.os-resize-observer-host>.os-resize-observer,.os-resize-observer-host:after{height:200%;width:200%;padding:inherit;border:inherit;margin:0;display:block;box-sizing:content-box}.os-resize-observer.observed,object.os-resize-observer{box-sizing:border-box!important}.os-size-auto-observer{box-sizing:inherit!important;height:100%;width:inherit;max-width:1px;position:relative;float:left;max-height:1px;overflow:hidden;z-index:-1;padding:0;margin:0;pointer-events:none;flex-grow:inherit;flex-shrink:0;flex-basis:0%}.os-size-auto-observer>.os-resize-observer{width:1000%;height:1000%;min-height:1px;min-width:1px}.os-resize-observer-item{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;z-index:-1;opacity:0;direction:ltr!important;-webkit-box-flex:0!important;-ms-flex:none!important;flex:none!important}.os-resize-observer-item-final{position:absolute;left:0;top:0;-webkit-transition:none!important;transition:none!important;-webkit-box-flex:0!important;-ms-flex:none!important;flex:none!important}.os-resize-observer{-webkit-animation-duration:0.001s;animation-duration:0.001s;-webkit-animation-name:hs-resize-observer-dummy-animation;animation-name:hs-resize-observer-dummy-animation}.os-host-transition>.os-scrollbar,.os-host-transition>.os-scrollbar-corner{-webkit-transition:opacity 0.3s,visibility 0.3s,top 0.3s,right 0.3s,bottom 0.3s,left 0.3s;transition:opacity 0.3s,visibility 0.3s,top 0.3s,right 0.3s,bottom 0.3s,left 0.3s}html.os-html>.os-host>.os-scrollbar{position:absolute;z-index:999999}.os-scrollbar,.os-scrollbar-corner{position:absolute;opacity:1;-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';z-index:1}.os-scrollbar-corner{bottom:0;right:0}.os-scrollbar{pointer-events:none}.os-scrollbar-track{pointer-events:auto;position:relative;height:100%;width:100%;padding:0!important;border:none!important}.os-scrollbar-handle{pointer-events:auto;position:absolute;width:100%;height:100%}.os-scrollbar-handle-off,.os-scrollbar-track-off{pointer-events:none}.os-scrollbar.os-scrollbar-unusable,.os-scrollbar.os-scrollbar-unusable *{pointer-events:none!important}.os-scrollbar.os-scrollbar-unusable .os-scrollbar-handle{opacity:0!important}.os-scrollbar-horizontal{bottom:0;left:0}.os-scrollbar-vertical{top:0;right:0}.os-host-rtl>.os-scrollbar-horizontal{right:0}.os-host-rtl>.os-scrollbar-vertical{right:auto;left:0}.os-host-rtl>.os-scrollbar-corner{right:auto;left:0}.os-scrollbar-auto-hidden,.os-padding + .os-scrollbar-corner,.os-host-resize-disabled.os-host-scrollbar-horizontal-hidden>.os-scrollbar-corner,.os-host-scrollbar-horizontal-hidden>.os-scrollbar-horizontal,.os-host-resize-disabled.os-host-scrollbar-vertical-hidden>.os-scrollbar-corner,.os-host-scrollbar-vertical-hidden>.os-scrollbar-vertical,.os-scrollbar-horizontal.os-scrollbar-auto-hidden + .os-scrollbar-vertical + .os-scrollbar-corner,.os-scrollbar-horizontal + .os-scrollbar-vertical.os-scrollbar-auto-hidden + .os-scrollbar-corner,.os-scrollbar-horizontal.os-scrollbar-auto-hidden + .os-scrollbar-vertical.os-scrollbar-auto-hidden + .os-scrollbar-corner{opacity:0;visibility:hidden;pointer-events:none}.os-scrollbar-corner-resize-both{cursor:nwse-resize}.os-host-rtl>.os-scrollbar-corner-resize-both{cursor:nesw-resize}.os-scrollbar-corner-resize-horizontal{cursor:ew-resize}.os-scrollbar-corner-resize-vertical{cursor:ns-resize}.os-dragging .os-scrollbar-corner.os-scrollbar-corner-resize{cursor:default}.os-host-resize-disabled.os-host-scrollbar-horizontal-hidden>.os-scrollbar-vertical{top:0;bottom:0}.os-host-resize-disabled.os-host-scrollbar-vertical-hidden>.os-scrollbar-horizontal,.os-host-rtl.os-host-resize-disabled.os-host-scrollbar-vertical-hidden>.os-scrollbar-horizontal{right:0;left:0}.os-scrollbar:hover,.os-scrollbar-corner.os-scrollbar-corner-resize{opacity:1!important;visibility:visible!important}.os-scrollbar-corner.os-scrollbar-corner-resize{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgICB3aWR0aD0iMTAiICAgaGVpZ2h0PSIxMCIgICB2ZXJzaW9uPSIxLjEiPiAgPGcgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTEwNDIuMzYyMikiICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPiAgICA8cGF0aCAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQ5NDExNzY1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAgICAgICBkPSJtIDcuNDI0MjE4NywxMDQyLjM2MjIgYyAtMC43MjM1NzkyLDAgLTEuMzEwMTU2MiwwLjU4NjYgLTEuMzEwMTU2MiwxLjMxMDIgMCwwLjI5OSAwLjEwNDM0MTksMC41NzEgMC4yNzI5NDkyLDAuNzkxNSAwLjIwOTEwMjQsMC4xNDEzIDAuNDY1NjIwNiwwLjIxODQgMC43MzY5NjI5LDAuMjE4NCAwLjcyMzU3OTMsMCAxLjMxMDE1NjMsLTAuNTg2NiAxLjMxMDE1NjMsLTEuMzEwMiAwLC0wLjI3MTMgLTAuMDc3MDkzLC0wLjUyNzggLTAuMjE4MzU5NCwtMC43MzcgLTAuMjIwNDk0MSwtMC4xNjg2IC0wLjQ5MjU0NDMsLTAuMjcyOSAtMC43OTE1NTI4LC0wLjI3MjkgeiBtIDAsMy4wODQzIGMgLTAuNzIzNTc5MiwwIC0xLjMxMDE1NjIsMC41ODY2IC0xLjMxMDE1NjIsMS4zMTAyIDAsMC4yOTkgMC4xMDQzNDE5LDAuNTcxIDAuMjcyOTQ5MiwwLjc5MTUgMC4yMDkxMDI0LDAuMTQxMyAwLjQ2NTYyMDYsMC4yMTg0IDAuNzM2OTYyOSwwLjIxODQgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjYgMS4zMTAxNTYzLC0xLjMxMDIgMCwtMC4yNzEzIC0wLjA3NzA5MywtMC41Mjc4IC0wLjIxODM1OTQsLTAuNzM2OSAtMC4yMjA0OTQxLC0wLjE2ODYgLTAuNDkyNTQ0MywtMC4yNzMgLTAuNzkxNTUyOCwtMC4yNzMgeiBtIC0zLjA4NDMyNjEsMCBjIC0wLjcyMzU3OTMsMCAtMS4zMTAxNTYzLDAuNTg2NiAtMS4zMTAxNTYzLDEuMzEwMiAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MSAwLjI3Mjk0OTIsMC43OTE1IDAuMjA5MTAyNCwwLjE0MTMgMC40NjU2MjA3LDAuMjE4NCAwLjczNjk2MjksMC4yMTg0IDAuNzIzNTc5MywwIDEuMzEwMTU2MywtMC41ODY2IDEuMzEwMTU2MywtMS4zMTAyIDAsLTAuMjcxMyAtMC4wNzcwOTMsLTAuNTI3OCAtMC4yMTgzNTk0LC0wLjczNjkgLTAuMjIwNDk0LC0wLjE2ODYgLTAuNDkyNTQ0MiwtMC4yNzMgLTAuNzkxNTUyNywtMC4yNzMgeiBtIC0zLjAyOTczNjQsMy4wMjk4IEMgMC41ODY1NzY5MywxMDQ4LjQ3NjMgMCwxMDQ5LjA2MjggMCwxMDQ5Ljc4NjQgYyAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MTEgMC4yNzI5NDkyMiwwLjc5MTYgMC4yMDkxMDIyOSwwLjE0MTIgMC40NjU2MjA2NSwwLjIxODMgMC43MzY5NjI4OCwwLjIxODMgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjUgMS4zMTAxNTYzLC0xLjMxMDEgMCwtMC4yNzE0IC0wLjA3NzA5MywtMC41Mjc5IC0wLjIxODM1OTQsLTAuNzM3IC0wLjIyMDQ5NDEsLTAuMTY4NiAtMC40OTI1NDQzLC0wLjI3MjkgLTAuNzkxNTUyOCwtMC4yNzI5IHogbSAzLjAyOTczNjQsMCBjIC0wLjcyMzU3OTMsMCAtMS4zMTAxNTYzLDAuNTg2NSAtMS4zMTAxNTYzLDEuMzEwMSAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MTEgMC4yNzI5NDkyLDAuNzkxNiAwLjIwOTEwMjQsMC4xNDEyIDAuNDY1NjIwNywwLjIxODMgMC43MzY5NjI5LDAuMjE4MyAwLjcyMzU3OTMsMCAxLjMxMDE1NjMsLTAuNTg2NSAxLjMxMDE1NjMsLTEuMzEwMSAwLC0wLjI3MTQgLTAuMDc3MDkzLC0wLjUyNzkgLTAuMjE4MzU5NCwtMC43MzcgLTAuMjIwNDk0LC0wLjE2ODYgLTAuNDkyNTQ0MiwtMC4yNzI5IC0wLjc5MTU1MjcsLTAuMjcyOSB6IG0gMy4wODQzMjYxLDAgYyAtMC43MjM1NzkyLDAgLTEuMzEwMTU2MiwwLjU4NjUgLTEuMzEwMTU2MiwxLjMxMDEgMCwwLjI5OSAwLjEwNDM0MTksMC41NzExIDAuMjcyOTQ5MiwwLjc5MTYgMC4yMDkxMDI0LDAuMTQxMiAwLjQ2NTYyMDYsMC4yMTgzIDAuNzM2OTYyOSwwLjIxODMgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjUgMS4zMTAxNTYzLC0xLjMxMDEgMCwtMC4yNzE0IC0wLjA3NzA5MywtMC41Mjc5IC0wLjIxODM1OTQsLTAuNzM3IC0wLjIyMDQ5NDEsLTAuMTY4NiAtMC40OTI1NDQzLC0wLjI3MjkgLTAuNzkxNTUyOCwtMC4yNzI5IHoiLz4gIDwvZz4gIDxnICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPiAgICA8cGF0aCAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAgICAgICBkPSJtIDguMjE1NzcxNSwwLjI3Mjk0OTIyIGMgMC4xNDEyNjY3LDAuMjA5MTAyMjkgMC4yMTgzNTk0LDAuNDY1NjIwNjUgMC4yMTgzNTk0LDAuNzM2OTYyODggMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MyAtMS4zMTAxNTYzLDEuMzEwMTU2MyAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTk0IDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDc2IC0wLjIwNTUxNzYsLTAuNzk3Nzk2NTkgLTAuNTE4NjAzNSwtMS4wMzcyMDY5OCB6IG0gMCwzLjA4NDMyNjE4IGMgMC4xNDEyNjY3LDAuMjA5MTAyMyAwLjIxODM1OTQsMC40NjU2MjA2IDAuMjE4MzU5NCwwLjczNjk2MjkgMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MiAtMS4zMTAxNTYzLDEuMzEwMTU2MiAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTkzIDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY3IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogbSAtMy4wODQzMjYyLDAgYyAwLjE0MTI2NjcsMC4yMDkxMDIzIDAuMjE4MzU5NCwwLjQ2NTYyMDYgMC4yMTgzNTk0LDAuNzM2OTYyOSAwLDAuNzIzNTc5MyAtMC41ODY1NzcsMS4zMTAxNTYyIC0xLjMxMDE1NjMsMS4zMTAxNTYyIC0wLjI3MTM0MjIsMCAtMC41Mjc4NjA1LC0wLjA3NzA5MyAtMC43MzY5NjI5LC0wLjIxODM1OTMgMC4yMzk0MTA0LDAuMzEzMDg1OSAwLjYxMjYzNjMsMC41MTg2MDM1IDEuMDM3MjA3MSwwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYyLC0wLjU4NjU3NyAxLjMxMDE1NjIsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NSwtMC43OTc3OTY3IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogTSAyLjEwMTcwOSw2LjM4NzAxMTcgYyAwLjE0MTI2NjcsMC4yMDkxMDI0IDAuMjE4MzU5NCwwLjQ2NTYyMDYgMC4yMTgzNTk0LDAuNzM2OTYyOSAwLDAuNzIzNTc5MyAtMC41ODY1NzcsMS4zMTAxNTYzIC0xLjMxMDE1NjMsMS4zMTAxNTYzIC0wLjI3MTM0MjIzLDAgLTAuNTI3ODYwNTksLTAuMDc3MDkzIC0wLjczNjk2Mjg4LC0wLjIxODM1OTQgMC4yMzk0MTAzOSwwLjMxMzA4NTkgMC42MTI2MzYyMiwwLjUxODYwMzUgMS4wMzcyMDY5OCwwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY2IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogbSAzLjAyOTczNjMsMCBjIDAuMTQxMjY2NywwLjIwOTEwMjQgMC4yMTgzNTk0LDAuNDY1NjIwNiAwLjIxODM1OTQsMC43MzY5NjI5IDAsMC43MjM1NzkzIC0wLjU4NjU3NywxLjMxMDE1NjMgLTEuMzEwMTU2MywxLjMxMDE1NjMgLTAuMjcxMzQyMiwwIC0wLjUyNzg2MDUsLTAuMDc3MDkzIC0wLjczNjk2MjksLTAuMjE4MzU5NCAwLjIzOTQxMDQsMC4zMTMwODU5IDAuNjEyNjM2MywwLjUxODYwMzUgMS4wMzcyMDcxLDAuNTE4NjAzNSAwLjcyMzU3OTMsMCAxLjMxMDE1NjIsLTAuNTg2NTc3IDEuMzEwMTU2MiwtMS4zMTAxNTYzIDAsLTAuNDI0NTcwOCAtMC4yMDU1MTc1LC0wLjc5Nzc5NjYgLTAuNTE4NjAzNSwtMS4wMzcyMDcgeiBtIDMuMDg0MzI2MiwwIGMgMC4xNDEyNjY3LDAuMjA5MTAyNCAwLjIxODM1OTQsMC40NjU2MjA2IDAuMjE4MzU5NCwwLjczNjk2MjkgMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MyAtMS4zMTAxNTYzLDEuMzEwMTU2MyAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTk0IDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY2IC0wLjUxODYwMzUsLTEuMDM3MjA3IHoiIC8+ICA8L2c+PC9zdmc+);background-repeat:no-repeat;background-position:100% 100%;pointer-events:auto!important}.os-host-rtl>.os-scrollbar-corner.os-scrollbar-corner-resize{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.os-host-overflow{overflow:hidden!important}@-webkit-keyframes hs-resize-observer-dummy-animation{from{z-index:0}to{z-index:-1}}@keyframes hs-resize-observer-dummy-animation{from{z-index:0}to{z-index:-1}}.os-theme-none>.os-scrollbar-horizontal,.os-theme-none>.os-scrollbar-vertical,.os-theme-none>.os-scrollbar-corner{display:none!important}.os-theme-none>.os-scrollbar-corner-resize{display:block!important;min-width:10px;min-height:10px}.os-theme-dark>.os-scrollbar-horizontal,.os-theme-light>.os-scrollbar-horizontal{right:10px;height:10px}.os-theme-dark>.os-scrollbar-vertical,.os-theme-light>.os-scrollbar-vertical{bottom:10px;width:10px}.os-theme-dark.os-host-rtl>.os-scrollbar-horizontal,.os-theme-light.os-host-rtl>.os-scrollbar-horizontal{left:10px;right:0}.os-theme-dark>.os-scrollbar-corner,.os-theme-light>.os-scrollbar-corner{height:10px;width:10px}.os-theme-dark>.os-scrollbar-corner,.os-theme-light>.os-scrollbar-corner{background-color:transparent}.os-theme-dark>.os-scrollbar,.os-theme-light>.os-scrollbar{padding:2px;box-sizing:border-box;background:transparent}.os-theme-dark>.os-scrollbar.os-scrollbar-unusable,.os-theme-light>.os-scrollbar.os-scrollbar-unusable{background:transparent}.os-theme-dark>.os-scrollbar>.os-scrollbar-track,.os-theme-light>.os-scrollbar>.os-scrollbar-track{background:transparent}.os-theme-dark>.os-scrollbar-horizontal>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light>.os-scrollbar-horizontal>.os-scrollbar-track>.os-scrollbar-handle{min-width:30px}.os-theme-dark>.os-scrollbar-vertical>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light>.os-scrollbar-vertical>.os-scrollbar-track>.os-scrollbar-handle{min-height:30px}.os-theme-dark.os-host-transition>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light.os-host-transition>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{-webkit-transition:background-color 0.3s;transition:background-color 0.3s}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-dark>.os-scrollbar>.os-scrollbar-track,.os-theme-light>.os-scrollbar>.os-scrollbar-track{border-radius:10px}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(0,0,0,.4)}.os-theme-light>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(255,255,255,.4)}.os-theme-dark>.os-scrollbar:hover>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(0,0,0,.55)}.os-theme-light>.os-scrollbar:hover>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(255,255,255,.55)}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle.active{background:rgba(0,0,0,.7)}.os-theme-light>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle.active{background:rgba(255,255,255,.7)}.os-theme-dark>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-dark>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-vertical .os-scrollbar-handle:before{content:'';position:absolute;left:0;right:0;top:0;bottom:0;display:block}.os-theme-dark.os-host-scrollbar-horizontal-hidden>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-dark.os-host-scrollbar-vertical-hidden>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-theme-light.os-host-scrollbar-horizontal-hidden>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-light.os-host-scrollbar-vertical-hidden>.os-scrollbar-vertical .os-scrollbar-handle:before{display:none}.os-theme-dark>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-horizontal .os-scrollbar-handle:before{top:-6px;bottom:-2px}.os-theme-dark>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-vertical .os-scrollbar-handle:before{left:-6px;right:-2px}.os-host-rtl.os-theme-dark>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-host-rtl.os-theme-light>.os-scrollbar-vertical .os-scrollbar-handle:before{right:-6px;left:-2px} \ No newline at end of file diff --git a/js/OverlayScrollbars.js b/js/OverlayScrollbars.js index 15da5fc..2bd8d04 100644 --- a/js/OverlayScrollbars.js +++ b/js/OverlayScrollbars.js @@ -2,13 +2,13 @@ * OverlayScrollbars * https://github.com/KingSora/OverlayScrollbars * - * Version: 1.5.3 + * Version: 1.6.0 * * Copyright KingSora. * https://github.com/KingSora * * Released under the MIT license. - * Date: 07.11.2018 + * Date: 02.12.2018 */ (function (global, factory) { @@ -135,7 +135,7 @@ /** * Gets the pageX and pageY values of the given mouse event. * @param event The mouse event of which the pageX and pageX shall be got. - * @returns {x: number, y: number} x = pageX value, y = pageY value. + * @returns {{x: number, y: number}} x = pageX value, y = pageY value. */ page: function(event) { event = event.originalEvent || event; @@ -179,11 +179,12 @@ /** * Gets the clicked mouse button of the given mouse event. * @param event The mouse event of which the clicked button shal be got. - * @returns {number} The number of the clicked mouse button. (1 : leftButton | 2 : middleButton | 3 : rightButton) + * @returns {number} The number of the clicked mouse button. (0 : none | 1 : leftButton | 2 : middleButton | 3 : rightButton) */ mBtn: function(event) { - if (!event.which && event.button !== undefined) - return (event.button & 1 ? 1 : (event.button & 2 ? 3 : (event.button & 4 ? 2 : 0))); + var button = event.button; + if (!event.which && button !== undefined) + return (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); else return event.which; }, @@ -248,17 +249,17 @@ } }; + var MATH = Math; var JQUERY = window.jQuery; var EASING = (function() { - var _math = window.Math; var _easingsMath = { - p : _math.PI, - c : _math.cos, - s : _math.sin, - w : _math.pow, - t : _math.sqrt, - n : _math.asin, - a : _math.abs, + p : MATH.PI, + c : MATH.cos, + s : MATH.sin, + w : MATH.pow, + t : MATH.sqrt, + n : MATH.asin, + a : MATH.abs, o : 1.70158 }; @@ -348,8 +349,8 @@ easeInElastic: function (x, t, b, c, d) { var s=_easingsMath.o;var p=0;var a=c; if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; - if (a < _easingsMath.a(c)) { a=c; var s=p/4; } - else var s = p/(2*_easingsMath.p) * _easingsMath.n (c/a); + if (a < _easingsMath.a(c)) { a=c; s=p/4; } + else s = p/(2*_easingsMath.p) * _easingsMath.n (c/a); return -(a*_easingsMath.w(2,10*(t-=1)) * _easingsMath.s( (t*d-s)*(2*_easingsMath.p)/p )) + b; }, easeOutElastic: function (x, t, b, c, d) { @@ -357,8 +358,8 @@ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; - if (a < _easingsMath.a(c)) { a=c; var s=p/4; } - else var s = p/(2*_easingsMath.p) * _easingsMath.n (c/a); + if (a < _easingsMath.a(c)) { a=c; s=p/4; } + else s = p/(2*_easingsMath.p) * _easingsMath.n (c/a); return a*_easingsMath.w(2,-10*t) * _easingsMath.s( (t*d-s)*(2*_easingsMath.p)/p ) + c + b; }, easeInOutElastic: function (x, t, b, c, d) { @@ -366,8 +367,8 @@ if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); - if (a < _easingsMath.a(c)) { a=c; var s=p/4; } - else var s = p/(2*_easingsMath.p) * _easingsMath.n (c/a); + if (a < _easingsMath.a(c)) { a=c; s=p/4; } + else s = p/(2*_easingsMath.p) * _easingsMath.n (c/a); if (t < 1) return -.5*(a*_easingsMath.w(2,10*(t-=1)) * _easingsMath.s( (t*d-s)*(2*_easingsMath.p)/p )) + b; return a*_easingsMath.w(2,-10*(t-=1)) * _easingsMath.s( (t*d-s)*(2*_easingsMath.p)/p )*.5 + c + b; }, @@ -770,7 +771,7 @@ timeNow = COMPATIBILITY.now(); elapsed = (timeNow - timeStart); end = qObj.stop || elapsed >= duration; - percent = 1 - ((Math.max(0, timeStart + duration - timeNow) / duration) || 0); + percent = 1 - ((MATH.max(0, timeStart + duration - timeNow) / duration) || 0); for(key in to) { fromVal = parseFloat(from[key]); @@ -798,7 +799,7 @@ } if(isFunction(progress)) - progress({ }, percent, Math.max(0, duration - elapsed)); + progress({ }, percent, MATH.max(0, duration - elapsed)); if (end) { startNextAnimationInQ(animObj); @@ -1387,60 +1388,62 @@ TYPES.f, //function TYPES.z //null ]; - var restrictedStringsSplit = " "; - var restrictedStringsPossibilitiesSplit = ":"; + var restrictedStringsSplit = ' '; + var restrictedStringsPossibilitiesSplit = ':'; var classNameAllowedValues = [TYPES.z, TYPES.s]; var numberAllowedValues = TYPES.n; var booleanNullAllowedValues = [TYPES.z, TYPES.b]; var booleanTrueTemplate = [true, TYPES.b]; var booleanFalseTemplate = [false, TYPES.b]; var callbackTemplate = [null, [TYPES.z, TYPES.f]]; + var inheritedAttrsTemplate = [['style', 'class'], [TYPES.s, TYPES.a, TYPES.z]]; var resizeAllowedValues = 'n:none b:both h:horizontal v:vertical'; var overflowBehaviorAllowedValues = 'v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden'; var scrollbarsVisibilityAllowedValues = 'v:visible h:hidden a:auto'; var scrollbarsAutoHideAllowedValues = 'n:never s:scroll l:leave m:move'; var optionsDefaultsAndTemplate = { - className: ['os-theme-dark', classNameAllowedValues], //null || string - resize: ['none', resizeAllowedValues], //none || both || horizontal || vertical || n || b || h || v - sizeAutoCapable: booleanTrueTemplate, //true || false - clipAlways: booleanTrueTemplate, //true || false - normalizeRTL: booleanTrueTemplate, //true || false - paddingAbsolute: booleanFalseTemplate, //true || false - autoUpdate: [null, booleanNullAllowedValues], //true || false || null - autoUpdateInterval: [33, numberAllowedValues], //number - nativeScrollbarsOverlaid: { - showNativeScrollbars: booleanFalseTemplate, //true || false - initialize: booleanTrueTemplate //true || false - }, - overflowBehavior: { - x: ['scroll', overflowBehaviorAllowedValues], //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s - y: ['scroll', overflowBehaviorAllowedValues] //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s + className: ['os-theme-dark', classNameAllowedValues], //null || string + resize: ['none', resizeAllowedValues], //none || both || horizontal || vertical || n || b || h || v + sizeAutoCapable: booleanTrueTemplate, //true || false + clipAlways: booleanTrueTemplate, //true || false + normalizeRTL: booleanTrueTemplate, //true || false + paddingAbsolute: booleanFalseTemplate, //true || false + autoUpdate: [null, booleanNullAllowedValues], //true || false || null + autoUpdateInterval: [33, numberAllowedValues], //number + nativeScrollbarsOverlaid: { + showNativeScrollbars: booleanFalseTemplate, //true || false + initialize: booleanTrueTemplate //true || false + }, + overflowBehavior: { + x: ['scroll', overflowBehaviorAllowedValues], //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s + y: ['scroll', overflowBehaviorAllowedValues] //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s }, scrollbars: { - visibility: ['auto', scrollbarsVisibilityAllowedValues], //visible || hidden || auto || v || h || a - autoHide: ['never', scrollbarsAutoHideAllowedValues], //never || scroll || leave || move || n || s || l || m - autoHideDelay: [800, numberAllowedValues], //number - dragScrolling: booleanTrueTemplate, //true || false - clickScrolling: booleanFalseTemplate, //true || false - touchSupport: booleanTrueTemplate //true || false + visibility: ['auto', scrollbarsVisibilityAllowedValues], //visible || hidden || auto || v || h || a + autoHide: ['never', scrollbarsAutoHideAllowedValues], //never || scroll || leave || move || n || s || l || m + autoHideDelay: [800, numberAllowedValues], //number + dragScrolling: booleanTrueTemplate, //true || false + clickScrolling: booleanFalseTemplate, //true || false + touchSupport: booleanTrueTemplate //true || false }, textarea: { - dynWidth: booleanFalseTemplate, //true || false - dynHeight: booleanFalseTemplate //true || false + dynWidth: booleanFalseTemplate, //true || false + dynHeight: booleanFalseTemplate, //true || false + inheritedAttrs : inheritedAttrsTemplate, //string || array || null }, callbacks: { - onInitialized: callbackTemplate, //null || function - onInitializationWithdrawn: callbackTemplate, //null || function - onDestroyed: callbackTemplate, //null || function - onScrollStart: callbackTemplate, //null || function - onScroll: callbackTemplate, //null || function - onScrollStop: callbackTemplate, //null || function - onOverflowChanged: callbackTemplate, //null || function - onOverflowAmountChanged: callbackTemplate, //null || function - onDirectionChanged: callbackTemplate, //null || function - onContentSizeChanged: callbackTemplate, //null || function - onHostSizeChanged: callbackTemplate, //null || function - onUpdated: callbackTemplate //null || function + onInitialized: callbackTemplate, //null || function + onInitializationWithdrawn: callbackTemplate, //null || function + onDestroyed: callbackTemplate, //null || function + onScrollStart: callbackTemplate, //null || function + onScroll: callbackTemplate, //null || function + onScrollStop: callbackTemplate, //null || function + onOverflowChanged: callbackTemplate, //null || function + onOverflowAmountChanged: callbackTemplate, //null || function + onDirectionChanged: callbackTemplate, //null || function + onContentSizeChanged: callbackTemplate, //null || function + onHostSizeChanged: callbackTemplate, //null || function + onUpdated: callbackTemplate //null || function } }; var convert = function(template) { @@ -1568,7 +1571,7 @@ if(keepForeignProps) FRAMEWORK.extend(true, validatedOptions, objectCopy); else if(!FRAMEWORK.isEmptyObject(objectCopy) && writeErrors) - console.warn("The following options are discarded due to invalidity:\r\n" + JSON.stringify(objectCopy, null, 2)); + console.warn("The following options are discarded due to invalidity:\r\n" + window.JSON.stringify(objectCopy, null, 2)); return validatedOptions; } @@ -1632,19 +1635,19 @@ var edge = ua[strIndexOf]('Edge/'); var rv = ua[strIndexOf]('rv:'); var result; - var parseInt = window.parseInt; + var parseIntFunc = parseInt; // IE 10 or older => return version number if (msie > 0) - result = parseInt(ua[strSubString](msie + 5, ua[strIndexOf]('.', msie)), 10); + result = parseIntFunc(ua[strSubString](msie + 5, ua[strIndexOf]('.', msie)), 10); // IE 11 => return version number else if (trident > 0) - result = parseInt(ua[strSubString](rv + 3, ua[strIndexOf]('.', rv)), 10); + result = parseIntFunc(ua[strSubString](rv + 3, ua[strIndexOf]('.', rv)), 10); // Edge (IE 12+) => return version number else if (edge > 0) - result = parseInt(ua[strSubString](edge + 5, ua[strIndexOf]('.', edge)), 10); + result = parseIntFunc(ua[strSubString](edge + 5, ua[strIndexOf]('.', edge)), 10); // other browser return result; @@ -1720,7 +1723,7 @@ if(nativeScrollbarIsOverlaid.x && nativeScrollbarIsOverlaid.y) return; - var abs = Math.abs; + var abs = MATH.abs; var windowWidth = COMPATIBILITY.wW(); var windowHeight = COMPATIBILITY.wH(); var windowDpr = getWindowDPR(); @@ -1734,8 +1737,8 @@ if (deltaW === 0 && deltaH === 0) return; - var deltaWRatio = Math.round(newW / (windowWidth / 100.0)); - var deltaHRatio = Math.round(newH / (windowHeight / 100.0)); + var deltaWRatio = MATH.round(newW / (windowWidth / 100.0)); + var deltaHRatio = MATH.round(newH / (windowHeight / 100.0)); var absDeltaW = abs(deltaW); var absDeltaH = abs(deltaH); var absDeltaWRatio = abs(deltaWRatio); @@ -1851,13 +1854,13 @@ if (instance !== undefined) { var instanceOptions = instance.options(); var instanceAutoUpdateAllowed = instanceOptions[_strAutoUpdate]; - var instanceAutoUpdateInterval = Math.max(1, instanceOptions[_strAutoUpdateInterval]); + var instanceAutoUpdateInterval = MATH.max(1, instanceOptions[_strAutoUpdateInterval]); var now = COMPATIBILITY.now(); if ((instanceAutoUpdateAllowed === true || instanceAutoUpdateAllowed === null) && (now - _loopingInstancesIntervalCache[i]) > instanceAutoUpdateInterval) { instance.update('auto'); _loopingInstancesIntervalCache[i] = new Date(now += instanceAutoUpdateInterval); } - lowestInterval = Math.max(1, Math.min(lowestInterval, instanceAutoUpdateInterval)); + lowestInterval = MATH.max(1, MATH.min(lowestInterval, instanceAutoUpdateInterval)); } } _loopInterval = lowestInterval; @@ -1946,6 +1949,7 @@ var _supportTransform; var _supportPassiveEvents; var _supportResizeObserver; + var _supportMutationObserver; var _restrictedMeasuring; //general readonly: @@ -1972,10 +1976,6 @@ var _viewportSize = { }; var _nativeScrollbarMinSize = { }; - //scroll - var _scrollStopDelay = 175; - var _scrollStopTimeoutId; - //naming: var _strMinusHidden = '-hidden'; var _strMarginMinus = 'margin-'; @@ -2059,6 +2059,9 @@ var _classNameDragging = _cassNamesPrefix + 'dragging'; var _classNameThemeNone = _cassNamesPrefix + 'theme-none'; + //callbacks: + var _callbacksInitQeueue = [ ]; + //options: var _defaultOptions; var _currentOptions; @@ -2081,14 +2084,14 @@ var _htmlElement; var _bodyElement; var _targetElement; //the target element of this OverlayScrollbars object - var _hostElement; //the host element of this OverlayScrollbars object -> may be the same as targetElement - var _sizeAutoObserverElement; //observes size auto changes + var _hostElement; //the host element of this OverlayScrollbars object -> may be the same as targetElement + var _sizeAutoObserverElement; //observes size auto changes var _sizeObserverElement; //observes size and padding changes - var _contentGlueElement; //has always the size of the content element - var _paddingElement; //manages the padding - var _viewportElement; //is the viewport of our scrollbar model + var _contentGlueElement; //has always the size of the content element + var _paddingElement; //manages the padding + var _viewportElement; //is the viewport of our scrollbar model var _contentArrangeElement; //is needed for correct sizing of the content element (only if native scrollbars are overlays) - var _contentElement; //the element which holds the content + var _contentElement; //the element which holds the content var _textareaCoverElement; //only applied if target is a textarea element. Used for correct size calculation and for prevention of uncontrolled scrolling var _scrollbarCornerElement; var _scrollbarHorizontalElement; @@ -2147,21 +2150,12 @@ var _displayIsHiddenCache; //MutationObserver: - var _mutationObserverContentLag = 11; var _mutationObserverHost; var _mutationObserverContent; - var _mutationObserverConnected; - var _supportMutationObserver; + var _mutationObserversConnected; //textarea: - var _textareaKeyDownRestrictedKeyCodes = [ - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 123, //F1 to F12 - 33, 34, //page up, page down - 37, 38, 39, 40, //left, up, right, down arrows - 16, 17, 18, 19, 20, 144 //Shift, Ctrl, Alt, Pause, CapsLock, NumLock - ]; - var _textareaKeyDownKeyCodesList = [ ]; - var _textareaUpdateIntervalID; + var _textareaEvents; var _textareaHasFocus; //scrollbars: @@ -2181,11 +2175,10 @@ var _resizeBoth; var _resizeHorizontal; var _resizeVertical; - var _resizeDragStartPosition = { }; - var _resizeDragStartSize = { }; + var _resizeOnMouseTouchDown; - //==== Add / Remove Passive Event Listener ====// + //==== Passive Event Listener ====// /** * Adds a passive event listener to the given element. @@ -2212,7 +2205,7 @@ } - //==== Add / Remove / Freeze / Unfreeze Resize Observer ====// + //==== Resize Observer ====// /** * Adds a resize observer to the given element. @@ -2450,13 +2443,101 @@ } - //==== Connect / Disconnect Mutation Observer ====// + //==== Mutation Observers ====// + /** + * Creates MutationObservers for the host and content Element if they are supported. + */ + function createMutationObservers() { + if (_supportMutationObserver) { + var mutationObserverContentLag = 11; + var mutationObserver = COMPATIBILITY.mO(); + var contentLastUpdate = COMPATIBILITY.now(); + var mutationTarget; + var mutationAttrName; + var contentTimeout; + var now; + var sizeAuto; + var action; + + _mutationObserverHost = new mutationObserver(function (mutations) { + if (!_initialized || _isSleeping) + return; + + var doUpdate = false; + //var doUpdateScrollbars = false; + var mutation; + FRAMEWORK.each(mutations, function () { + mutation = this; + mutationTarget = mutation.target; + mutationAttrName = mutation.attributeName; + + if (mutationAttrName === LEXICON.c) + doUpdate = hostClassNamesChanged(mutation.oldValue, mutationTarget.className); + else if (mutationAttrName === LEXICON.s) + doUpdate = mutation.oldValue !== mutationTarget[LEXICON.s].cssText; + else + doUpdate = true; + + if (doUpdate) + return false; + }); + + if (doUpdate) + _base.update(_strAuto); + /* + if(doUpdateScrollbars) { + refreshScrollbarHandleLength(true); + refreshScrollbarHandleOffset(true, _scrollHorizontalInfo.cs); + refreshScrollbarHandleLength(false); + refreshScrollbarHandleOffset(false, _scrollVerticalInfo.cs); + } + */ + }); + _mutationObserverContent = new mutationObserver(function (mutations) { + if (!_initialized || _isSleeping) + return; + + var doUpdate = false; + var mutation; + FRAMEWORK.each(mutations, function () { + mutation = this; + doUpdate = isUnknownMutation(mutation); + return !doUpdate; + }); + + if (doUpdate) { + now = COMPATIBILITY.now(); + sizeAuto = (_heightAutoCache || _widthAutoCache); + action = function () { + if(!_destroyed) { + contentLastUpdate = now; + + //if cols, rows or wrap attr was changed + if (_isTextarea) + textareaUpdate(); + + if (sizeAuto) + update(); + else + _base.update(_strAuto); + } + }; + clearTimeout(contentTimeout); + if (mutationObserverContentLag <= 0 || now - contentLastUpdate > mutationObserverContentLag || !sizeAuto) + action(); + else + contentTimeout = setTimeout(action, mutationObserverContentLag); + } + }); + } + } + /** * Connects the MutationObservers if they are supported. */ - function mutationObserversConnect() { - if (_supportMutationObserver && !_mutationObserverConnected) { + function connectMutationObservers() { + if (_supportMutationObserver && !_mutationObserversConnected) { _mutationObserverHost.observe(_hostElement[0], { attributes: true, attributeOldValue: true, @@ -2472,19 +2553,19 @@ attributeFilter: _isTextarea ? ['wrap', 'cols', 'rows'] : [LEXICON.i, LEXICON.c, LEXICON.s] }); - _mutationObserverConnected = true; + _mutationObserversConnected = true; } } /** * Disconnects the MutationObservers if they are supported. */ - function mutationObserversDisconnect() { - if (_supportMutationObserver && _mutationObserverConnected) { + function disconnectMutationObservers() { + if (_supportMutationObserver && _mutationObserversConnected) { _mutationObserverHost.disconnect(); _mutationObserverContent.disconnect(); - _mutationObserverConnected = false; + _mutationObserversConnected = false; } } @@ -2514,7 +2595,7 @@ _hostElementSizeChangeDetectedCache = hostSize; } } - + /** * The mouse enter event of the host element. This event is only needed for the autoHide feature. */ @@ -2545,212 +2626,34 @@ } } - /** - * The scroll event of the viewport element. That is the main scroll event. It controls also the "scroll", "scrollStart" and "scrollStop" callbacks. - * @param event The scroll event. + /** + * Adds or removes mouse & touch events of the host element. (for handling auto-hiding of the scrollbars) + * @param destroy Indicates whether the events shall be added or removed. */ - function viewportOnScroll(event) { - if (_isSleeping) - return; - - if (_scrollStopTimeoutId !== undefined) - clearTimeout(_scrollStopTimeoutId); + function setupHostMouseTouchEvents(destroy) { + var passiveEvent = destroy ? removePassiveEventListener : addPassiveEventListener; + var strOnOff = destroy ? 'off' : 'on'; + var setupEvent = function(target, name, listener) { + if(_supportPassiveEvents) + passiveEvent(target, name, listener); + else + target[strOnOff](name, listener); + }; + + if(_scrollbarsAutoHideMove && !destroy) + setupEvent(_hostElement, _strMouseTouchMoveEvent, hostOnMouseMove); else { - if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) - refreshScrollbarsAutoHide(true); - - if (!nativeOverlayScrollbarsAreActive()) - addClass(_hostElement, _classNameHostScrolling); - - callCallback("onScrollStart", event); + if(destroy) + setupEvent(_hostElement, _strMouseTouchMoveEvent, hostOnMouseMove); + setupEvent(_hostElement, _strMouseTouchEnter, hostOnMouseEnter); + setupEvent(_hostElement, _strMouseTouchLeave, hostOnMouseLeave); } - - refreshScrollbarHandleOffset(true, _viewportElement[_strScrollLeft]()); - refreshScrollbarHandleOffset(false, _viewportElement[_strScrollTop]()); - callCallback("onScroll", event); - - _scrollStopTimeoutId = setTimeout(function () { - if(!_destroyed) { - viewportOnScrollStop(); - callCallback("onScrollStop", event); - } - }, _scrollStopDelay); + + //if the plugin is initialized and the mouse is over the host element, make the scrollbars visible + if(!_initialized && !destroy) + _hostElement.one("mouseover", hostOnMouseEnter); } - - /** - * This method gets called if the scroll event stopped for a specified amount of time. - */ - function viewportOnScrollStop() { - clearTimeout(_scrollStopTimeoutId); - _scrollStopTimeoutId = undefined; - if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) - refreshScrollbarsAutoHide(false); - - if (!nativeOverlayScrollbarsAreActive()) - removeClass(_hostElement, _classNameHostScrolling); - } - - /** - * The key input event of the textarea element. - */ - function textareaOnInput() { - textareaUpdate(); - _base.update(_strAuto); - } - - /** - * The key down event of the textarea element. Is only applied if the input event isn't fully supported. - * @param event The key down event. - */ - function textareaOnKeyDown(event) { - var keyCode = event.keyCode; - if (textareaIsRestrictedKeyCode(keyCode)) - return; - if (_textareaKeyDownKeyCodesList.length === 0) { - var action = function () { - textareaUpdate(); - _base.update(_strAuto); - }; - action(); - _textareaUpdateIntervalID = setInterval(action, 1000 / 60); - } - if (FRAMEWORK.inArray(keyCode, _textareaKeyDownKeyCodesList) === -1) - _textareaKeyDownKeyCodesList.push(keyCode); - } - - /** - * The key up event of the textarea element. Is only applied if the input event isn't fully supported. - * @param event The key up event. - */ - function textareaOnKeyUp(event) { - var keyCode = event.keyCode; - if (textareaIsRestrictedKeyCode(keyCode)) - return; - var index = FRAMEWORK.inArray(keyCode, _textareaKeyDownKeyCodesList); - if (index > -1) - _textareaKeyDownKeyCodesList.splice(index, 1); - if (_textareaKeyDownKeyCodesList.length === 0) { - textareaUpdate(); - _base.update(_strAuto); - clearInterval(_textareaUpdateIntervalID); - } - } - - /** - * The drop event of the textarea element. - */ - function textareaOnDrop() { - setTimeout(function () { - if(!_destroyed) { - textareaUpdate(); - _base.update(_strAuto); - } - }, 50); - } - - /** - * The focus event of the textarea element. - */ - function textareaOnFocus() { - _textareaHasFocus = true; - } - - /** - * The focus out event of the textarea element. - */ - function textareaOnFocusOut() { - _textareaHasFocus = false; - clearInterval(_textareaUpdateIntervalID); - _textareaKeyDownKeyCodesList = [ ]; - textareaUpdate(); - _base.update(_strAuto); - } - - /** - * The scroll event of the textarea element. - * @param event The scroll event. - */ - function textareaOnScroll(event) { - _targetElement[_strScrollLeft](_rtlScrollBehavior.i && _normalizeRTLCache ? 9999999 : 0); - _targetElement[_strScrollTop](0); - COMPATIBILITY.prvD(event); - COMPATIBILITY.stpP(event); - return false; - } - - /** - * The mouse down event of the scrollbar corner element. - * @param event The mouse down event. - */ - function scrollbarCornerOnMouseDown(event) { - if (_isSleeping) - return; - - var originalEvent = event.originalEvent || event; - var isTouchEvent = originalEvent.touches !== undefined; - - if (COMPATIBILITY.mBtn(event) === 1 || isTouchEvent) { - if (_mutationObserverConnected) { - _resizeReconnectMutationObserver = true; - mutationObserversDisconnect(); - } - - _resizeDragStartPosition = COMPATIBILITY.page(event); - - _resizeDragStartSize.w = _hostElement[0][LEXICON.oW] - (!_isBorderBox ? _paddingX : 0); - _resizeDragStartSize.h = _hostElement[0][LEXICON.oH] - (!_isBorderBox ? _paddingY : 0); - - _documentElement.on(_strSelectStartEvent, documentOnSelectStart) - .on(_strMouseTouchMoveEvent, scrollbarCornerOnResize) - .on(_strMouseTouchUpEvent, scrollbarCornerOnResized); - - addClass(_bodyElement, _classNameDragging); - if (_scrollbarCornerElement.setCapture) - _scrollbarCornerElement.setCapture(); - - COMPATIBILITY.prvD(event); - COMPATIBILITY.stpP(event); - } - } - - /** - * The mouse move event if the scrollbar corner element is resizable and gets dragged. - * @param event The mouse move event. - */ - function scrollbarCornerOnResize(event) { - var pageOffset = COMPATIBILITY.page(event); - var hostElementCSS = { }; - if (_resizeHorizontal || _resizeBoth) - hostElementCSS[_strWidth] = (_resizeDragStartSize.w + pageOffset.x - _resizeDragStartPosition.x); - if (_resizeVertical || _resizeBoth) - hostElementCSS[_strHeight] = (_resizeDragStartSize.h + pageOffset.y - _resizeDragStartPosition.y); - _hostElement.css(hostElementCSS); - COMPATIBILITY.stpP(event); - } - - /** - * The mouse up event if the scrollbar corner element is resizable and was dragged and now the mouse button is released. - * @param event The mouse up event. - */ - function scrollbarCornerOnResized(event) { - var eventIsTrusted = event !== undefined; - - _documentElement.off(_strSelectStartEvent, documentOnSelectStart) - .off(_strMouseTouchMoveEvent, scrollbarCornerOnResize) - .off(_strMouseTouchUpEvent, scrollbarCornerOnResized); - - removeClass(_bodyElement, _classNameDragging); - if (_scrollbarCornerElement.releaseCapture) - _scrollbarCornerElement.releaseCapture(); - - if (eventIsTrusted) { - if (_resizeReconnectMutationObserver) - mutationObserversConnect(); - _base.update(_strAuto); - } - _resizeReconnectMutationObserver = false; - } - + /** * Prevents text from deselection if attached to the document element on the mousedown event of a DOM element. * @param event The select start event. @@ -2804,7 +2707,7 @@ //remove none theme from diff list to prevent update var idx = FRAMEWORK.inArray(_classNameThemeNone, diff); - var curr = diff[i]; + var curr; var i; var v; var o; @@ -2854,6 +2757,10 @@ if (mutationTarget === _contentElement[0]) return attributeName === null; if (mutationType === 'attributes' && (attributeName === LEXICON.c || attributeName === LEXICON.s) && !_isTextarea) { + //ignore className changes by the plugin + if (attributeName === LEXICON.c && FRAMEWORK(mutationTarget).hasClass(_classNameHostElement)) + return hostClassNamesChanged(mutation.oldValue, mutationTarget.getAttribute(LEXICON.c)); + //only do it of browser support it natively if (typeof mutationTarget[strClosest] != TYPES.f) return true; @@ -2875,7 +2782,7 @@ var float; var textareaValueLength = _isTextarea && _widthAutoCache && !_textareaAutoWrappingCache ? _targetElement.val().length : 0; - var setCSS = !_mutationObserverConnected && _widthAutoCache && !_isTextarea; + var setCSS = !_mutationObserversConnected && _widthAutoCache && !_isTextarea; var viewportScrollSize = { }; var css = { }; @@ -2917,7 +2824,7 @@ * @returns {boolean} */ function meaningfulAttrsChanged() { - if (_isSleeping || _mutationObserverConnected) + if (_isSleeping || _mutationObserversConnected) return false; var hostElementId = _hostElement.attr(LEXICON.i) || _strEmpty; @@ -3055,7 +2962,7 @@ //measure width origWidth = measureElement[LEXICON.oW]; - width = doMeasure ? Math.max(origWidth, measureElement[LEXICON.sW] - 1) : 1; + width = doMeasure ? MATH.max(origWidth, measureElement[LEXICON.sW] - 1) : 1; width += (_widthAutoCache ? _marginX + (!_isBorderBox ? wrapAttrOff ? 0 : _paddingX + _borderX : 0) : 0); //set measured width and height auto @@ -3065,7 +2972,7 @@ //measure height origHeight = measureElement[LEXICON.oH]; - height = Math.max(origHeight, measureElement[LEXICON.sH] - 1); + height = MATH.max(origHeight, measureElement[LEXICON.sH] - 1); //append correct size values css[_strWidth] = width; @@ -3271,22 +3178,22 @@ //set correct auto Update if (autoUpdateChanged) { if (autoUpdate === true) { - mutationObserversDisconnect(); + disconnectMutationObservers(); autoUpdateLoop.add(_base); } else if (autoUpdate === null) { if (_autoUpdateRecommended) { - mutationObserversDisconnect(); + disconnectMutationObservers(); autoUpdateLoop.add(_base); } else { autoUpdateLoop.remove(_base); - mutationObserversConnect(); + connectMutationObservers(); } } else { autoUpdateLoop.remove(_base); - mutationObserversConnect(); + connectMutationObservers(); } } @@ -3374,7 +3281,7 @@ //detect width auto: var widthAutoResizeDetection = false; - var widthAutoObserverDetection = (_sizeAutoObserverAdded && (_hostElement.css(_strFloat) !== 'none' /*|| _isTextarea */)) ? (Math.round(sizeAutoObserverElementBCRect.right - sizeAutoObserverElementBCRect.left) === 0) && (!paddingAbsolute ? (hostElement[LEXICON.cW] - _paddingX) > 0 : true) : false; + var widthAutoObserverDetection = (_sizeAutoObserverAdded && (_hostElement.css(_strFloat) !== 'none' /*|| _isTextarea */)) ? (MATH.round(sizeAutoObserverElementBCRect.right - sizeAutoObserverElementBCRect.left) === 0) && (!paddingAbsolute ? (hostElement[LEXICON.cW] - _paddingX) > 0 : true) : false; if (sizeAutoCapable && !widthAutoObserverDetection) { var tmpCurrHostWidth = hostElement[LEXICON.oW]; var tmpCurrContentGlueWidth = _contentGlueElement.css(_strWidth); @@ -3395,7 +3302,7 @@ var wasWidthAuto = !widthAuto && _widthAutoCache; //detect height auto: - var heightAuto = _sizeAutoObserverAdded && !displayIsHidden ? (Math.round(sizeAutoObserverElementBCRect.bottom - sizeAutoObserverElementBCRect.top) === 0) /* && (!paddingAbsolute && (_msieVersion > 9 || !_msieVersion) ? true : true) */ : false; + var heightAuto = _sizeAutoObserverAdded && !displayIsHidden ? (MATH.round(sizeAutoObserverElementBCRect.bottom - sizeAutoObserverElementBCRect.top) === 0) /* && (!paddingAbsolute && (_msieVersion > 9 || !_msieVersion) ? true : true) */ : false; var heightAutoChanged = checkCacheSingle(heightAuto, _heightAutoCache, force); var wasHeightAuto = !heightAuto && _heightAutoCache; @@ -3439,7 +3346,7 @@ }; }; var getViewportSize = function() { - var brect = paddingElement.getBoundingClientRect() + var brect = paddingElement.getBoundingClientRect(); return brect[_strWidth] ? { w: brect[_strWidth], @@ -3599,8 +3506,8 @@ h: contentMeasureElement[LEXICON.cH] }; var scrollSize = { - w: Math.max(contentMeasureElement[LEXICON.sW], contentMeasureElementGuaranty[LEXICON.sW]), - h: Math.max(contentMeasureElement[LEXICON.sH], contentMeasureElementGuaranty[LEXICON.sH]) + w: MATH.max(contentMeasureElement[LEXICON.sW], contentMeasureElementGuaranty[LEXICON.sW]), + h: MATH.max(contentMeasureElement[LEXICON.sH], contentMeasureElementGuaranty[LEXICON.sH]) }; var contentClientSize = { w: _isTextarea && textareaSize && !textareaDynWidth ? textareaSize.ow : widthAuto ? clientSize.w : scrollSize.w, @@ -3618,8 +3525,8 @@ //has to be clientSize because offsetSize respect borders. var hostSize = getHostSize(); var contentGlueSize = { - w: Math.max(contentClientSize.w + padding.ax, hostSize.w - _paddingX) - (textareaDynWidth ? (_isTextarea && widthAuto ? _marginX + (!_isBorderBox ? _paddingX + _borderX : 0) : 0) : 0), - h: Math.max(contentClientSize.h + padding.ay, hostSize.h - _paddingY) + w: MATH.max(contentClientSize.w + padding.ax, hostSize.w - _paddingX) - (textareaDynWidth ? (_isTextarea && widthAuto ? _marginX + (!_isBorderBox ? _paddingX + _borderX : 0) : 0) : 0), + h: MATH.max(contentClientSize.h + padding.ay, hostSize.h - _paddingY) }; contentGlueSize.c = checkCacheDouble(contentGlueSize, _contentGlueSizeCache, force); _contentGlueSizeCache = contentGlueSize; @@ -3662,8 +3569,8 @@ //make sure content glue size at least 1 if (contentClientSize.h > 0) { - contentGlueElementCSS[_strWidth] = Math.max(1, contentGlueElementCSS[_strWidth]); - contentGlueElementCSS[_strHeight] = Math.max(1, contentGlueElementCSS[_strHeight]); + contentGlueElementCSS[_strWidth] = MATH.max(1, contentGlueElementCSS[_strWidth]); + contentGlueElementCSS[_strHeight] = MATH.max(1, contentGlueElementCSS[_strHeight]); } if (_isTextarea) @@ -3672,7 +3579,7 @@ } if (widthAuto) contentElementCSS[_strWidth] = _strHundredPercent; - if (widthAuto && !_isBorderBox && !_mutationObserverConnected) + if (widthAuto && !_isBorderBox && !_mutationObserversConnected) contentElementCSS[_strFloat] = 'none'; @@ -3685,8 +3592,8 @@ var contentBCRectW = contentBCRect[_strWidth] || 0; var contentBCRectH = contentBCRect[_strHeight] || 0; var contentScrollSize = { - w: Math.max(contentMeasureElement[LEXICON.sW], contentMeasureElementGuaranty[LEXICON.sW]) + parseToZeroOrNumber(contentBCRectW) - contentBCRectW, - h: Math.max(contentMeasureElement[LEXICON.sH], contentMeasureElementGuaranty[LEXICON.sH]) + parseToZeroOrNumber(contentBCRectH) - contentBCRectH + w: MATH.max(contentMeasureElement[LEXICON.sW], contentMeasureElementGuaranty[LEXICON.sW]) + parseToZeroOrNumber(contentBCRectW) - contentBCRectW, + h: MATH.max(contentMeasureElement[LEXICON.sH], contentMeasureElementGuaranty[LEXICON.sH]) + parseToZeroOrNumber(contentBCRectH) - contentBCRectH }; contentScrollSize.c = contentSizeChanged = checkCacheDouble(contentScrollSize, _contentScrollSizeCache, force); _contentScrollSizeCache = contentScrollSize; @@ -3715,8 +3622,8 @@ y: overflowBehavior.y === 's' }; var overflowAmount = { - x: Math.max(0, Math.round((contentScrollSize.w - _viewportSize.w) * 100) / 100), - y: Math.max(0, Math.round((contentScrollSize.h - _viewportSize.h) * 100) / 100) + x: MATH.max(0, MATH.round((contentScrollSize.w - _viewportSize.w) * 100) / 100), + y: MATH.max(0, MATH.round((contentScrollSize.h - _viewportSize.h) * 100) / 100) }; var hideOverflowForceTextarea = _isTextarea && (_viewportSize.w === 0 || _viewportSize.h === 0); var hideOverflowForceRounding = (_viewportElement[0].scrollLeftMax === 0 && overflowAmount.x > 0 && overflowAmount.x < 1) || (_viewportElement[0].scrollTopMax === 0 && overflowAmount.y > 0 && overflowAmount.y < 1); @@ -3909,9 +3816,9 @@ if (cssDirectionChanged || widthAutoChanged || heightAutoChanged) { if (_isRTL && widthAuto) { var floatTmp = _contentElement.css(_strFloat); - var posLeftWithoutFloat = Math.round(_contentElement.css(_strFloat, _strEmpty).css(_strLeft, _strEmpty).position().left); + var posLeftWithoutFloat = MATH.round(_contentElement.css(_strFloat, _strEmpty).css(_strLeft, _strEmpty).position().left); _contentElement.css(_strFloat, floatTmp); - var posLeftWithFloat = Math.round(_contentElement.position().left); + var posLeftWithFloat = MATH.round(_contentElement.position().left); if (posLeftWithoutFloat !== posLeftWithFloat) contentElementCSS[_strLeft] = posLeftWithoutFloat; @@ -3958,8 +3865,8 @@ if (_isBody) addClass(_hostElement, _classNameHostResizeDisabled); if (resizeChanged) { - var addCornerEvents = function () { _scrollbarCornerElement.on(_strMouseTouchDownEvent, scrollbarCornerOnMouseDown); }; - var removeCornerEvents = function () { _scrollbarCornerElement.off(_strMouseTouchDownEvent, scrollbarCornerOnMouseDown); }; + var addCornerEvents = function () { _scrollbarCornerElement.on(_strMouseTouchDownEvent, _resizeOnMouseTouchDown); }; + var removeCornerEvents = function () { _scrollbarCornerElement.off(_strMouseTouchDownEvent, _resizeOnMouseTouchDown); }; if (_resizeNone) { addClass(_hostElement, _classNameHostResizeDisabled); removeClass(_scrollbarCornerElement, [ @@ -4018,46 +3925,12 @@ //manage the scrollbars auto hide feature (auto hide them after specific actions) if (scrollbarsAutoHideChanged || ignoreOverlayScrollbarHidingChanged) { - var addMouseTouchEvents = function (move) { - if (_supportPassiveEvents) { - if(move) - addPassiveEventListener(_hostElement, _strMouseTouchMoveEvent, hostOnMouseMove); - else { - addPassiveEventListener(_hostElement, _strMouseTouchEnter, hostOnMouseEnter); - addPassiveEventListener(_hostElement, _strMouseTouchLeave, hostOnMouseLeave); - } - } - else { - if(move) - _hostElement.on(_strMouseTouchMoveEvent, hostOnMouseMove); - else { - _hostElement.on(_strMouseTouchEnter, hostOnMouseEnter) - .on(_strMouseTouchLeave, hostOnMouseLeave); - } - } - - //if the plugin is initialized and the mouse is over the host element, make the scrollbars visible - if(!_initialized) - _hostElement.one("mouseover", hostOnMouseEnter); - }; - var removeMouseTouchEvents = function () { - if (_supportPassiveEvents) { - removePassiveEventListener(_hostElement, _strMouseTouchMoveEvent, hostOnMouseMove); - removePassiveEventListener(_hostElement, _strMouseTouchEnter, hostOnMouseEnter); - removePassiveEventListener(_hostElement, _strMouseTouchLeave, hostOnMouseLeave); - } - else { - _hostElement.off(_strMouseTouchMoveEvent, hostOnMouseMove) - .off(_strMouseTouchEnter, hostOnMouseEnter) - .off(_strMouseTouchLeave, hostOnMouseLeave); - } - }; if (_scrollbarsAutoHideLeave || _scrollbarsAutoHideMove) { - removeMouseTouchEvents(); - addMouseTouchEvents(_scrollbarsAutoHideMove); + setupHostMouseTouchEvents(true); + setupHostMouseTouchEvents(); } else { - removeMouseTouchEvents(); + setupHostMouseTouchEvents(true); } if (_scrollbarsAutoHideNever) @@ -4092,7 +3965,7 @@ var lastCol = textareaInfo.c; var cursorPos = textareaInfo.p; var cursorMax = textareaInfo.m; - var cursorIsLastPosition = (cursorMax === cursorPos && _textareaHasFocus); + var cursorIsLastPosition = (cursorPos >= cursorMax && _textareaHasFocus); var doScroll = { x: (!textareaAutoWrapping && (cursorCol === lastCol && cursorRow === widestRow)) ? _overflowAmountCache.x : -1, y: (textareaAutoWrapping ? cursorIsLastPosition || textareaRowsChanged && (previousOverflow !== undefined ? (currScroll.t === previousOverflow.y) : false) : (cursorIsLastPosition || textareaRowsChanged) && cursorRow === lastRow) ? _overflowAmountCache.y : -1 @@ -4121,25 +3994,25 @@ } if (cssDirectionChanged) { - callCallback("onDirectionChanged", { + dispatchCallback("onDirectionChanged", { isRTL: _isRTL, dir: cssDirection }); } if (hostSizeChanged) { - callCallback("onHostSizeChanged", { + dispatchCallback("onHostSizeChanged", { width: _hostSizeCache.w, height: _hostSizeCache.h }); } if (contentSizeChanged) { - callCallback("onContentSizeChanged", { + dispatchCallback("onContentSizeChanged", { width: _contentScrollSizeCache.w, height: _contentScrollSizeCache.h }); } if (hasOverflow.c || hideOverflow.c) { - callCallback("onOverflowChanged", { + dispatchCallback("onOverflowChanged", { x: hasOverflow.x, y: hasOverflow.y, xScrollable: hideOverflow.xs, @@ -4148,7 +4021,7 @@ }); } if (overflowAmount.c) { - callCallback("onOverflowAmountChanged", { + dispatchCallback("onOverflowAmountChanged", { x: overflowAmount.x, y: overflowAmount.y }); @@ -4170,7 +4043,7 @@ unfreezeResizeObserver(_sizeObserverElement); unfreezeResizeObserver(_sizeAutoObserverElement); - callCallback("onUpdated", { forced: force }); + dispatchCallback("onUpdated", { forced: force }); } @@ -4185,54 +4058,295 @@ _currentPreparedOptions = extend(true, {}, _currentPreparedOptions, _pluginsOptions.v(newOptions, _pluginsOptions.t, false, true)); } + + //==== Structure ====// + + /** + * Builds or destroys the wrapper and helper DOM elements. + * @param destroy Indicates whether the DOM shall be build or destroyed. + */ + function setupStructureDOM(destroy) { + var adoptAttrs = _currentPreparedOptions.textarea.inheritedAttrs; + var adoptAttrsMap = { }; + var applyAdoptedAttrs = function() { + var applyAdoptedAttrsElm = destroy ? _targetElement : _hostElement; + FRAMEWORK.each(adoptAttrsMap, function(k, v) { + if(type(v) == TYPES.s) { + if(k == LEXICON.c) + applyAdoptedAttrsElm.addClass(v); + else + applyAdoptedAttrsElm.attr(k, v); + } + }); + }; + var hostElementClassNames = [ + _classNameHostElement, + _classNameHostTextareaElement, + _classNameHostResizeDisabled, + _classNameHostRTL, + _classNameHostScrollbarHorizontalHidden, + _classNameHostScrollbarVerticalHidden, + _classNameHostTransition, + _classNameHostScrolling, + _classNameHostOverflow, + _classNameHostOverflowX, + _classNameHostOverflowY, + _classNameThemeNone, + _classNameCache].join(_strSpace); + adoptAttrs = type(adoptAttrs) == TYPES.s ? adoptAttrs.split(' ') : adoptAttrs; + if(type(adoptAttrs) == TYPES.a) { + FRAMEWORK.each(adoptAttrs, function(i, v) { + if(type(v) == TYPES.s) + adoptAttrsMap[v] = destroy ? _hostElement.attr(v) : _targetElement.attr(v); + }); + } + + if(!destroy) { + if (_isTextarea) { + var hostElementCSS = {}; + if (!_currentPreparedOptions.sizeAutoCapable) { + hostElementCSS[_strWidth] = _targetElement.css(_strWidth); + hostElementCSS[_strHeight] = _targetElement.css(_strHeight); + } + _targetElement.wrap(generateDiv(_classNameHostTextareaElement)); + _hostElement = _targetElement.parent(); + _hostElement.css(hostElementCSS) + .wrapInner(generateDiv(_classNameContentElement + _strSpace + _classNameTextInherit)) + .wrapInner(generateDiv(_classNameViewportElement + _strSpace + _classNameTextInherit)) + .wrapInner(generateDiv(_classNamePaddingElement + _strSpace + _classNameTextInherit)); + _contentElement = findFirst(_hostElement, _strDot + _classNameContentElement); + _viewportElement = findFirst(_hostElement, _strDot + _classNameViewportElement); + _paddingElement = findFirst(_hostElement, _strDot + _classNamePaddingElement); + _textareaCoverElement = FRAMEWORK(generateDiv(_classNameTextareaCoverElement)); + _contentElement.prepend(_textareaCoverElement); + addClass(_targetElement, _classNameTextareaElement + _strSpace + _classNameTextInherit); + + applyAdoptedAttrs(); + } + else { + _hostElement = _targetElement; + _hostElement.wrapInner(generateDiv(_classNameContentElement)) + .wrapInner(generateDiv(_classNameViewportElement)) + .wrapInner(generateDiv(_classNamePaddingElement)); + _contentElement = findFirst(_hostElement, _strDot + _classNameContentElement); + _viewportElement = findFirst(_hostElement, _strDot + _classNameViewportElement); + _paddingElement = findFirst(_hostElement, _strDot + _classNamePaddingElement); + + addClass(_targetElement, _classNameHostElement); + } + + if (_nativeScrollbarStyling) + addClass(_viewportElement, _nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y ? _classNameViewportNativeScrollbarsOverlaid : _classNameViewportNativeScrollbarsInvisible); + if (_isBody) + addClass(_htmlElement, _classNameHTMLElement); + + _sizeObserverElement = FRAMEWORK(generateDiv('os-resize-observer-host')); + _hostElement.prepend(_sizeObserverElement); + } + else { + _contentElement.contents() + .unwrap() + .unwrap() + .unwrap(); + + if (_isTextarea) { + _targetElement.removeAttr(LEXICON.s); + + applyAdoptedAttrs(); + + removeClass(_targetElement, hostElementClassNames + _strSpace + _classNameTextareaElement + _strSpace + _classNameTextInherit) + .unwrap(); + remove(_textareaCoverElement); + remove(_hostElement); + } + else { + removeClass(_targetElement, _classNameHostElement); + removeClass(_hostElement, hostElementClassNames); + } + + if (_isBody) + removeClass(_htmlElement, _classNameHTMLElement); + + remove(_sizeObserverElement); + } + } + + /** + * Adds or removes all wrapper elements interactivity events. + * @param destroy Indicates whether the Events shall be added or removed. + */ + function setupStructureEvents(destroy) { + var textareaKeyDownRestrictedKeyCodes = [ + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 123, //F1 to F12 + 33, 34, //page up, page down + 37, 38, 39, 40, //left, up, right, down arrows + 16, 17, 18, 19, 20, 144 //Shift, Ctrl, Alt, Pause, CapsLock, NumLock + ]; + var textareaKeyDownKeyCodesList = [ ]; + var textareaUpdateIntervalID; + var scrollStopDelay = 175; + var scrollStopTimeoutId; + var strOnOff = destroy ? 'off' : 'on'; + var updateTextarea; + var viewportOnScroll; + + if(!destroy && _isTextarea) { + _textareaEvents = { }; + updateTextarea = function(doClearInterval) { + textareaUpdate(); + _base.update(_strAuto); + if(doClearInterval) + clearInterval(textareaUpdateIntervalID); + }; + _textareaEvents[_strScroll] = function(event) { + _targetElement[_strScrollLeft](_rtlScrollBehavior.i && _normalizeRTLCache ? 9999999 : 0); + _targetElement[_strScrollTop](0); + COMPATIBILITY.prvD(event); + COMPATIBILITY.stpP(event); + return false; + }; + _textareaEvents['drop'] = function() { + setTimeout(function () { + if(!_destroyed) + updateTextarea(); + }, 50); + }; + _textareaEvents['focus'] = function() { + _textareaHasFocus = true; + }; + _textareaEvents['focusout'] = function() { + _textareaHasFocus = false; + textareaKeyDownKeyCodesList = [ ]; + updateTextarea(true); + }; + if (_msieVersion > 9 || !_autoUpdateRecommended) { + _textareaEvents['input'] = function textareaOnInput() { + updateTextarea(); + } + } + else { + _textareaEvents[_strKeyDownEvent] = function textareaOnKeyDown(event) { + var keyCode = event.keyCode; + if (FRAMEWORK.inArray(keyCode, textareaKeyDownRestrictedKeyCodes) > -1) + return; + if (!textareaKeyDownKeyCodesList.length) { + updateTextarea(); + textareaUpdateIntervalID = setInterval(updateTextarea, 1000 / 60); + } + if (FRAMEWORK.inArray(keyCode, textareaKeyDownKeyCodesList) === -1) + textareaKeyDownKeyCodesList.push(keyCode); + }; + _textareaEvents[_strKeyUpEvent] = function(event) { + var keyCode = event.keyCode; + var index = FRAMEWORK.inArray(keyCode, textareaKeyDownKeyCodesList); + + if (FRAMEWORK.inArray(keyCode, textareaKeyDownRestrictedKeyCodes) > -1) + return; + if (index > -1) + textareaKeyDownKeyCodesList.splice(index, 1); + if (!textareaKeyDownKeyCodesList.length) + updateTextarea(true); + }; + } + } + + if (_isTextarea) { + FRAMEWORK.each(_textareaEvents, function(key, value) { + _targetElement[strOnOff](key, value); + }); + } + else { + _contentElement[strOnOff](_strTransitionEndEvent, function (event) { + if (_autoUpdateCache === true) + return; + event = event.originalEvent || event; + if (isSizeAffectingCSSProperty(event.propertyName)) + update(_strAuto); + }); + } + + if(!destroy) { + viewportOnScroll = function(event) { + if (_isSleeping) + return; + + if (scrollStopTimeoutId !== undefined) + clearTimeout(scrollStopTimeoutId); + else { + if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) + refreshScrollbarsAutoHide(true); + + if (!nativeOverlayScrollbarsAreActive()) + addClass(_hostElement, _classNameHostScrolling); + + dispatchCallback("onScrollStart", event); + } + + refreshScrollbarHandleOffset(true); + refreshScrollbarHandleOffset(false); + dispatchCallback("onScroll", event); + + scrollStopTimeoutId = setTimeout(function () { + if(!_destroyed) { + //OnScrollStop: + clearTimeout(scrollStopTimeoutId); + scrollStopTimeoutId = undefined; + + if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) + refreshScrollbarsAutoHide(false); + + if (!nativeOverlayScrollbarsAreActive()) + removeClass(_hostElement, _classNameHostScrolling); + + dispatchCallback("onScrollStop", event); + } + }, scrollStopDelay); + }; + + if (_supportPassiveEvents) + addPassiveEventListener(_viewportElement, _strScroll, viewportOnScroll); + else + _viewportElement.on(_strScroll, viewportOnScroll); + } + } + + + //==== Scrollbars ====// /** - * Builds all scrollbars if they aren't already build. + * Builds or destroys all scrollbar DOM elements (scrollbar, track, handle) + * @param destroy Indicates whether the DOM shall be build or destroyed. */ - function buildScrollbars() { - _scrollbarHorizontalElement = FRAMEWORK(generateDiv(_classNameScrollbar + _strSpace + _classNameScrollbarHorizontal)); - _scrollbarHorizontalTrackElement = FRAMEWORK(generateDiv(_classNameScrollbarTrack)); - _scrollbarHorizontalHandleElement = FRAMEWORK(generateDiv(_classNameScrollbarHandle)); - _scrollbarVerticalElement = FRAMEWORK(generateDiv(_classNameScrollbar + _strSpace + _classNameScrollbarVertical)); - _scrollbarVerticalTrackElement = FRAMEWORK(generateDiv(_classNameScrollbarTrack)); - _scrollbarVerticalHandleElement = FRAMEWORK(generateDiv(_classNameScrollbarHandle)); + function setupScrollbarsDOM(destroy) { + if(!destroy) { + _scrollbarHorizontalElement = FRAMEWORK(generateDiv(_classNameScrollbar + _strSpace + _classNameScrollbarHorizontal)); + _scrollbarHorizontalTrackElement = FRAMEWORK(generateDiv(_classNameScrollbarTrack)); + _scrollbarHorizontalHandleElement = FRAMEWORK(generateDiv(_classNameScrollbarHandle)); + _scrollbarVerticalElement = FRAMEWORK(generateDiv(_classNameScrollbar + _strSpace + _classNameScrollbarVertical)); + _scrollbarVerticalTrackElement = FRAMEWORK(generateDiv(_classNameScrollbarTrack)); + _scrollbarVerticalHandleElement = FRAMEWORK(generateDiv(_classNameScrollbarHandle)); - _scrollbarHorizontalElement.append(_scrollbarHorizontalTrackElement); - _scrollbarHorizontalTrackElement.append(_scrollbarHorizontalHandleElement); - _scrollbarVerticalElement.append(_scrollbarVerticalTrackElement); - _scrollbarVerticalTrackElement.append(_scrollbarVerticalHandleElement); + _scrollbarHorizontalElement.append(_scrollbarHorizontalTrackElement); + _scrollbarHorizontalTrackElement.append(_scrollbarHorizontalHandleElement); + _scrollbarVerticalElement.append(_scrollbarVerticalTrackElement); + _scrollbarVerticalTrackElement.append(_scrollbarVerticalHandleElement); - _paddingElement.after(_scrollbarVerticalElement); - _paddingElement.after(_scrollbarHorizontalElement); - - //scrollbar events - if (_supportTransition) { - _scrollbarHorizontalElement.on(_strTransitionEndEvent, function (event) { - if (event.target !== _scrollbarHorizontalElement[0]) - return; - refreshScrollbarHandleLength(true); - refreshScrollbarHandleOffset(true, _viewportElement[_strScrollLeft]()); - }); - _scrollbarVerticalElement.on(_strTransitionEndEvent, function (event) { - if (event.target !== _scrollbarVerticalElement[0]) - return; - refreshScrollbarHandleLength(false); - refreshScrollbarHandleOffset(false, _viewportElement[_strScrollTop]()); - }); + _paddingElement.after(_scrollbarVerticalElement); + _paddingElement.after(_scrollbarHorizontalElement); + } + else { + remove(_scrollbarHorizontalElement); + remove(_scrollbarVerticalElement); } - initScrollbarInteractivity(true); - initScrollbarInteractivity(false); - _scrollbarCornerElement = FRAMEWORK(generateDiv(_classNameScrollbarCorner)); - _hostElement.append(_scrollbarCornerElement); } /** - * Initializes all scrollbar interactivity. (track and handle dragging, clicking, scrolling) + * Initializes all scrollbar interactivity events. (track and handle dragging, clicking, scrolling) * @param isHorizontal True if the target scrollbar is the horizontal scrollbar, false if the target scrollbar is the vertical scrollbar. */ - function initScrollbarInteractivity(isHorizontal) { + function setupScrollbarEvents(isHorizontal) { var scrollbarVars = getScrollbarVars(isHorizontal); var insideIFrame = _windowElement.top !== _windowElement; var mouseDownScroll; @@ -4246,43 +4360,42 @@ var increaseDecreaseScrollAmountKeyCodes = [ 16, 17 ]; //shift, ctrl function increaseTrackScrollAmount() { scrollDurationFactor = 0.5; - }; + } function decreaseTrackScrollAmount() { scrollDurationFactor = 1; - }; + } function documentKeyDown(event) { if (FRAMEWORK.inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1) increaseTrackScrollAmount(); - }; + } function documentKeyUp(event) { if (FRAMEWORK.inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1) decreaseTrackScrollAmount(); - }; + } function onMouseTouchDownContinue(event) { var originalEvent = event.originalEvent || event; var isTouchEvent = originalEvent.touches !== undefined; - return _isSleeping || nativeOverlayScrollbarsAreActive() || !_scrollbarsDragScrollingCache || (isTouchEvent && !_scrollbarsTouchSupport) ? false : COMPATIBILITY.mBtn(event) === 1 || isTouchEvent; - }; - function handleDragMove(event) { - if(!onMouseTouchDownContinue(event)) { - documentMouseTouchUp(event); - return; - } - - var trackLength = scrollbarVars.i.tl; - var handleLength = scrollbarVars.i.hl; - var scrollRange = scrollbarVars.i.ms; - var scrollRaw = (_msieVersion && insideIFrame ? event['screen' + XY] : COMPATIBILITY.page(event)[xy]) - mouseDownOffset; //use screen coordinates in EDGE & IE because the page values are incorrect in frames. - var scrollDeltaPercent = scrollRaw / (trackLength - handleLength); - var scrollDelta = (scrollRange * scrollDeltaPercent); - scrollDelta = isFinite(scrollDelta) ? scrollDelta : 0; - if (_isRTL && isHorizontal && !_rtlScrollBehavior.i) - scrollDelta *= -1; - _viewportElement[scroll](mouseDownScroll + scrollDelta); + return _isSleeping || _destroyed || nativeOverlayScrollbarsAreActive() || !_scrollbarsDragScrollingCache || (isTouchEvent && !_scrollbarsTouchSupport) ? false : COMPATIBILITY.mBtn(event) === 1 || isTouchEvent; + } + function documentDragMove(event) { + if(onMouseTouchDownContinue(event)) { + var trackLength = scrollbarVars.i.tl; + var handleLength = scrollbarVars.i.hl; + var scrollRange = scrollbarVars.i.ms; + var scrollRaw = (_msieVersion && insideIFrame ? event['screen' + XY] : COMPATIBILITY.page(event)[xy]) - mouseDownOffset; //use screen coordinates in EDGE & IE because the page values are incorrect in frames. + var scrollDeltaPercent = scrollRaw / (trackLength - handleLength); + var scrollDelta = (scrollRange * scrollDeltaPercent); + scrollDelta = isFinite(scrollDelta) ? scrollDelta : 0; + if (_isRTL && isHorizontal && !_rtlScrollBehavior.i) + scrollDelta *= -1; + _viewportElement[scroll](mouseDownScroll + scrollDelta); - if (!_supportPassiveEvents) - COMPATIBILITY.prvD(event); - }; + if (!_supportPassiveEvents) + COMPATIBILITY.prvD(event); + } + else + documentMouseTouchUp(event); + } function documentMouseTouchUp(event) { event = event || event.originalEvent; @@ -4291,7 +4404,7 @@ removeClass(scrollbarVars.t, strActive); removeClass(scrollbarVars.s, strActive); - _documentElement.off(_strMouseTouchMoveEvent, handleDragMove) + _documentElement.off(_strMouseTouchMoveEvent, documentDragMove) .off(_strMouseTouchUpEvent, documentMouseTouchUp) .off(_strKeyDownEvent, documentKeyDown) .off(_strKeyUpEvent, documentKeyUp) @@ -4306,16 +4419,18 @@ trackTimeout = undefined; } - var rect = _hostElement[0].getBoundingClientRect(); - var mouseInsideHost = event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom; + if(event) { + var rect = _hostElement[0].getBoundingClientRect(); + var mouseInsideHost = event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom; - //if mouse is outside host element - if (!mouseInsideHost) - hostOnMouseLeave(); - - if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) - refreshScrollbarsAutoHide(false); - }; + //if mouse is outside host element + if (!mouseInsideHost) + hostOnMouseLeave(); + + if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) + refreshScrollbarsAutoHide(false); + } + } function onHandleMouseTouchDown(event) { mouseDownScroll = _viewportElement[scroll](); mouseDownScroll = mouseDownScroll === undefined ? 0 : mouseDownScroll; @@ -4327,14 +4442,14 @@ addClass(scrollbarVars.h, strActive); addClass(scrollbarVars.s, strActive); - _documentElement.on(_strMouseTouchMoveEvent, handleDragMove) + _documentElement.on(_strMouseTouchMoveEvent, documentDragMove) .on(_strMouseTouchUpEvent, documentMouseTouchUp) .on(_strSelectStartEvent, documentOnSelectStart); if(_msieVersion || !_documentMixed) COMPATIBILITY.prvD(event); COMPATIBILITY.stpP(event); - }; + } scrollbarVars.h.on(_strMouseTouchDownEvent, function(event) { if (onMouseTouchDownContinue(event)) onHandleMouseTouchDown(event); @@ -4358,7 +4473,7 @@ var handleLength = scrollbarVars.i.hl; var scrollRange = scrollbarVars.i.ms; var scrollDuration = 270 * scrollDurationFactor; - var timeoutDelay = isFirstIteration ? Math.max(400, scrollDuration) : scrollDuration; + var timeoutDelay = isFirstIteration ? MATH.max(400, scrollDuration) : scrollDuration; var instantScrollPosition = scrollRange * ((mouseOffset - (handleLength / 2)) / (trackLength - handleLength)); // 100% * positionPercent var rtlIsNormal = _isRTL && isHorizontal && ((!_rtlScrollBehavior.i && !_rtlScrollBehavior.n) || _normalizeRTLCache); var decreaseScrollCondition = rtlIsNormal ? handleOffset < mouseOffset : handleOffset > mouseOffset; @@ -4428,6 +4543,14 @@ scrollbarVars.s.on(_strMouseTouchDownEvent, function(event) { COMPATIBILITY.stpP(event); }); + if (_supportTransition) { + scrollbarVars.s.on(_strTransitionEndEvent, function(event) { + if (event.target !== scrollbarVars.s[0]) + return; + refreshScrollbarHandleLength(isHorizontal); + refreshScrollbarHandleOffset(isHorizontal); + }); + } } /** @@ -4491,8 +4614,8 @@ var scrollbarVars = getScrollbarVars(isHorizontal); var digit = 1000000; //get and apply intended handle length - var handleRatio = Math.min(1, (_hostSizeCache[scrollbarVars._wh] - (_paddingAbsoluteCache ? (isHorizontal ? _paddingX : _paddingY) : 0)) / _contentScrollSizeCache[scrollbarVars._wh]); - handleCSS[scrollbarVars.wh] = (Math.floor(handleRatio * 100 * digit) / digit) + "%"; //the last * digit / digit is for flooring to the 4th digit + var handleRatio = MATH.min(1, (_hostSizeCache[scrollbarVars._wh] - (_paddingAbsoluteCache ? (isHorizontal ? _paddingX : _paddingY) : 0)) / _contentScrollSizeCache[scrollbarVars._wh]); + handleCSS[scrollbarVars.wh] = (MATH.floor(handleRatio * 100 * digit) / digit) + "%"; //the last * digit / digit is for flooring to the 4th digit if (!nativeOverlayScrollbarsAreActive()) scrollbarVars.h.css(handleCSS); @@ -4505,9 +4628,10 @@ /** * Refreshes the handle offset of the given scrollbar. * @param isHorizontal True if the horizontal scrollbar handle shall be refreshed, false if the vertical one shall be refreshed. - * @param currentScroll The current scroll offset of the given scrollbar axis. (if isHorizontal ? scrollLeft : scrollTop) + * @param currentScroll The current scroll offset of the given scrollbar axis or undefined if the current scroll-offset shall be taken. (if isHorizontal ? scrollLeft : scrollTop) */ function refreshScrollbarHandleOffset(isHorizontal, currentScroll) { + currentScroll = currentScroll === undefined ? isHorizontal ? _viewportElement[_strScrollLeft]() : _viewportElement[_strScrollTop]() : currentScroll; var isRTLisHorizontal = _isRTL && isHorizontal; var handleCSS = {}; var scrollbarVars = getScrollbarVars(isHorizontal); @@ -4518,7 +4642,7 @@ //measure the handle length to respect min & max length //DONT use the variable '_contentScrollSizeCache[scrollbarVars._wh]' instead of '_viewportElement[0]['scroll' + scrollbarVars.WH]' // because its a bit behind during the small delay when content size updates - //(delay = _mutationObserverContentLag, if its 0 then this var could be used) + //(delay = mutationObserverContentLag, if its 0 then this var could be used) var maxScroll = _viewportElement[0][_strScroll + scrollbarVars.WH] - _viewportElement[0]['client' + scrollbarVars.WH]; var handleLength = scrollbarVars.i.hl; var trackLength = scrollbarVars.t[0]['offset' + scrollbarVars.WH]; @@ -4532,7 +4656,7 @@ maxScroll *= -1; posRatio = currentScroll / maxScroll; - posRatio = isNaN(posRatio) ? 0 : Math.min(1, posRatio); + posRatio = isNaN(posRatio) ? 0 : MATH.min(1, posRatio); scrollbarVars.i.ms = maxScroll; //ms = max scroll scrollbarVars.i.cs = currentScroll; //cs = current scroll @@ -4542,7 +4666,7 @@ offset = isNaN(offset) ? 0 : offset; if (isRTLisHorizontal && !_rtlScrollBehavior.i) offset = trackLength - handleLength - offset; - offset = Math.max(0, offset); + offset = MATH.max(0, offset); if (_supportTransform) { transformOffset = isRTLisHorizontal ? -(trackLength - handleLength - offset) : offset; //in px @@ -4602,7 +4726,99 @@ }; } + + //==== Scrollbar Corner ====// + + /** + * Builds or destroys the scrollbar corner DOM element. + * @param destroy Indicates whether the DOM shall be build or destroyed. + */ + function setupScrollbarCornerDOM(destroy) { + if(!destroy) { + _scrollbarCornerElement = FRAMEWORK(generateDiv(_classNameScrollbarCorner)); + _hostElement.append(_scrollbarCornerElement); + } + else { + remove(_scrollbarCornerElement); + } + } + + /** + * Initializes all scrollbar corner interactivity events. + */ + function setupScrollbarCornerEvents() { + var insideIFrame = _windowElement.top !== _windowElement; + var resizeDragStartPosition = { }; + var resizeDragStartSize = { }; + + _resizeOnMouseTouchDown = function(event) { + if (onMouseTouchDownContinue(event)) { + if (_mutationObserversConnected) { + _resizeReconnectMutationObserver = true; + disconnectMutationObservers(); + } + resizeDragStartPosition = getCoordinates(event); + + resizeDragStartSize.w = _hostElement[0][LEXICON.oW] - (!_isBorderBox ? _paddingX : 0); + resizeDragStartSize.h = _hostElement[0][LEXICON.oH] - (!_isBorderBox ? _paddingY : 0); + + _documentElement.on(_strSelectStartEvent, documentOnSelectStart) + .on(_strMouseTouchMoveEvent, documentDragMove) + .on(_strMouseTouchUpEvent, documentMouseTouchUp); + + addClass(_bodyElement, _classNameDragging); + if (_scrollbarCornerElement.setCapture) + _scrollbarCornerElement.setCapture(); + + COMPATIBILITY.prvD(event); + COMPATIBILITY.stpP(event); + } + }; + function documentDragMove(event) { + if (onMouseTouchDownContinue(event)) { + var pageOffset = getCoordinates(event); + var hostElementCSS = { }; + if (_resizeHorizontal || _resizeBoth) + hostElementCSS[_strWidth] = (resizeDragStartSize.w + pageOffset.x - resizeDragStartPosition.x); + if (_resizeVertical || _resizeBoth) + hostElementCSS[_strHeight] = (resizeDragStartSize.h + pageOffset.y - resizeDragStartPosition.y); + _hostElement.css(hostElementCSS); + COMPATIBILITY.stpP(event); + } + else { + documentMouseTouchUp(event); + } + } + function documentMouseTouchUp(event) { + var eventIsTrusted = event !== undefined; + + _documentElement.off(_strSelectStartEvent, documentOnSelectStart) + .off(_strMouseTouchMoveEvent, documentDragMove) + .off(_strMouseTouchUpEvent, documentMouseTouchUp); + + removeClass(_bodyElement, _classNameDragging); + if (_scrollbarCornerElement.releaseCapture) + _scrollbarCornerElement.releaseCapture(); + + if (eventIsTrusted) { + if (_resizeReconnectMutationObserver) + connectMutationObservers(); + _base.update(_strAuto); + } + _resizeReconnectMutationObserver = false; + } + function onMouseTouchDownContinue(event) { + var originalEvent = event.originalEvent || event; + var isTouchEvent = originalEvent.touches !== undefined; + return _isSleeping || _destroyed ? false : COMPATIBILITY.mBtn(event) === 1 || isTouchEvent; + } + function getCoordinates(event) { + return _msieVersion && insideIFrame ? { x : event.screenX , y : event.screenY } : COMPATIBILITY.page(event); + } + } + + //==== Utils ====// /** @@ -4610,7 +4826,7 @@ * @param name The name of the target which shall be called. * @param args The args with which the callback shall be called. */ - function callCallback(name, args) { + function dispatchCallback(name, args) { if(_initialized) { var callback = _currentPreparedOptions.callbacks[name]; var extensionOnName = name; @@ -4628,6 +4844,8 @@ ext.on(extensionOnName, args); }); } + else if(!_destroyed) + _callbacksInitQeueue.push({ n : name, a : args }); } /** @@ -4692,11 +4910,10 @@ * @param toFloat Indicates whether the number shall be parsed to a float. */ function parseToZeroOrNumber(value, toFloat) { - var num = toFloat ? window.parseFloat(value) : window.parseInt(value); + var num = toFloat ? parseFloat(value) : parseInt(value); return isNaN(num) ? 0 : num; } - /** * Gets several information of the textarea and returns them as a object or undefined if the browser doesn't support it. * @returns {{cursorRow: Number, cursorCol, rows: Number, cols: number, wRow: number, pos: number, max : number}} or undefined if not supported. @@ -4740,19 +4957,6 @@ }; } - /** - * Checks the given key code and returns a boolean which is indicating if the given key code is a restricted one. - * @param keyCode The key code which shall be checked. - * @returns {boolean} True if the given key code is restricted, false otherwise. - */ - function textareaIsRestrictedKeyCode(keyCode) { - for (var i = 0; i < _textareaKeyDownRestrictedKeyCodes.length; i++) { - if (keyCode === _textareaKeyDownRestrictedKeyCodes[i]) - return true; - } - return false; - } - /** * Determines whether native overlay scrollbars are active. * @returns {boolean} True if native overlay scrollbars are active, false otherwise. @@ -4830,6 +5034,7 @@ FRAMEWORK.extend(obj, extendObjRoot, true); } + //==== Utils Cache ====// /** @@ -4893,7 +5098,7 @@ return false; } - + //==== Shortcuts ====// /** @@ -4999,7 +5204,7 @@ //return current options if newOptions are undefined or empty if (FRAMEWORK.isEmptyObject(newOptions) || !FRAMEWORK.isPlainObject(newOptions)) { if (type(newOptions) == TYPES.s) { - if (arguments.length >= 2) { + if (arguments.length > 1) { var option = { }; setObjectPropVal(option, newOptions, value); setOptions(option); @@ -5025,92 +5230,50 @@ _base.destroy = function () { _destroyed = true; + //remove this instance from auto update loop autoUpdateLoop.remove(_base); - mutationObserversDisconnect(); + + //disconnect all mutation observers + disconnectMutationObservers(); + + //remove all resize observers removeResizeObserver(_sizeObserverElement); if (_sizeAutoObserverAdded) removeResizeObserver(_sizeAutoObserverElement); + //remove all extensions for(var extName in _extensions) _base.removeExt(extName); - remove(_sizeObserverElement); - if (_contentGlueElement !== undefined) + //remove all events from host element + setupHostMouseTouchEvents(true); + + //remove all events from structure + setupStructureEvents(true); + + //remove all helper / detection elements + if (_contentGlueElement) remove(_contentGlueElement); - if (_contentArrangeElement !== undefined) + if (_contentArrangeElement) remove(_contentArrangeElement); if (_sizeAutoObserverAdded) remove(_sizeAutoObserverElement); - if (_supportPassiveEvents) { - removePassiveEventListener(_hostElement, _strMouseTouchMoveEvent, hostOnMouseMove); - removePassiveEventListener(_hostElement, _strMouseTouchEnter, hostOnMouseEnter); - removePassiveEventListener(_hostElement, _strMouseTouchLeave, hostOnMouseLeave); - } - else { - _hostElement.off(_strMouseTouchMoveEvent, hostOnMouseMove) - .off(_strMouseTouchEnter, hostOnMouseEnter) - .off(_strMouseTouchLeave, hostOnMouseLeave); - } - - remove(_scrollbarHorizontalElement); - remove(_scrollbarVerticalElement); - if(_scrollbarCornerElement) - remove(_scrollbarCornerElement); - if (!_resizeNone) - scrollbarCornerOnResized(); - - _contentElement.contents() - .unwrap() - .unwrap() - .unwrap(); - - if (_isBody) - removeClass(_htmlElement, _classNameHTMLElement); - - - if (_isTextarea) { - _targetElement.off(_strScroll, textareaOnScroll) - .off('drop', textareaOnDrop) - .off('focus', textareaOnFocus) - .off('focusout', textareaOnFocusOut); - if (_msieVersion > 9 || !_autoUpdateRecommended) - _targetElement.off('input', textareaOnInput); - else { - _targetElement.off(_strKeyDownEvent, textareaOnKeyDown) - .off(_strKeyUpEvent, textareaOnKeyUp); - } - - remove(_textareaCoverElement); - removeClass(_targetElement, _classNameTextareaElement + _strSpace + _classNameTextInherit) - .unwrap() - .removeAttr(LEXICON.s); - remove(_hostElement); - } - else { - removeClass(_targetElement, _classNameHostElement); - removeClass(_hostElement, [ - _classNameHostElement, - _classNameHostResizeDisabled, - _classNameHostRTL, - _classNameHostScrollbarHorizontalHidden, - _classNameHostScrollbarVerticalHidden, - _classNameHostTransition, - _classNameHostScrolling, - _classNameHostOverflow, - _classNameHostOverflowX, - _classNameHostOverflowY, - _classNameThemeNone, - _classNameCache].join(_strSpace)); - } - - for(var i = 0; i < _imgs.length; i++) + //remove all generated DOM + setupScrollbarsDOM(true); + setupScrollbarCornerDOM(true); + setupStructureDOM(true); + + //remove all generated image load events + for(var i = 0; i < _imgs[LEXICON.l]; i++) FRAMEWORK(_imgs[i]).off('load', imgOnLoad); _imgs = undefined; + //remove this instance from the instances list INSTANCES(pluginTargetElement, 0); - callCallback("onDestroyed"); + dispatchCallback("onDestroyed"); + //remove all properties and methods for (var property in _base) delete _base[property]; _base = undefined; @@ -5149,10 +5312,10 @@ * * 3. Can be a object with a HTML or jQuery element with additional settings: * { - * el : [HTMLElement, jQuery element], MUST be specified, else this object isn't valid. - * scroll : [string, array, object], Default value is 'always'. - * block : [string, array, object], Default value is 'begin'. - * margin : [number, boolean array, object] Default value is false. + * el : [HTMLElement, jQuery element], MUST be specified, else this object isn't valid. + * scroll : [string, array, object], Default value is 'always'. + * block : [string, array, object], Default value is 'begin'. + * margin : [number, boolean, array, object] Default value is false. * } * * Possible scroll settings are: @@ -5173,11 +5336,17 @@ * @param duration The duration of the scroll animation, OR a jQuery animation configuration object. * @param easing The animation easing. * @param complete The animation complete callback. - * @returns - * { - * x: {position: *, ratio: (number|*), max: (number|*), handleOffset: (number|*), handleLength: *, handleLengthRatio: (number|*), trackLength: *, isRTL: *, isRTLNormalized: *}, - * y: {position: *, ratio: (number|*), max: (number|*), handleOffset: (number|*), handleLength: *, handleLengthRatio: (number|*), trackLength: *} - * } + * @returns {{ + * position: {x: number, y: number}, + * ratio: {x: number, y: number}, + * max: {x: number, y: number}, + * handleOffset: {x: number, y: number}, + * handleLength: {x: number, y: number}, + * handleLengthRatio: {x: number, y: number}, t + * rackLength: {x: number, y: number}, + * isRTL: boolean, + * isRTLNormalized: boolean + * }} */ _base.scroll = function (coordinates, duration, easing, complete) { if (arguments.length === 0 || coordinates === undefined) { @@ -5192,7 +5361,11 @@ scrollX = normalizeInvert ? maxScrollX - scrollX : scrollX; scrollX *= normalizeNegate ? -1 : 1; maxScrollX *= normalizeNegate ? -1 : 1; + return { + /** + * @deprecated + */ x: { position: scrollX, ratio: scrollXRatio, @@ -5204,6 +5377,9 @@ isRTL: _isRTL, isRTLNormalized: _normalizeRTLCache }, + /** + * @deprecated + */ y: { position: infoY.cs, ratio: infoY.csr, @@ -5212,7 +5388,38 @@ handleLength: infoY.hl, handleLengthRatio: infoY.hlr, trackLength: infoY.tl - } + }, + + position : { + x : scrollX, + y : infoY.cs + }, + ratio : { + x : scrollXRatio, + y : infoY.csr + }, + max : { + x : maxScrollX, + y : infoY.ms + }, + handleOffset : { + x : infoX.ho, + y : infoY.ho + }, + handleLength : { + x : infoX.hl, + y : infoY.hl + }, + handleLengthRatio : { + x : infoX.hlr, + y : infoY.hlr + }, + trackLength : { + x : infoX.tl, + y : infoY.tl + }, + isRTL: _isRTL, + isRTLNormalized: _normalizeRTLCache }; } @@ -5220,12 +5427,14 @@ var coordinatesXAxisProps = [_strX, _strLeft, 'l']; var coordinatesYAxisProps = [_strY, _strTop, 't']; var coordinatesOperators = ['+=', '-=', '*=', '/=']; + var durationIsObject = type(duration) == TYPES.o; + var completeCallback = durationIsObject ? duration.complete : complete; var i; var finalScroll = { }; + var specialEasing = {}; var doScrollLeft; var doScrollTop; var animationOptions; - var durationIsObject = type(duration) == TYPES.o; var strEnd = 'end'; var strBegin = 'begin'; var strCenter = 'center'; @@ -5246,6 +5455,13 @@ var possibleElement = coordinatesIsElementObj ? coordinates.el : coordinates; var possibleElementIsJQuery = possibleElement instanceof FRAMEWORK || JQUERY ? possibleElement instanceof JQUERY : false; var possibleElementIsHTMLElement = possibleElementIsJQuery ? false : isHTMLElement(possibleElement); + var proxyCompleteCallback = type(completeCallback) != TYPES.f ? undefined : function() { + if(doScrollLeft) + refreshScrollbarHandleOffset(true); + if(doScrollTop) + refreshScrollbarHandleOffset(false); + completeCallback(); + }; var checkSettingsStringValue = function (currValue, allowedValues) { for (i = 0; i < allowedValues[strLength]; i++) { if (currValue === allowedValues[i]) @@ -5253,39 +5469,18 @@ } return false; }; - var getRawScroll = function (coordinates) { - var rawScroll = {}; - if (type(coordinates) == TYPES.a && coordinates[strLength] > 0) { - rawScroll.x = coordinates[0]; - rawScroll.y = coordinates[1]; - } - else if (type(coordinates) == TYPES.s || type(coordinates) == TYPES.n) { - rawScroll.x = coordinates; - rawScroll.y = coordinates; - } + var getRawScroll = function (isX, coordinates) { + var coordinateProps = isX ? coordinatesXAxisProps : coordinatesYAxisProps; + coordinates = type(coordinates) == TYPES.s || type(coordinates) == TYPES.n ? [ coordinates, coordinates ] : coordinates; + + if (type(coordinates) == TYPES.a) + return isX ? coordinates[0] : coordinates[1]; else if (type(coordinates) == TYPES.o) { normalizeRTL = type(coordinates.n) == TYPES.b ? coordinates.n : normalizeRTL; - coordinates = extend({}, coordinates); - i = 0; - for (var key in coordinates) { - if (coordinates.hasOwnProperty(key)) { - if (i > 2) - delete coordinates[key]; - i++; - } - } - var getRawScrollValue = function (isX) { - var coordinateProps = isX ? coordinatesXAxisProps : coordinatesYAxisProps; - for (i = 0; i < coordinateProps[strLength]; i++) { - if (coordinateProps[i] in coordinates) { - return coordinates[coordinateProps[i]]; - } - } - }; - rawScroll.x = getRawScrollValue(true); - rawScroll.y = getRawScrollValue(false); + for (i = 0; i < coordinateProps[strLength]; i++) + if (coordinateProps[i] in coordinates) + return coordinates[coordinateProps[i]]; } - return rawScroll; }; var getFinalScroll = function (isX, rawScroll) { var isString = type(rawScroll) == TYPES.s; @@ -5301,6 +5496,7 @@ var isRTLisX = _isRTL && isX; var normalizeShortcuts = isRTLisX && _rtlScrollBehavior.n && !normalizeRTL; var strReplace = 'replace'; + var evalFunc = eval; if (isString) { //check operator if (rawScroll[strLength] > 2) { @@ -5323,7 +5519,7 @@ rawScroll = rawScroll[strReplace](/%/g, mult + (maxScroll * (isRTLisX && _rtlScrollBehavior.n ? -1 : 1) / 100.0)); rawScroll = rawScroll[strReplace](/vw/g, mult + _viewportSize.w); rawScroll = rawScroll[strReplace](/vh/g, mult + _viewportSize.h); - amount = parseToZeroOrNumber(parseToZeroOrNumber(window.eval(rawScroll), true).toFixed()); + amount = parseToZeroOrNumber(parseToZeroOrNumber(evalFunc(rawScroll), true).toFixed()); } else { amount = rawScroll; @@ -5354,7 +5550,7 @@ } finalValue = invert ? maxScroll - finalValue : finalValue; finalValue *= negate ? -1 : 1; - finalValue = isRTLisX && _rtlScrollBehavior.n ? Math.min(0, Math.max(maxScroll, finalValue)) : Math.max(0, Math.min(maxScroll, finalValue)); + finalValue = isRTLisX && _rtlScrollBehavior.n ? MATH.min(0, MATH.max(maxScroll, finalValue)) : MATH.max(0, MATH.min(maxScroll, finalValue)); } return finalValue === currScroll ? undefined : finalValue; }; @@ -5462,16 +5658,16 @@ elementOffset[_strTop] -= settingsMargin[0]; elementOffset[_strLeft] -= settingsMargin[3]; var elementScrollCoordinates = { - x: Math.round(elementOffset[_strLeft] - viewportOffset[_strLeft] + viewportScroll.l), - y: Math.round(elementOffset[_strTop] - viewportOffset[_strTop] + viewportScroll.t) + x: MATH.round(elementOffset[_strLeft] - viewportOffset[_strLeft] + viewportScroll.l), + y: MATH.round(elementOffset[_strTop] - viewportOffset[_strTop] + viewportScroll.t) }; if (_isRTL) { if (!_rtlScrollBehavior.n && !_rtlScrollBehavior.i) - elementScrollCoordinates.x = Math.round(viewportOffset[_strLeft] - elementOffset[_strLeft] + viewportScroll.l); + elementScrollCoordinates.x = MATH.round(viewportOffset[_strLeft] - elementOffset[_strLeft] + viewportScroll.l); if (_rtlScrollBehavior.n && normalizeRTL) elementScrollCoordinates.x *= -1; if (_rtlScrollBehavior.i && normalizeRTL) - elementScrollCoordinates.x = Math.round(viewportOffset[_strLeft] - elementOffset[_strLeft] + (_scrollHorizontalInfo.ms - viewportScroll.l)); + elementScrollCoordinates.x = MATH.round(viewportOffset[_strLeft] - elementOffset[_strLeft] + (_scrollHorizontalInfo.ms - viewportScroll.l)); } //measuring is required @@ -5529,23 +5725,24 @@ coordinates = elementScrollCoordinates; } - finalScroll[_strScrollLeft] = getFinalScroll(true, getRawScroll(coordinates).x); - finalScroll[_strScrollTop] = getFinalScroll(false, getRawScroll(coordinates).y); + finalScroll[_strScrollLeft] = getFinalScroll(true, getRawScroll(true, coordinates)); + finalScroll[_strScrollTop] = getFinalScroll(false, getRawScroll(false, coordinates)); doScrollLeft = finalScroll[_strScrollLeft] !== undefined; doScrollTop = finalScroll[_strScrollTop] !== undefined; if ((doScrollLeft || doScrollTop) && (duration > 0 || durationIsObject)) { - if (durationIsObject) + if (durationIsObject) { + duration.complete = proxyCompleteCallback; _viewportElement.animate(finalScroll, duration); + } else { animationOptions = { duration: duration, - complete: complete + complete: proxyCompleteCallback }; - if (type(easing) == TYPES.a) { - var specialEasing = {}; - specialEasing[_strScrollLeft] = easing[0]; - specialEasing[_strScrollTop] = easing[1]; + if (type(easing) == TYPES.a || FRAMEWORK.isPlainObject(easing)) { + specialEasing[_strScrollLeft] = easing[0] || easing.x; + specialEasing[_strScrollTop] = easing[1] || easing.y; animationOptions.specialEasing = specialEasing; } else { @@ -5621,7 +5818,7 @@ }; var obj = { sleeping: prepare(_isSleeping) || false, - autoUpdate: prepare(!_mutationObserverConnected), + autoUpdate: prepare(!_mutationObserversConnected), widthAuto: prepare(_widthAutoCache), heightAuto: prepare(_heightAutoCache), padding: prepare(_cssPaddingCache), @@ -5675,7 +5872,7 @@ var contractFulfilled = true; if(registeredExtensionObj) { if(!_extensions.hasOwnProperty(extName)) { - instance = registeredExtensionObj.extension.call(_base, + instance = registeredExtensionObj.extensionFactory.call(_base, extend(true, { }, registeredExtensionObj.defaultOptions), FRAMEWORK, COMPATIBILITY); @@ -5743,7 +5940,7 @@ //check if the plugin hasn't to be initialized if (_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.x && !_currentPreparedOptions.nativeScrollbarsOverlaid.initialize) { - callCallback("onInitializationWithdrawn"); + dispatchCallback("onInitializationWithdrawn"); return false; } @@ -5768,181 +5965,45 @@ var initBodyScroll; if (_isBody) { initBodyScroll = {}; - initBodyScroll.l = Math.max(_targetElement[_strScrollLeft](), _htmlElement[_strScrollLeft](), _windowElement[_strScrollLeft]()); - initBodyScroll.t = Math.max(_targetElement[_strScrollTop](), _htmlElement[_strScrollTop](), _windowElement[_strScrollTop]()); + initBodyScroll.l = MATH.max(_targetElement[_strScrollLeft](), _htmlElement[_strScrollLeft](), _windowElement[_strScrollLeft]()); + initBodyScroll.t = MATH.max(_targetElement[_strScrollTop](), _htmlElement[_strScrollTop](), _windowElement[_strScrollTop]()); } - //build Hide-scrollbars DOM - if (_isTextarea) { - _targetElement.wrap(generateDiv(_classNameHostTextareaElement)); - addClass(_targetElement, _classNameTextareaElement + _strSpace + _classNameTextInherit); - _hostElement = _targetElement.parent(); - var hostElementCSS = {}; - if (!_currentPreparedOptions.sizeAutoCapable) { - hostElementCSS[_strWidth] = _targetElement.css(_strWidth); - hostElementCSS[_strHeight] = _targetElement.css(_strHeight); - } - _hostElement.css(hostElementCSS) - .wrapInner(generateDiv(_classNameContentElement + _strSpace + _classNameTextInherit)) - .wrapInner(generateDiv(_classNameViewportElement + _strSpace + _classNameTextInherit)) - .wrapInner(generateDiv(_classNamePaddingElement + _strSpace + _classNameTextInherit)); - _contentElement = findFirst(_hostElement, _strDot + _classNameContentElement); - _viewportElement = findFirst(_hostElement, _strDot + _classNameViewportElement); - _paddingElement = findFirst(_hostElement, _strDot + _classNamePaddingElement); - _textareaCoverElement = FRAMEWORK(generateDiv(_classNameTextareaCoverElement)); - _contentElement.prepend(_textareaCoverElement); + //build OverlayScrollbars DOM and Events + setupStructureDOM(); + setupStructureEvents(); - _targetElement.on(_strScroll, textareaOnScroll) - .on('drop', textareaOnDrop) - .on('focus', textareaOnFocus) - .on('focusout', textareaOnFocusOut); - if (_msieVersion > 9 || !_autoUpdateRecommended) { - _targetElement.on('input', textareaOnInput); - } - else { - _targetElement.on(_strKeyDownEvent, textareaOnKeyDown) - .on(_strKeyUpEvent, textareaOnKeyUp); - } - } else { - addClass(_targetElement, _classNameHostElement); - _hostElement = _targetElement; - _hostElement.wrapInner(generateDiv(_classNameContentElement)) - .wrapInner(generateDiv(_classNameViewportElement)) - .wrapInner(generateDiv(_classNamePaddingElement)); - _contentElement = findFirst(_hostElement, _strDot + _classNameContentElement); - _viewportElement = findFirst(_hostElement, _strDot + _classNameViewportElement); - _paddingElement = findFirst(_hostElement, _strDot + _classNamePaddingElement); + //build Scrollbars DOM and Events + setupScrollbarsDOM(); + setupScrollbarEvents(true); + setupScrollbarEvents(false); + + //build Scrollbar Corner DOM and Events + setupScrollbarCornerDOM(); + setupScrollbarCornerEvents(); - //add transitionend event - _contentElement.on(_strTransitionEndEvent, function (event) { - if (_autoUpdateCache === true) - return; - event = event.originalEvent || event; - if (isSizeAffectingCSSProperty(event.propertyName)) - update(_strAuto); - }); - } - - buildScrollbars(); - - //add scroll event - if (_supportPassiveEvents) - addPassiveEventListener(_viewportElement, _strScroll, viewportOnScroll); - else - _viewportElement.on(_strScroll, viewportOnScroll); - - if (_nativeScrollbarStyling) - addClass(_viewportElement, _nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y ? _classNameViewportNativeScrollbarsOverlaid : _classNameViewportNativeScrollbarsInvisible); - - //build mutation observers - if (_supportMutationObserver) { - var mutationObserver = COMPATIBILITY.mO(); - var contentLastUpdate = COMPATIBILITY.now(); - var mutationTarget; - var mutationAttrName; - var contentTimeout; - var now; - var sizeAuto; - var action; - - _mutationObserverHost = new mutationObserver(function (mutations) { - if (!_initialized || _isSleeping) - return; - - var doUpdate = false; - //var doUpdateScrollbars = false; - var mutation; - FRAMEWORK.each(mutations, function () { - mutation = this; - mutationTarget = mutation.target; - mutationAttrName = mutation.attributeName; - - if (mutationAttrName === LEXICON.c) - doUpdate = hostClassNamesChanged(mutation.oldValue, mutationTarget.className); - else if (mutationAttrName === LEXICON.s) - doUpdate = mutation.oldValue !== mutationTarget[LEXICON.s].cssText; - else - doUpdate = true; - - if (doUpdate) - return false; - }); - - if (doUpdate) - _base.update(_strAuto); - /* - if(doUpdateScrollbars) { - refreshScrollbarHandleLength(true); - refreshScrollbarHandleOffset(true, _scrollHorizontalInfo.cs); - refreshScrollbarHandleLength(false); - refreshScrollbarHandleOffset(false, _scrollVerticalInfo.cs); - } - */ - }); - _mutationObserverContent = new mutationObserver(function (mutations) { - if (!_initialized || _isSleeping) - return; - - var doUpdate = false; - var mutation; - FRAMEWORK.each(mutations, function () { - mutation = this; - doUpdate = isUnknownMutation(mutation); - return !doUpdate; - }); - - if (doUpdate) { - now = COMPATIBILITY.now(); - sizeAuto = (_heightAutoCache || _widthAutoCache); - action = function () { - if(!_destroyed) { - contentLastUpdate = now; - - //if cols, rows or wrap attr was changed - if (_isTextarea) - textareaUpdate(); - - if (sizeAuto) - update(); - else - _base.update(_strAuto); - } - }; - clearTimeout(contentTimeout); - if (_mutationObserverContentLag <= 0 || now - contentLastUpdate > _mutationObserverContentLag || !sizeAuto) - action(); - else - contentTimeout = setTimeout(action, _mutationObserverContentLag); - } - }); - } + //create mutation observers + createMutationObservers(); + //apply the body scroll to handle it right in the update method + if(_isBody) + _viewportElement[_strScrollLeft](initBodyScroll.l)[_strScrollTop](initBodyScroll.t); + //build resize observer for the host element - if (_isBody) { - addClass(_htmlElement, _classNameHTMLElement); - - //apply the body scroll to handle it right in the update method - _viewportElement[_strScrollLeft](initBodyScroll.l); - _viewportElement[_strScrollTop](initBodyScroll.t); - } - _sizeObserverElement = FRAMEWORK(generateDiv('os-resize-observer-host')); - _hostElement.prepend(_sizeObserverElement); addResizeObserver(_sizeObserverElement, hostOnResized); //update for the first time hostOnResized(); //initialize cache for host size _base.update(_strAuto); //initialize cache for content - //add the transition class for transitions AFTER the first update (for preventing unwanted transitions) - setTimeout(function () { - if (_supportTransition && !_destroyed) - addClass(_hostElement, _classNameHostTransition) - }, 333); - //the plugin is initialized now! _initialized = true; - callCallback("onInitialized"); - + dispatchCallback("onInitialized"); + + //call all callbacks which would fire before the initialized was complete + FRAMEWORK.each(_callbacksInitQeueue, function(index, value) { dispatchCallback(value.n, value.a); }); + _callbacksInitQeueue = [ ]; + //add extensions if(type(extensions) == TYPES.s) extensions = [ extensions ]; @@ -5951,6 +6012,12 @@ else if(FRAMEWORK.isPlainObject(extensions)) FRAMEWORK.each(extensions, function (key, value) { _base.addExt(key, value); }); + //add the transition class for transitions AFTER the first update & AFTER the applied extensions (for preventing unwanted transitions) + setTimeout(function () { + if (_supportTransition && !_destroyed) + addClass(_hostElement, _classNameHostTransition) + }, 333); + return _initialized; } @@ -5972,38 +6039,38 @@ if(arguments.length === 0) return this; + /* + pluginTargetElements will be converted to: + 1. A jQueryElement Array + 2. A HTMLElement Array + 3. A Array with a single HTML Element + so pluginTargetElements is always a array. + */ + pluginTargetElements = pluginTargetElements.length != undefined ? pluginTargetElements : [ pluginTargetElements[0] || pluginTargetElements ]; initOverlayScrollbarsStatics(); var arr = [ ]; var inst; var result; - if(FRAMEWORK.isPlainObject(options)) { - if (pluginTargetElements && pluginTargetElements.length) { - FRAMEWORK.each(pluginTargetElements, function () { - inst = this; + + if(pluginTargetElements.length > 0) { + if(FRAMEWORK.isPlainObject(options)) { + FRAMEWORK.each(pluginTargetElements, function (i, v) { + inst = v; if(inst !== undefined) arr.push(OverlayScrollbarsInstance(inst, options, extensions, _pluginsGlobals, _pluginsAutoUpdateLoop)); }); - result = arr.length > 1 ? arr : arr[0]; } - else - result = OverlayScrollbarsInstance(pluginTargetElements, options, extensions, _pluginsGlobals, _pluginsAutoUpdateLoop); - } - else if(pluginTargetElements) { - if(pluginTargetElements.length && pluginTargetElements.length > 0) { - FRAMEWORK.each(pluginTargetElements, function() { - inst = INSTANCES(this); - if(options === '!') { - if(inst instanceof window[PLUGINNAME]) - arr.push(inst); - } - else + else { + FRAMEWORK.each(pluginTargetElements, function(i, v) { + inst = INSTANCES(v); + if((options === '!' && inst instanceof window[PLUGINNAME]) || (COMPATIBILITY.type(options) == TYPES.f && options(v, inst))) + arr.push(inst); + else if(options === undefined) arr.push(inst); }); - result = arr.length > 1 ? arr : arr[0]; } - else - result = INSTANCES(pluginTargetElements); + result = arr.length === 1 ? arr[0] : arr; } return result; }; @@ -6056,7 +6123,7 @@ //register extension _pluginsExtensions.push({ name : extensionName, - extension : extension, + extensionFactory : extension, defaultOptions : defaultOptions }); } diff --git a/js/OverlayScrollbars.min.js b/js/OverlayScrollbars.min.js index 20d5bb8..daf1ddf 100644 --- a/js/OverlayScrollbars.min.js +++ b/js/OverlayScrollbars.min.js @@ -2,12 +2,12 @@ * OverlayScrollbars * https://github.com/KingSora/OverlayScrollbars * - * Version: 1.5.3 + * Version: 1.6.0 * * Copyright KingSora. * https://github.com/KingSora * * Released under the MIT license. - * Date: 07.11.2018 + * Date: 02.12.2018 */ -!function(t,n){"function"==typeof define&&define.amd?define(function(){return n(t,t.document,undefined)}):"object"==typeof module&&"object"==typeof module.exports?module.exports=n(t,t.document,undefined):n(t,t.document,undefined)}("undefined"!=typeof window?window:this,function(t,n,e){"use strict";var r,i,o,a,s="OverlayScrollbars",c={o:"object",f:"function",a:"array",s:"string",b:"boolean",n:"number",u:"undefined",z:"null"},u={c:"class",s:"style",i:"id",l:"length",p:"prototype",oH:"offsetHeight",cH:"clientHeight",sH:"scrollHeight",oW:"offsetWidth",cW:"clientWidth",sW:"scrollWidth"},l={wW:function(){return t.innerWidth||n.documentElement[u.cW]||n.body[u.cW]},wH:function(){return t.innerHeight||n.documentElement[u.cH]||n.body[u.cH]},mO:function(){return t.MutationObserver||t.WebKitMutationObserver||t.WebkitMutationObserver||t.MozMutationObserver||e},rO:function(){return t.ResizeObserver||t.WebKitResizeObserver||t.WebkitResizeObserver||t.MozResizeObserver||e},rAF:function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||t.msRequestAnimationFrame||function(n){return t.setTimeout(n,1e3/60)}},cAF:function(){return t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.mozCancelAnimationFrame||t.oCancelAnimationFrame||t.msCancelAnimationFrame||function(n){return t.clearTimeout(n)}},now:function(){return Date.now()||(new Date).getTime()},stpP:function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},prvD:function(t){t.preventDefault&&t.cancelable?t.preventDefault():t.returnValue=!1},page:function(t){var r="page",i="client",o="X",a="Y",s=((t=t.originalEvent||t).target||t.srcElement||n).ownerDocument||n,c=s.documentElement,u=s.body;if(t.touches!==e){var l=t.touches[0];return{x:l[r+o],y:l[r+a]}}return!t[r+o]&&t[i+o]&&null!=t[i+o]?{x:t[i+o]+(c&&c.scrollLeft||u&&u.scrollLeft||0)-(c&&c.clientLeft||u&&u.clientLeft||0),y:t[i+a]+(c&&c.scrollTop||u&&u.scrollTop||0)-(c&&c.clientTop||u&&u.clientTop||0)}:{x:t[r+o],y:t[r+a]}},mBtn:function(t){return t.which||t.button===e?t.which:1&t.button?1:2&t.button?3:4&t.button?2:0},inA:function(t,n){for(var e=0;e0&&e-1 in n)}function S(t){return(t.match(r)||[]).join(i)}function A(t,e){for(var r=(t.parentNode||n).querySelectorAll(e)||[],i=r[u.l];i--;)if(r[i]==t)return!0;return!1}function C(t,n,e){if(d(e)==c.a)for(var r=0;r0?(r=t.q[0],T(t.el,r.props,r.duration,r.easing,r.complete,!0)):(e=y(t,f))>-1&&f.splice(e,1)}function H(t,n,e){n===a||n===s?t[n]=e:z(t,n,e)}function T(t,n,r,i,o,c){var d,p,v,b,O,S,A=w(r),C={},z={},E=0;for(A?(i=r.easing,r.start,v=r.progress,b=r.step,O=r.specialEasing,o=r.complete,S=r.duration):S=r,O=O||{},S=S||400,i=i||"swing",c=c||!1;E0)P=l.now(),R=function(){for(d in T=l.now(),D=T-P,W=q.stop||D>=S,k=1-(Math.max(0,P+S-T)/S||0),z)L=parseFloat(C[d]),I=parseFloat(z[d]),N=(I-L)*h[O[d]||i](k,k*S,0,1,S)+L,H(t,d,N),m(b)&&b(N,{elem:t,prop:d,start:L,now:N,end:I,pos:k,options:{easing:i,speacialEasing:O,duration:S,complete:o,step:b},startTime:P});m(v)&&v({},k,Math.max(0,S-D)),W?(M(p),m(o)&&o()):q.frame=l.rAF()(R)},q.frame=l.rAF()(R);else{for(d in z)H(t,d,z[d]);M(p)}}}function W(t,n,e){for(var r,i,o,a=0;a0){if((i=r.q[0]).stop=!0,l.cAF()(i.frame),r.q.splice(0,1),e)for(o in i.props)H(t,o,i.props[o]);n?r.q=[]:M(r,!1)}break}}return g[u.p]={on:function(t,n){var e,i=(t=(t||o).match(r)||[o])[u.l],a=0;return this.each(function(){e=this;try{if(e.addEventListener)for(;a0;)i=i.childNodes[0];for(n=0;e[u.l]-n;i.firstChild===e[0]&&n++)i.appendChild(e[n]);var s=a?a.nextSibling:o.firstChild;return o.insertBefore(r,s),this},wrapInner:function(t){return this.each(function(){var n=g(this),e=n.contents();e[u.l]?e.wrapAll(t):n.append(t)})},wrap:function(t){return this.each(function(){g(this).wrapAll(t)})},css:function(n,r){var i,o,a,s=t.getComputedStyle;return d(n)==c.s?r===e?(i=this[0],a=s?s(i,null):i.currentStyle[n],s?null!=a?a.getPropertyValue(n):i[u.s][n]:a):this.each(function(){z(this,n,r)}):this.each(function(){for(o in n)z(this,o,n[o])})},hasClass:function(t){for(var n,e,r=0,a=i+t+i;n=this[r++];){if((e=n.classList)&&e.contains(t))return!0;if(1===n.nodeType&&(i+S(n.className+o)+i).indexOf(a)>-1)return!0}return!1},addClass:function(t){var n,a,s,c,u,l,f,h,d=0,p=0;if(t)for(n=t.match(r)||[];a=this[d++];)if(h=a.classList,f===e&&(f=h!==e),f)for(;u=n[p++];)h.add(u);else if(c=a.className+o,s=1===a.nodeType&&i+S(c)+i){for(;u=n[p++];)s.indexOf(i+u+i)<0&&(s+=u+i);c!==(l=S(s))&&(a.className=l)}return this},removeClass:function(t){var n,a,s,c,u,l,f,h,d=0,p=0;if(t)for(n=t.match(r)||[];a=this[d++];)if(h=a.classList,f===e&&(f=h!==e),f)for(;u=n[p++];)h.remove(u);else if(c=a.className+o,s=1===a.nodeType&&i+S(c)+i){for(;u=n[p++];)for(;s.indexOf(i+u+i)>-1;)s=s.replace(i+u+i,i);c!==(l=S(s))&&(a.className=l)}return this},hide:function(){return this.each(function(){this[u.s].display="none"})},show:function(){return this.each(function(){this[u.s].display="block"})},attr:function(t,n){for(var r,i=0;r=this[i++];){if(n===e)return r.getAttribute(t);r.setAttribute(t,n)}return this},removeAttr:function(t){return this.each(function(){this.removeAttribute(t)})},offset:function(){var e=this[0].getBoundingClientRect(),r=t.pageXOffset||n.documentElement[a],i=t.pageYOffset||n.documentElement[s];return{top:e.top+i,left:e.left+r}},position:function(){var t=this[0];return{top:t.offsetTop,left:t.offsetLeft}},scrollLeft:function(t){for(var n,r=0;n=this[r++];){if(t===e)return n[a];n[a]=t}return this},scrollTop:function(t){for(var n,r=0;n=this[r++];){if(t===e)return n[s];n[s]=t}return this},val:function(t){var n=this[0];return t?(n.value=t,this):n.value},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(t){return g(this[t>=0?t:this[u.l]+t])},find:function(t){var n,e=[];return this.each(function(){var r=this.querySelectorAll(t);for(n=0;n-1){if(!(e>1))return o[r][a];delete t[a],o.splice(r,1)}}}),v=function(){var r,i,o,a,h,v,y,m,x,w,b,g,O,S,A=[],C=(o=[c.b,c.n,c.s,c.a,c.o,c.f,c.z],a=" ",h=":",v=[c.z,c.s],y=c.n,m=[c.z,c.b],x=[!0,c.b],w=[!1,c.b],b=[null,[c.z,c.f]],O={className:["os-theme-dark",v],resize:["none","n:none b:both h:horizontal v:vertical"],sizeAutoCapable:x,clipAlways:x,normalizeRTL:x,paddingAbsolute:w,autoUpdate:[null,m],autoUpdateInterval:[33,y],nativeScrollbarsOverlaid:{showNativeScrollbars:w,initialize:x},overflowBehavior:{x:["scroll",g="v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden"],y:["scroll",g]},scrollbars:{visibility:["auto","v:visible h:hidden a:auto"],autoHide:["never","n:never s:scroll l:leave m:move"],autoHideDelay:[800,y],dragScrolling:x,clickScrolling:w,touchSupport:x},textarea:{dynWidth:w,dynHeight:w},callbacks:{onInitialized:b,onInitializationWithdrawn:b,onDestroyed:b,onScrollStart:b,onScroll:b,onScrollStop:b,onOverflowChanged:b,onOverflowAmountChanged:b,onDirectionChanged:b,onContentSizeChanged:b,onHostSizeChanged:b,onUpdated:b}},{d:(S=function(t){var n=function(e){var r,i,o;for(r in e)e.hasOwnProperty(r)&&(i=e[r],(o=l.type(i))==c.a?e[r]=i[t?1:0]:o==c.o&&(e[r]=n(i)));return e};return n(d.extend(!0,{},O))})(),t:S(!0),v:function(t,n,e,r,i){var s={},u=d.extend(!0,{},t),f=function(t,n,i,s){for(var u in n)if(n.hasOwnProperty(u)&&t.hasOwnProperty(u)){var p,v,y,m,x,w,b,g,O=!1,S=n[u],A=l.type(S),C=l.type(S)!=c.a?[S]:S,z=t[u],E=l.type(z),M=s?s+".":"",H='The option "'+M+u+"\" wasn't set, because",T=[],W=[];if(A==c.o)i[u]={},f(z,S,i[u],M+u),d.isEmptyObject(z)&&delete t[u];else{for(w=0;w0?"\r\nValid strings are: [ "+W.join(", ").split(h).join(", ")+" ].":"")),delete t[u]}}};return f(u,n,s),i?d.extend(!0,s,u):!d.isEmptyObject(u)&&e&&console.warn("The following options are discarded due to invalidity:\r\n"+JSON.stringify(u,null,2)),s}});function z(){r||(r=new E(C.d)),i||(i=new M(r))}function E(r){var i=this,o="overflow",a="hidden",s="scroll",c=d("body"),f=d('
'),h=f[0],v=d(f.children("div").eq(0));c.append(f),f.hide().show();var y,m,x,w,b,g,O,S,A,C=M(h),z={x:0===C.x,y:0===C.y};function E(t){var r=!1,i="Webkit Moz ms O".split(" "),o=n.createElement("div"),a=null,s=0;if(t=t.toLowerCase(),o[u.s][t]!==e&&(r=!0),!r)for(a=t.charAt(0).toUpperCase()+t.substr(1);s0?y=A(m[w](b+5,m[x](".",b)),10):g>0?y=A(m[w](S+3,m[x](".",S)),10):O>0&&(y=A(m[w](O+5,m[x](".",O)),10)),y),cssCalc:function(){var t,e,r=n.createElement("div"),i=["calc","-webkit-calc","-moz-calc","-o-calc"];for(t=0;t0){var t=l.wW(),a=l.wH(),h=t-e,v=a-r;if(0===h&&0===v)return;var y,m=Math.round(t/(e/100)),x=Math.round(a/(r/100)),w=n(h),b=n(v),g=n(m),O=n(x),S=u(),A=w>2&&b>2,C=!s(g,O),z=A&&C&&(S!==o&&o>0),E=i.nativeScrollbarSize;z&&(c.append(f),y=i.nativeScrollbarSize=M(f[0]),f.remove(),E.x===y.x&&E.y===y.y||d.each(p(),function(){p(this)&&p(this).update("zoom")})),e=t,r=a,o=S}};d(t).on("resize",a)}function s(t,e){var r=n(t),i=n(e);return!(r===i||r+1===i||r-1===i)}function u(){var n=t.screen.deviceXDPI||0,e=t.screen.logicalXDPI||1;return t.devicePixelRatio||n/e}}()}function M(t){var n,r=this,i="autoUpdate",o=i+"Interval",a=u.l,s=[],c=[],f=!1,h=33,p=h,v=l.now(),y=function(){if(s[a]>0&&f){n=l.rAF()(function(){y()});var t=l.now(),r=t-v;if(r>p){v=t-r%p;for(var u=h,d=0;db&&(m.update("auto"),c[d]=new Date(g+=b)),u=Math.max(1,Math.min(u,b))}}p=u}}else p=h};r.add=function(n){-1===d.inArray(n,s)&&(s.push(n),c.push(l.now()),s[a]>0&&!f&&(f=!0,t.autoUpdateLoop=f,y()))},r.remove=function(r){var i=d.inArray(r,s);i>-1&&(c.splice(i,1),s.splice(i,1),0===s[a]&&f&&(f=!1,t.autoUpdateLoop=f,n!==e&&(l.cAF()(n),n=-1)))}}function H(r,i,o,a,h){if(fi(r)){if(p(r)){var v=p(r);return v.options(i),v}var y,m,x,w,b,g,O,S,A,z,E,M,H,T,W,k,L,I,N,P,R,D,j,q,F,B,U,_,Q,V,X,Y,K,$,G,J,Z,tt,nt,et,rt,it,ot,at,st,ct,ut,lt,ft,ht,dt,pt,vt,yt,mt,xt,wt,bt,gt,Ot,St,At,Ct,zt,Et,Mt,Ht,Tt,Wt,kt,Lt,It,Nt,Pt,Rt,Dt,jt,qt,Ft,Bt,Ut,_t,Qt,Vt,Xt,Yt,Kt,$t,Gt,Jt,Zt,tn,nn,en,rn,on,an,sn,cn,un,ln,fn,hn,dn,pn,vn,yn,mn,xn,wn,bn,gn,On,Sn,An,Cn,zn,En,Mn,Hn,Tn,Wn=new t[s],kn=d[u.p],Ln={},In={},Nn={},Pn={},Rn={},Dn=175,jn="-hidden",qn="margin-",Fn="padding-",Bn="border-",Un="top",_n="right",Qn="bottom",Vn="left",Xn="min-",Yn="max-",Kn="width",$n="height",Gn="float",Jn="",Zn="auto",te="scroll",ne="100%",ee="x",re="y",ie=".",oe=" ",ae="scrollbar",se="-horizontal",ce="-vertical",ue=te+"Left",le=te+"Top",fe="mousedown touchstart",he="mouseup touchend touchcancel",de="mousemove touchmove",pe="mouseenter",ve="mouseleave",ye="keydown",me="keyup",xe="selectstart",we="transitionend webkitTransitionEnd oTransitionEnd",be="__overlayScrollbarsRO__",ge="os-",Oe=ge+"html",Se=ge+"host",Ae=Se+"-textarea",Ce=Se+"-"+ae+se+jn,ze=Se+"-"+ae+ce+jn,Ee=Se+"-transition",Me=Se+"-rtl",He=Se+"-resize-disabled",Te=Se+"-scrolling",We=Se+"-overflow",ke=We+"-x",Le=We+"-y",Ie=ge+"textarea",Ne=Ie+"-cover",Pe=ge+"padding",Re=ge+"viewport",De=Re+"-native-scrollbars-invisible",je=Re+"-native-scrollbars-overlaid",qe=ge+"content",Fe=ge+"content-arrange",Be=ge+"content-glue",Ue=ge+"size-auto-observer",_e=ge+"resize-observer",Qe=ge+"resize-observer-item",Ve=Qe+"-final",Xe=ge+"text-inherit",Ye=ge+ae,Ke=Ye+"-track",$e=Ke+"-off",Ge=Ye+"-handle",Je=Ge+"-off",Ze=Ye+"-unusable",tr=Ye+"-"+Zn+jn,nr=Ye+"-corner",er=nr+"-resize",rr=er+"-both",ir=er+se,or=er+ce,ar=Ye+se,sr=Ye+ce,cr=ge+"dragging",ur=ge+"theme-none",lr={},fr="added removed on contract",hr={},dr=42,pr=[],vr=11,yr=[112,113,114,115,116,117,118,119,120,121,123,33,34,37,38,39,40,16,17,18,19,20,144],mr=[],xr={},wr={};if(Wn.sleep=function(){_=!0},Wn.update=function(t){var n,e,r=Ai(t)==c.s,i="img",o="load";r?0===t.indexOf(Zn)?(n=$r(),e=Kr(),(n||e)&&Zr(!1,e,!1,"+"==t.slice(-1))):"zoom"===t&&Zr(!0,!0):(t=_||t,_=!1,Zr(!1,!1,t,!0)),k||ut.find(i).each(function(t,n){-1===l.inA(n,pr)&&d(n).off(o,Qr).on(o,Qr)})},Wn.options=function(t,n){if(d.isEmptyObject(t)||!d.isPlainObject(t)){if(Ai(t)==c.s){if(arguments.length>=2){var e={};return bi(e,t,n),ti(e),void Zr()}return wi(X,t)}return X}ti(t);var r=_||!1;_=!1,Zr(),_=r},Wn.destroy=function(){for(var t in W=!0,h.remove(Wn),Er(),Sr(it),P&&Sr(rt),lr)Wn.removeExt(t);Mi(it),ot!==e&&Mi(ot),ct!==e&&Mi(ct),P&&Mi(rt),E?(gr(et,de,Wr),gr(et,pe,Hr),gr(et,ve,Tr)):et.off(de,Wr).off(pe,Hr).off(ve,Tr),Mi(ht),Mi(vt),ft&&Mi(ft),En||Ur(),ut.contents().unwrap().unwrap().unwrap(),L&&Ei(Z,Oe),k?(nt.off(te,qr).off("drop",Rr).off("focus",Dr).off("focusout",jr),b>9||!w?nt.off("input",Ir):nt.off(ye,Nr).off(me,Pr),Mi(lt),Ei(nt,Ie+oe+Xe).unwrap().removeAttr(u.s),Mi(et)):(Ei(nt,Se),Ei(et,[Se,He,Me,Ce,ze,Ee,Te,We,ke,Le,ur,rn].join(oe)));for(var n=0;n0)n.x=t[0],n.y=t[1];else if(Ai(t)==c.s||Ai(t)==c.n)n.x=t,n.y=t;else if(Ai(t)==c.o){for(var e in M=Ai(t.n)==c.b?t.n:M,t=Ci({},t),m=0,t)t.hasOwnProperty(e)&&(m>2&&delete t[e],m++);var r=function(n){var e=n?H:T;for(m=0;m2){var y=r.substr(0,2);for(m=0;m/g,(p?"-":Jn)+ne))[v](/px/g,Jn))[v](/%/g,h+f*(d&&x.n?-1:1)/100))[v](/vw/g,h+Pn.w))[v](/vh/g,h+Pn.h),o=di(di(t.eval(r),!0).toFixed())}else o=r;if(o!==e&&!isNaN(o)&&Ai(o)==c.n){var w=M&&d,b=l*(w&&x.n?-1:1),g=w&&x.i,O=w&&x.n;switch(b=g?f-b:b,i){case"+=":s=b+o;break;case"-=":s=b-o;break;case"*=":s=b*o;break;case"/=":s=b/o;break;default:s=o}s=g?f-s:s,s*=O?-1:1,s=d&&x.n?Math.min(0,Math.max(f,s)):Math.max(0,Math.min(f,s))}return s===l?e:s},Z=function(t,n,e,r){var i,o,a=[e,e],s=Ai(t);if(s==n)t=[t,t];else if(s==c.a){if((i=t[F])>2||i<1)t=a;else for(1===i&&(t[1]=e),m=0;m=4?tt(et):ct:ut==c.o?tt([et[Un],et[_n],et[Qn],et[Vn]]):ct,O=$(rt,B)?rt:"xy",S=Z(it,c.s,D,Q),A=Z(ot,c.s,N,_),C=et;var lt={l:In.cs,t:Nn.cs},ft=at.offset(),ht=E.offset(),dt={x:S.x==j||O==re,y:S.y==j||O==ee};ht[Un]-=C[0],ht[Vn]-=C[3];var pt={x:Math.round(ht[Vn]-ft[Vn]+lt.l),y:Math.round(ht[Un]-ft[Un]+lt.t)};if(U&&(x.n||x.i||(pt.x=Math.round(ft[Vn]-ht[Vn]+lt.l)),x.n&&M&&(pt.x*=-1),x.i&&M&&(pt.x=Math.round(ft[Vn]-ht[Vn]+(In.ms-lt.l)))),A.x!=N||A.y!=N||S.x==q||S.y==q||U){var vt=E[0],yt=z?vt.getBoundingClientRect():{width:vt[u.oW],height:vt[u.oH]},mt={w:yt[Kn]+C[3]+C[1],h:yt[$n]+C[0]+C[2]},xt=function(t){var n=ci(t),e=n._wh,r=n.lt,i=n.xy,o=A[i]==(t&&U?N:I),a=A[i]==P,s=A[i]==R,c=S[i]==j,u=S[i]==q,l=Pn[e],f=ft[r],h=mt[e],d=ht[r],p=a?2:1,v=d+h/2,y=f+l/2,m=h<=l&&d>=f&&d+h<=f+l;c?dt[i]=!0:dt[i]||((s||u)&&(dt[i]=!!u&&m,o=hy:v0||L))if(L)st.animate(k,r);else{if(g={duration:r,complete:o},Ai(i)==c.a){var wt={};wt[ue]=i[0],wt[le]=i[1],g.specialEasing=wt}else g.easing=i;st.animate(k,g)}else w&&st[ue](k[ue]),b&&st[le](k[le])},Wn.scrollStop=function(t,n,e){return st.stop(t,n,e),Wn},Wn.getElements=function(t){var n={target:nt[0],host:et[0],padding:at[0],viewport:st[0],content:ut[0],scrollbarHorizontal:{scrollbar:ht[0],track:dt[0],handle:pt[0]},scrollbarVertical:{scrollbar:vt[0],track:yt[0],handle:mt[0]},scrollbarCorner:ft[0]};return Ai(t)==c.s?wi(n,t):n},Wn.getState=function(t){var n=function(t){if(!d.isPlainObject(t))return t;var n=Ci(!0,{},t),e=function(t,e){n.hasOwnProperty(t)&&(n[e]=n[t],delete n[t])};return e("w",Kn),e("h",$n),delete n.c,n},e={sleeping:n(_)||!1,autoUpdate:n(!dn),widthAuto:n(St),heightAuto:n(At),padding:n(Et),overflowAmount:n(Pt),hideOverflow:n(Ot),hasOverflow:n(gt),contentScrollSize:n(wt),viewportSize:n(Pn),hostSize:n(xt),documentMixed:n(I)};return Ai(t)==c.s?wi(e,t):e},Wn.ext=function(t){var n,e=fr.split(" "),r=0;if(Ai(t)==c.s){if(lr.hasOwnProperty(t))for(n=Ci(!0,{},lr[t]);r9||!w){t.prepend(xi(_e,xi({className:Qe,dir:"ltr"},xi(Qe,xi(Ve))+xi(Qe,xi({className:Ve,style:"width: 200%; height: 200%"})))));var p,v,y,m,g=t[0][s][0][s][0],O=d(g[s][1]),S=d(g[s][0]),A=d(S[0][s][0]),C=g[u.oW],z=g[u.oH],E=2,H=a.nativeScrollbarSize,T=function(){S[ue](r)[le](r),O[ue](r)[le](r)},W=function(){v=0,p&&(C=y,z=m,f())},k=function(t){return y=g[u.oW],m=g[u.oH],p=y!=C||m!=z,t&&p&&!v?(l.cAF()(v),v=l.rAF()(W)):t||W(),T(),t&&(l.prvD(t),l.stpP(t)),!1},L={},I={};I[Un]=-(H.y+1)*E,I[_n]=H.x*-E,I[Qn]=H.y*-E,I[Vn]=-(H.x+1)*E,d(g).css(I),S.on(te,k),O.on(te,k),t.on(o,function(){k(!1)}),L[Kn]=r,L[$n]=r,A.css(L),T()}else{var N=J[0],P=N.attachEvent,R=b!==e;if(P)t.prepend(xi(_e)),Hi(t,ie+_e)[0].attachEvent("onresize",f);else{var D=N.createElement(c.o);D.setAttribute("tabindex","-1"),D.setAttribute(u.c,_e),D.onload=function(){var t=this.contentDocument.defaultView;t.addEventListener("resize",f),t.document.documentElement.style.display="none"},D.type="text/html",R&&t.prepend(D),D.data="about:blank",R||t.prepend(D),t.on(o,f)}}if(t[0]===it[0]){var j=function(){var n=et.css("direction"),e={},i=0,o=!1;return n!==Wt&&("ltr"===n?(e[Vn]=0,e[_n]=Zn,i=r):(e[Vn]=Zn,e[_n]=0,i=x.n?-r:x.i?0:r),it.children().eq(0).css(e),t[ue](i)[le](r),Wt=n,o=!0),o};j(),t.on(te,function(t){return j()&&Zr(),l.prvD(t),l.stpP(t),!1})}}function Sr(t){if(M){var n=t.contents()[0];n[be].disconnect(),delete n[be]}else Mi(t.children(ie+_e).eq(0))}function Ar(t){}function Cr(t){}function zr(){pn&&!dn&&(fn.observe(et[0],{attributes:!0,attributeOldValue:!0,attributeFilter:[u.i,u.c,u.s]}),hn.observe(k?nt[0]:ut[0],{attributes:!0,attributeOldValue:!0,subtree:!k,childList:!k,characterData:!k,attributeFilter:k?["wrap","cols","rows"]:[u.i,u.c,u.s]}),dn=!0)}function Er(){pn&&dn&&(fn.disconnect(),hn.disconnect(),dn=!1)}function Mr(){if(!_){var t=it[0],n={w:t[u.sW],h:t[u.sH]};if(T){var e=Oi(n,$t);$t=n,e&&Zr(!0,!1)}else $t=n}}function Hr(){Sn&&ii(!0)}function Tr(){Sn&&!tt.hasClass(cr)&&ii(!1)}function Wr(){On&&(ii(!0),clearTimeout(xn),xn=setTimeout(function(){On&&!W&&ii(!1)},100))}function kr(t){_||(Q!==e?clearTimeout(Q):((gn||On)&&ii(!0),yi()||zi(et,Te),ui("onScrollStart",t)),ai(!0,st[ue]()),ai(!1,st[le]()),ui("onScroll",t),Q=setTimeout(function(){W||(Lr(),ui("onScrollStop",t))},Dn))}function Lr(){clearTimeout(Q),Q=e,(gn||On)&&ii(!1),yi()||Ei(et,Te)}function Ir(){Jr(),Wn.update(Zn)}function Nr(t){var n=t.keyCode;if(!vi(n)){if(0===mr.length){var e=function(){Jr(),Wn.update(Zn)};e(),vn=setInterval(e,1e3/60)}-1===d.inArray(n,mr)&&mr.push(n)}}function Pr(t){var n=t.keyCode;if(!vi(n)){var e=d.inArray(n,mr);e>-1&&mr.splice(e,1),0===mr.length&&(Jr(),Wn.update(Zn),clearInterval(vn))}}function Rr(){setTimeout(function(){W||(Jr(),Wn.update(Zn))},50)}function Dr(){yn=!0}function jr(){yn=!1,clearInterval(vn),mr=[],Jr(),Wn.update(Zn)}function qr(t){return nt[ue](x.i&&en?9999999:0),nt[le](0),l.prvD(t),l.stpP(t),!1}function Fr(t){if(!_){var n=(t.originalEvent||t).touches!==e;(1===l.mBtn(t)||n)&&(dn&&(zn=!0,Er()),xr=l.page(t),wr.w=et[0][u.oW]-(N?0:R),wr.h=et[0][u.oH]-(N?0:D),J.on(xe,_r).on(de,Br).on(he,Ur),zi(tt,cr),ft.setCapture&&ft.setCapture(),l.prvD(t),l.stpP(t))}}function Br(t){var n=l.page(t),e={};(Hn||Mn)&&(e[Kn]=wr.w+n.x-xr.x),(Tn||Mn)&&(e[$n]=wr.h+n.y-xr.y),et.css(e),l.stpP(t)}function Ur(t){var n=t!==e;J.off(xe,_r).off(de,Br).off(he,Ur),Ei(tt,cr),ft.releaseCapture&&ft.releaseCapture(),n&&(zn&&zr(),Wn.update(Zn)),zn=!1}function _r(t){return l.prvD(t),!1}function Qr(){Zr()}function Vr(){var t={};return L&&ct&&(t.w=di(ct.css(Xn+Kn)),t.h=di(ct.css(Xn+$n)),t.c=Oi(t,cn),t.f=!0),cn=t,t.c||!1}function Xr(t,n){var r=n!==e&&null!==n?n.split(oe):Jn,i=t!==e&&null!==t?t.split(oe):Jn;if(r===Jn&&i===Jn)return!1;var o,a,s,c,u=hi(i,r),l=!1,f=on!==e&&null!==on?on.split(oe):[Jn],h=rn!==e&&null!==rn?rn.split(oe):[Jn],p=d.inArray(ur,u),v=u[o];for(p>-1&&u.splice(p,1),o=0;o0&&T&&o-K0?G:ur)),Vt&&(!0===Qt?(Er(),h.add(Wn)):null===Qt&&w?(Er(),h.add(Wn)):(h.remove(Wn),zr())),Bt)if(Wt)if(ot===e&&(ot=d(xi(Be)),at.before(ot)),P)rt.show();else{rt=d(xi(Ue)),ot.before(rt);var hn={w:-1,h:-1};Or(rt,function(){var t={w:rt[0][u.oW],h:rt[0][u.oH]};Oi(t,hn)&&(T&&At&&t.h>0||St&&t.w>0?Zr():(T&&!At&&0===t.h||!St&&0===t.w)&&Zr()),hn=t}),P=!0,null!==O&&rt.css($n,O+"(100% + 1px)")}else P&&rt.hide();r&&(it.find("*").trigger(te),P&&rt.find("*").trigger(te));var pn,vn=et.css("direction"),mn=gi(vn,Tt,r),xn=et.css("box-sizing"),Cn=gi(xn,zt,r),zn={c:r,t:di(et.css(Fn+Un)),r:di(et.css(Fn+_n)),b:di(et.css(Fn+Qn)),l:di(et.css(Fn+Vn))};try{pn=P?rt[0].getBoundingClientRect():null}catch(qi){return}N="border-box"===xn;var kn=(U="rtl"===vn)?Vn:_n,In=U?_n:Vn,Nn=et[0],Dn=at[0],jn=!1,ie=!(!P||"none"===et.css(Gn))&&(0===Math.round(pn.right-pn.left)&&(!!pt||Nn[u.cW]-R>0));if(Wt&&!ie){var ae=Nn[u.oW],se=ot.css(Kn);ot.css(Kn,Zn);var ce=Nn[u.oW];ot.css(Kn,se),(jn=ae!==ce)||(ot.css(Kn,ae+1),ce=Nn[u.oW],ot.css(Kn,se),jn=ae!==ce)}var he=(ie||jn)&&Wt&&!c,ye=gi(he,St,r),me=!he&&St,xe=!(!P||c)&&0===Math.round(pn.bottom-pn.top),we=gi(xe,At,r),be=!xe&&At,ge="-"+Kn,Oe=he&&N||!N,Se=xe&&N||!N,Ae={c:r,t:Se?di(et.css(Bn+Un+ge),!0):0,r:Oe?di(et.css(Bn+_n+ge),!0):0,b:Se?di(et.css(Bn+Qn+ge),!0):0,l:Oe?di(et.css(Bn+Vn+ge),!0):0},Ce={c:r,t:di(et.css(qn+Un)),r:di(et.css(qn+_n)),b:di(et.css(qn+Qn)),l:di(et.css(qn+Vn))},ze={h:String(et.css(Yn+$n)),w:String(et.css(Yn+Kn))},Ee={},Ie={},Ne=function(){return{w:Nn[u.cW],h:Nn[u.cH]}},Pe=function(){var t=Dn.getBoundingClientRect();return t[Kn]?{w:t[Kn],h:t[$n]}:{w:Dn[u.oW],h:Dn[u.oH]}};if(R=zn.l+zn.r,D=zn.t+zn.b,zn.ax=pt?R:0,zn.ay=pt?D:0,zn.c=Si(zn,Et),j=Ae.l+Ae.r,q=Ae.t+Ae.b,Ae.c=Si(Ae,Mt),F=Ce.l+Ce.r,B=Ce.t+Ce.b,Ce.c=Si(Ce,Ht),ze.ih=di(ze.h),ze.iw=di(ze.w),ze.ch=ze.h.indexOf("px")>-1,ze.cw=ze.w.indexOf("px")>-1,ze.c=Oi(ze,Ct,r),Tt=vn,zt=xn,St=he,At=xe,Et=zn,Mt=Ae,Ht=Ce,Ct=ze,mn&&P&&rt.css(Gn,In),zn.c||mn||vt||ye||we||Cn||Bt){var Re={},De={};li(Ie,qn,[-zn.t,-zn.r,-zn.b,-zn.l]),pt?(li(Re,Jn,[zn.t,zn.r,zn.b,zn.l]),li(k?De:Ee,Fn)):(li(Re,Jn),li(k?De:Ee,Fn,[zn.t,zn.r,zn.b,zn.l])),at.css(Re),nt.css(De)}Pn=Pe();var je=!!k&&Jr();if(xe&&(we||vt||Cn||ze.c||zn.c||Ae.c)?(ze.cw&&(Ee[Yn+$n]=ze.ch?ze.ih-zn.ay+(N?-q:D):Jn),Ee[$n]=Zn):(we||vt)&&(Ee[Yn+$n]=Jn,Ee[$n]=ne),he&&(ye||vt||Cn||ze.c||zn.c||Ae.c||mn)?(ze.cw&&(Ee[Yn+Kn]=ze.cw?ze.iw-zn.ax+(N?-j:R)+(y.y?m.y:0):Jn),Ee[Kn]=Zn,Ie[Yn+Kn]=ne):(ye||vt)&&(Ee[Yn+Kn]=Jn,Ee[Kn]=ne,Ee[Gn]=Jn,Ie[Yn+Kn]=Jn),he&&(ze.cw||(Ee[Yn+Kn]=Jn),Ie[Kn]=k&&Kt?je.dw:Zn,Ee[Kn]=Zn,Ee[Gn]=In),xe&&(ze.ch||(Ee[Yn+$n]=Jn),Ie[$n]=k?un?je.dh:Zn:ut[0][u.cH]),Wt&&ot.css(Ie),ut.css(Ee),Ee={},Ie={},t||n||mn||Cn||vt||ye||he||we||xe||ze.c||_t||Yt||mt||tt||C||$t||fn||dt||r){var qe="overflow",_e=qe+"-x",Qe=qe+"-y",Ve="hidden",Xe="visible",Ye=H?y.x||y.y||Pn.w0&&(Ie[Kn]=Math.max(1,Ie[Kn]),Ie[$n]=Math.max(1,Ie[$n])),k&<.css(pr),ot.css(Ie)}he&&(Ee[Kn]=ne),!he||N||dn||(Ee[Gn]="none"),ut.css(Ee),Ee={};var vr=Je.getBoundingClientRect(),yr=vr[Kn]||0,mr=vr[$n]||0,xr={w:Math.max(Je[u.sW],Ze[u.sW])+di(yr)-yr,h:Math.max(Je[u.sH],Ze[u.sH])+di(mr)-mr};xr.c=n=Oi(xr,wt,r),wt=xr,Ye&&ut.css(qe,Jn),Pn=Pe(),t=Oi(sr=Ne(),xt),xt=sr;var wr={x:"v-s"===Xt.x,y:"v-s"===Xt.y},Sr={x:"v-h"===Xt.x,y:"v-h"===Xt.y},Mr={x:"s"===Xt.x,y:"s"===Xt.y},kr={x:Math.max(0,Math.round(100*(xr.w-Pn.w))/100),y:Math.max(0,Math.round(100*(xr.h-Pn.h))/100)},Lr=k&&(0===Pn.w||0===Pn.h),Ir=0===st[0].scrollLeftMax&&kr.x>0&&kr.x<1||0===st[0].scrollTopMax&&kr.y>0&&kr.y<1;(Lr||Ir)&&(kr.x=kr.y=0);var Nr={x:kr.x>0,y:kr.y>0},Pr={x:Nr.x,y:Nr.y};(wr.x||Sr.x)&&(Pr.x=Nr.y&&!wr.y&&!Sr.y),(wr.y||Sr.y)&&(Pr.y=Nr.x&&!wr.x&&!Sr.x),Pr.xs=!!Pr.x&&(Mr.x||wr.x),Pr.ys=!!Pr.y&&(Mr.y||wr.y);var Rr={x:Nr.x&&Pr.xs,y:Nr.y&&Pr.ys},Dr=Pt;if(kr.c=Oi(kr,Pt,ee,re,r),Pt=kr,Nr.c=Oi(Nr,gt,ee,re,r),gt=Nr,Pr.c=Oi(Pr,Ot,ee,re,r),Ot=Pr,y.x||y.y){var jr="px solid transparent",qr={},Br={},Ur=r;(Nr.x||Nr.y)&&(Br.w=y.y&&Nr.y?xr.w+m.y:Jn,Br.h=y.x&&Nr.x?xr.h+m.x:Jn,Ur=gi(Br,bt,r),bt=Br),(Nr.c||Pr.c||xr.c||mn||ye||we||he||xe||_t)&&(Ee[qn+In]=Ee[Bn+In]=Jn,y.x&&Nr.x&&Pr.xs?(Ee[qn+Qn]=xe?Ut?Jn:m.x:Jn,Ee[Bn+Qn]=xe||Ut?Jn:m.x+jr):(Br.h=Ee[qn+Qn]=Ee[Bn+Qn]=Jn,Ur=!0),y.y&&Nr.y&&Pr.ys?(Ee[qn+kn]=he?Ut?Jn:m.y:Jn,Ee[Bn+kn]=Ut?Jn:m.y+jr):(Br.w=Ee[qn+kn]=Ee[Bn+kn]=Jn,Ur=!0)),Ut&&(Br.w=Br.h=Jn,Ur=!0),Ur&&(qr[Kn]=Pr.y?Br.w:Jn,qr[$n]=Pr.x?Br.h:Jn,ct||(ct=d(xi(Fe)),st.prepend(ct)),ct.css(qr)),ut.css(Ee)}var _r={};Re={};if(t||Nr.c||Pr.c||xr.c||Yt||Cn||_t||mn||mt||we){_r[In]=Jn;var Qr=function(){_r[Qn]=Jn,Ln.h=0},Xr=function(){_r[kn]=Jn,Ln.w=0};if(Nr.x&&Pr.xs?(_r[_e]=te,Ut?Qr():(_r[Qn]=-(y.x?m.x:S.x),Ln.h=y.x?m.y:0)):(_r[_e]=Jn,Qr()),Nr.y&&Pr.ys?(_r[Qe]=te,Ut?Xr():(_r[kn]=-(y.y?m.y:S.y),Ln.w=y.y?m.x:0)):(_r[Qe]=Jn,Xr()),(Pn.h-1,ji=Ri.y>-1;(Di||ji)&&(ji&&st[le](Ri.y),Di&&(U&&en&&x.i?st[ue](0):st[ue](Ri.x)))}Ft=Mi}else k||(U&&x.i&&y.y&&Nr.x&&en&&(p.l+=Ln.w||0),st[ue](p.l),st[le](p.t));mn&&ui("onDirectionChanged",{isRTL:U,dir:vn}),t&&ui("onHostSizeChanged",{width:xt.w,height:xt.h}),n&&ui("onContentSizeChanged",{width:wt.w,height:wt.h}),(Nr.c||Pr.c)&&ui("onOverflowChanged",{x:Nr.x,y:Nr.y,xScrollable:Pr.xs,yScrollable:Pr.ys,clipped:Pr.x||Pr.y}),kr.c&&ui("onOverflowAmountChanged",{x:kr.x,y:kr.y})}L&&(gt.c||cn.c)&&(cn.f||Vr(),y.y&>.x&&ut.css(Xn+Kn,cn.w+m.y),y.x&>.y&&ut.css(Xn+$n,cn.h+m.x),cn.c=!1),Cr(it),Cr(rt),ui("onUpdated",{forced:r})}}function ti(t){X=Ci(!0,{},X,C.v(t,C.t,!0)),Y=Ci(!0,{},Y,C.v(t,C.t,!1,!0))}function ni(){ht=d(xi(Ye+oe+ar)),dt=d(xi(Ke)),pt=d(xi(Ge)),vt=d(xi(Ye+oe+sr)),yt=d(xi(Ke)),mt=d(xi(Ge)),ht.append(dt),dt.append(pt),vt.append(yt),yt.append(mt),at.after(vt),at.after(ht),A&&(ht.on(we,function(t){t.target===ht[0]&&(oi(!0),ai(!0,st[ue]()))}),vt.on(we,function(t){t.target===vt[0]&&(oi(!1),ai(!1,st[le]()))})),ei(!0),ei(!1),ft=d(xi(nr)),et.append(ft)}function ei(t){var n,r,i,o=ci(t),a=G.top!==G,s=o.xy,c=o.XY,u=te+o.LT,f="active",h=1,p=[16,17];function v(){h=.5}function y(){h=1}function m(t){d.inArray(t.keyCode,p)>-1&&v()}function w(t){d.inArray(t.keyCode,p)>-1&&y()}function g(t){var n=(t.originalEvent||t).touches!==e;return!(_||yi()||!tn||n&&!An)&&(1===l.mBtn(t)||n)}function O(e){if(g(e)){var i=o.i.tl,f=o.i.hl,h=o.i.ms*(((b&&a?e["screen"+c]:l.page(e)[s])-r)/(i-f));h=isFinite(h)?h:0,U&&t&&!x.i&&(h*=-1),st[u](n+h),E||l.prvD(e)}else S(e)}function S(t){t=t||t.originalEvent,Ei(tt,cr),Ei(o.h,f),Ei(o.t,f),Ei(o.s,f),J.off(de,O).off(he,S).off(ye,m).off(me,w).off(xe,_r),y(),n=e,r=e,i!==e&&(Wn.scrollStop(),clearTimeout(i),i=e);var a=et[0].getBoundingClientRect();t.clientX>=a.left&&t.clientX<=a.right&&t.clientY>=a.top&&t.clientY<=a.bottom||Tr(),(gn||On)&&ii(!1)}function A(i){n=(n=st[u]())===e?0:n,(U&&t&&!x.n||!U)&&(n=n<0?0:n),r=b&&a?i["screen"+c]:l.page(i)[s],zi(tt,cr),zi(o.h,f),zi(o.s,f),J.on(de,O).on(he,S).on(xe,_r),!b&&I||l.prvD(i),l.stpP(i)}o.h.on(fe,function(t){g(t)&&A(t)}),o.t.on(fe,function(n){if(g(n)){var a,c,d=Pn[o._wh],p=o.t.offset()[o.lt],y=n.ctrlKey,b=n.shiftKey,O=b&&y,C=!0,z="linear",E=function(){if(!W){var l=r-p,f=o.i.tl,v=o.i.ho,y=o.i.hl,m=o.i.ms,w=270*h,g=C?Math.max(400,w):w,S=m*((l-y/2)/(f-y)),M=U&&t&&(!x.i&&!x.n||en),H=M?vl,T={};b?(S=isFinite(S)?S:0,U&&t&&!x.i&&(S=m-S),O?(T.n=!1,T[s]=S,Wn.scroll(T,130,z,function(){A(n)})):(st[u](S),A(n))):(a=C?H:a,c=M?a?v+y>=l:v<=l:a?v<=l:v+y>=l,T[s]=a?"-="+d:"+="+d,Wn.scrollStop(),Wn.scroll(T,w,z),c?(clearTimeout(i),Wn.scrollStop(),i=e):i=setTimeout(E,g),C=!1)}};y&&v(),r=l.page(n)[s],zi(tt,cr),zi(o.t,f),zi(o.s,f),J.on(he,S).on(ye,m).on(me,w).on(xe,_r),E(),l.prvD(n),l.stpP(n)}}).on(pe,function(){(gn||On)&&(Cn=!0,ii(!0))}).on(ve,function(){(gn||On)&&(Cn=!1,ii(!1))}),o.s.on(fe,function(t){l.stpP(t)})}function ri(t,n,e){var r=t?Ce:ze,i=t?ht:vt;n?Ei(et,r):zi(et,r),e?Ei(i,Ze):zi(i,Ze)}function ii(t,n){if(clearTimeout(mn),t)Ei(ht,tr),Ei(vt,tr);else{var e="active",r=function(){if(!Cn&&!W){var t=pt.hasClass(e)||mt.hasClass(e);!t&&(gn||On||Sn)&&zi(ht,tr),!t&&(gn||On||Sn)&&zi(vt,tr)}};wn>0&&!0!==n?mn=setTimeout(r,wn):r()}}function oi(t){var n={},e=ci(t),r=1e6,i=Math.min(1,(xt[e._wh]-(kt?t?R:D:0))/wt[e._wh]);n[e.wh]=Math.floor(100*i*r)/r+"%",yi()||e.h.css(n),e.i.hl=e.h[0]["offset"+e.WH],e.i.hlr=i}function ai(t,n){var e,r,i,o=U&&t,a={},s=ci(t),c="translate(",u="transform",l=st[0][te+s.WH]-st[0]["client"+s.WH],f=s.i.hl,h=s.t[0]["offset"+s.WH],d=h-f;x.n&&o&&(l*=-1),i=n/l,i=isNaN(i)?0:Math.min(1,i),s.i.ms=l,s.i.cs=n,s.i.csr=i,d*=i,d=isNaN(d)?0:d,o&&!x.i&&(d=h-f-d),d=Math.max(0,d),z?(r=o?-(h-f-d):d,e=t?c+r+"px, 0)":c+"0, "+r+"px)",a["-webkit-"+u]=e,a["-moz-"+u]=e,a["-ms-"+u]=e,a["-o-"+u]=e,a[u]=e):a[s.lt]=d,yi()||s.h.css(a),s.i.ho=d,s.i.tl=h}function si(t,n){var e=n?"removeClass":"addClass",r=t?yt:mt,i=t?$e:Je;(t?dt:pt)[e](i),r[e](i)}function ci(t){return{wh:t?Kn:$n,WH:t?"Width":"Height",lt:t?Vn:Un,LT:t?"Left":"Top",xy:t?ee:re,XY:t?"X":"Y",_wh:t?"w":"h",_lt:t?"l":"t",t:t?dt:yt,h:t?pt:mt,s:t?ht:vt,i:t?In:Nn}}function ui(t,n){if(T){var e,r=Y.callbacks[t],i=t;"on"===i.substr(0,2)&&(i=i.substr(2,1).toLowerCase()+i.substr(3)),Ai(r)==c.f&&r.call(Wn,n),d.each(lr,function(){Ai((e=this).on)==c.f&&e.on(i,n)})}}function li(t,n,r){r===e&&(r=[Jn,Jn,Jn,Jn]),t[n+Un]=r[0],t[n+_n]=r[1],t[n+Qn]=r[2],t[n+Vn]=r[3]}function fi(n){var e="ownerDocument",r="HTMLElement",i=n&&n[e]&&n[e].parentWindow||t;return typeof i[r]==c.o?n instanceof i[r]:n&&typeof n==c.o&&null!==n&&1===n.nodeType&&typeof n.nodeName==c.s}function hi(t,n){var e,r,i=[],o=[];for(e=0;ef&&(l=r+1,f=n);return{cR:h,cC:d,r:c,c:f,w:l,p:t,m:a}}}function vi(t){for(var n=0;n"+(n||Jn)+""}function wi(t,n){for(var e,r=n.split(ie),i=0;i9||!w?nt.on("input",Ir):nt.on(ye,Nr).on(me,Pr)}else zi(nt,Se),(et=nt).wrapInner(xi(qe)).wrapInner(xi(Re)).wrapInner(xi(Pe)),ut=Hi(et,ie+qe),st=Hi(et,ie+Re),at=Hi(et,ie+Pe),ut.on(we,function(t){!0!==Dt&&Gr((t=t.originalEvent||t).propertyName)&&Zr(Zn)});if(ni(),E?br(st,te,kr):st.on(te,kr),g&&zi(st,y.x&&y.y?je:De),pn){var s,f,h,p,v,C,N=l.mO(),P=l.now();fn=new N(function(t){if(T&&!_){var n,e=!1;d.each(t,function(){if(s=(n=this).target,f=n.attributeName,e=f===u.c?Xr(n.oldValue,s.className):f!==u.s||n.oldValue!==s[u.s].cssText)return!1}),e&&Wn.update(Zn)}}),hn=new N(function(t){if(T&&!_){var n=!1;d.each(t,function(){return!(n=Yr(this))}),n&&(p=l.now(),v=At||St,C=function(){W||(P=p,k&&Jr(),v?Zr():Wn.update(Zn))},clearTimeout(h),vr<=0||p-P>vr||!v?C():h=setTimeout(C,vr))}})}return L&&(zi(Z,Oe),st[ue](i.l),st[le](i.t)),it=d(xi("os-resize-observer-host")),et.prepend(it),Or(it,Mr),Mr(),Wn.update(Zn),setTimeout(function(){A&&!W&&zi(et,Ee)},333),T=!0,ui("onInitialized"),Ai(r)==c.s&&(r=[r]),l.isA(r)?d.each(r,function(){Wn.addExt(this)}):d.isPlainObject(r)&&d.each(r,function(t,n){Wn.addExt(t,n)}),T}}return t[s]=function(n,o,a){if(0===arguments.length)return this;z();var c,u,l=[];return d.isPlainObject(o)?n&&n.length?(d.each(n,function(){(c=this)!==e&&l.push(H(c,o,a,r,i))}),u=l.length>1?l:l[0]):u=H(n,o,a,r,i):n&&(n.length&&n.length>0?(d.each(n,function(){c=p(this),"!"===o?c instanceof t[s]&&l.push(c):l.push(c)}),u=l.length>1?l:l[0]):u=p(n)),u},t[s].globals=function(){z();var t=d.extend(!0,{},r);return delete t.msie,t},t[s].defaultOptions=function(t){z();var n=r.defaultOptions;if(t===e)return d.extend(!0,{},n);r.defaultOptions=d.extend(!0,{},n,C.v(t,C.t,!0))},t[s].extension=function(t,n,e){var r=l.type(t)==c.s,i=arguments[u.l],o=0;if(i<1||!r)return d.extend(!0,{length:A[u.l]},A);if(r)if(l.type(n)==c.f)A.push({name:t,extension:n,defaultOptions:e});else for(;o1))return d.extend(!0,{},A[o]);A.splice(o,1)}},t[s]}();return f&&f.fn&&(f.fn.overlayScrollbars=function(t,n){var e=this;return f.isPlainObject(t)?(f.each(e,function(){v(this,t,n)}),e):v(e,t)}),v}); \ No newline at end of file +!function(t,n){"function"==typeof define&&define.amd?define(function(){return n(t,t.document,undefined)}):"object"==typeof module&&"object"==typeof module.exports?module.exports=n(t,t.document,undefined):n(t,t.document,undefined)}("undefined"!=typeof window?window:this,function(t,n,e){"use strict";var r,i,o,s="OverlayScrollbars",a={o:"object",f:"function",a:"array",s:"string",b:"boolean",n:"number",u:"undefined",z:"null"},c={c:"class",s:"style",i:"id",l:"length",p:"prototype",oH:"offsetHeight",cH:"clientHeight",sH:"scrollHeight",oW:"offsetWidth",cW:"clientWidth",sW:"scrollWidth"},u={wW:function(){return t.innerWidth||n.documentElement[c.cW]||n.body[c.cW]},wH:function(){return t.innerHeight||n.documentElement[c.cH]||n.body[c.cH]},mO:function(){return t.MutationObserver||t.WebKitMutationObserver||t.WebkitMutationObserver||t.MozMutationObserver||e},rO:function(){return t.ResizeObserver||t.WebKitResizeObserver||t.WebkitResizeObserver||t.MozResizeObserver||e},rAF:function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||t.msRequestAnimationFrame||function(n){return t.setTimeout(n,1e3/60)}},cAF:function(){return t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.mozCancelAnimationFrame||t.oCancelAnimationFrame||t.msCancelAnimationFrame||function(n){return t.clearTimeout(n)}},now:function(){return Date.now()||(new Date).getTime()},stpP:function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},prvD:function(t){t.preventDefault&&t.cancelable?t.preventDefault():t.returnValue=!1},page:function(t){var r="page",i="client",o="X",s="Y",a=((t=t.originalEvent||t).target||t.srcElement||n).ownerDocument||n,c=a.documentElement,u=a.body;if(t.touches!==e){var l=t.touches[0];return{x:l[r+o],y:l[r+s]}}return!t[r+o]&&t[i+o]&&null!=t[i+o]?{x:t[i+o]+(c&&c.scrollLeft||u&&u.scrollLeft||0)-(c&&c.clientLeft||u&&u.clientLeft||0),y:t[i+s]+(c&&c.scrollTop||u&&u.scrollTop||0)-(c&&c.clientTop||u&&u.clientTop||0)}:{x:t[r+o],y:t[r+s]}},mBtn:function(t){var n=t.button;return t.which||n===e?t.which:1&n?1:2&n?3:4&n?2:0},inA:function(t,n){for(var e=0;e0&&e-1 in n)}function A(t){return(t.match(r)||[]).join(i)}function C(t,e){for(var r=(t.parentNode||n).querySelectorAll(e)||[],i=r[c.l];i--;)if(r[i]==t)return!0;return!1}function z(t,n,e){if(p(e)==a.a)for(var r=0;r0?(r=t.q[0],L(t.el,r.props,r.duration,r.easing,r.complete,!0)):(e=m(t,d))>-1&&d.splice(e,1)}function W(t,n,e){n===s||n===f?t[n]=e:E(t,n,e)}function L(t,n,r,i,o,a){var p,v,y,g,S,A,C=b(r),z={},E={},T=0;for(C?(i=r.easing,r.start,y=r.progress,g=r.step,S=r.specialEasing,o=r.complete,A=r.duration):A=r,S=S||{},A=A||400,i=i||"swing",a=a||!1;T0)D=u.now(),F=function(){for(p in L=u.now(),j=L-D,k=B.stop||j>=A,I=1-(l.max(0,D+A-L)/A||0),E)N=parseFloat(z[p]),P=parseFloat(E[p]),R=(P-N)*h[S[p]||i](I,I*A,0,1,A)+N,W(t,p,R),x(g)&&g(R,{elem:t,prop:p,start:N,now:R,end:P,pos:I,options:{easing:i,speacialEasing:S,duration:A,complete:o,step:g},startTime:D});x(y)&&y({},I,l.max(0,A-j)),k?(H(v),x(o)&&o()):B.frame=u.rAF()(F)},B.frame=u.rAF()(F);else{for(p in E)W(t,p,E[p]);H(v)}}}function k(t,n,e){for(var r,i,o,s=0;s0){if((i=r.q[0]).stop=!0,u.cAF()(i.frame),r.q.splice(0,1),e)for(o in i.props)W(t,o,i.props[o]);n?r.q=[]:H(r,!1)}break}}return O[c.p]={on:function(t,n){var e,i=(t=(t||o).match(r)||[o])[c.l],s=0;return this.each(function(){e=this;try{if(e.addEventListener)for(;s0;)i=i.childNodes[0];for(n=0;e[c.l]-n;i.firstChild===e[0]&&n++)i.appendChild(e[n]);var a=s?s.nextSibling:o.firstChild;return o.insertBefore(r,a),this},wrapInner:function(t){return this.each(function(){var n=O(this),e=n.contents();e[c.l]?e.wrapAll(t):n.append(t)})},wrap:function(t){return this.each(function(){O(this).wrapAll(t)})},css:function(n,r){var i,o,s,u=t.getComputedStyle;return p(n)==a.s?r===e?(i=this[0],s=u?u(i,null):i.currentStyle[n],u?null!=s?s.getPropertyValue(n):i[c.s][n]:s):this.each(function(){E(this,n,r)}):this.each(function(){for(o in n)E(this,o,n[o])})},hasClass:function(t){for(var n,e,r=0,s=i+t+i;n=this[r++];){if((e=n.classList)&&e.contains(t))return!0;if(1===n.nodeType&&(i+A(n.className+o)+i).indexOf(s)>-1)return!0}return!1},addClass:function(t){var n,s,a,c,u,l,f,h,d=0,p=0;if(t)for(n=t.match(r)||[];s=this[d++];)if(h=s.classList,f===e&&(f=h!==e),f)for(;u=n[p++];)h.add(u);else if(c=s.className+o,a=1===s.nodeType&&i+A(c)+i){for(;u=n[p++];)a.indexOf(i+u+i)<0&&(a+=u+i);c!==(l=A(a))&&(s.className=l)}return this},removeClass:function(t){var n,s,a,c,u,l,f,h,d=0,p=0;if(t)for(n=t.match(r)||[];s=this[d++];)if(h=s.classList,f===e&&(f=h!==e),f)for(;u=n[p++];)h.remove(u);else if(c=s.className+o,a=1===s.nodeType&&i+A(c)+i){for(;u=n[p++];)for(;a.indexOf(i+u+i)>-1;)a=a.replace(i+u+i,i);c!==(l=A(a))&&(s.className=l)}return this},hide:function(){return this.each(function(){this[c.s].display="none"})},show:function(){return this.each(function(){this[c.s].display="block"})},attr:function(t,n){for(var r,i=0;r=this[i++];){if(n===e)return r.getAttribute(t);r.setAttribute(t,n)}return this},removeAttr:function(t){return this.each(function(){this.removeAttribute(t)})},offset:function(){var e=this[0].getBoundingClientRect(),r=t.pageXOffset||n.documentElement[s],i=t.pageYOffset||n.documentElement[f];return{top:e.top+i,left:e.left+r}},position:function(){var t=this[0];return{top:t.offsetTop,left:t.offsetLeft}},scrollLeft:function(t){for(var n,r=0;n=this[r++];){if(t===e)return n[s];n[s]=t}return this},scrollTop:function(t){for(var n,r=0;n=this[r++];){if(t===e)return n[f];n[f]=t}return this},val:function(t){var n=this[0];return t?(n.value=t,this):n.value},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(t){return O(this[t>=0?t:this[c.l]+t])},find:function(t){var n,e=[];return this.each(function(){var r=this.querySelectorAll(t);for(n=0;n-1){if(!(e>1))return i[r][o];delete t[o],i.splice(r,1)}}}),v=function(){var r,i,o,h,v,y,m,x,w,b,g,O,S,A,C=[],z=(o=[a.b,a.n,a.s,a.a,a.o,a.f,a.z],h=" ",v=":",y=[a.z,a.s],m=a.n,x=[a.z,a.b],w=[!0,a.b],b=[!1,a.b],g=[null,[a.z,a.f]],S={className:["os-theme-dark",y],resize:["none","n:none b:both h:horizontal v:vertical"],sizeAutoCapable:w,clipAlways:w,normalizeRTL:w,paddingAbsolute:b,autoUpdate:[null,x],autoUpdateInterval:[33,m],nativeScrollbarsOverlaid:{showNativeScrollbars:b,initialize:w},overflowBehavior:{x:["scroll",O="v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden"],y:["scroll",O]},scrollbars:{visibility:["auto","v:visible h:hidden a:auto"],autoHide:["never","n:never s:scroll l:leave m:move"],autoHideDelay:[800,m],dragScrolling:w,clickScrolling:b,touchSupport:w},textarea:{dynWidth:b,dynHeight:b,inheritedAttrs:[["style","class"],[a.s,a.a,a.z]]},callbacks:{onInitialized:g,onInitializationWithdrawn:g,onDestroyed:g,onScrollStart:g,onScroll:g,onScrollStop:g,onOverflowChanged:g,onOverflowAmountChanged:g,onDirectionChanged:g,onContentSizeChanged:g,onHostSizeChanged:g,onUpdated:g}},{d:(A=function(t){var n=function(e){var r,i,o;for(r in e)e.hasOwnProperty(r)&&(i=e[r],(o=u.type(i))==a.a?e[r]=i[t?1:0]:o==a.o&&(e[r]=n(i)));return e};return n(d.extend(!0,{},S))})(),t:A(!0),v:function(n,e,r,i,s){var c={},l=d.extend(!0,{},n),f=function(t,n,e,s){for(var c in n)if(n.hasOwnProperty(c)&&t.hasOwnProperty(c)){var l,p,y,m,x,w,b,g,O=!1,S=n[c],A=u.type(S),C=u.type(S)!=a.a?[S]:S,z=t[c],E=u.type(z),T=s?s+".":"",H='The option "'+T+c+"\" wasn't set, because",W=[],L=[];if(A==a.o)e[c]={},f(z,S,e[c],T+c),d.isEmptyObject(z)&&delete t[c];else{for(w=0;w0?"\r\nValid strings are: [ "+L.join(", ").split(v).join(", ")+" ].":"")),delete t[c]}}};return f(l,e,c),s?d.extend(!0,c,l):!d.isEmptyObject(l)&&r&&console.warn("The following options are discarded due to invalidity:\r\n"+t.JSON.stringify(l,null,2)),c}});function E(){r||(r=new T(z.d)),i||(i=new H(r))}function T(r){var i=this,o="overflow",s="hidden",a="scroll",f=d("body"),h=d('
'),v=h[0],y=d(h.children("div").eq(0));f.append(h),h.hide().show();var m,x,w,b,g,O,S,A,C,z=H(v),E={x:0===z.x,y:0===z.y};function T(t){var r=!1,i="Webkit Moz ms O".split(" "),o=n.createElement("div"),s=null,a=0;if(t=t.toLowerCase(),o[c.s][t]!==e&&(r=!0),!r)for(s=t.charAt(0).toUpperCase()+t.substr(1);a0?m=C(x[b](g+5,x[w](".",g)),10):O>0?m=C(x[b](A+3,x[w](".",A)),10):S>0&&(m=C(x[b](S+5,x[w](".",S)),10)),m),cssCalc:function(){var t,e,r=n.createElement("div"),i=["calc","-webkit-calc","-moz-calc","-o-calc"];for(t=0;t0){var t=u.wW(),s=u.wH(),v=t-e,y=s-r;if(0===v&&0===y)return;var m,x=l.round(t/(e/100)),w=l.round(s/(r/100)),b=n(v),g=n(y),O=n(x),S=n(w),A=c(),C=b>2&&g>2,z=!a(O,S),E=C&&z&&(A!==o&&o>0),T=i.nativeScrollbarSize;E&&(f.append(h),m=i.nativeScrollbarSize=H(h[0]),h.remove(),T.x===m.x&&T.y===m.y||d.each(p(),function(){p(this)&&p(this).update("zoom")})),e=t,r=s,o=A}};d(t).on("resize",s)}function a(t,e){var r=n(t),i=n(e);return!(r===i||r+1===i||r-1===i)}function c(){var n=t.screen.deviceXDPI||0,e=t.screen.logicalXDPI||1;return t.devicePixelRatio||n/e}}()}function H(t){var n,r=this,i="autoUpdate",o=i+"Interval",s=c.l,a=[],f=[],h=!1,p=33,v=p,y=u.now(),m=function(){if(a[s]>0&&h){n=u.rAF()(function(){m()});var t=u.now(),r=t-y;if(r>v){y=t-r%v;for(var c=p,d=0;dg&&(x.update("auto"),f[d]=new Date(O+=g)),c=l.max(1,l.min(c,g))}}v=c}}else v=p};r.add=function(n){-1===d.inArray(n,a)&&(a.push(n),f.push(u.now()),a[s]>0&&!h&&(h=!0,t.autoUpdateLoop=h,m()))},r.remove=function(r){var i=d.inArray(r,a);i>-1&&(f.splice(i,1),a.splice(i,1),0===a[s]&&h&&(h=!1,t.autoUpdateLoop=h,n!==e&&(u.cAF()(n),n=-1)))}}function W(r,i,o,h,v){if(ni(r)){if(p(r)){var y=p(r);return y.options(i),y}var m,x,w,b,g,O,S,A,C,E,T,H,W,L,k,I,N,P,R,D,F,j,q,B,M,U,_,V,Q,X,Y,K,$,G,J,Z,tt,nt,et,rt,it,ot,st,at,ct,ut,lt,ft,ht,dt,pt,vt,yt,mt,xt,wt,bt,gt,Ot,St,At,Ct,zt,Et,Tt,Ht,Wt,Lt,kt,It,Nt,Pt,Rt,Dt,Ft,jt,qt,Bt,Mt,Ut,_t,Vt,Qt,Xt,Yt,Kt,$t,Gt,Jt,Zt,tn,nn,en,rn,on,sn,an,cn,un,ln,fn,hn,dn,pn,vn,yn,mn,xn,wn,bn,gn,On,Sn,An,Cn,zn,En,Tn,Hn,Wn,Ln,kn=new t[s],In=d[c.p],Nn={},Pn={},Rn={},Dn={},Fn={},jn="-hidden",qn="margin-",Bn="padding-",Mn="border-",Un="top",_n="right",Vn="bottom",Qn="left",Xn="min-",Yn="max-",Kn="width",$n="height",Gn="float",Jn="",Zn="auto",te="scroll",ne="100%",ee="x",re="y",ie=".",oe=" ",se="scrollbar",ae="-horizontal",ce="-vertical",ue=te+"Left",le=te+"Top",fe="mousedown touchstart",he="mouseup touchend touchcancel",de="mousemove touchmove",pe="mouseenter",ve="mouseleave",ye="keydown",me="keyup",xe="selectstart",we="transitionend webkitTransitionEnd oTransitionEnd",be="__overlayScrollbarsRO__",ge="os-",Oe=ge+"html",Se=ge+"host",Ae=Se+"-textarea",Ce=Se+"-"+se+ae+jn,ze=Se+"-"+se+ce+jn,Ee=Se+"-transition",Te=Se+"-rtl",He=Se+"-resize-disabled",We=Se+"-scrolling",Le=Se+"-overflow",ke=Le+"-x",Ie=Le+"-y",Ne=ge+"textarea",Pe=Ne+"-cover",Re=ge+"padding",De=ge+"viewport",Fe=De+"-native-scrollbars-invisible",je=De+"-native-scrollbars-overlaid",qe=ge+"content",Be=ge+"content-arrange",Me=ge+"content-glue",Ue=ge+"size-auto-observer",_e=ge+"resize-observer",Ve=ge+"resize-observer-item",Qe=Ve+"-final",Xe=ge+"text-inherit",Ye=ge+se,Ke=Ye+"-track",$e=Ke+"-off",Ge=Ye+"-handle",Je=Ge+"-off",Ze=Ye+"-unusable",tr=Ye+"-"+Zn+jn,nr=Ye+"-corner",er=nr+"-resize",rr=er+"-both",ir=er+ae,or=er+ce,sr=Ye+ae,ar=Ye+ce,cr=ge+"dragging",ur=ge+"theme-none",lr=[],fr={},hr="added removed on contract",dr={},pr=42,vr=[];if(kn.sleep=function(){Q=!0},kn.update=function(t){var n,e,r=di(t)==a.s,i="img",o="load";r?0===t.indexOf(Zn)?(n=Rr(),e=Pr(),(n||e)&&jr(!1,e,!1,"+"==t.slice(-1))):"zoom"===t&&jr(!0,!0):(t=Q||t,Q=!1,jr(!1,!1,t,!0)),N||lt.find(i).each(function(t,n){-1===u.inA(n,vr)&&d(n).off(o,Lr).on(o,Lr)})},kn.options=function(t,n){if(d.isEmptyObject(t)||!d.isPlainObject(t)){if(di(t)==a.s){if(arguments.length>1){var e={};return ui(e,t,n),qr(e),void jr()}return ci(Y,t)}return Y}qr(t);var r=Q||!1;Q=!1,jr(),Q=r},kn.destroy=function(){for(var t in I=!0,v.remove(kn),Ar(),wr(ot),F&&wr(it),fr)kn.removeExt(t);Hr(!0),Mr(!0),st&&mi(st),ut&&mi(ut),F&&mi(it),Ur(!0),Gr(!0),Br(!0);for(var n=0;n2){var x=n.substr(0,2);for(m=0;m/g,(p?"-":Jn)+ne))[v](/px/g,Jn))[v](/%/g,h+f*(d&&w.n?-1:1)/100))[v](/vw/g,h+Dn.w))[v](/vh/g,h+Dn.h)),!0).toFixed())}else i=n;if(i!==e&&!isNaN(i)&&di(i)==a.n){var b=T&&d,g=u*(b&&w.n?-1:1),O=b&&w.i,S=b&&w.n;switch(g=O?f-g:g,r){case"+=":s=g+i;break;case"-=":s=g-i;break;case"*=":s=g*i;break;case"/=":s=g/i;break;default:s=i}s=O?f-s:s,s*=S?-1:1,s=d&&w.n?l.min(0,l.max(f,s)):l.max(0,l.min(f,s))}return s===u?e:s},et=function(t,n,e,r){var i,o,s=[e,e],c=di(t);if(c==n)t=[t,t];else if(c==a.a){if((i=t[U])>2||i<1)t=s;else for(1===i&&(t[1]=e),m=0;m=4?rt(ot):ft:ht==a.o?rt([ot[Un],ot[_n],ot[Vn],ot[Qn]]):ft,O=Z(st,_)?st:"xy",S=et(ut,a.s,q,X),A=et(lt,a.s,D,Q),C=ot;var dt={l:Pn.cs,t:Rn.cs},pt=at.offset(),vt=z.offset(),yt={x:S.x==B||O==re,y:S.y==B||O==ee};vt[Un]-=C[0],vt[Qn]-=C[3];var mt={x:l.round(vt[Qn]-pt[Qn]+dt.l),y:l.round(vt[Un]-pt[Un]+dt.t)};if(V&&(w.n||w.i||(mt.x=l.round(pt[Qn]-vt[Qn]+dt.l)),w.n&&T&&(mt.x*=-1),w.i&&T&&(mt.x=l.round(pt[Qn]-vt[Qn]+(Pn.ms-dt.l)))),A.x!=D||A.y!=D||S.x==M||S.y==M||V){var xt=z[0],wt=E?xt.getBoundingClientRect():{width:xt[c.oW],height:xt[c.oH]},bt={w:wt[Kn]+C[3]+C[1],h:wt[$n]+C[0]+C[2]},gt=function(t){var n=$r(t),e=n._wh,r=n.lt,i=n.xy,o=A[i]==(t&&V?D:R),s=A[i]==F,a=A[i]==j,c=S[i]==B,u=S[i]==M,l=Dn[e],f=pt[r],h=bt[e],d=vt[r],p=s?2:1,v=d+h/2,y=f+l/2,m=h<=l&&d>=f&&d+h<=f+l;c?yt[i]=!0:yt[i]||((a||u)&&(yt[i]=!!u&&m,o=hy:v0||k)?k?(n.complete=J,ct.animate(N,n)):(g={duration:n,complete:J},di(r)==a.a||d.isPlainObject(r)?(P[ue]=r[0]||r.x,P[le]=r[1]||r.y,g.specialEasing=P):g.easing=r,ct.animate(N,g)):(x&&ct[ue](N[ue]),b&&ct[le](N[le]))},kn.scrollStop=function(t,n,e){return ct.stop(t,n,e),kn},kn.getElements=function(t){var n={target:et[0],host:rt[0],padding:at[0],viewport:ct[0],content:lt[0],scrollbarHorizontal:{scrollbar:dt[0],track:pt[0],handle:vt[0]},scrollbarVertical:{scrollbar:yt[0],track:mt[0],handle:xt[0]},scrollbarCorner:ht[0]};return di(t)==a.s?ci(n,t):n},kn.getState=function(t){var n=function(t){if(!d.isPlainObject(t))return t;var n=pi(!0,{},t),e=function(t,e){n.hasOwnProperty(t)&&(n[e]=n[t],delete n[t])};return e("w",Kn),e("h",$n),delete n.c,n},e={sleeping:n(Q)||!1,autoUpdate:n(!pn),widthAuto:n(At),heightAuto:n(Ct),padding:n(Tt),overflowAmount:n(Dt),hideOverflow:n(St),hasOverflow:n(Ot),contentScrollSize:n(bt),viewportSize:n(Dn),hostSize:n(wt),documentMixed:n(R)};return di(t)==a.s?ci(e,t):e},kn.ext=function(t){var n,e=hr.split(" "),r=0;if(di(t)==a.s){if(fr.hasOwnProperty(t))for(n=pi(!0,{},fr[t]);r9||!b){t.prepend(ai(_e,ai({className:Ve,dir:"ltr"},ai(Ve,ai(Qe))+ai(Ve,ai({className:Qe,style:"width: 200%; height: 200%"})))));var p,v,y,m,x=t[0][s][0][s][0],O=d(x[s][1]),S=d(x[s][0]),A=d(S[0][s][0]),C=x[c.oW],z=x[c.oH],E=2,T=h.nativeScrollbarSize,W=function(){S[ue](r)[le](r),O[ue](r)[le](r)},L=function(){v=0,p&&(C=y,z=m,l())},k=function(t){return y=x[c.oW],m=x[c.oH],p=y!=C||m!=z,t&&p&&!v?(u.cAF()(v),v=u.rAF()(L)):t||L(),W(),t&&(u.prvD(t),u.stpP(t)),!1},I={},N={};N[Un]=-(T.y+1)*E,N[_n]=T.x*-E,N[Vn]=T.y*-E,N[Qn]=-(T.x+1)*E,d(x).css(N),S.on(te,k),O.on(te,k),t.on(o,function(){k(!1)}),I[Kn]=r,I[$n]=r,A.css(I),W()}else{var P=Z[0],R=P.attachEvent,D=g!==e;if(R)t.prepend(ai(_e)),xi(t,ie+_e)[0].attachEvent("onresize",l);else{var F=P.createElement(a.o);F.setAttribute("tabindex","-1"),F.setAttribute(c.c,_e),F.onload=function(){var t=this.contentDocument.defaultView;t.addEventListener("resize",l),t.document.documentElement.style.display="none"},F.type="text/html",D&&t.prepend(F),F.data="about:blank",D||t.prepend(F),t.on(o,l)}}if(t[0]===ot[0]){var j=function(){var n=rt.css("direction"),e={},i=0,o=!1;return n!==kt&&("ltr"===n?(e[Qn]=0,e[_n]=Zn,i=r):(e[Qn]=Zn,e[_n]=0,i=w.n?-r:w.i?0:r),ot.children().eq(0).css(e),t[ue](i)[le](r),kt=n,o=!0),o};j(),t.on(te,function(t){return j()&&jr(),u.prvD(t),u.stpP(t),!1})}}function wr(t){if(H){var n=t.contents()[0];n[be].disconnect(),delete n[be]}else mi(t.children(ie+_e).eq(0))}function br(t){}function gr(t){}function Or(){if(W){var t,n,e,r,i,o,s=11,a=u.mO(),l=u.now();hn=new a(function(e){if(k&&!Q){var r,i=!1;d.each(e,function(){if(t=(r=this).target,n=r.attributeName,i=n===c.c?Ir(r.oldValue,t.className):n!==c.s||r.oldValue!==t[c.s].cssText)return!1}),i&&kn.update(Zn)}}),dn=new a(function(t){if(k&&!Q){var n=!1;d.each(t,function(){return!(n=Nr(this))}),n&&(r=u.now(),i=Ct||At,o=function(){I||(l=r,N&&Fr(),i?jr():kn.update(Zn))},clearTimeout(e),s<=0||r-l>s||!i?o():e=setTimeout(o,s))}})}}function Sr(){W&&!pn&&(hn.observe(rt[0],{attributes:!0,attributeOldValue:!0,attributeFilter:[c.i,c.c,c.s]}),dn.observe(N?et[0]:lt[0],{attributes:!0,attributeOldValue:!0,subtree:!N,childList:!N,characterData:!N,attributeFilter:N?["wrap","cols","rows"]:[c.i,c.c,c.s]}),pn=!0)}function Ar(){W&&pn&&(hn.disconnect(),dn.disconnect(),pn=!1)}function Cr(){if(!Q){var t=ot[0],n={w:t[c.sW],h:t[c.sH]};if(k){var e=fi(n,Gt);Gt=n,e&&jr(!0,!1)}else Gt=n}}function zr(){Sn&&Qr(!0)}function Er(){Sn&&!nt.hasClass(cr)&&Qr(!1)}function Tr(){On&&(Qr(!0),clearTimeout(xn),xn=setTimeout(function(){On&&!I&&Qr(!1)},100))}function Hr(t){var n=t?mr:yr,e=t?"off":"on",r=function(t,r,i){T?n(t,r,i):t[e](r,i)};On&&!t?r(rt,de,Tr):(t&&r(rt,de,Tr),r(rt,pe,zr),r(rt,ve,Er)),k||t||rt.one("mouseover",zr)}function Wr(t){return u.prvD(t),!1}function Lr(){jr()}function kr(){var t={};return P&&ut&&(t.w=ri(ut.css(Xn+Kn)),t.h=ri(ut.css(Xn+$n)),t.c=fi(t,un),t.f=!0),un=t,t.c||!1}function Ir(t,n){var r=n!==e&&null!==n?n.split(oe):Jn,i=t!==e&&null!==t?t.split(oe):Jn;if(r===Jn&&i===Jn)return!1;var o,s,a,c,u,l=ei(i,r),f=!1,h=sn!==e&&null!==sn?sn.split(oe):[Jn],p=on!==e&&null!==on?on.split(oe):[Jn],v=d.inArray(ur,l);for(v>-1&&l.splice(v,1),s=0;s0&&k&&o-$0?Y:ur)),Qt&&(!0===Vt?(Ar(),v.add(kn)):null===Vt&&b?(Ar(),v.add(kn)):(v.remove(kn),Sr())),kt)if(xt)if(st===e&&(st=d(ai(Me)),at.before(st)),F)it.show();else{it=d(ai(Ue)),st.before(it);var hn={w:-1,h:-1};xr(it,function(){var t={w:it[0][c.oW],h:it[0][c.oH]};fi(t,hn)&&(k&&Ct&&t.h>0||At&&t.w>0?jr():(k&&!Ct&&0===t.h||!At&&0===t.w)&&jr()),hn=t}),F=!0,null!==S&&it.css($n,S+"(100% + 1px)")}else F&&it.hide();r&&(ot.find("*").trigger(te),F&&it.find("*").trigger(te));var dn,vn=rt.css("direction"),mn=li(vn,Lt,r),xn=rt.css("box-sizing"),Cn=li(xn,Et,r),zn={c:r,t:ri(rt.css(Bn+Un)),r:ri(rt.css(Bn+_n)),b:ri(rt.css(Bn+Vn)),l:ri(rt.css(Bn+Qn))};try{dn=F?it[0].getBoundingClientRect():null}catch(Wi){return}D="border-box"===xn;var In=(V="rtl"===vn)?Qn:_n,Pn=V?_n:Qn,Rn=rt[0],jn=at[0],ie=!1,se=!(!F||"none"===rt.css(Gn))&&(0===l.round(dn.right-dn.left)&&(!!pt||Rn[c.cW]-j>0));if(xt&&!se){var ae=Rn[c.oW],ce=st.css(Kn);st.css(Kn,Zn);var he=Rn[c.oW];st.css(Kn,ce),(ie=ae!==he)||(st.css(Kn,ae+1),he=Rn[c.oW],st.css(Kn,ce),ie=ae!==he)}var de=(se||ie)&&xt&&!a,pe=li(de,At,r),ve=!de&&At,ye=!(!F||a)&&0===l.round(dn.bottom-dn.top),me=li(ye,Ct,r),xe=!ye&&Ct,we="-"+Kn,be=de&&D||!D,ge=ye&&D||!D,Oe={c:r,t:ge?ri(rt.css(Mn+Un+we),!0):0,r:be?ri(rt.css(Mn+_n+we),!0):0,b:ge?ri(rt.css(Mn+Vn+we),!0):0,l:be?ri(rt.css(Mn+Qn+we),!0):0},Se={c:r,t:ri(rt.css(qn+Un)),r:ri(rt.css(qn+_n)),b:ri(rt.css(qn+Vn)),l:ri(rt.css(qn+Qn))},Ae={h:String(rt.css(Yn+$n)),w:String(rt.css(Yn+Kn))},Ce={},ze={},Ee=function(){return{w:Rn[c.cW],h:Rn[c.cH]}},Ne=function(){var t=jn.getBoundingClientRect();return t[Kn]?{w:t[Kn],h:t[$n]}:{w:jn[c.oW],h:jn[c.oH]}};if(j=zn.l+zn.r,q=zn.t+zn.b,zn.ax=pt?j:0,zn.ay=pt?q:0,zn.c=hi(zn,Tt),B=Oe.l+Oe.r,M=Oe.t+Oe.b,Oe.c=hi(Oe,Ht),U=Se.l+Se.r,_=Se.t+Se.b,Se.c=hi(Se,Wt),Ae.ih=ri(Ae.h),Ae.iw=ri(Ae.w),Ae.ch=Ae.h.indexOf("px")>-1,Ae.cw=Ae.w.indexOf("px")>-1,Ae.c=fi(Ae,zt,r),Lt=vn,Et=xn,At=de,Ct=ye,Tt=zn,Ht=Oe,Wt=Se,zt=Ae,mn&&F&&it.css(Gn,Pn),zn.c||mn||vt||pe||me||Cn||kt){var Pe={},Re={};ti(ze,qn,[-zn.t,-zn.r,-zn.b,-zn.l]),pt?(ti(Pe,Jn,[zn.t,zn.r,zn.b,zn.l]),ti(N?Re:Ce,Bn)):(ti(Pe,Jn),ti(N?Re:Ce,Bn,[zn.t,zn.r,zn.b,zn.l])),at.css(Pe),et.css(Re)}Dn=Ne();var De=!!N&&Fr();if(ye&&(me||vt||Cn||Ae.c||zn.c||Oe.c)?(Ae.cw&&(Ce[Yn+$n]=Ae.ch?Ae.ih-zn.ay+(D?-M:q):Jn),Ce[$n]=Zn):(me||vt)&&(Ce[Yn+$n]=Jn,Ce[$n]=ne),de&&(pe||vt||Cn||Ae.c||zn.c||Oe.c||mn)?(Ae.cw&&(Ce[Yn+Kn]=Ae.cw?Ae.iw-zn.ax+(D?-B:j)+(m.y?x.y:0):Jn),Ce[Kn]=Zn,ze[Yn+Kn]=ne):(pe||vt)&&(Ce[Yn+Kn]=Jn,Ce[Kn]=ne,Ce[Gn]=Jn,ze[Yn+Kn]=Jn),de&&(Ae.cw||(Ce[Yn+Kn]=Jn),ze[Kn]=N&&Kt?De.dw:Zn,Ce[Kn]=Zn,Ce[Gn]=Pn),ye&&(Ae.ch||(Ce[Yn+$n]=Jn),ze[$n]=N?Gt?De.dh:Zn:lt[0][c.cH]),xt&&st.css(ze),lt.css(Ce),Ce={},ze={},t||n||mn||Cn||vt||pe||de||me||ye||Ae.c||_t||Yt||mt||tt||z||$t||ln||dt||r){var Fe="overflow",je=Fe+"-x",qe=Fe+"-y",_e="hidden",Ve="visible",Qe=L?m.x||m.y||Dn.w0&&(ze[Kn]=l.max(1,ze[Kn]),ze[$n]=l.max(1,ze[$n])),N&&ft.css(lr),st.css(ze)}de&&(Ce[Kn]=ne),!de||D||pn||(Ce[Gn]="none"),lt.css(Ce),Ce={};var fr=$e.getBoundingClientRect(),hr=fr[Kn]||0,vr=fr[$n]||0,yr={w:l.max($e[c.sW],Ge[c.sW])+ri(hr)-hr,h:l.max($e[c.sH],Ge[c.sH])+ri(vr)-vr};yr.c=n=fi(yr,bt,r),bt=yr,Qe&<.css(Fe,Jn),Dn=Ne(),t=fi(nr=Ee(),wt),wt=nr;var mr={x:"v-s"===Xt.x,y:"v-s"===Xt.y},wr={x:"v-h"===Xt.x,y:"v-h"===Xt.y},Or={x:"s"===Xt.x,y:"s"===Xt.y},Cr={x:l.max(0,l.round(100*(yr.w-Dn.w))/100),y:l.max(0,l.round(100*(yr.h-Dn.h))/100)},zr=N&&(0===Dn.w||0===Dn.h),Er=0===ct[0].scrollLeftMax&&Cr.x>0&&Cr.x<1||0===ct[0].scrollTopMax&&Cr.y>0&&Cr.y<1;(zr||Er)&&(Cr.x=Cr.y=0);var Tr={x:Cr.x>0,y:Cr.y>0},Wr={x:Tr.x,y:Tr.y};(mr.x||wr.x)&&(Wr.x=Tr.y&&!mr.y&&!wr.y),(mr.y||wr.y)&&(Wr.y=Tr.x&&!mr.x&&!wr.x),Wr.xs=!!Wr.x&&(Or.x||mr.x),Wr.ys=!!Wr.y&&(Or.y||mr.y);var Lr={x:Tr.x&&Wr.xs,y:Tr.y&&Wr.ys},Ir=Dt;if(Cr.c=fi(Cr,Dt,ee,re,r),Dt=Cr,Tr.c=fi(Tr,Ot,ee,re,r),Ot=Tr,Wr.c=fi(Wr,St,ee,re,r),St=Wr,m.x||m.y){var Nr="px solid transparent",Pr={},Rr={},Dr=r;(Tr.x||Tr.y)&&(Rr.w=m.y&&Tr.y?yr.w+x.y:Jn,Rr.h=m.x&&Tr.x?yr.h+x.x:Jn,Dr=li(Rr,gt,r),gt=Rr),(Tr.c||Wr.c||yr.c||mn||pe||me||de||ye||_t)&&(Ce[qn+Pn]=Ce[Mn+Pn]=Jn,m.x&&Tr.x&&Wr.xs?(Ce[qn+Vn]=ye?Ut?Jn:x.x:Jn,Ce[Mn+Vn]=ye||Ut?Jn:x.x+Nr):(Rr.h=Ce[qn+Vn]=Ce[Mn+Vn]=Jn,Dr=!0),m.y&&Tr.y&&Wr.ys?(Ce[qn+In]=de?Ut?Jn:x.y:Jn,Ce[Mn+In]=Ut?Jn:x.y+Nr):(Rr.w=Ce[qn+In]=Ce[Mn+In]=Jn,Dr=!0)),Ut&&(Rr.w=Rr.h=Jn,Dr=!0),Dr&&(Pr[Kn]=Wr.y?Rr.w:Jn,Pr[$n]=Wr.x?Rr.h:Jn,ut||(ut=d(ai(Be)),ct.prepend(ut)),ut.css(Pr)),lt.css(Ce)}var qr={};Pe={};if(t||Tr.c||Wr.c||yr.c||Yt||Cn||_t||mn||mt||me){qr[Pn]=Jn;var Br=function(){qr[Vn]=Jn,Nn.h=0},Mr=function(){qr[In]=Jn,Nn.w=0};if(Tr.x&&Wr.xs?(qr[je]=te,Ut?Br():(qr[Vn]=-(m.x?x.x:A.x),Nn.h=m.x?x.y:0)):(qr[je]=Jn,Br()),Tr.y&&Wr.ys?(qr[qe]=te,Ut?Mr():(qr[In]=-(m.y?x.y:A.y),Nn.w=m.y?x.x:0)):(qr[qe]=Jn,Mr()),(Dn.h=wi.m&&yn,Ei={x:nt||Oi!==Ci||gi!==Si?-1:Dt.x,y:(nt?zi||bi&&Ir!==e&&p.t===Ir.y:(zi||bi)&&gi===Ai)?Dt.y:-1},Ti=Ei.x>-1,Hi=Ei.y>-1;(Ti||Hi)&&(Hi&&ct[le](Ei.y),Ti&&(V&&rn&&w.i?ct[ue](0):ct[ue](Ei.x)))}Mt=wi}else N||(V&&w.i&&m.y&&Tr.x&&rn&&(p.l+=Nn.w||0),ct[ue](p.l),ct[le](p.t));mn&&Zr("onDirectionChanged",{isRTL:V,dir:vn}),t&&Zr("onHostSizeChanged",{width:wt.w,height:wt.h}),n&&Zr("onContentSizeChanged",{width:bt.w,height:bt.h}),(Tr.c||Wr.c)&&Zr("onOverflowChanged",{x:Tr.x,y:Tr.y,xScrollable:Wr.xs,yScrollable:Wr.ys,clipped:Wr.x||Wr.y}),Cr.c&&Zr("onOverflowAmountChanged",{x:Cr.x,y:Cr.y})}P&&(Ot.c||un.c)&&(un.f||kr(),m.y&&Ot.x&<.css(Xn+Kn,un.w+x.y),m.x&&Ot.y&<.css(Xn+$n,un.h+x.x),un.c=!1),gr(ot),gr(it),Zr("onUpdated",{forced:r})}}function qr(t){Y=pi(!0,{},Y,z.v(t,z.t,!0)),K=pi(!0,{},K,z.v(t,z.t,!1,!0))}function Br(t){var n=K.textarea.inheritedAttrs,e={},r=function(){var n=t?et:rt;d.each(e,function(t,e){di(e)==a.s&&(t==c.c?n.addClass(e):n.attr(t,e))})},i=[Se,Ae,He,Te,Ce,ze,Ee,We,Le,ke,Ie,ur,on].join(oe);if(di(n=di(n)==a.s?n.split(" "):n)==a.a&&d.each(n,function(n,r){di(r)==a.s&&(e[r]=t?rt.attr(r):et.attr(r))}),t)lt.contents().unwrap().unwrap().unwrap(),N?(et.removeAttr(c.s),r(),yi(et,i+oe+Ne+oe+Xe).unwrap(),mi(ft),mi(rt)):(yi(et,Se),yi(rt,i)),P&&yi(tt,Oe),mi(ot);else{if(N){var o={};K.sizeAutoCapable||(o[Kn]=et.css(Kn),o[$n]=et.css($n)),et.wrap(ai(Ae)),(rt=et.parent()).css(o).wrapInner(ai(qe+oe+Xe)).wrapInner(ai(De+oe+Xe)).wrapInner(ai(Re+oe+Xe)),lt=xi(rt,ie+qe),ct=xi(rt,ie+De),at=xi(rt,ie+Re),ft=d(ai(Pe)),lt.prepend(ft),vi(et,Ne+oe+Xe),r()}else(rt=et).wrapInner(ai(qe)).wrapInner(ai(De)).wrapInner(ai(Re)),lt=xi(rt,ie+qe),ct=xi(rt,ie+De),at=xi(rt,ie+Re),vi(et,Se);O&&vi(ct,m.x&&m.y?je:Fe),P&&vi(tt,Oe),ot=d(ai("os-resize-observer-host")),rt.prepend(ot)}}function Mr(t){var n,r,i,o,s=[112,113,114,115,116,117,118,119,120,121,123,33,34,37,38,39,40,16,17,18,19,20,144],a=[],c=175,l=t?"off":"on";!t&&N&&(i=function(t){Fr(),kn.update(Zn),t&&clearInterval(n)},(vn={})[te]=function(t){return et[ue](w.i&&rn?9999999:0),et[le](0),u.prvD(t),u.stpP(t),!1},vn.drop=function(){setTimeout(function(){I||i()},50)},vn.focus=function(){yn=!0},vn.focusout=function(){yn=!1,a=[],i(!0)},g>9||!b?vn.input=function(){i()}:(vn[ye]=function(t){var e=t.keyCode;d.inArray(e,s)>-1||(a.length||(i(),n=setInterval(i,1e3/60)),-1===d.inArray(e,a)&&a.push(e))},vn[me]=function(t){var n=t.keyCode,e=d.inArray(n,a);d.inArray(n,s)>-1||(e>-1&&a.splice(e,1),a.length||i(!0))})),N?d.each(vn,function(t,n){et[l](t,n)}):lt[l](we,function(t){!0!==jt&&Dr((t=t.originalEvent||t).propertyName)&&jr(Zn)}),t||(o=function(t){Q||(r!==e?clearTimeout(r):((gn||On)&&Qr(!0),oi()||vi(rt,We),Zr("onScrollStart",t)),Yr(!0),Yr(!1),Zr("onScroll",t),r=setTimeout(function(){I||(clearTimeout(r),r=e,(gn||On)&&Qr(!1),oi()||yi(rt,We),Zr("onScrollStop",t))},c))},T?yr(ct,te,o):ct.on(te,o))}function Ur(t){t?(mi(dt),mi(yt)):(dt=d(ai(Ye+oe+sr)),pt=d(ai(Ke)),vt=d(ai(Ge)),yt=d(ai(Ye+oe+ar)),mt=d(ai(Ke)),xt=d(ai(Ge)),dt.append(pt),pt.append(vt),yt.append(mt),mt.append(xt),at.after(yt),at.after(dt))}function _r(t){var n,r,i,o=$r(t),s=J.top!==J,a=o.xy,c=o.XY,f=te+o.LT,h="active",p=1,v=[16,17];function y(){p=.5}function m(){p=1}function x(t){d.inArray(t.keyCode,v)>-1&&y()}function b(t){d.inArray(t.keyCode,v)>-1&&m()}function O(t){var n=(t.originalEvent||t).touches!==e;return!(Q||I||oi()||!nn||n&&!An)&&(1===u.mBtn(t)||n)}function S(e){if(O(e)){var i=o.i.tl,l=o.i.hl,h=o.i.ms*(((g&&s?e["screen"+c]:u.page(e)[a])-r)/(i-l));h=isFinite(h)?h:0,V&&t&&!w.i&&(h*=-1),ct[f](n+h),T||u.prvD(e)}else A(e)}function A(t){if(t=t||t.originalEvent,yi(nt,cr),yi(o.h,h),yi(o.t,h),yi(o.s,h),Z.off(de,S).off(he,A).off(ye,x).off(me,b).off(xe,Wr),m(),n=e,r=e,i!==e&&(kn.scrollStop(),clearTimeout(i),i=e),t){var s=rt[0].getBoundingClientRect();t.clientX>=s.left&&t.clientX<=s.right&&t.clientY>=s.top&&t.clientY<=s.bottom||Er(),(gn||On)&&Qr(!1)}}function z(i){n=(n=ct[f]())===e?0:n,(V&&t&&!w.n||!V)&&(n=n<0?0:n),r=g&&s?i["screen"+c]:u.page(i)[a],vi(nt,cr),vi(o.h,h),vi(o.s,h),Z.on(de,S).on(he,A).on(xe,Wr),!g&&R||u.prvD(i),u.stpP(i)}o.h.on(fe,function(t){O(t)&&z(t)}),o.t.on(fe,function(n){if(O(n)){var s,c,d=Dn[o._wh],v=o.t.offset()[o.lt],m=n.ctrlKey,g=n.shiftKey,S=g&&m,C=!0,E="linear",T=function(){if(!I){var u=r-v,h=o.i.tl,y=o.i.ho,m=o.i.hl,x=o.i.ms,b=270*p,O=C?l.max(400,b):b,A=x*((u-m/2)/(h-m)),H=V&&t&&(!w.i&&!w.n||rn),W=H?yu,L={};g?(A=isFinite(A)?A:0,V&&t&&!w.i&&(A=x-A),S?(L.n=!1,L[a]=A,kn.scroll(L,130,E,function(){z(n)})):(ct[f](A),z(n))):(s=C?W:s,c=H?s?y+m>=u:y<=u:s?y<=u:y+m>=u,L[a]=s?"-="+d:"+="+d,kn.scrollStop(),kn.scroll(L,b,E),c?(clearTimeout(i),kn.scrollStop(),i=e):i=setTimeout(T,O),C=!1)}};m&&y(),r=u.page(n)[a],vi(nt,cr),vi(o.t,h),vi(o.s,h),Z.on(he,A).on(ye,x).on(me,b).on(xe,Wr),T(),u.prvD(n),u.stpP(n)}}).on(pe,function(){(gn||On)&&(Cn=!0,Qr(!0))}).on(ve,function(){(gn||On)&&(Cn=!1,Qr(!1))}),o.s.on(fe,function(t){u.stpP(t)}),C&&o.s.on(we,function(n){n.target===o.s[0]&&(Xr(t),Yr(t))})}function Vr(t,n,e){var r=t?Ce:ze,i=t?dt:yt;n?yi(rt,r):vi(rt,r),e?yi(i,Ze):vi(i,Ze)}function Qr(t,n){if(clearTimeout(mn),t)yi(dt,tr),yi(yt,tr);else{var e="active",r=function(){if(!Cn&&!I){var t=vt.hasClass(e)||xt.hasClass(e);!t&&(gn||On||Sn)&&vi(dt,tr),!t&&(gn||On||Sn)&&vi(yt,tr)}};wn>0&&!0!==n?mn=setTimeout(r,wn):r()}}function Xr(t){var n={},e=$r(t),r=1e6,i=l.min(1,(wt[e._wh]-(It?t?j:q:0))/bt[e._wh]);n[e.wh]=l.floor(100*i*r)/r+"%",oi()||e.h.css(n),e.i.hl=e.h[0]["offset"+e.WH],e.i.hlr=i}function Yr(t,n){n=n===e?t?ct[ue]():ct[le]():n;var r,i,o,s=V&&t,a={},c=$r(t),u="translate(",f="transform",h=ct[0][te+c.WH]-ct[0]["client"+c.WH],d=c.i.hl,p=c.t[0]["offset"+c.WH],v=p-d;w.n&&s&&(h*=-1),o=n/h,o=isNaN(o)?0:l.min(1,o),c.i.ms=h,c.i.cs=n,c.i.csr=o,v*=o,v=isNaN(v)?0:v,s&&!w.i&&(v=p-d-v),v=l.max(0,v),E?(i=s?-(p-d-v):v,r=t?u+i+"px, 0)":u+"0, "+i+"px)",a["-webkit-"+f]=r,a["-moz-"+f]=r,a["-ms-"+f]=r,a["-o-"+f]=r,a[f]=r):a[c.lt]=v,oi()||c.h.css(a),c.i.ho=v,c.i.tl=p}function Kr(t,n){var e=n?"removeClass":"addClass",r=t?mt:xt,i=t?$e:Je;(t?pt:vt)[e](i),r[e](i)}function $r(t){return{wh:t?Kn:$n,WH:t?"Width":"Height",lt:t?Qn:Un,LT:t?"Left":"Top",xy:t?ee:re,XY:t?"X":"Y",_wh:t?"w":"h",_lt:t?"l":"t",t:t?pt:mt,h:t?vt:xt,s:t?dt:yt,i:t?Pn:Rn}}function Gr(t){t?mi(ht):(ht=d(ai(nr)),rt.append(ht))}function Jr(){var t=J.top!==J,n={},r={};function i(t){if(s(t)){var e=a(t),i={};(Hn||Tn)&&(i[Kn]=r.w+e.x-n.x),(Wn||Tn)&&(i[$n]=r.h+e.y-n.y),rt.css(i),u.stpP(t)}else o(t)}function o(t){var n=t!==e;Z.off(xe,Wr).off(de,i).off(he,o),yi(nt,cr),ht.releaseCapture&&ht.releaseCapture(),n&&(zn&&Sr(),kn.update(Zn)),zn=!1}function s(t){var n=(t.originalEvent||t).touches!==e;return!Q&&!I&&(1===u.mBtn(t)||n)}function a(n){return g&&t?{x:n.screenX,y:n.screenY}:u.page(n)}Ln=function(t){s(t)&&(pn&&(zn=!0,Ar()),n=a(t),r.w=rt[0][c.oW]-(D?0:j),r.h=rt[0][c.oH]-(D?0:q),Z.on(xe,Wr).on(de,i).on(he,o),vi(nt,cr),ht.setCapture&&ht.setCapture(),u.prvD(t),u.stpP(t))}}function Zr(t,n){if(k){var e,r=K.callbacks[t],i=t;"on"===i.substr(0,2)&&(i=i.substr(2,1).toLowerCase()+i.substr(3)),di(r)==a.f&&r.call(kn,n),d.each(fr,function(){di((e=this).on)==a.f&&e.on(i,n)})}else I||lr.push({n:t,a:n})}function ti(t,n,r){r===e&&(r=[Jn,Jn,Jn,Jn]),t[n+Un]=r[0],t[n+_n]=r[1],t[n+Vn]=r[2],t[n+Qn]=r[3]}function ni(n){var e="ownerDocument",r="HTMLElement",i=n&&n[e]&&n[e].parentWindow||t;return typeof i[r]==a.o?n instanceof i[r]:n&&typeof n==a.o&&null!==n&&1===n.nodeType&&typeof n.nodeName==a.s}function ei(t,n){var e,r,i=[],o=[];for(e=0;ef&&(l=r+1,f=n);return{cR:h,cC:d,r:c,c:f,w:l,p:t,m:s}}}function oi(){return Ft&&m.x&&m.y}function si(){return N?ft[0]:lt[0]}function ai(t,n){return"
"+(n||Jn)+"
"}function ci(t,n){for(var e,r=n.split(ie),i=0;i0&&(d.isPlainObject(o)?d.each(n,function(t,n){(l=n)!==e&&h.push(W(l,o,c,r,i))}):d.each(n,function(n,r){l=p(r),"!"===o&&l instanceof t[s]||u.type(o)==a.f&&o(r,l)?h.push(l):o===e&&h.push(l)}),f=1===h.length?h[0]:h),f},t[s].globals=function(){E();var t=d.extend(!0,{},r);return delete t.msie,t},t[s].defaultOptions=function(t){E();var n=r.defaultOptions;if(t===e)return d.extend(!0,{},n);r.defaultOptions=d.extend(!0,{},n,z.v(t,z.t,!0))},t[s].extension=function(t,n,e){var r=u.type(t)==a.s,i=arguments[c.l],o=0;if(i<1||!r)return d.extend(!0,{length:C[c.l]},C);if(r)if(u.type(n)==a.f)C.push({name:t,extensionFactory:n,defaultOptions:e});else for(;o1))return d.extend(!0,{},C[o]);C.splice(o,1)}},t[s]}();return f&&f.fn&&(f.fn.overlayScrollbars=function(t,n){var e=this;return f.isPlainObject(t)?(f.each(e,function(){v(this,t,n)}),e):v(e,t)}),v}); \ No newline at end of file diff --git a/js/jquery.overlayScrollbars.js b/js/jquery.overlayScrollbars.js index c094a14..0c29a35 100644 --- a/js/jquery.overlayScrollbars.js +++ b/js/jquery.overlayScrollbars.js @@ -2,13 +2,13 @@ * OverlayScrollbars * https://github.com/KingSora/OverlayScrollbars * - * Version: 1.5.3 + * Version: 1.6.0 * * Copyright KingSora. * https://github.com/KingSora * * Released under the MIT license. - * Date: 07.11.2018 + * Date: 02.12.2018 */ (function (global, factory) { @@ -135,7 +135,7 @@ /** * Gets the pageX and pageY values of the given mouse event. * @param event The mouse event of which the pageX and pageX shall be got. - * @returns {x: number, y: number} x = pageX value, y = pageY value. + * @returns {{x: number, y: number}} x = pageX value, y = pageY value. */ page: function(event) { event = event.originalEvent || event; @@ -179,11 +179,12 @@ /** * Gets the clicked mouse button of the given mouse event. * @param event The mouse event of which the clicked button shal be got. - * @returns {number} The number of the clicked mouse button. (1 : leftButton | 2 : middleButton | 3 : rightButton) + * @returns {number} The number of the clicked mouse button. (0 : none | 1 : leftButton | 2 : middleButton | 3 : rightButton) */ mBtn: function(event) { - if (!event.which && event.button !== undefined) - return (event.button & 1 ? 1 : (event.button & 2 ? 3 : (event.button & 4 ? 2 : 0))); + var button = event.button; + if (!event.which && button !== undefined) + return (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); else return event.which; }, @@ -248,6 +249,7 @@ } }; + var MATH = Math; var JQUERY = framework; var EASING = framework.easing; var FRAMEWORK = framework; @@ -308,60 +310,62 @@ TYPES.f, //function TYPES.z //null ]; - var restrictedStringsSplit = " "; - var restrictedStringsPossibilitiesSplit = ":"; + var restrictedStringsSplit = ' '; + var restrictedStringsPossibilitiesSplit = ':'; var classNameAllowedValues = [TYPES.z, TYPES.s]; var numberAllowedValues = TYPES.n; var booleanNullAllowedValues = [TYPES.z, TYPES.b]; var booleanTrueTemplate = [true, TYPES.b]; var booleanFalseTemplate = [false, TYPES.b]; var callbackTemplate = [null, [TYPES.z, TYPES.f]]; + var inheritedAttrsTemplate = [['style', 'class'], [TYPES.s, TYPES.a, TYPES.z]]; var resizeAllowedValues = 'n:none b:both h:horizontal v:vertical'; var overflowBehaviorAllowedValues = 'v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden'; var scrollbarsVisibilityAllowedValues = 'v:visible h:hidden a:auto'; var scrollbarsAutoHideAllowedValues = 'n:never s:scroll l:leave m:move'; var optionsDefaultsAndTemplate = { - className: ['os-theme-dark', classNameAllowedValues], //null || string - resize: ['none', resizeAllowedValues], //none || both || horizontal || vertical || n || b || h || v - sizeAutoCapable: booleanTrueTemplate, //true || false - clipAlways: booleanTrueTemplate, //true || false - normalizeRTL: booleanTrueTemplate, //true || false - paddingAbsolute: booleanFalseTemplate, //true || false - autoUpdate: [null, booleanNullAllowedValues], //true || false || null - autoUpdateInterval: [33, numberAllowedValues], //number - nativeScrollbarsOverlaid: { - showNativeScrollbars: booleanFalseTemplate, //true || false - initialize: booleanTrueTemplate //true || false - }, - overflowBehavior: { - x: ['scroll', overflowBehaviorAllowedValues], //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s - y: ['scroll', overflowBehaviorAllowedValues] //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s + className: ['os-theme-dark', classNameAllowedValues], //null || string + resize: ['none', resizeAllowedValues], //none || both || horizontal || vertical || n || b || h || v + sizeAutoCapable: booleanTrueTemplate, //true || false + clipAlways: booleanTrueTemplate, //true || false + normalizeRTL: booleanTrueTemplate, //true || false + paddingAbsolute: booleanFalseTemplate, //true || false + autoUpdate: [null, booleanNullAllowedValues], //true || false || null + autoUpdateInterval: [33, numberAllowedValues], //number + nativeScrollbarsOverlaid: { + showNativeScrollbars: booleanFalseTemplate, //true || false + initialize: booleanTrueTemplate //true || false + }, + overflowBehavior: { + x: ['scroll', overflowBehaviorAllowedValues], //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s + y: ['scroll', overflowBehaviorAllowedValues] //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s }, scrollbars: { - visibility: ['auto', scrollbarsVisibilityAllowedValues], //visible || hidden || auto || v || h || a - autoHide: ['never', scrollbarsAutoHideAllowedValues], //never || scroll || leave || move || n || s || l || m - autoHideDelay: [800, numberAllowedValues], //number - dragScrolling: booleanTrueTemplate, //true || false - clickScrolling: booleanFalseTemplate, //true || false - touchSupport: booleanTrueTemplate //true || false + visibility: ['auto', scrollbarsVisibilityAllowedValues], //visible || hidden || auto || v || h || a + autoHide: ['never', scrollbarsAutoHideAllowedValues], //never || scroll || leave || move || n || s || l || m + autoHideDelay: [800, numberAllowedValues], //number + dragScrolling: booleanTrueTemplate, //true || false + clickScrolling: booleanFalseTemplate, //true || false + touchSupport: booleanTrueTemplate //true || false }, textarea: { - dynWidth: booleanFalseTemplate, //true || false - dynHeight: booleanFalseTemplate //true || false + dynWidth: booleanFalseTemplate, //true || false + dynHeight: booleanFalseTemplate, //true || false + inheritedAttrs : inheritedAttrsTemplate, //string || array || null }, callbacks: { - onInitialized: callbackTemplate, //null || function - onInitializationWithdrawn: callbackTemplate, //null || function - onDestroyed: callbackTemplate, //null || function - onScrollStart: callbackTemplate, //null || function - onScroll: callbackTemplate, //null || function - onScrollStop: callbackTemplate, //null || function - onOverflowChanged: callbackTemplate, //null || function - onOverflowAmountChanged: callbackTemplate, //null || function - onDirectionChanged: callbackTemplate, //null || function - onContentSizeChanged: callbackTemplate, //null || function - onHostSizeChanged: callbackTemplate, //null || function - onUpdated: callbackTemplate //null || function + onInitialized: callbackTemplate, //null || function + onInitializationWithdrawn: callbackTemplate, //null || function + onDestroyed: callbackTemplate, //null || function + onScrollStart: callbackTemplate, //null || function + onScroll: callbackTemplate, //null || function + onScrollStop: callbackTemplate, //null || function + onOverflowChanged: callbackTemplate, //null || function + onOverflowAmountChanged: callbackTemplate, //null || function + onDirectionChanged: callbackTemplate, //null || function + onContentSizeChanged: callbackTemplate, //null || function + onHostSizeChanged: callbackTemplate, //null || function + onUpdated: callbackTemplate //null || function } }; var convert = function(template) { @@ -489,7 +493,7 @@ if(keepForeignProps) FRAMEWORK.extend(true, validatedOptions, objectCopy); else if(!FRAMEWORK.isEmptyObject(objectCopy) && writeErrors) - console.warn("The following options are discarded due to invalidity:\r\n" + JSON.stringify(objectCopy, null, 2)); + console.warn("The following options are discarded due to invalidity:\r\n" + window.JSON.stringify(objectCopy, null, 2)); return validatedOptions; } @@ -553,19 +557,19 @@ var edge = ua[strIndexOf]('Edge/'); var rv = ua[strIndexOf]('rv:'); var result; - var parseInt = window.parseInt; + var parseIntFunc = parseInt; // IE 10 or older => return version number if (msie > 0) - result = parseInt(ua[strSubString](msie + 5, ua[strIndexOf]('.', msie)), 10); + result = parseIntFunc(ua[strSubString](msie + 5, ua[strIndexOf]('.', msie)), 10); // IE 11 => return version number else if (trident > 0) - result = parseInt(ua[strSubString](rv + 3, ua[strIndexOf]('.', rv)), 10); + result = parseIntFunc(ua[strSubString](rv + 3, ua[strIndexOf]('.', rv)), 10); // Edge (IE 12+) => return version number else if (edge > 0) - result = parseInt(ua[strSubString](edge + 5, ua[strIndexOf]('.', edge)), 10); + result = parseIntFunc(ua[strSubString](edge + 5, ua[strIndexOf]('.', edge)), 10); // other browser return result; @@ -641,7 +645,7 @@ if(nativeScrollbarIsOverlaid.x && nativeScrollbarIsOverlaid.y) return; - var abs = Math.abs; + var abs = MATH.abs; var windowWidth = COMPATIBILITY.wW(); var windowHeight = COMPATIBILITY.wH(); var windowDpr = getWindowDPR(); @@ -655,8 +659,8 @@ if (deltaW === 0 && deltaH === 0) return; - var deltaWRatio = Math.round(newW / (windowWidth / 100.0)); - var deltaHRatio = Math.round(newH / (windowHeight / 100.0)); + var deltaWRatio = MATH.round(newW / (windowWidth / 100.0)); + var deltaHRatio = MATH.round(newH / (windowHeight / 100.0)); var absDeltaW = abs(deltaW); var absDeltaH = abs(deltaH); var absDeltaWRatio = abs(deltaWRatio); @@ -772,13 +776,13 @@ if (instance !== undefined) { var instanceOptions = instance.options(); var instanceAutoUpdateAllowed = instanceOptions[_strAutoUpdate]; - var instanceAutoUpdateInterval = Math.max(1, instanceOptions[_strAutoUpdateInterval]); + var instanceAutoUpdateInterval = MATH.max(1, instanceOptions[_strAutoUpdateInterval]); var now = COMPATIBILITY.now(); if ((instanceAutoUpdateAllowed === true || instanceAutoUpdateAllowed === null) && (now - _loopingInstancesIntervalCache[i]) > instanceAutoUpdateInterval) { instance.update('auto'); _loopingInstancesIntervalCache[i] = new Date(now += instanceAutoUpdateInterval); } - lowestInterval = Math.max(1, Math.min(lowestInterval, instanceAutoUpdateInterval)); + lowestInterval = MATH.max(1, MATH.min(lowestInterval, instanceAutoUpdateInterval)); } } _loopInterval = lowestInterval; @@ -867,6 +871,7 @@ var _supportTransform; var _supportPassiveEvents; var _supportResizeObserver; + var _supportMutationObserver; var _restrictedMeasuring; //general readonly: @@ -893,10 +898,6 @@ var _viewportSize = { }; var _nativeScrollbarMinSize = { }; - //scroll - var _scrollStopDelay = 175; - var _scrollStopTimeoutId; - //naming: var _strMinusHidden = '-hidden'; var _strMarginMinus = 'margin-'; @@ -980,6 +981,9 @@ var _classNameDragging = _cassNamesPrefix + 'dragging'; var _classNameThemeNone = _cassNamesPrefix + 'theme-none'; + //callbacks: + var _callbacksInitQeueue = [ ]; + //options: var _defaultOptions; var _currentOptions; @@ -1002,14 +1006,14 @@ var _htmlElement; var _bodyElement; var _targetElement; //the target element of this OverlayScrollbars object - var _hostElement; //the host element of this OverlayScrollbars object -> may be the same as targetElement - var _sizeAutoObserverElement; //observes size auto changes + var _hostElement; //the host element of this OverlayScrollbars object -> may be the same as targetElement + var _sizeAutoObserverElement; //observes size auto changes var _sizeObserverElement; //observes size and padding changes - var _contentGlueElement; //has always the size of the content element - var _paddingElement; //manages the padding - var _viewportElement; //is the viewport of our scrollbar model + var _contentGlueElement; //has always the size of the content element + var _paddingElement; //manages the padding + var _viewportElement; //is the viewport of our scrollbar model var _contentArrangeElement; //is needed for correct sizing of the content element (only if native scrollbars are overlays) - var _contentElement; //the element which holds the content + var _contentElement; //the element which holds the content var _textareaCoverElement; //only applied if target is a textarea element. Used for correct size calculation and for prevention of uncontrolled scrolling var _scrollbarCornerElement; var _scrollbarHorizontalElement; @@ -1068,21 +1072,12 @@ var _displayIsHiddenCache; //MutationObserver: - var _mutationObserverContentLag = 11; var _mutationObserverHost; var _mutationObserverContent; - var _mutationObserverConnected; - var _supportMutationObserver; + var _mutationObserversConnected; //textarea: - var _textareaKeyDownRestrictedKeyCodes = [ - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 123, //F1 to F12 - 33, 34, //page up, page down - 37, 38, 39, 40, //left, up, right, down arrows - 16, 17, 18, 19, 20, 144 //Shift, Ctrl, Alt, Pause, CapsLock, NumLock - ]; - var _textareaKeyDownKeyCodesList = [ ]; - var _textareaUpdateIntervalID; + var _textareaEvents; var _textareaHasFocus; //scrollbars: @@ -1102,11 +1097,10 @@ var _resizeBoth; var _resizeHorizontal; var _resizeVertical; - var _resizeDragStartPosition = { }; - var _resizeDragStartSize = { }; + var _resizeOnMouseTouchDown; - //==== Add / Remove Passive Event Listener ====// + //==== Passive Event Listener ====// /** * Adds a passive event listener to the given element. @@ -1133,7 +1127,7 @@ } - //==== Add / Remove / Freeze / Unfreeze Resize Observer ====// + //==== Resize Observer ====// /** * Adds a resize observer to the given element. @@ -1371,13 +1365,101 @@ } - //==== Connect / Disconnect Mutation Observer ====// + //==== Mutation Observers ====// + /** + * Creates MutationObservers for the host and content Element if they are supported. + */ + function createMutationObservers() { + if (_supportMutationObserver) { + var mutationObserverContentLag = 11; + var mutationObserver = COMPATIBILITY.mO(); + var contentLastUpdate = COMPATIBILITY.now(); + var mutationTarget; + var mutationAttrName; + var contentTimeout; + var now; + var sizeAuto; + var action; + + _mutationObserverHost = new mutationObserver(function (mutations) { + if (!_initialized || _isSleeping) + return; + + var doUpdate = false; + //var doUpdateScrollbars = false; + var mutation; + FRAMEWORK.each(mutations, function () { + mutation = this; + mutationTarget = mutation.target; + mutationAttrName = mutation.attributeName; + + if (mutationAttrName === LEXICON.c) + doUpdate = hostClassNamesChanged(mutation.oldValue, mutationTarget.className); + else if (mutationAttrName === LEXICON.s) + doUpdate = mutation.oldValue !== mutationTarget[LEXICON.s].cssText; + else + doUpdate = true; + + if (doUpdate) + return false; + }); + + if (doUpdate) + _base.update(_strAuto); + /* + if(doUpdateScrollbars) { + refreshScrollbarHandleLength(true); + refreshScrollbarHandleOffset(true, _scrollHorizontalInfo.cs); + refreshScrollbarHandleLength(false); + refreshScrollbarHandleOffset(false, _scrollVerticalInfo.cs); + } + */ + }); + _mutationObserverContent = new mutationObserver(function (mutations) { + if (!_initialized || _isSleeping) + return; + + var doUpdate = false; + var mutation; + FRAMEWORK.each(mutations, function () { + mutation = this; + doUpdate = isUnknownMutation(mutation); + return !doUpdate; + }); + + if (doUpdate) { + now = COMPATIBILITY.now(); + sizeAuto = (_heightAutoCache || _widthAutoCache); + action = function () { + if(!_destroyed) { + contentLastUpdate = now; + + //if cols, rows or wrap attr was changed + if (_isTextarea) + textareaUpdate(); + + if (sizeAuto) + update(); + else + _base.update(_strAuto); + } + }; + clearTimeout(contentTimeout); + if (mutationObserverContentLag <= 0 || now - contentLastUpdate > mutationObserverContentLag || !sizeAuto) + action(); + else + contentTimeout = setTimeout(action, mutationObserverContentLag); + } + }); + } + } + /** * Connects the MutationObservers if they are supported. */ - function mutationObserversConnect() { - if (_supportMutationObserver && !_mutationObserverConnected) { + function connectMutationObservers() { + if (_supportMutationObserver && !_mutationObserversConnected) { _mutationObserverHost.observe(_hostElement[0], { attributes: true, attributeOldValue: true, @@ -1393,19 +1475,19 @@ attributeFilter: _isTextarea ? ['wrap', 'cols', 'rows'] : [LEXICON.i, LEXICON.c, LEXICON.s] }); - _mutationObserverConnected = true; + _mutationObserversConnected = true; } } /** * Disconnects the MutationObservers if they are supported. */ - function mutationObserversDisconnect() { - if (_supportMutationObserver && _mutationObserverConnected) { + function disconnectMutationObservers() { + if (_supportMutationObserver && _mutationObserversConnected) { _mutationObserverHost.disconnect(); _mutationObserverContent.disconnect(); - _mutationObserverConnected = false; + _mutationObserversConnected = false; } } @@ -1435,7 +1517,7 @@ _hostElementSizeChangeDetectedCache = hostSize; } } - + /** * The mouse enter event of the host element. This event is only needed for the autoHide feature. */ @@ -1466,212 +1548,34 @@ } } - /** - * The scroll event of the viewport element. That is the main scroll event. It controls also the "scroll", "scrollStart" and "scrollStop" callbacks. - * @param event The scroll event. + /** + * Adds or removes mouse & touch events of the host element. (for handling auto-hiding of the scrollbars) + * @param destroy Indicates whether the events shall be added or removed. */ - function viewportOnScroll(event) { - if (_isSleeping) - return; - - if (_scrollStopTimeoutId !== undefined) - clearTimeout(_scrollStopTimeoutId); + function setupHostMouseTouchEvents(destroy) { + var passiveEvent = destroy ? removePassiveEventListener : addPassiveEventListener; + var strOnOff = destroy ? 'off' : 'on'; + var setupEvent = function(target, name, listener) { + if(_supportPassiveEvents) + passiveEvent(target, name, listener); + else + target[strOnOff](name, listener); + }; + + if(_scrollbarsAutoHideMove && !destroy) + setupEvent(_hostElement, _strMouseTouchMoveEvent, hostOnMouseMove); else { - if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) - refreshScrollbarsAutoHide(true); - - if (!nativeOverlayScrollbarsAreActive()) - addClass(_hostElement, _classNameHostScrolling); - - callCallback("onScrollStart", event); + if(destroy) + setupEvent(_hostElement, _strMouseTouchMoveEvent, hostOnMouseMove); + setupEvent(_hostElement, _strMouseTouchEnter, hostOnMouseEnter); + setupEvent(_hostElement, _strMouseTouchLeave, hostOnMouseLeave); } - - refreshScrollbarHandleOffset(true, _viewportElement[_strScrollLeft]()); - refreshScrollbarHandleOffset(false, _viewportElement[_strScrollTop]()); - callCallback("onScroll", event); - - _scrollStopTimeoutId = setTimeout(function () { - if(!_destroyed) { - viewportOnScrollStop(); - callCallback("onScrollStop", event); - } - }, _scrollStopDelay); + + //if the plugin is initialized and the mouse is over the host element, make the scrollbars visible + if(!_initialized && !destroy) + _hostElement.one("mouseover", hostOnMouseEnter); } - - /** - * This method gets called if the scroll event stopped for a specified amount of time. - */ - function viewportOnScrollStop() { - clearTimeout(_scrollStopTimeoutId); - _scrollStopTimeoutId = undefined; - if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) - refreshScrollbarsAutoHide(false); - - if (!nativeOverlayScrollbarsAreActive()) - removeClass(_hostElement, _classNameHostScrolling); - } - - /** - * The key input event of the textarea element. - */ - function textareaOnInput() { - textareaUpdate(); - _base.update(_strAuto); - } - - /** - * The key down event of the textarea element. Is only applied if the input event isn't fully supported. - * @param event The key down event. - */ - function textareaOnKeyDown(event) { - var keyCode = event.keyCode; - if (textareaIsRestrictedKeyCode(keyCode)) - return; - if (_textareaKeyDownKeyCodesList.length === 0) { - var action = function () { - textareaUpdate(); - _base.update(_strAuto); - }; - action(); - _textareaUpdateIntervalID = setInterval(action, 1000 / 60); - } - if (FRAMEWORK.inArray(keyCode, _textareaKeyDownKeyCodesList) === -1) - _textareaKeyDownKeyCodesList.push(keyCode); - } - - /** - * The key up event of the textarea element. Is only applied if the input event isn't fully supported. - * @param event The key up event. - */ - function textareaOnKeyUp(event) { - var keyCode = event.keyCode; - if (textareaIsRestrictedKeyCode(keyCode)) - return; - var index = FRAMEWORK.inArray(keyCode, _textareaKeyDownKeyCodesList); - if (index > -1) - _textareaKeyDownKeyCodesList.splice(index, 1); - if (_textareaKeyDownKeyCodesList.length === 0) { - textareaUpdate(); - _base.update(_strAuto); - clearInterval(_textareaUpdateIntervalID); - } - } - - /** - * The drop event of the textarea element. - */ - function textareaOnDrop() { - setTimeout(function () { - if(!_destroyed) { - textareaUpdate(); - _base.update(_strAuto); - } - }, 50); - } - - /** - * The focus event of the textarea element. - */ - function textareaOnFocus() { - _textareaHasFocus = true; - } - - /** - * The focus out event of the textarea element. - */ - function textareaOnFocusOut() { - _textareaHasFocus = false; - clearInterval(_textareaUpdateIntervalID); - _textareaKeyDownKeyCodesList = [ ]; - textareaUpdate(); - _base.update(_strAuto); - } - - /** - * The scroll event of the textarea element. - * @param event The scroll event. - */ - function textareaOnScroll(event) { - _targetElement[_strScrollLeft](_rtlScrollBehavior.i && _normalizeRTLCache ? 9999999 : 0); - _targetElement[_strScrollTop](0); - COMPATIBILITY.prvD(event); - COMPATIBILITY.stpP(event); - return false; - } - - /** - * The mouse down event of the scrollbar corner element. - * @param event The mouse down event. - */ - function scrollbarCornerOnMouseDown(event) { - if (_isSleeping) - return; - - var originalEvent = event.originalEvent || event; - var isTouchEvent = originalEvent.touches !== undefined; - - if (COMPATIBILITY.mBtn(event) === 1 || isTouchEvent) { - if (_mutationObserverConnected) { - _resizeReconnectMutationObserver = true; - mutationObserversDisconnect(); - } - - _resizeDragStartPosition = COMPATIBILITY.page(event); - - _resizeDragStartSize.w = _hostElement[0][LEXICON.oW] - (!_isBorderBox ? _paddingX : 0); - _resizeDragStartSize.h = _hostElement[0][LEXICON.oH] - (!_isBorderBox ? _paddingY : 0); - - _documentElement.on(_strSelectStartEvent, documentOnSelectStart) - .on(_strMouseTouchMoveEvent, scrollbarCornerOnResize) - .on(_strMouseTouchUpEvent, scrollbarCornerOnResized); - - addClass(_bodyElement, _classNameDragging); - if (_scrollbarCornerElement.setCapture) - _scrollbarCornerElement.setCapture(); - - COMPATIBILITY.prvD(event); - COMPATIBILITY.stpP(event); - } - } - - /** - * The mouse move event if the scrollbar corner element is resizable and gets dragged. - * @param event The mouse move event. - */ - function scrollbarCornerOnResize(event) { - var pageOffset = COMPATIBILITY.page(event); - var hostElementCSS = { }; - if (_resizeHorizontal || _resizeBoth) - hostElementCSS[_strWidth] = (_resizeDragStartSize.w + pageOffset.x - _resizeDragStartPosition.x); - if (_resizeVertical || _resizeBoth) - hostElementCSS[_strHeight] = (_resizeDragStartSize.h + pageOffset.y - _resizeDragStartPosition.y); - _hostElement.css(hostElementCSS); - COMPATIBILITY.stpP(event); - } - - /** - * The mouse up event if the scrollbar corner element is resizable and was dragged and now the mouse button is released. - * @param event The mouse up event. - */ - function scrollbarCornerOnResized(event) { - var eventIsTrusted = event !== undefined; - - _documentElement.off(_strSelectStartEvent, documentOnSelectStart) - .off(_strMouseTouchMoveEvent, scrollbarCornerOnResize) - .off(_strMouseTouchUpEvent, scrollbarCornerOnResized); - - removeClass(_bodyElement, _classNameDragging); - if (_scrollbarCornerElement.releaseCapture) - _scrollbarCornerElement.releaseCapture(); - - if (eventIsTrusted) { - if (_resizeReconnectMutationObserver) - mutationObserversConnect(); - _base.update(_strAuto); - } - _resizeReconnectMutationObserver = false; - } - + /** * Prevents text from deselection if attached to the document element on the mousedown event of a DOM element. * @param event The select start event. @@ -1725,7 +1629,7 @@ //remove none theme from diff list to prevent update var idx = FRAMEWORK.inArray(_classNameThemeNone, diff); - var curr = diff[i]; + var curr; var i; var v; var o; @@ -1775,6 +1679,10 @@ if (mutationTarget === _contentElement[0]) return attributeName === null; if (mutationType === 'attributes' && (attributeName === LEXICON.c || attributeName === LEXICON.s) && !_isTextarea) { + //ignore className changes by the plugin + if (attributeName === LEXICON.c && FRAMEWORK(mutationTarget).hasClass(_classNameHostElement)) + return hostClassNamesChanged(mutation.oldValue, mutationTarget.getAttribute(LEXICON.c)); + //only do it of browser support it natively if (typeof mutationTarget[strClosest] != TYPES.f) return true; @@ -1796,7 +1704,7 @@ var float; var textareaValueLength = _isTextarea && _widthAutoCache && !_textareaAutoWrappingCache ? _targetElement.val().length : 0; - var setCSS = !_mutationObserverConnected && _widthAutoCache && !_isTextarea; + var setCSS = !_mutationObserversConnected && _widthAutoCache && !_isTextarea; var viewportScrollSize = { }; var css = { }; @@ -1838,7 +1746,7 @@ * @returns {boolean} */ function meaningfulAttrsChanged() { - if (_isSleeping || _mutationObserverConnected) + if (_isSleeping || _mutationObserversConnected) return false; var hostElementId = _hostElement.attr(LEXICON.i) || _strEmpty; @@ -1976,7 +1884,7 @@ //measure width origWidth = measureElement[LEXICON.oW]; - width = doMeasure ? Math.max(origWidth, measureElement[LEXICON.sW] - 1) : 1; + width = doMeasure ? MATH.max(origWidth, measureElement[LEXICON.sW] - 1) : 1; width += (_widthAutoCache ? _marginX + (!_isBorderBox ? wrapAttrOff ? 0 : _paddingX + _borderX : 0) : 0); //set measured width and height auto @@ -1986,7 +1894,7 @@ //measure height origHeight = measureElement[LEXICON.oH]; - height = Math.max(origHeight, measureElement[LEXICON.sH] - 1); + height = MATH.max(origHeight, measureElement[LEXICON.sH] - 1); //append correct size values css[_strWidth] = width; @@ -2192,22 +2100,22 @@ //set correct auto Update if (autoUpdateChanged) { if (autoUpdate === true) { - mutationObserversDisconnect(); + disconnectMutationObservers(); autoUpdateLoop.add(_base); } else if (autoUpdate === null) { if (_autoUpdateRecommended) { - mutationObserversDisconnect(); + disconnectMutationObservers(); autoUpdateLoop.add(_base); } else { autoUpdateLoop.remove(_base); - mutationObserversConnect(); + connectMutationObservers(); } } else { autoUpdateLoop.remove(_base); - mutationObserversConnect(); + connectMutationObservers(); } } @@ -2295,7 +2203,7 @@ //detect width auto: var widthAutoResizeDetection = false; - var widthAutoObserverDetection = (_sizeAutoObserverAdded && (_hostElement.css(_strFloat) !== 'none' /*|| _isTextarea */)) ? (Math.round(sizeAutoObserverElementBCRect.right - sizeAutoObserverElementBCRect.left) === 0) && (!paddingAbsolute ? (hostElement[LEXICON.cW] - _paddingX) > 0 : true) : false; + var widthAutoObserverDetection = (_sizeAutoObserverAdded && (_hostElement.css(_strFloat) !== 'none' /*|| _isTextarea */)) ? (MATH.round(sizeAutoObserverElementBCRect.right - sizeAutoObserverElementBCRect.left) === 0) && (!paddingAbsolute ? (hostElement[LEXICON.cW] - _paddingX) > 0 : true) : false; if (sizeAutoCapable && !widthAutoObserverDetection) { var tmpCurrHostWidth = hostElement[LEXICON.oW]; var tmpCurrContentGlueWidth = _contentGlueElement.css(_strWidth); @@ -2316,7 +2224,7 @@ var wasWidthAuto = !widthAuto && _widthAutoCache; //detect height auto: - var heightAuto = _sizeAutoObserverAdded && !displayIsHidden ? (Math.round(sizeAutoObserverElementBCRect.bottom - sizeAutoObserverElementBCRect.top) === 0) /* && (!paddingAbsolute && (_msieVersion > 9 || !_msieVersion) ? true : true) */ : false; + var heightAuto = _sizeAutoObserverAdded && !displayIsHidden ? (MATH.round(sizeAutoObserverElementBCRect.bottom - sizeAutoObserverElementBCRect.top) === 0) /* && (!paddingAbsolute && (_msieVersion > 9 || !_msieVersion) ? true : true) */ : false; var heightAutoChanged = checkCacheSingle(heightAuto, _heightAutoCache, force); var wasHeightAuto = !heightAuto && _heightAutoCache; @@ -2360,7 +2268,7 @@ }; }; var getViewportSize = function() { - var brect = paddingElement.getBoundingClientRect() + var brect = paddingElement.getBoundingClientRect(); return brect[_strWidth] ? { w: brect[_strWidth], @@ -2520,8 +2428,8 @@ h: contentMeasureElement[LEXICON.cH] }; var scrollSize = { - w: Math.max(contentMeasureElement[LEXICON.sW], contentMeasureElementGuaranty[LEXICON.sW]), - h: Math.max(contentMeasureElement[LEXICON.sH], contentMeasureElementGuaranty[LEXICON.sH]) + w: MATH.max(contentMeasureElement[LEXICON.sW], contentMeasureElementGuaranty[LEXICON.sW]), + h: MATH.max(contentMeasureElement[LEXICON.sH], contentMeasureElementGuaranty[LEXICON.sH]) }; var contentClientSize = { w: _isTextarea && textareaSize && !textareaDynWidth ? textareaSize.ow : widthAuto ? clientSize.w : scrollSize.w, @@ -2539,8 +2447,8 @@ //has to be clientSize because offsetSize respect borders. var hostSize = getHostSize(); var contentGlueSize = { - w: Math.max(contentClientSize.w + padding.ax, hostSize.w - _paddingX) - (textareaDynWidth ? (_isTextarea && widthAuto ? _marginX + (!_isBorderBox ? _paddingX + _borderX : 0) : 0) : 0), - h: Math.max(contentClientSize.h + padding.ay, hostSize.h - _paddingY) + w: MATH.max(contentClientSize.w + padding.ax, hostSize.w - _paddingX) - (textareaDynWidth ? (_isTextarea && widthAuto ? _marginX + (!_isBorderBox ? _paddingX + _borderX : 0) : 0) : 0), + h: MATH.max(contentClientSize.h + padding.ay, hostSize.h - _paddingY) }; contentGlueSize.c = checkCacheDouble(contentGlueSize, _contentGlueSizeCache, force); _contentGlueSizeCache = contentGlueSize; @@ -2583,8 +2491,8 @@ //make sure content glue size at least 1 if (contentClientSize.h > 0) { - contentGlueElementCSS[_strWidth] = Math.max(1, contentGlueElementCSS[_strWidth]); - contentGlueElementCSS[_strHeight] = Math.max(1, contentGlueElementCSS[_strHeight]); + contentGlueElementCSS[_strWidth] = MATH.max(1, contentGlueElementCSS[_strWidth]); + contentGlueElementCSS[_strHeight] = MATH.max(1, contentGlueElementCSS[_strHeight]); } if (_isTextarea) @@ -2593,7 +2501,7 @@ } if (widthAuto) contentElementCSS[_strWidth] = _strHundredPercent; - if (widthAuto && !_isBorderBox && !_mutationObserverConnected) + if (widthAuto && !_isBorderBox && !_mutationObserversConnected) contentElementCSS[_strFloat] = 'none'; @@ -2606,8 +2514,8 @@ var contentBCRectW = contentBCRect[_strWidth] || 0; var contentBCRectH = contentBCRect[_strHeight] || 0; var contentScrollSize = { - w: Math.max(contentMeasureElement[LEXICON.sW], contentMeasureElementGuaranty[LEXICON.sW]) + parseToZeroOrNumber(contentBCRectW) - contentBCRectW, - h: Math.max(contentMeasureElement[LEXICON.sH], contentMeasureElementGuaranty[LEXICON.sH]) + parseToZeroOrNumber(contentBCRectH) - contentBCRectH + w: MATH.max(contentMeasureElement[LEXICON.sW], contentMeasureElementGuaranty[LEXICON.sW]) + parseToZeroOrNumber(contentBCRectW) - contentBCRectW, + h: MATH.max(contentMeasureElement[LEXICON.sH], contentMeasureElementGuaranty[LEXICON.sH]) + parseToZeroOrNumber(contentBCRectH) - contentBCRectH }; contentScrollSize.c = contentSizeChanged = checkCacheDouble(contentScrollSize, _contentScrollSizeCache, force); _contentScrollSizeCache = contentScrollSize; @@ -2636,8 +2544,8 @@ y: overflowBehavior.y === 's' }; var overflowAmount = { - x: Math.max(0, Math.round((contentScrollSize.w - _viewportSize.w) * 100) / 100), - y: Math.max(0, Math.round((contentScrollSize.h - _viewportSize.h) * 100) / 100) + x: MATH.max(0, MATH.round((contentScrollSize.w - _viewportSize.w) * 100) / 100), + y: MATH.max(0, MATH.round((contentScrollSize.h - _viewportSize.h) * 100) / 100) }; var hideOverflowForceTextarea = _isTextarea && (_viewportSize.w === 0 || _viewportSize.h === 0); var hideOverflowForceRounding = (_viewportElement[0].scrollLeftMax === 0 && overflowAmount.x > 0 && overflowAmount.x < 1) || (_viewportElement[0].scrollTopMax === 0 && overflowAmount.y > 0 && overflowAmount.y < 1); @@ -2830,9 +2738,9 @@ if (cssDirectionChanged || widthAutoChanged || heightAutoChanged) { if (_isRTL && widthAuto) { var floatTmp = _contentElement.css(_strFloat); - var posLeftWithoutFloat = Math.round(_contentElement.css(_strFloat, _strEmpty).css(_strLeft, _strEmpty).position().left); + var posLeftWithoutFloat = MATH.round(_contentElement.css(_strFloat, _strEmpty).css(_strLeft, _strEmpty).position().left); _contentElement.css(_strFloat, floatTmp); - var posLeftWithFloat = Math.round(_contentElement.position().left); + var posLeftWithFloat = MATH.round(_contentElement.position().left); if (posLeftWithoutFloat !== posLeftWithFloat) contentElementCSS[_strLeft] = posLeftWithoutFloat; @@ -2879,8 +2787,8 @@ if (_isBody) addClass(_hostElement, _classNameHostResizeDisabled); if (resizeChanged) { - var addCornerEvents = function () { _scrollbarCornerElement.on(_strMouseTouchDownEvent, scrollbarCornerOnMouseDown); }; - var removeCornerEvents = function () { _scrollbarCornerElement.off(_strMouseTouchDownEvent, scrollbarCornerOnMouseDown); }; + var addCornerEvents = function () { _scrollbarCornerElement.on(_strMouseTouchDownEvent, _resizeOnMouseTouchDown); }; + var removeCornerEvents = function () { _scrollbarCornerElement.off(_strMouseTouchDownEvent, _resizeOnMouseTouchDown); }; if (_resizeNone) { addClass(_hostElement, _classNameHostResizeDisabled); removeClass(_scrollbarCornerElement, [ @@ -2939,46 +2847,12 @@ //manage the scrollbars auto hide feature (auto hide them after specific actions) if (scrollbarsAutoHideChanged || ignoreOverlayScrollbarHidingChanged) { - var addMouseTouchEvents = function (move) { - if (_supportPassiveEvents) { - if(move) - addPassiveEventListener(_hostElement, _strMouseTouchMoveEvent, hostOnMouseMove); - else { - addPassiveEventListener(_hostElement, _strMouseTouchEnter, hostOnMouseEnter); - addPassiveEventListener(_hostElement, _strMouseTouchLeave, hostOnMouseLeave); - } - } - else { - if(move) - _hostElement.on(_strMouseTouchMoveEvent, hostOnMouseMove); - else { - _hostElement.on(_strMouseTouchEnter, hostOnMouseEnter) - .on(_strMouseTouchLeave, hostOnMouseLeave); - } - } - - //if the plugin is initialized and the mouse is over the host element, make the scrollbars visible - if(!_initialized) - _hostElement.one("mouseover", hostOnMouseEnter); - }; - var removeMouseTouchEvents = function () { - if (_supportPassiveEvents) { - removePassiveEventListener(_hostElement, _strMouseTouchMoveEvent, hostOnMouseMove); - removePassiveEventListener(_hostElement, _strMouseTouchEnter, hostOnMouseEnter); - removePassiveEventListener(_hostElement, _strMouseTouchLeave, hostOnMouseLeave); - } - else { - _hostElement.off(_strMouseTouchMoveEvent, hostOnMouseMove) - .off(_strMouseTouchEnter, hostOnMouseEnter) - .off(_strMouseTouchLeave, hostOnMouseLeave); - } - }; if (_scrollbarsAutoHideLeave || _scrollbarsAutoHideMove) { - removeMouseTouchEvents(); - addMouseTouchEvents(_scrollbarsAutoHideMove); + setupHostMouseTouchEvents(true); + setupHostMouseTouchEvents(); } else { - removeMouseTouchEvents(); + setupHostMouseTouchEvents(true); } if (_scrollbarsAutoHideNever) @@ -3013,7 +2887,7 @@ var lastCol = textareaInfo.c; var cursorPos = textareaInfo.p; var cursorMax = textareaInfo.m; - var cursorIsLastPosition = (cursorMax === cursorPos && _textareaHasFocus); + var cursorIsLastPosition = (cursorPos >= cursorMax && _textareaHasFocus); var doScroll = { x: (!textareaAutoWrapping && (cursorCol === lastCol && cursorRow === widestRow)) ? _overflowAmountCache.x : -1, y: (textareaAutoWrapping ? cursorIsLastPosition || textareaRowsChanged && (previousOverflow !== undefined ? (currScroll.t === previousOverflow.y) : false) : (cursorIsLastPosition || textareaRowsChanged) && cursorRow === lastRow) ? _overflowAmountCache.y : -1 @@ -3042,25 +2916,25 @@ } if (cssDirectionChanged) { - callCallback("onDirectionChanged", { + dispatchCallback("onDirectionChanged", { isRTL: _isRTL, dir: cssDirection }); } if (hostSizeChanged) { - callCallback("onHostSizeChanged", { + dispatchCallback("onHostSizeChanged", { width: _hostSizeCache.w, height: _hostSizeCache.h }); } if (contentSizeChanged) { - callCallback("onContentSizeChanged", { + dispatchCallback("onContentSizeChanged", { width: _contentScrollSizeCache.w, height: _contentScrollSizeCache.h }); } if (hasOverflow.c || hideOverflow.c) { - callCallback("onOverflowChanged", { + dispatchCallback("onOverflowChanged", { x: hasOverflow.x, y: hasOverflow.y, xScrollable: hideOverflow.xs, @@ -3069,7 +2943,7 @@ }); } if (overflowAmount.c) { - callCallback("onOverflowAmountChanged", { + dispatchCallback("onOverflowAmountChanged", { x: overflowAmount.x, y: overflowAmount.y }); @@ -3091,7 +2965,7 @@ unfreezeResizeObserver(_sizeObserverElement); unfreezeResizeObserver(_sizeAutoObserverElement); - callCallback("onUpdated", { forced: force }); + dispatchCallback("onUpdated", { forced: force }); } @@ -3106,54 +2980,295 @@ _currentPreparedOptions = extend(true, {}, _currentPreparedOptions, _pluginsOptions.v(newOptions, _pluginsOptions.t, false, true)); } + + //==== Structure ====// + + /** + * Builds or destroys the wrapper and helper DOM elements. + * @param destroy Indicates whether the DOM shall be build or destroyed. + */ + function setupStructureDOM(destroy) { + var adoptAttrs = _currentPreparedOptions.textarea.inheritedAttrs; + var adoptAttrsMap = { }; + var applyAdoptedAttrs = function() { + var applyAdoptedAttrsElm = destroy ? _targetElement : _hostElement; + FRAMEWORK.each(adoptAttrsMap, function(k, v) { + if(type(v) == TYPES.s) { + if(k == LEXICON.c) + applyAdoptedAttrsElm.addClass(v); + else + applyAdoptedAttrsElm.attr(k, v); + } + }); + }; + var hostElementClassNames = [ + _classNameHostElement, + _classNameHostTextareaElement, + _classNameHostResizeDisabled, + _classNameHostRTL, + _classNameHostScrollbarHorizontalHidden, + _classNameHostScrollbarVerticalHidden, + _classNameHostTransition, + _classNameHostScrolling, + _classNameHostOverflow, + _classNameHostOverflowX, + _classNameHostOverflowY, + _classNameThemeNone, + _classNameCache].join(_strSpace); + adoptAttrs = type(adoptAttrs) == TYPES.s ? adoptAttrs.split(' ') : adoptAttrs; + if(type(adoptAttrs) == TYPES.a) { + FRAMEWORK.each(adoptAttrs, function(i, v) { + if(type(v) == TYPES.s) + adoptAttrsMap[v] = destroy ? _hostElement.attr(v) : _targetElement.attr(v); + }); + } + + if(!destroy) { + if (_isTextarea) { + var hostElementCSS = {}; + if (!_currentPreparedOptions.sizeAutoCapable) { + hostElementCSS[_strWidth] = _targetElement.css(_strWidth); + hostElementCSS[_strHeight] = _targetElement.css(_strHeight); + } + _targetElement.wrap(generateDiv(_classNameHostTextareaElement)); + _hostElement = _targetElement.parent(); + _hostElement.css(hostElementCSS) + .wrapInner(generateDiv(_classNameContentElement + _strSpace + _classNameTextInherit)) + .wrapInner(generateDiv(_classNameViewportElement + _strSpace + _classNameTextInherit)) + .wrapInner(generateDiv(_classNamePaddingElement + _strSpace + _classNameTextInherit)); + _contentElement = findFirst(_hostElement, _strDot + _classNameContentElement); + _viewportElement = findFirst(_hostElement, _strDot + _classNameViewportElement); + _paddingElement = findFirst(_hostElement, _strDot + _classNamePaddingElement); + _textareaCoverElement = FRAMEWORK(generateDiv(_classNameTextareaCoverElement)); + _contentElement.prepend(_textareaCoverElement); + addClass(_targetElement, _classNameTextareaElement + _strSpace + _classNameTextInherit); + + applyAdoptedAttrs(); + } + else { + _hostElement = _targetElement; + _hostElement.wrapInner(generateDiv(_classNameContentElement)) + .wrapInner(generateDiv(_classNameViewportElement)) + .wrapInner(generateDiv(_classNamePaddingElement)); + _contentElement = findFirst(_hostElement, _strDot + _classNameContentElement); + _viewportElement = findFirst(_hostElement, _strDot + _classNameViewportElement); + _paddingElement = findFirst(_hostElement, _strDot + _classNamePaddingElement); + + addClass(_targetElement, _classNameHostElement); + } + + if (_nativeScrollbarStyling) + addClass(_viewportElement, _nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y ? _classNameViewportNativeScrollbarsOverlaid : _classNameViewportNativeScrollbarsInvisible); + if (_isBody) + addClass(_htmlElement, _classNameHTMLElement); + + _sizeObserverElement = FRAMEWORK(generateDiv('os-resize-observer-host')); + _hostElement.prepend(_sizeObserverElement); + } + else { + _contentElement.contents() + .unwrap() + .unwrap() + .unwrap(); + + if (_isTextarea) { + _targetElement.removeAttr(LEXICON.s); + + applyAdoptedAttrs(); + + removeClass(_targetElement, hostElementClassNames + _strSpace + _classNameTextareaElement + _strSpace + _classNameTextInherit) + .unwrap(); + remove(_textareaCoverElement); + remove(_hostElement); + } + else { + removeClass(_targetElement, _classNameHostElement); + removeClass(_hostElement, hostElementClassNames); + } + + if (_isBody) + removeClass(_htmlElement, _classNameHTMLElement); + + remove(_sizeObserverElement); + } + } + + /** + * Adds or removes all wrapper elements interactivity events. + * @param destroy Indicates whether the Events shall be added or removed. + */ + function setupStructureEvents(destroy) { + var textareaKeyDownRestrictedKeyCodes = [ + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 123, //F1 to F12 + 33, 34, //page up, page down + 37, 38, 39, 40, //left, up, right, down arrows + 16, 17, 18, 19, 20, 144 //Shift, Ctrl, Alt, Pause, CapsLock, NumLock + ]; + var textareaKeyDownKeyCodesList = [ ]; + var textareaUpdateIntervalID; + var scrollStopDelay = 175; + var scrollStopTimeoutId; + var strOnOff = destroy ? 'off' : 'on'; + var updateTextarea; + var viewportOnScroll; + + if(!destroy && _isTextarea) { + _textareaEvents = { }; + updateTextarea = function(doClearInterval) { + textareaUpdate(); + _base.update(_strAuto); + if(doClearInterval) + clearInterval(textareaUpdateIntervalID); + }; + _textareaEvents[_strScroll] = function(event) { + _targetElement[_strScrollLeft](_rtlScrollBehavior.i && _normalizeRTLCache ? 9999999 : 0); + _targetElement[_strScrollTop](0); + COMPATIBILITY.prvD(event); + COMPATIBILITY.stpP(event); + return false; + }; + _textareaEvents['drop'] = function() { + setTimeout(function () { + if(!_destroyed) + updateTextarea(); + }, 50); + }; + _textareaEvents['focus'] = function() { + _textareaHasFocus = true; + }; + _textareaEvents['focusout'] = function() { + _textareaHasFocus = false; + textareaKeyDownKeyCodesList = [ ]; + updateTextarea(true); + }; + if (_msieVersion > 9 || !_autoUpdateRecommended) { + _textareaEvents['input'] = function textareaOnInput() { + updateTextarea(); + } + } + else { + _textareaEvents[_strKeyDownEvent] = function textareaOnKeyDown(event) { + var keyCode = event.keyCode; + if (FRAMEWORK.inArray(keyCode, textareaKeyDownRestrictedKeyCodes) > -1) + return; + if (!textareaKeyDownKeyCodesList.length) { + updateTextarea(); + textareaUpdateIntervalID = setInterval(updateTextarea, 1000 / 60); + } + if (FRAMEWORK.inArray(keyCode, textareaKeyDownKeyCodesList) === -1) + textareaKeyDownKeyCodesList.push(keyCode); + }; + _textareaEvents[_strKeyUpEvent] = function(event) { + var keyCode = event.keyCode; + var index = FRAMEWORK.inArray(keyCode, textareaKeyDownKeyCodesList); + + if (FRAMEWORK.inArray(keyCode, textareaKeyDownRestrictedKeyCodes) > -1) + return; + if (index > -1) + textareaKeyDownKeyCodesList.splice(index, 1); + if (!textareaKeyDownKeyCodesList.length) + updateTextarea(true); + }; + } + } + + if (_isTextarea) { + FRAMEWORK.each(_textareaEvents, function(key, value) { + _targetElement[strOnOff](key, value); + }); + } + else { + _contentElement[strOnOff](_strTransitionEndEvent, function (event) { + if (_autoUpdateCache === true) + return; + event = event.originalEvent || event; + if (isSizeAffectingCSSProperty(event.propertyName)) + update(_strAuto); + }); + } + + if(!destroy) { + viewportOnScroll = function(event) { + if (_isSleeping) + return; + + if (scrollStopTimeoutId !== undefined) + clearTimeout(scrollStopTimeoutId); + else { + if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) + refreshScrollbarsAutoHide(true); + + if (!nativeOverlayScrollbarsAreActive()) + addClass(_hostElement, _classNameHostScrolling); + + dispatchCallback("onScrollStart", event); + } + + refreshScrollbarHandleOffset(true); + refreshScrollbarHandleOffset(false); + dispatchCallback("onScroll", event); + + scrollStopTimeoutId = setTimeout(function () { + if(!_destroyed) { + //OnScrollStop: + clearTimeout(scrollStopTimeoutId); + scrollStopTimeoutId = undefined; + + if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) + refreshScrollbarsAutoHide(false); + + if (!nativeOverlayScrollbarsAreActive()) + removeClass(_hostElement, _classNameHostScrolling); + + dispatchCallback("onScrollStop", event); + } + }, scrollStopDelay); + }; + + if (_supportPassiveEvents) + addPassiveEventListener(_viewportElement, _strScroll, viewportOnScroll); + else + _viewportElement.on(_strScroll, viewportOnScroll); + } + } + + + //==== Scrollbars ====// /** - * Builds all scrollbars if they aren't already build. + * Builds or destroys all scrollbar DOM elements (scrollbar, track, handle) + * @param destroy Indicates whether the DOM shall be build or destroyed. */ - function buildScrollbars() { - _scrollbarHorizontalElement = FRAMEWORK(generateDiv(_classNameScrollbar + _strSpace + _classNameScrollbarHorizontal)); - _scrollbarHorizontalTrackElement = FRAMEWORK(generateDiv(_classNameScrollbarTrack)); - _scrollbarHorizontalHandleElement = FRAMEWORK(generateDiv(_classNameScrollbarHandle)); - _scrollbarVerticalElement = FRAMEWORK(generateDiv(_classNameScrollbar + _strSpace + _classNameScrollbarVertical)); - _scrollbarVerticalTrackElement = FRAMEWORK(generateDiv(_classNameScrollbarTrack)); - _scrollbarVerticalHandleElement = FRAMEWORK(generateDiv(_classNameScrollbarHandle)); + function setupScrollbarsDOM(destroy) { + if(!destroy) { + _scrollbarHorizontalElement = FRAMEWORK(generateDiv(_classNameScrollbar + _strSpace + _classNameScrollbarHorizontal)); + _scrollbarHorizontalTrackElement = FRAMEWORK(generateDiv(_classNameScrollbarTrack)); + _scrollbarHorizontalHandleElement = FRAMEWORK(generateDiv(_classNameScrollbarHandle)); + _scrollbarVerticalElement = FRAMEWORK(generateDiv(_classNameScrollbar + _strSpace + _classNameScrollbarVertical)); + _scrollbarVerticalTrackElement = FRAMEWORK(generateDiv(_classNameScrollbarTrack)); + _scrollbarVerticalHandleElement = FRAMEWORK(generateDiv(_classNameScrollbarHandle)); - _scrollbarHorizontalElement.append(_scrollbarHorizontalTrackElement); - _scrollbarHorizontalTrackElement.append(_scrollbarHorizontalHandleElement); - _scrollbarVerticalElement.append(_scrollbarVerticalTrackElement); - _scrollbarVerticalTrackElement.append(_scrollbarVerticalHandleElement); + _scrollbarHorizontalElement.append(_scrollbarHorizontalTrackElement); + _scrollbarHorizontalTrackElement.append(_scrollbarHorizontalHandleElement); + _scrollbarVerticalElement.append(_scrollbarVerticalTrackElement); + _scrollbarVerticalTrackElement.append(_scrollbarVerticalHandleElement); - _paddingElement.after(_scrollbarVerticalElement); - _paddingElement.after(_scrollbarHorizontalElement); - - //scrollbar events - if (_supportTransition) { - _scrollbarHorizontalElement.on(_strTransitionEndEvent, function (event) { - if (event.target !== _scrollbarHorizontalElement[0]) - return; - refreshScrollbarHandleLength(true); - refreshScrollbarHandleOffset(true, _viewportElement[_strScrollLeft]()); - }); - _scrollbarVerticalElement.on(_strTransitionEndEvent, function (event) { - if (event.target !== _scrollbarVerticalElement[0]) - return; - refreshScrollbarHandleLength(false); - refreshScrollbarHandleOffset(false, _viewportElement[_strScrollTop]()); - }); + _paddingElement.after(_scrollbarVerticalElement); + _paddingElement.after(_scrollbarHorizontalElement); + } + else { + remove(_scrollbarHorizontalElement); + remove(_scrollbarVerticalElement); } - initScrollbarInteractivity(true); - initScrollbarInteractivity(false); - _scrollbarCornerElement = FRAMEWORK(generateDiv(_classNameScrollbarCorner)); - _hostElement.append(_scrollbarCornerElement); } /** - * Initializes all scrollbar interactivity. (track and handle dragging, clicking, scrolling) + * Initializes all scrollbar interactivity events. (track and handle dragging, clicking, scrolling) * @param isHorizontal True if the target scrollbar is the horizontal scrollbar, false if the target scrollbar is the vertical scrollbar. */ - function initScrollbarInteractivity(isHorizontal) { + function setupScrollbarEvents(isHorizontal) { var scrollbarVars = getScrollbarVars(isHorizontal); var insideIFrame = _windowElement.top !== _windowElement; var mouseDownScroll; @@ -3167,43 +3282,42 @@ var increaseDecreaseScrollAmountKeyCodes = [ 16, 17 ]; //shift, ctrl function increaseTrackScrollAmount() { scrollDurationFactor = 0.5; - }; + } function decreaseTrackScrollAmount() { scrollDurationFactor = 1; - }; + } function documentKeyDown(event) { if (FRAMEWORK.inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1) increaseTrackScrollAmount(); - }; + } function documentKeyUp(event) { if (FRAMEWORK.inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1) decreaseTrackScrollAmount(); - }; + } function onMouseTouchDownContinue(event) { var originalEvent = event.originalEvent || event; var isTouchEvent = originalEvent.touches !== undefined; - return _isSleeping || nativeOverlayScrollbarsAreActive() || !_scrollbarsDragScrollingCache || (isTouchEvent && !_scrollbarsTouchSupport) ? false : COMPATIBILITY.mBtn(event) === 1 || isTouchEvent; - }; - function handleDragMove(event) { - if(!onMouseTouchDownContinue(event)) { - documentMouseTouchUp(event); - return; - } - - var trackLength = scrollbarVars.i.tl; - var handleLength = scrollbarVars.i.hl; - var scrollRange = scrollbarVars.i.ms; - var scrollRaw = (_msieVersion && insideIFrame ? event['screen' + XY] : COMPATIBILITY.page(event)[xy]) - mouseDownOffset; //use screen coordinates in EDGE & IE because the page values are incorrect in frames. - var scrollDeltaPercent = scrollRaw / (trackLength - handleLength); - var scrollDelta = (scrollRange * scrollDeltaPercent); - scrollDelta = isFinite(scrollDelta) ? scrollDelta : 0; - if (_isRTL && isHorizontal && !_rtlScrollBehavior.i) - scrollDelta *= -1; - _viewportElement[scroll](mouseDownScroll + scrollDelta); + return _isSleeping || _destroyed || nativeOverlayScrollbarsAreActive() || !_scrollbarsDragScrollingCache || (isTouchEvent && !_scrollbarsTouchSupport) ? false : COMPATIBILITY.mBtn(event) === 1 || isTouchEvent; + } + function documentDragMove(event) { + if(onMouseTouchDownContinue(event)) { + var trackLength = scrollbarVars.i.tl; + var handleLength = scrollbarVars.i.hl; + var scrollRange = scrollbarVars.i.ms; + var scrollRaw = (_msieVersion && insideIFrame ? event['screen' + XY] : COMPATIBILITY.page(event)[xy]) - mouseDownOffset; //use screen coordinates in EDGE & IE because the page values are incorrect in frames. + var scrollDeltaPercent = scrollRaw / (trackLength - handleLength); + var scrollDelta = (scrollRange * scrollDeltaPercent); + scrollDelta = isFinite(scrollDelta) ? scrollDelta : 0; + if (_isRTL && isHorizontal && !_rtlScrollBehavior.i) + scrollDelta *= -1; + _viewportElement[scroll](mouseDownScroll + scrollDelta); - if (!_supportPassiveEvents) - COMPATIBILITY.prvD(event); - }; + if (!_supportPassiveEvents) + COMPATIBILITY.prvD(event); + } + else + documentMouseTouchUp(event); + } function documentMouseTouchUp(event) { event = event || event.originalEvent; @@ -3212,7 +3326,7 @@ removeClass(scrollbarVars.t, strActive); removeClass(scrollbarVars.s, strActive); - _documentElement.off(_strMouseTouchMoveEvent, handleDragMove) + _documentElement.off(_strMouseTouchMoveEvent, documentDragMove) .off(_strMouseTouchUpEvent, documentMouseTouchUp) .off(_strKeyDownEvent, documentKeyDown) .off(_strKeyUpEvent, documentKeyUp) @@ -3227,16 +3341,18 @@ trackTimeout = undefined; } - var rect = _hostElement[0].getBoundingClientRect(); - var mouseInsideHost = event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom; + if(event) { + var rect = _hostElement[0].getBoundingClientRect(); + var mouseInsideHost = event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom; - //if mouse is outside host element - if (!mouseInsideHost) - hostOnMouseLeave(); - - if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) - refreshScrollbarsAutoHide(false); - }; + //if mouse is outside host element + if (!mouseInsideHost) + hostOnMouseLeave(); + + if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove) + refreshScrollbarsAutoHide(false); + } + } function onHandleMouseTouchDown(event) { mouseDownScroll = _viewportElement[scroll](); mouseDownScroll = mouseDownScroll === undefined ? 0 : mouseDownScroll; @@ -3248,14 +3364,14 @@ addClass(scrollbarVars.h, strActive); addClass(scrollbarVars.s, strActive); - _documentElement.on(_strMouseTouchMoveEvent, handleDragMove) + _documentElement.on(_strMouseTouchMoveEvent, documentDragMove) .on(_strMouseTouchUpEvent, documentMouseTouchUp) .on(_strSelectStartEvent, documentOnSelectStart); if(_msieVersion || !_documentMixed) COMPATIBILITY.prvD(event); COMPATIBILITY.stpP(event); - }; + } scrollbarVars.h.on(_strMouseTouchDownEvent, function(event) { if (onMouseTouchDownContinue(event)) onHandleMouseTouchDown(event); @@ -3279,7 +3395,7 @@ var handleLength = scrollbarVars.i.hl; var scrollRange = scrollbarVars.i.ms; var scrollDuration = 270 * scrollDurationFactor; - var timeoutDelay = isFirstIteration ? Math.max(400, scrollDuration) : scrollDuration; + var timeoutDelay = isFirstIteration ? MATH.max(400, scrollDuration) : scrollDuration; var instantScrollPosition = scrollRange * ((mouseOffset - (handleLength / 2)) / (trackLength - handleLength)); // 100% * positionPercent var rtlIsNormal = _isRTL && isHorizontal && ((!_rtlScrollBehavior.i && !_rtlScrollBehavior.n) || _normalizeRTLCache); var decreaseScrollCondition = rtlIsNormal ? handleOffset < mouseOffset : handleOffset > mouseOffset; @@ -3349,6 +3465,14 @@ scrollbarVars.s.on(_strMouseTouchDownEvent, function(event) { COMPATIBILITY.stpP(event); }); + if (_supportTransition) { + scrollbarVars.s.on(_strTransitionEndEvent, function(event) { + if (event.target !== scrollbarVars.s[0]) + return; + refreshScrollbarHandleLength(isHorizontal); + refreshScrollbarHandleOffset(isHorizontal); + }); + } } /** @@ -3412,8 +3536,8 @@ var scrollbarVars = getScrollbarVars(isHorizontal); var digit = 1000000; //get and apply intended handle length - var handleRatio = Math.min(1, (_hostSizeCache[scrollbarVars._wh] - (_paddingAbsoluteCache ? (isHorizontal ? _paddingX : _paddingY) : 0)) / _contentScrollSizeCache[scrollbarVars._wh]); - handleCSS[scrollbarVars.wh] = (Math.floor(handleRatio * 100 * digit) / digit) + "%"; //the last * digit / digit is for flooring to the 4th digit + var handleRatio = MATH.min(1, (_hostSizeCache[scrollbarVars._wh] - (_paddingAbsoluteCache ? (isHorizontal ? _paddingX : _paddingY) : 0)) / _contentScrollSizeCache[scrollbarVars._wh]); + handleCSS[scrollbarVars.wh] = (MATH.floor(handleRatio * 100 * digit) / digit) + "%"; //the last * digit / digit is for flooring to the 4th digit if (!nativeOverlayScrollbarsAreActive()) scrollbarVars.h.css(handleCSS); @@ -3426,9 +3550,10 @@ /** * Refreshes the handle offset of the given scrollbar. * @param isHorizontal True if the horizontal scrollbar handle shall be refreshed, false if the vertical one shall be refreshed. - * @param currentScroll The current scroll offset of the given scrollbar axis. (if isHorizontal ? scrollLeft : scrollTop) + * @param currentScroll The current scroll offset of the given scrollbar axis or undefined if the current scroll-offset shall be taken. (if isHorizontal ? scrollLeft : scrollTop) */ function refreshScrollbarHandleOffset(isHorizontal, currentScroll) { + currentScroll = currentScroll === undefined ? isHorizontal ? _viewportElement[_strScrollLeft]() : _viewportElement[_strScrollTop]() : currentScroll; var isRTLisHorizontal = _isRTL && isHorizontal; var handleCSS = {}; var scrollbarVars = getScrollbarVars(isHorizontal); @@ -3439,7 +3564,7 @@ //measure the handle length to respect min & max length //DONT use the variable '_contentScrollSizeCache[scrollbarVars._wh]' instead of '_viewportElement[0]['scroll' + scrollbarVars.WH]' // because its a bit behind during the small delay when content size updates - //(delay = _mutationObserverContentLag, if its 0 then this var could be used) + //(delay = mutationObserverContentLag, if its 0 then this var could be used) var maxScroll = _viewportElement[0][_strScroll + scrollbarVars.WH] - _viewportElement[0]['client' + scrollbarVars.WH]; var handleLength = scrollbarVars.i.hl; var trackLength = scrollbarVars.t[0]['offset' + scrollbarVars.WH]; @@ -3453,7 +3578,7 @@ maxScroll *= -1; posRatio = currentScroll / maxScroll; - posRatio = isNaN(posRatio) ? 0 : Math.min(1, posRatio); + posRatio = isNaN(posRatio) ? 0 : MATH.min(1, posRatio); scrollbarVars.i.ms = maxScroll; //ms = max scroll scrollbarVars.i.cs = currentScroll; //cs = current scroll @@ -3463,7 +3588,7 @@ offset = isNaN(offset) ? 0 : offset; if (isRTLisHorizontal && !_rtlScrollBehavior.i) offset = trackLength - handleLength - offset; - offset = Math.max(0, offset); + offset = MATH.max(0, offset); if (_supportTransform) { transformOffset = isRTLisHorizontal ? -(trackLength - handleLength - offset) : offset; //in px @@ -3523,7 +3648,99 @@ }; } + + //==== Scrollbar Corner ====// + + /** + * Builds or destroys the scrollbar corner DOM element. + * @param destroy Indicates whether the DOM shall be build or destroyed. + */ + function setupScrollbarCornerDOM(destroy) { + if(!destroy) { + _scrollbarCornerElement = FRAMEWORK(generateDiv(_classNameScrollbarCorner)); + _hostElement.append(_scrollbarCornerElement); + } + else { + remove(_scrollbarCornerElement); + } + } + + /** + * Initializes all scrollbar corner interactivity events. + */ + function setupScrollbarCornerEvents() { + var insideIFrame = _windowElement.top !== _windowElement; + var resizeDragStartPosition = { }; + var resizeDragStartSize = { }; + + _resizeOnMouseTouchDown = function(event) { + if (onMouseTouchDownContinue(event)) { + if (_mutationObserversConnected) { + _resizeReconnectMutationObserver = true; + disconnectMutationObservers(); + } + resizeDragStartPosition = getCoordinates(event); + + resizeDragStartSize.w = _hostElement[0][LEXICON.oW] - (!_isBorderBox ? _paddingX : 0); + resizeDragStartSize.h = _hostElement[0][LEXICON.oH] - (!_isBorderBox ? _paddingY : 0); + + _documentElement.on(_strSelectStartEvent, documentOnSelectStart) + .on(_strMouseTouchMoveEvent, documentDragMove) + .on(_strMouseTouchUpEvent, documentMouseTouchUp); + + addClass(_bodyElement, _classNameDragging); + if (_scrollbarCornerElement.setCapture) + _scrollbarCornerElement.setCapture(); + + COMPATIBILITY.prvD(event); + COMPATIBILITY.stpP(event); + } + }; + function documentDragMove(event) { + if (onMouseTouchDownContinue(event)) { + var pageOffset = getCoordinates(event); + var hostElementCSS = { }; + if (_resizeHorizontal || _resizeBoth) + hostElementCSS[_strWidth] = (resizeDragStartSize.w + pageOffset.x - resizeDragStartPosition.x); + if (_resizeVertical || _resizeBoth) + hostElementCSS[_strHeight] = (resizeDragStartSize.h + pageOffset.y - resizeDragStartPosition.y); + _hostElement.css(hostElementCSS); + COMPATIBILITY.stpP(event); + } + else { + documentMouseTouchUp(event); + } + } + function documentMouseTouchUp(event) { + var eventIsTrusted = event !== undefined; + + _documentElement.off(_strSelectStartEvent, documentOnSelectStart) + .off(_strMouseTouchMoveEvent, documentDragMove) + .off(_strMouseTouchUpEvent, documentMouseTouchUp); + + removeClass(_bodyElement, _classNameDragging); + if (_scrollbarCornerElement.releaseCapture) + _scrollbarCornerElement.releaseCapture(); + + if (eventIsTrusted) { + if (_resizeReconnectMutationObserver) + connectMutationObservers(); + _base.update(_strAuto); + } + _resizeReconnectMutationObserver = false; + } + function onMouseTouchDownContinue(event) { + var originalEvent = event.originalEvent || event; + var isTouchEvent = originalEvent.touches !== undefined; + return _isSleeping || _destroyed ? false : COMPATIBILITY.mBtn(event) === 1 || isTouchEvent; + } + function getCoordinates(event) { + return _msieVersion && insideIFrame ? { x : event.screenX , y : event.screenY } : COMPATIBILITY.page(event); + } + } + + //==== Utils ====// /** @@ -3531,7 +3748,7 @@ * @param name The name of the target which shall be called. * @param args The args with which the callback shall be called. */ - function callCallback(name, args) { + function dispatchCallback(name, args) { if(_initialized) { var callback = _currentPreparedOptions.callbacks[name]; var extensionOnName = name; @@ -3549,6 +3766,8 @@ ext.on(extensionOnName, args); }); } + else if(!_destroyed) + _callbacksInitQeueue.push({ n : name, a : args }); } /** @@ -3613,11 +3832,10 @@ * @param toFloat Indicates whether the number shall be parsed to a float. */ function parseToZeroOrNumber(value, toFloat) { - var num = toFloat ? window.parseFloat(value) : window.parseInt(value); + var num = toFloat ? parseFloat(value) : parseInt(value); return isNaN(num) ? 0 : num; } - /** * Gets several information of the textarea and returns them as a object or undefined if the browser doesn't support it. * @returns {{cursorRow: Number, cursorCol, rows: Number, cols: number, wRow: number, pos: number, max : number}} or undefined if not supported. @@ -3661,19 +3879,6 @@ }; } - /** - * Checks the given key code and returns a boolean which is indicating if the given key code is a restricted one. - * @param keyCode The key code which shall be checked. - * @returns {boolean} True if the given key code is restricted, false otherwise. - */ - function textareaIsRestrictedKeyCode(keyCode) { - for (var i = 0; i < _textareaKeyDownRestrictedKeyCodes.length; i++) { - if (keyCode === _textareaKeyDownRestrictedKeyCodes[i]) - return true; - } - return false; - } - /** * Determines whether native overlay scrollbars are active. * @returns {boolean} True if native overlay scrollbars are active, false otherwise. @@ -3751,6 +3956,7 @@ FRAMEWORK.extend(obj, extendObjRoot, true); } + //==== Utils Cache ====// /** @@ -3814,7 +4020,7 @@ return false; } - + //==== Shortcuts ====// /** @@ -3920,7 +4126,7 @@ //return current options if newOptions are undefined or empty if (FRAMEWORK.isEmptyObject(newOptions) || !FRAMEWORK.isPlainObject(newOptions)) { if (type(newOptions) == TYPES.s) { - if (arguments.length >= 2) { + if (arguments.length > 1) { var option = { }; setObjectPropVal(option, newOptions, value); setOptions(option); @@ -3946,92 +4152,50 @@ _base.destroy = function () { _destroyed = true; + //remove this instance from auto update loop autoUpdateLoop.remove(_base); - mutationObserversDisconnect(); + + //disconnect all mutation observers + disconnectMutationObservers(); + + //remove all resize observers removeResizeObserver(_sizeObserverElement); if (_sizeAutoObserverAdded) removeResizeObserver(_sizeAutoObserverElement); + //remove all extensions for(var extName in _extensions) _base.removeExt(extName); - remove(_sizeObserverElement); - if (_contentGlueElement !== undefined) + //remove all events from host element + setupHostMouseTouchEvents(true); + + //remove all events from structure + setupStructureEvents(true); + + //remove all helper / detection elements + if (_contentGlueElement) remove(_contentGlueElement); - if (_contentArrangeElement !== undefined) + if (_contentArrangeElement) remove(_contentArrangeElement); if (_sizeAutoObserverAdded) remove(_sizeAutoObserverElement); - if (_supportPassiveEvents) { - removePassiveEventListener(_hostElement, _strMouseTouchMoveEvent, hostOnMouseMove); - removePassiveEventListener(_hostElement, _strMouseTouchEnter, hostOnMouseEnter); - removePassiveEventListener(_hostElement, _strMouseTouchLeave, hostOnMouseLeave); - } - else { - _hostElement.off(_strMouseTouchMoveEvent, hostOnMouseMove) - .off(_strMouseTouchEnter, hostOnMouseEnter) - .off(_strMouseTouchLeave, hostOnMouseLeave); - } - - remove(_scrollbarHorizontalElement); - remove(_scrollbarVerticalElement); - if(_scrollbarCornerElement) - remove(_scrollbarCornerElement); - if (!_resizeNone) - scrollbarCornerOnResized(); - - _contentElement.contents() - .unwrap() - .unwrap() - .unwrap(); - - if (_isBody) - removeClass(_htmlElement, _classNameHTMLElement); - - - if (_isTextarea) { - _targetElement.off(_strScroll, textareaOnScroll) - .off('drop', textareaOnDrop) - .off('focus', textareaOnFocus) - .off('focusout', textareaOnFocusOut); - if (_msieVersion > 9 || !_autoUpdateRecommended) - _targetElement.off('input', textareaOnInput); - else { - _targetElement.off(_strKeyDownEvent, textareaOnKeyDown) - .off(_strKeyUpEvent, textareaOnKeyUp); - } - - remove(_textareaCoverElement); - removeClass(_targetElement, _classNameTextareaElement + _strSpace + _classNameTextInherit) - .unwrap() - .removeAttr(LEXICON.s); - remove(_hostElement); - } - else { - removeClass(_targetElement, _classNameHostElement); - removeClass(_hostElement, [ - _classNameHostElement, - _classNameHostResizeDisabled, - _classNameHostRTL, - _classNameHostScrollbarHorizontalHidden, - _classNameHostScrollbarVerticalHidden, - _classNameHostTransition, - _classNameHostScrolling, - _classNameHostOverflow, - _classNameHostOverflowX, - _classNameHostOverflowY, - _classNameThemeNone, - _classNameCache].join(_strSpace)); - } - - for(var i = 0; i < _imgs.length; i++) + //remove all generated DOM + setupScrollbarsDOM(true); + setupScrollbarCornerDOM(true); + setupStructureDOM(true); + + //remove all generated image load events + for(var i = 0; i < _imgs[LEXICON.l]; i++) FRAMEWORK(_imgs[i]).off('load', imgOnLoad); _imgs = undefined; + //remove this instance from the instances list INSTANCES(pluginTargetElement, 0); - callCallback("onDestroyed"); + dispatchCallback("onDestroyed"); + //remove all properties and methods for (var property in _base) delete _base[property]; _base = undefined; @@ -4070,10 +4234,10 @@ * * 3. Can be a object with a HTML or jQuery element with additional settings: * { - * el : [HTMLElement, jQuery element], MUST be specified, else this object isn't valid. - * scroll : [string, array, object], Default value is 'always'. - * block : [string, array, object], Default value is 'begin'. - * margin : [number, boolean array, object] Default value is false. + * el : [HTMLElement, jQuery element], MUST be specified, else this object isn't valid. + * scroll : [string, array, object], Default value is 'always'. + * block : [string, array, object], Default value is 'begin'. + * margin : [number, boolean, array, object] Default value is false. * } * * Possible scroll settings are: @@ -4094,11 +4258,17 @@ * @param duration The duration of the scroll animation, OR a jQuery animation configuration object. * @param easing The animation easing. * @param complete The animation complete callback. - * @returns - * { - * x: {position: *, ratio: (number|*), max: (number|*), handleOffset: (number|*), handleLength: *, handleLengthRatio: (number|*), trackLength: *, isRTL: *, isRTLNormalized: *}, - * y: {position: *, ratio: (number|*), max: (number|*), handleOffset: (number|*), handleLength: *, handleLengthRatio: (number|*), trackLength: *} - * } + * @returns {{ + * position: {x: number, y: number}, + * ratio: {x: number, y: number}, + * max: {x: number, y: number}, + * handleOffset: {x: number, y: number}, + * handleLength: {x: number, y: number}, + * handleLengthRatio: {x: number, y: number}, t + * rackLength: {x: number, y: number}, + * isRTL: boolean, + * isRTLNormalized: boolean + * }} */ _base.scroll = function (coordinates, duration, easing, complete) { if (arguments.length === 0 || coordinates === undefined) { @@ -4113,7 +4283,11 @@ scrollX = normalizeInvert ? maxScrollX - scrollX : scrollX; scrollX *= normalizeNegate ? -1 : 1; maxScrollX *= normalizeNegate ? -1 : 1; + return { + /** + * @deprecated + */ x: { position: scrollX, ratio: scrollXRatio, @@ -4125,6 +4299,9 @@ isRTL: _isRTL, isRTLNormalized: _normalizeRTLCache }, + /** + * @deprecated + */ y: { position: infoY.cs, ratio: infoY.csr, @@ -4133,7 +4310,38 @@ handleLength: infoY.hl, handleLengthRatio: infoY.hlr, trackLength: infoY.tl - } + }, + + position : { + x : scrollX, + y : infoY.cs + }, + ratio : { + x : scrollXRatio, + y : infoY.csr + }, + max : { + x : maxScrollX, + y : infoY.ms + }, + handleOffset : { + x : infoX.ho, + y : infoY.ho + }, + handleLength : { + x : infoX.hl, + y : infoY.hl + }, + handleLengthRatio : { + x : infoX.hlr, + y : infoY.hlr + }, + trackLength : { + x : infoX.tl, + y : infoY.tl + }, + isRTL: _isRTL, + isRTLNormalized: _normalizeRTLCache }; } @@ -4141,12 +4349,14 @@ var coordinatesXAxisProps = [_strX, _strLeft, 'l']; var coordinatesYAxisProps = [_strY, _strTop, 't']; var coordinatesOperators = ['+=', '-=', '*=', '/=']; + var durationIsObject = type(duration) == TYPES.o; + var completeCallback = durationIsObject ? duration.complete : complete; var i; var finalScroll = { }; + var specialEasing = {}; var doScrollLeft; var doScrollTop; var animationOptions; - var durationIsObject = type(duration) == TYPES.o; var strEnd = 'end'; var strBegin = 'begin'; var strCenter = 'center'; @@ -4167,6 +4377,13 @@ var possibleElement = coordinatesIsElementObj ? coordinates.el : coordinates; var possibleElementIsJQuery = possibleElement instanceof FRAMEWORK || JQUERY ? possibleElement instanceof JQUERY : false; var possibleElementIsHTMLElement = possibleElementIsJQuery ? false : isHTMLElement(possibleElement); + var proxyCompleteCallback = type(completeCallback) != TYPES.f ? undefined : function() { + if(doScrollLeft) + refreshScrollbarHandleOffset(true); + if(doScrollTop) + refreshScrollbarHandleOffset(false); + completeCallback(); + }; var checkSettingsStringValue = function (currValue, allowedValues) { for (i = 0; i < allowedValues[strLength]; i++) { if (currValue === allowedValues[i]) @@ -4174,39 +4391,18 @@ } return false; }; - var getRawScroll = function (coordinates) { - var rawScroll = {}; - if (type(coordinates) == TYPES.a && coordinates[strLength] > 0) { - rawScroll.x = coordinates[0]; - rawScroll.y = coordinates[1]; - } - else if (type(coordinates) == TYPES.s || type(coordinates) == TYPES.n) { - rawScroll.x = coordinates; - rawScroll.y = coordinates; - } + var getRawScroll = function (isX, coordinates) { + var coordinateProps = isX ? coordinatesXAxisProps : coordinatesYAxisProps; + coordinates = type(coordinates) == TYPES.s || type(coordinates) == TYPES.n ? [ coordinates, coordinates ] : coordinates; + + if (type(coordinates) == TYPES.a) + return isX ? coordinates[0] : coordinates[1]; else if (type(coordinates) == TYPES.o) { normalizeRTL = type(coordinates.n) == TYPES.b ? coordinates.n : normalizeRTL; - coordinates = extend({}, coordinates); - i = 0; - for (var key in coordinates) { - if (coordinates.hasOwnProperty(key)) { - if (i > 2) - delete coordinates[key]; - i++; - } - } - var getRawScrollValue = function (isX) { - var coordinateProps = isX ? coordinatesXAxisProps : coordinatesYAxisProps; - for (i = 0; i < coordinateProps[strLength]; i++) { - if (coordinateProps[i] in coordinates) { - return coordinates[coordinateProps[i]]; - } - } - }; - rawScroll.x = getRawScrollValue(true); - rawScroll.y = getRawScrollValue(false); + for (i = 0; i < coordinateProps[strLength]; i++) + if (coordinateProps[i] in coordinates) + return coordinates[coordinateProps[i]]; } - return rawScroll; }; var getFinalScroll = function (isX, rawScroll) { var isString = type(rawScroll) == TYPES.s; @@ -4222,6 +4418,7 @@ var isRTLisX = _isRTL && isX; var normalizeShortcuts = isRTLisX && _rtlScrollBehavior.n && !normalizeRTL; var strReplace = 'replace'; + var evalFunc = eval; if (isString) { //check operator if (rawScroll[strLength] > 2) { @@ -4244,7 +4441,7 @@ rawScroll = rawScroll[strReplace](/%/g, mult + (maxScroll * (isRTLisX && _rtlScrollBehavior.n ? -1 : 1) / 100.0)); rawScroll = rawScroll[strReplace](/vw/g, mult + _viewportSize.w); rawScroll = rawScroll[strReplace](/vh/g, mult + _viewportSize.h); - amount = parseToZeroOrNumber(parseToZeroOrNumber(window.eval(rawScroll), true).toFixed()); + amount = parseToZeroOrNumber(parseToZeroOrNumber(evalFunc(rawScroll), true).toFixed()); } else { amount = rawScroll; @@ -4275,7 +4472,7 @@ } finalValue = invert ? maxScroll - finalValue : finalValue; finalValue *= negate ? -1 : 1; - finalValue = isRTLisX && _rtlScrollBehavior.n ? Math.min(0, Math.max(maxScroll, finalValue)) : Math.max(0, Math.min(maxScroll, finalValue)); + finalValue = isRTLisX && _rtlScrollBehavior.n ? MATH.min(0, MATH.max(maxScroll, finalValue)) : MATH.max(0, MATH.min(maxScroll, finalValue)); } return finalValue === currScroll ? undefined : finalValue; }; @@ -4383,16 +4580,16 @@ elementOffset[_strTop] -= settingsMargin[0]; elementOffset[_strLeft] -= settingsMargin[3]; var elementScrollCoordinates = { - x: Math.round(elementOffset[_strLeft] - viewportOffset[_strLeft] + viewportScroll.l), - y: Math.round(elementOffset[_strTop] - viewportOffset[_strTop] + viewportScroll.t) + x: MATH.round(elementOffset[_strLeft] - viewportOffset[_strLeft] + viewportScroll.l), + y: MATH.round(elementOffset[_strTop] - viewportOffset[_strTop] + viewportScroll.t) }; if (_isRTL) { if (!_rtlScrollBehavior.n && !_rtlScrollBehavior.i) - elementScrollCoordinates.x = Math.round(viewportOffset[_strLeft] - elementOffset[_strLeft] + viewportScroll.l); + elementScrollCoordinates.x = MATH.round(viewportOffset[_strLeft] - elementOffset[_strLeft] + viewportScroll.l); if (_rtlScrollBehavior.n && normalizeRTL) elementScrollCoordinates.x *= -1; if (_rtlScrollBehavior.i && normalizeRTL) - elementScrollCoordinates.x = Math.round(viewportOffset[_strLeft] - elementOffset[_strLeft] + (_scrollHorizontalInfo.ms - viewportScroll.l)); + elementScrollCoordinates.x = MATH.round(viewportOffset[_strLeft] - elementOffset[_strLeft] + (_scrollHorizontalInfo.ms - viewportScroll.l)); } //measuring is required @@ -4450,23 +4647,24 @@ coordinates = elementScrollCoordinates; } - finalScroll[_strScrollLeft] = getFinalScroll(true, getRawScroll(coordinates).x); - finalScroll[_strScrollTop] = getFinalScroll(false, getRawScroll(coordinates).y); + finalScroll[_strScrollLeft] = getFinalScroll(true, getRawScroll(true, coordinates)); + finalScroll[_strScrollTop] = getFinalScroll(false, getRawScroll(false, coordinates)); doScrollLeft = finalScroll[_strScrollLeft] !== undefined; doScrollTop = finalScroll[_strScrollTop] !== undefined; if ((doScrollLeft || doScrollTop) && (duration > 0 || durationIsObject)) { - if (durationIsObject) + if (durationIsObject) { + duration.complete = proxyCompleteCallback; _viewportElement.animate(finalScroll, duration); + } else { animationOptions = { duration: duration, - complete: complete + complete: proxyCompleteCallback }; - if (type(easing) == TYPES.a) { - var specialEasing = {}; - specialEasing[_strScrollLeft] = easing[0]; - specialEasing[_strScrollTop] = easing[1]; + if (type(easing) == TYPES.a || FRAMEWORK.isPlainObject(easing)) { + specialEasing[_strScrollLeft] = easing[0] || easing.x; + specialEasing[_strScrollTop] = easing[1] || easing.y; animationOptions.specialEasing = specialEasing; } else { @@ -4542,7 +4740,7 @@ }; var obj = { sleeping: prepare(_isSleeping) || false, - autoUpdate: prepare(!_mutationObserverConnected), + autoUpdate: prepare(!_mutationObserversConnected), widthAuto: prepare(_widthAutoCache), heightAuto: prepare(_heightAutoCache), padding: prepare(_cssPaddingCache), @@ -4596,7 +4794,7 @@ var contractFulfilled = true; if(registeredExtensionObj) { if(!_extensions.hasOwnProperty(extName)) { - instance = registeredExtensionObj.extension.call(_base, + instance = registeredExtensionObj.extensionFactory.call(_base, extend(true, { }, registeredExtensionObj.defaultOptions), FRAMEWORK, COMPATIBILITY); @@ -4664,7 +4862,7 @@ //check if the plugin hasn't to be initialized if (_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.x && !_currentPreparedOptions.nativeScrollbarsOverlaid.initialize) { - callCallback("onInitializationWithdrawn"); + dispatchCallback("onInitializationWithdrawn"); return false; } @@ -4689,181 +4887,45 @@ var initBodyScroll; if (_isBody) { initBodyScroll = {}; - initBodyScroll.l = Math.max(_targetElement[_strScrollLeft](), _htmlElement[_strScrollLeft](), _windowElement[_strScrollLeft]()); - initBodyScroll.t = Math.max(_targetElement[_strScrollTop](), _htmlElement[_strScrollTop](), _windowElement[_strScrollTop]()); + initBodyScroll.l = MATH.max(_targetElement[_strScrollLeft](), _htmlElement[_strScrollLeft](), _windowElement[_strScrollLeft]()); + initBodyScroll.t = MATH.max(_targetElement[_strScrollTop](), _htmlElement[_strScrollTop](), _windowElement[_strScrollTop]()); } - //build Hide-scrollbars DOM - if (_isTextarea) { - _targetElement.wrap(generateDiv(_classNameHostTextareaElement)); - addClass(_targetElement, _classNameTextareaElement + _strSpace + _classNameTextInherit); - _hostElement = _targetElement.parent(); - var hostElementCSS = {}; - if (!_currentPreparedOptions.sizeAutoCapable) { - hostElementCSS[_strWidth] = _targetElement.css(_strWidth); - hostElementCSS[_strHeight] = _targetElement.css(_strHeight); - } - _hostElement.css(hostElementCSS) - .wrapInner(generateDiv(_classNameContentElement + _strSpace + _classNameTextInherit)) - .wrapInner(generateDiv(_classNameViewportElement + _strSpace + _classNameTextInherit)) - .wrapInner(generateDiv(_classNamePaddingElement + _strSpace + _classNameTextInherit)); - _contentElement = findFirst(_hostElement, _strDot + _classNameContentElement); - _viewportElement = findFirst(_hostElement, _strDot + _classNameViewportElement); - _paddingElement = findFirst(_hostElement, _strDot + _classNamePaddingElement); - _textareaCoverElement = FRAMEWORK(generateDiv(_classNameTextareaCoverElement)); - _contentElement.prepend(_textareaCoverElement); + //build OverlayScrollbars DOM and Events + setupStructureDOM(); + setupStructureEvents(); - _targetElement.on(_strScroll, textareaOnScroll) - .on('drop', textareaOnDrop) - .on('focus', textareaOnFocus) - .on('focusout', textareaOnFocusOut); - if (_msieVersion > 9 || !_autoUpdateRecommended) { - _targetElement.on('input', textareaOnInput); - } - else { - _targetElement.on(_strKeyDownEvent, textareaOnKeyDown) - .on(_strKeyUpEvent, textareaOnKeyUp); - } - } else { - addClass(_targetElement, _classNameHostElement); - _hostElement = _targetElement; - _hostElement.wrapInner(generateDiv(_classNameContentElement)) - .wrapInner(generateDiv(_classNameViewportElement)) - .wrapInner(generateDiv(_classNamePaddingElement)); - _contentElement = findFirst(_hostElement, _strDot + _classNameContentElement); - _viewportElement = findFirst(_hostElement, _strDot + _classNameViewportElement); - _paddingElement = findFirst(_hostElement, _strDot + _classNamePaddingElement); + //build Scrollbars DOM and Events + setupScrollbarsDOM(); + setupScrollbarEvents(true); + setupScrollbarEvents(false); + + //build Scrollbar Corner DOM and Events + setupScrollbarCornerDOM(); + setupScrollbarCornerEvents(); - //add transitionend event - _contentElement.on(_strTransitionEndEvent, function (event) { - if (_autoUpdateCache === true) - return; - event = event.originalEvent || event; - if (isSizeAffectingCSSProperty(event.propertyName)) - update(_strAuto); - }); - } - - buildScrollbars(); - - //add scroll event - if (_supportPassiveEvents) - addPassiveEventListener(_viewportElement, _strScroll, viewportOnScroll); - else - _viewportElement.on(_strScroll, viewportOnScroll); - - if (_nativeScrollbarStyling) - addClass(_viewportElement, _nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y ? _classNameViewportNativeScrollbarsOverlaid : _classNameViewportNativeScrollbarsInvisible); - - //build mutation observers - if (_supportMutationObserver) { - var mutationObserver = COMPATIBILITY.mO(); - var contentLastUpdate = COMPATIBILITY.now(); - var mutationTarget; - var mutationAttrName; - var contentTimeout; - var now; - var sizeAuto; - var action; - - _mutationObserverHost = new mutationObserver(function (mutations) { - if (!_initialized || _isSleeping) - return; - - var doUpdate = false; - //var doUpdateScrollbars = false; - var mutation; - FRAMEWORK.each(mutations, function () { - mutation = this; - mutationTarget = mutation.target; - mutationAttrName = mutation.attributeName; - - if (mutationAttrName === LEXICON.c) - doUpdate = hostClassNamesChanged(mutation.oldValue, mutationTarget.className); - else if (mutationAttrName === LEXICON.s) - doUpdate = mutation.oldValue !== mutationTarget[LEXICON.s].cssText; - else - doUpdate = true; - - if (doUpdate) - return false; - }); - - if (doUpdate) - _base.update(_strAuto); - /* - if(doUpdateScrollbars) { - refreshScrollbarHandleLength(true); - refreshScrollbarHandleOffset(true, _scrollHorizontalInfo.cs); - refreshScrollbarHandleLength(false); - refreshScrollbarHandleOffset(false, _scrollVerticalInfo.cs); - } - */ - }); - _mutationObserverContent = new mutationObserver(function (mutations) { - if (!_initialized || _isSleeping) - return; - - var doUpdate = false; - var mutation; - FRAMEWORK.each(mutations, function () { - mutation = this; - doUpdate = isUnknownMutation(mutation); - return !doUpdate; - }); - - if (doUpdate) { - now = COMPATIBILITY.now(); - sizeAuto = (_heightAutoCache || _widthAutoCache); - action = function () { - if(!_destroyed) { - contentLastUpdate = now; - - //if cols, rows or wrap attr was changed - if (_isTextarea) - textareaUpdate(); - - if (sizeAuto) - update(); - else - _base.update(_strAuto); - } - }; - clearTimeout(contentTimeout); - if (_mutationObserverContentLag <= 0 || now - contentLastUpdate > _mutationObserverContentLag || !sizeAuto) - action(); - else - contentTimeout = setTimeout(action, _mutationObserverContentLag); - } - }); - } + //create mutation observers + createMutationObservers(); + //apply the body scroll to handle it right in the update method + if(_isBody) + _viewportElement[_strScrollLeft](initBodyScroll.l)[_strScrollTop](initBodyScroll.t); + //build resize observer for the host element - if (_isBody) { - addClass(_htmlElement, _classNameHTMLElement); - - //apply the body scroll to handle it right in the update method - _viewportElement[_strScrollLeft](initBodyScroll.l); - _viewportElement[_strScrollTop](initBodyScroll.t); - } - _sizeObserverElement = FRAMEWORK(generateDiv('os-resize-observer-host')); - _hostElement.prepend(_sizeObserverElement); addResizeObserver(_sizeObserverElement, hostOnResized); //update for the first time hostOnResized(); //initialize cache for host size _base.update(_strAuto); //initialize cache for content - //add the transition class for transitions AFTER the first update (for preventing unwanted transitions) - setTimeout(function () { - if (_supportTransition && !_destroyed) - addClass(_hostElement, _classNameHostTransition) - }, 333); - //the plugin is initialized now! _initialized = true; - callCallback("onInitialized"); - + dispatchCallback("onInitialized"); + + //call all callbacks which would fire before the initialized was complete + FRAMEWORK.each(_callbacksInitQeueue, function(index, value) { dispatchCallback(value.n, value.a); }); + _callbacksInitQeueue = [ ]; + //add extensions if(type(extensions) == TYPES.s) extensions = [ extensions ]; @@ -4872,6 +4934,12 @@ else if(FRAMEWORK.isPlainObject(extensions)) FRAMEWORK.each(extensions, function (key, value) { _base.addExt(key, value); }); + //add the transition class for transitions AFTER the first update & AFTER the applied extensions (for preventing unwanted transitions) + setTimeout(function () { + if (_supportTransition && !_destroyed) + addClass(_hostElement, _classNameHostTransition) + }, 333); + return _initialized; } @@ -4893,38 +4961,38 @@ if(arguments.length === 0) return this; + /* + pluginTargetElements will be converted to: + 1. A jQueryElement Array + 2. A HTMLElement Array + 3. A Array with a single HTML Element + so pluginTargetElements is always a array. + */ + pluginTargetElements = pluginTargetElements.length != undefined ? pluginTargetElements : [ pluginTargetElements[0] || pluginTargetElements ]; initOverlayScrollbarsStatics(); var arr = [ ]; var inst; var result; - if(FRAMEWORK.isPlainObject(options)) { - if (pluginTargetElements && pluginTargetElements.length) { - FRAMEWORK.each(pluginTargetElements, function () { - inst = this; + + if(pluginTargetElements.length > 0) { + if(FRAMEWORK.isPlainObject(options)) { + FRAMEWORK.each(pluginTargetElements, function (i, v) { + inst = v; if(inst !== undefined) arr.push(OverlayScrollbarsInstance(inst, options, extensions, _pluginsGlobals, _pluginsAutoUpdateLoop)); }); - result = arr.length > 1 ? arr : arr[0]; } - else - result = OverlayScrollbarsInstance(pluginTargetElements, options, extensions, _pluginsGlobals, _pluginsAutoUpdateLoop); - } - else if(pluginTargetElements) { - if(pluginTargetElements.length && pluginTargetElements.length > 0) { - FRAMEWORK.each(pluginTargetElements, function() { - inst = INSTANCES(this); - if(options === '!') { - if(inst instanceof window[PLUGINNAME]) - arr.push(inst); - } - else + else { + FRAMEWORK.each(pluginTargetElements, function(i, v) { + inst = INSTANCES(v); + if((options === '!' && inst instanceof window[PLUGINNAME]) || (COMPATIBILITY.type(options) == TYPES.f && options(v, inst))) + arr.push(inst); + else if(options === undefined) arr.push(inst); }); - result = arr.length > 1 ? arr : arr[0]; } - else - result = INSTANCES(pluginTargetElements); + result = arr.length === 1 ? arr[0] : arr; } return result; }; @@ -4977,7 +5045,7 @@ //register extension _pluginsExtensions.push({ name : extensionName, - extension : extension, + extensionFactory : extension, defaultOptions : defaultOptions }); } diff --git a/js/jquery.overlayScrollbars.min.js b/js/jquery.overlayScrollbars.min.js index 5b62652..8110309 100644 --- a/js/jquery.overlayScrollbars.min.js +++ b/js/jquery.overlayScrollbars.min.js @@ -2,12 +2,12 @@ * OverlayScrollbars * https://github.com/KingSora/OverlayScrollbars * - * Version: 1.5.3 + * Version: 1.6.0 * * Copyright KingSora. * https://github.com/KingSora * * Released under the MIT license. - * Date: 07.11.2018 + * Date: 02.12.2018 */ -!function(e,t){"function"==typeof define&&define.amd?define(["jquery"],function(n){return t(e,e.document,undefined,n)}):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(e,e.document,undefined,require("jquery")):t(e,e.document,undefined,e.jQuery)}("undefined"!=typeof window?window:this,function(e,t,n,r){"use strict";var i,o,a="OverlayScrollbars",s={o:"object",f:"function",a:"array",s:"string",b:"boolean",n:"number",u:"undefined",z:"null"},c={c:"class",s:"style",i:"id",l:"length",p:"prototype",oH:"offsetHeight",cH:"clientHeight",sH:"scrollHeight",oW:"offsetWidth",cW:"clientWidth",sW:"scrollWidth"},l={wW:function(){return e.innerWidth||t.documentElement[c.cW]||t.body[c.cW]},wH:function(){return e.innerHeight||t.documentElement[c.cH]||t.body[c.cH]},mO:function(){return e.MutationObserver||e.WebKitMutationObserver||e.WebkitMutationObserver||e.MozMutationObserver||n},rO:function(){return e.ResizeObserver||e.WebKitResizeObserver||e.WebkitResizeObserver||e.MozResizeObserver||n},rAF:function(){return e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t){return e.setTimeout(t,1e3/60)}},cAF:function(){return e.cancelAnimationFrame||e.webkitCancelAnimationFrame||e.mozCancelAnimationFrame||e.oCancelAnimationFrame||e.msCancelAnimationFrame||function(t){return e.clearTimeout(t)}},now:function(){return Date.now()||(new Date).getTime()},stpP:function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},prvD:function(e){e.preventDefault&&e.cancelable?e.preventDefault():e.returnValue=!1},page:function(e){var r="page",i="client",o="X",a="Y",s=((e=e.originalEvent||e).target||e.srcElement||t).ownerDocument||t,c=s.documentElement,l=s.body;if(e.touches!==n){var u=e.touches[0];return{x:u[r+o],y:u[r+a]}}return!e[r+o]&&e[i+o]&&null!=e[i+o]?{x:e[i+o]+(c&&c.scrollLeft||l&&l.scrollLeft||0)-(c&&c.clientLeft||l&&l.clientLeft||0),y:e[i+a]+(c&&c.scrollTop||l&&l.scrollTop||0)-(c&&c.clientTop||l&&l.clientTop||0)}:{x:e[r+o],y:e[r+a]}},mBtn:function(e){return e.which||e.button===n?e.which:1&e.button?1:2&e.button?3:4&e.button?2:0},inA:function(e,t){for(var n=0;n-1){if(!(n>1))return i[r][o];delete e[o],i.splice(r,1)}}}),d=function(){var r,i,o,d,v,p,y,x,m,w,b,g,S,O,z=[],A=(o=[s.b,s.n,s.s,s.a,s.o,s.f,s.z],d=" ",v=":",p=[s.z,s.s],y=s.n,x=[s.z,s.b],m=[!0,s.b],w=[!1,s.b],b=[null,[s.z,s.f]],S={className:["os-theme-dark",p],resize:["none","n:none b:both h:horizontal v:vertical"],sizeAutoCapable:m,clipAlways:m,normalizeRTL:m,paddingAbsolute:w,autoUpdate:[null,x],autoUpdateInterval:[33,y],nativeScrollbarsOverlaid:{showNativeScrollbars:w,initialize:m},overflowBehavior:{x:["scroll",g="v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden"],y:["scroll",g]},scrollbars:{visibility:["auto","v:visible h:hidden a:auto"],autoHide:["never","n:never s:scroll l:leave m:move"],autoHideDelay:[800,y],dragScrolling:m,clickScrolling:w,touchSupport:m},textarea:{dynWidth:w,dynHeight:w},callbacks:{onInitialized:b,onInitializationWithdrawn:b,onDestroyed:b,onScrollStart:b,onScroll:b,onScrollStop:b,onOverflowChanged:b,onOverflowAmountChanged:b,onDirectionChanged:b,onContentSizeChanged:b,onHostSizeChanged:b,onUpdated:b}},{d:(O=function(e){var t=function(n){var r,i,o;for(r in n)n.hasOwnProperty(r)&&(i=n[r],(o=l.type(i))==s.a?n[r]=i[e?1:0]:o==s.o&&(n[r]=t(i)));return n};return t(f.extend(!0,{},S))})(),t:O(!0),v:function(e,t,n,r,i){var a={},c=f.extend(!0,{},e),u=function(e,t,i,a){for(var c in t)if(t.hasOwnProperty(c)&&e.hasOwnProperty(c)){var h,p,y,x,m,w,b,g,S=!1,O=t[c],z=l.type(O),A=l.type(O)!=s.a?[O]:O,M=e[c],W=l.type(M),H=a?a+".":"",C='The option "'+H+c+"\" wasn't set, because",T=[],k=[];if(z==s.o)i[c]={},u(M,O,i[c],H+c),f.isEmptyObject(M)&&delete e[c];else{for(w=0;w0?"\r\nValid strings are: [ "+k.join(", ").split(v).join(", ")+" ].":"")),delete e[c]}}};return u(c,t,a),i?f.extend(!0,a,c):!f.isEmptyObject(c)&&n&&console.warn("The following options are discarded due to invalidity:\r\n"+JSON.stringify(c,null,2)),a}});function M(){r||(r=new W(A.d)),i||(i=new H(r))}function W(r){var i=this,o="overflow",a="hidden",s="scroll",u=f("body"),d=f('
'),v=d[0],p=f(d.children("div").eq(0));u.append(d),d.hide().show();var y,x,m,w,b,g,S,O,z,A=H(v),M={x:0===A.x,y:0===A.y};function W(e){var r=!1,i="Webkit Moz ms O".split(" "),o=t.createElement("div"),a=null,s=0;if(e=e.toLowerCase(),o[c.s][e]!==n&&(r=!0),!r)for(a=e.charAt(0).toUpperCase()+e.substr(1);s0?y=z(x[w](b+5,x[m](".",b)),10):g>0?y=z(x[w](O+3,x[m](".",O)),10):S>0&&(y=z(x[w](S+5,x[m](".",S)),10)),y),cssCalc:function(){var e,n,r=t.createElement("div"),i=["calc","-webkit-calc","-moz-calc","-o-calc"];for(e=0;e0){var e=l.wW(),a=l.wH(),v=e-n,p=a-r;if(0===v&&0===p)return;var y,x=Math.round(e/(n/100)),m=Math.round(a/(r/100)),w=t(v),b=t(p),g=t(x),S=t(m),O=c(),z=w>2&&b>2,A=!s(g,S),M=z&&A&&(O!==o&&o>0),W=i.nativeScrollbarSize;M&&(u.append(d),y=i.nativeScrollbarSize=H(d[0]),d.remove(),W.x===y.x&&W.y===y.y||f.each(h(),function(){h(this)&&h(this).update("zoom")})),n=e,r=a,o=O}};f(e).on("resize",a)}function s(e,n){var r=t(e),i=t(n);return!(r===i||r+1===i||r-1===i)}function c(){var t=e.screen.deviceXDPI||0,n=e.screen.logicalXDPI||1;return e.devicePixelRatio||t/n}}()}function H(e){var t,r=this,i="autoUpdate",o=i+"Interval",a=c.l,s=[],u=[],h=!1,d=33,v=d,p=l.now(),y=function(){if(s[a]>0&&h){t=l.rAF()(function(){y()});var e=l.now(),r=e-p;if(r>v){p=e-r%v;for(var c=d,f=0;fb&&(x.update("auto"),u[f]=new Date(g+=b)),c=Math.max(1,Math.min(c,b))}}v=c}}else v=d};r.add=function(t){-1===f.inArray(t,s)&&(s.push(t),u.push(l.now()),s[a]>0&&!h&&(h=!0,e.autoUpdateLoop=h,y()))},r.remove=function(r){var i=f.inArray(r,s);i>-1&&(u.splice(i,1),s.splice(i,1),0===s[a]&&h&&(h=!1,e.autoUpdateLoop=h,t!==n&&(l.cAF()(t),t=-1)))}}function C(r,i,o,d,v){if(fi(r)){if(h(r)){var p=h(r);return p.options(i),p}var y,x,m,w,b,g,S,O,z,M,W,H,C,T,k,E,L,P,D,R,j,N,F,I,U,_,B,q,V,X,Y,K,$,J,Q,G,Z,ee,te,ne,re,ie,oe,ae,se,ce,le,ue,fe,he,de,ve,pe,ye,xe,me,we,be,ge,Se,Oe,ze,Ae,Me,We,He,Ce,Te,ke,Ee,Le,Pe,De,Re,je,Ne,Fe,Ie,Ue,_e,Be,qe,Ve,Xe,Ye,Ke,$e,Je,Qe,Ge,Ze,et,tt,nt,rt,it,ot,at,st,ct,lt,ut,ft,ht,dt,vt,pt,yt,xt,mt,wt,bt,gt,St,Ot,zt,At,Mt,Wt,Ht,Ct,Tt=new e[a],kt=f[c.p],Et={},Lt={},Pt={},Dt={},Rt={},jt=175,Nt="-hidden",Ft="margin-",It="padding-",Ut="border-",_t="top",Bt="right",qt="bottom",Vt="left",Xt="min-",Yt="max-",Kt="width",$t="height",Jt="float",Qt="",Gt="auto",Zt="scroll",en="100%",tn="x",nn="y",rn=".",on=" ",an="scrollbar",sn="-horizontal",cn="-vertical",ln=Zt+"Left",un=Zt+"Top",fn="mousedown touchstart",hn="mouseup touchend touchcancel",dn="mousemove touchmove",vn="mouseenter",pn="mouseleave",yn="keydown",xn="keyup",mn="selectstart",wn="transitionend webkitTransitionEnd oTransitionEnd",bn="__overlayScrollbarsRO__",gn="os-",Sn=gn+"html",On=gn+"host",zn=On+"-textarea",An=On+"-"+an+sn+Nt,Mn=On+"-"+an+cn+Nt,Wn=On+"-transition",Hn=On+"-rtl",Cn=On+"-resize-disabled",Tn=On+"-scrolling",kn=On+"-overflow",En=kn+"-x",Ln=kn+"-y",Pn=gn+"textarea",Dn=Pn+"-cover",Rn=gn+"padding",jn=gn+"viewport",Nn=jn+"-native-scrollbars-invisible",Fn=jn+"-native-scrollbars-overlaid",In=gn+"content",Un=gn+"content-arrange",_n=gn+"content-glue",Bn=gn+"size-auto-observer",qn=gn+"resize-observer",Vn=gn+"resize-observer-item",Xn=Vn+"-final",Yn=gn+"text-inherit",Kn=gn+an,$n=Kn+"-track",Jn=$n+"-off",Qn=Kn+"-handle",Gn=Qn+"-off",Zn=Kn+"-unusable",er=Kn+"-"+Gt+Nt,tr=Kn+"-corner",nr=tr+"-resize",rr=nr+"-both",ir=nr+sn,or=nr+cn,ar=Kn+sn,sr=Kn+cn,cr=gn+"dragging",lr=gn+"theme-none",ur={},fr="added removed on contract",hr={},dr=42,vr=[],pr=11,yr=[112,113,114,115,116,117,118,119,120,121,123,33,34,37,38,39,40,16,17,18,19,20,144],xr=[],mr={},wr={};if(Tt.sleep=function(){q=!0},Tt.update=function(e){var t,n,r=zi(e)==s.s,i="img",o="load";r?0===e.indexOf(Gt)?(t=Jr(),n=$r(),(t||n)&&Zr(!1,n,!1,"+"==e.slice(-1))):"zoom"===e&&Zr(!0,!0):(e=q||e,q=!1,Zr(!1,!1,e,!0)),E||le.find(i).each(function(e,t){-1===l.inA(t,vr)&&f(t).off(o,Vr).on(o,Vr)})},Tt.options=function(e,t){if(f.isEmptyObject(e)||!f.isPlainObject(e)){if(zi(e)==s.s){if(arguments.length>=2){var n={};return bi(n,e,t),ei(n),void Zr()}return wi(Y,e)}return Y}ei(e);var r=q||!1;q=!1,Zr(),q=r},Tt.destroy=function(){for(var e in k=!0,v.remove(Tt),Wr(),Or(ie),R&&Or(re),ur)Tt.removeExt(e);Hi(ie),oe!==n&&Hi(oe),ce!==n&&Hi(ce),R&&Hi(re),W?(gr(ne,dn,kr),gr(ne,vn,Cr),gr(ne,pn,Tr)):ne.off(dn,kr).off(vn,Cr).off(pn,Tr),Hi(he),Hi(pe),fe&&Hi(fe),Mt||Br(),le.contents().unwrap().unwrap().unwrap(),L&&Wi(Z,Sn),E?(te.off(Zt,Ir).off("drop",jr).off("focus",Nr).off("focusout",Fr),b>9||!w?te.off("input",Pr):te.off(yn,Dr).off(xn,Rr),Hi(ue),Wi(te,Pn+on+Yn).unwrap().removeAttr(c.s),Hi(ne)):(Wi(te,On),Wi(ne,[On,Cn,Hn,An,Mn,Wn,Tn,kn,En,Ln,lr,rt].join(on)));for(var t=0;t0)t.x=e[0],t.y=e[1];else if(zi(e)==s.s||zi(e)==s.n)t.x=e,t.y=e;else if(zi(e)==s.o){for(var n in H=zi(e.n)==s.b?e.n:H,e=Ai({},e),x=0,e)e.hasOwnProperty(n)&&(x>2&&delete e[n],x++);var r=function(t){var n=t?C:T;for(x=0;x2){var y=r.substr(0,2);for(x=0;x/g,(v?"-":Qt)+en))[p](/px/g,Qt))[p](/%/g,h+f*(d&&m.n?-1:1)/100))[p](/vw/g,h+Dt.w))[p](/vh/g,h+Dt.h),o=di(di(e.eval(r),!0).toFixed())}else o=r;if(o!==n&&!isNaN(o)&&zi(o)==s.n){var w=H&&d,b=u*(w&&m.n?-1:1),g=w&&m.i,S=w&&m.n;switch(b=g?f-b:b,i){case"+=":c=b+o;break;case"-=":c=b-o;break;case"*=":c=b*o;break;case"/=":c=b/o;break;default:c=o}c=g?f-c:c,c*=S?-1:1,c=d&&m.n?Math.min(0,Math.max(f,c)):Math.max(0,Math.min(f,c))}return c===u?n:c},Z=function(e,t,n,r){var i,o,a=[n,n],c=zi(e);if(c==t)e=[e,e];else if(c==s.a){if((i=e[U])>2||i<1)e=a;else for(1===i&&(e[1]=n),x=0;x=4?ee(ne):ce:le==s.o?ee([ne[_t],ne[Bt],ne[qt],ne[Vt]]):ce,S=J(re,_)?re:"xy",O=Z(ie,s.s,N,V),z=Z(oe,s.s,D,q),A=ne;var ue={l:Lt.cs,t:Pt.cs},fe=ae.offset(),he=W.offset(),de={x:O.x==F||S==nn,y:O.y==F||S==tn};he[_t]-=A[0],he[Vt]-=A[3];var ve={x:Math.round(he[Vt]-fe[Vt]+ue.l),y:Math.round(he[_t]-fe[_t]+ue.t)};if(B&&(m.n||m.i||(ve.x=Math.round(fe[Vt]-he[Vt]+ue.l)),m.n&&H&&(ve.x*=-1),m.i&&H&&(ve.x=Math.round(fe[Vt]-he[Vt]+(Lt.ms-ue.l)))),z.x!=D||z.y!=D||O.x==I||O.y==I||B){var pe=W[0],ye=M?pe.getBoundingClientRect():{width:pe[c.oW],height:pe[c.oH]},xe={w:ye[Kt]+A[3]+A[1],h:ye[$t]+A[0]+A[2]},me=function(e){var t=ci(e),n=t._wh,r=t.lt,i=t.xy,o=z[i]==(e&&B?D:P),a=z[i]==R,s=z[i]==j,c=O[i]==F,l=O[i]==I,u=Dt[n],f=fe[r],h=xe[n],d=he[r],v=a?2:1,p=d+h/2,y=f+u/2,x=h<=u&&d>=f&&d+h<=f+u;c?de[i]=!0:de[i]||((s||l)&&(de[i]=!!l&&x,o=hy:p0||L))if(L)se.animate(E,r);else{if(g={duration:r,complete:o},zi(i)==s.a){var we={};we[ln]=i[0],we[un]=i[1],g.specialEasing=we}else g.easing=i;se.animate(E,g)}else w&&se[ln](E[ln]),b&&se[un](E[un])},Tt.scrollStop=function(e,t,n){return se.stop(e,t,n),Tt},Tt.getElements=function(e){var t={target:te[0],host:ne[0],padding:ae[0],viewport:se[0],content:le[0],scrollbarHorizontal:{scrollbar:he[0],track:de[0],handle:ve[0]},scrollbarVertical:{scrollbar:pe[0],track:ye[0],handle:xe[0]},scrollbarCorner:fe[0]};return zi(e)==s.s?wi(t,e):t},Tt.getState=function(e){var t=function(e){if(!f.isPlainObject(e))return e;var t=Ai(!0,{},e),n=function(e,n){t.hasOwnProperty(e)&&(t[n]=t[e],delete t[e])};return n("w",Kt),n("h",$t),delete t.c,t},n={sleeping:t(q)||!1,autoUpdate:t(!ht),widthAuto:t(Oe),heightAuto:t(ze),padding:t(We),overflowAmount:t(Re),hideOverflow:t(Se),hasOverflow:t(ge),contentScrollSize:t(we),viewportSize:t(Dt),hostSize:t(me),documentMixed:t(P)};return zi(e)==s.s?wi(n,e):n},Tt.ext=function(e){var t,n=fr.split(" "),r=0;if(zi(e)==s.s){if(ur.hasOwnProperty(e))for(t=Ai(!0,{},ur[e]);r9||!w){e.prepend(mi(qn,mi({className:Vn,dir:"ltr"},mi(Vn,mi(Xn))+mi(Vn,mi({className:Xn,style:"width: 200%; height: 200%"})))));var v,p,y,x,g=e[0][a][0][a][0],S=f(g[a][1]),O=f(g[a][0]),z=f(O[0][a][0]),A=g[c.oW],M=g[c.oH],W=2,C=d.nativeScrollbarSize,T=function(){O[ln](r)[un](r),S[ln](r)[un](r)},k=function(){p=0,v&&(A=y,M=x,u())},E=function(e){return y=g[c.oW],x=g[c.oH],v=y!=A||x!=M,e&&v&&!p?(l.cAF()(p),p=l.rAF()(k)):e||k(),T(),e&&(l.prvD(e),l.stpP(e)),!1},L={},P={};P[_t]=-(C.y+1)*W,P[Bt]=C.x*-W,P[qt]=C.y*-W,P[Vt]=-(C.x+1)*W,f(g).css(P),O.on(Zt,E),S.on(Zt,E),e.on(o,function(){E(!1)}),L[Kt]=r,L[$t]=r,z.css(L),T()}else{var D=G[0],R=D.attachEvent,j=b!==n;if(R)e.prepend(mi(qn)),Ci(e,rn+qn)[0].attachEvent("onresize",u);else{var N=D.createElement(s.o);N.setAttribute("tabindex","-1"),N.setAttribute(c.c,qn),N.onload=function(){var e=this.contentDocument.defaultView;e.addEventListener("resize",u),e.document.documentElement.style.display="none"},N.type="text/html",j&&e.prepend(N),N.data="about:blank",j||e.prepend(N),e.on(o,u)}}if(e[0]===ie[0]){var F=function(){var t=ne.css("direction"),n={},i=0,o=!1;return t!==ke&&("ltr"===t?(n[Vt]=0,n[Bt]=Gt,i=r):(n[Vt]=Gt,n[Bt]=0,i=m.n?-r:m.i?0:r),ie.children().eq(0).css(n),e[ln](i)[un](r),ke=t,o=!0),o};F(),e.on(Zt,function(e){return F()&&Zr(),l.prvD(e),l.stpP(e),!1})}}function Or(e){if(H){var t=e.contents()[0];t[bn].disconnect(),delete t[bn]}else Hi(e.children(rn+qn).eq(0))}function zr(e){}function Ar(e){}function Mr(){dt&&!ht&&(ut.observe(ne[0],{attributes:!0,attributeOldValue:!0,attributeFilter:[c.i,c.c,c.s]}),ft.observe(E?te[0]:le[0],{attributes:!0,attributeOldValue:!0,subtree:!E,childList:!E,characterData:!E,attributeFilter:E?["wrap","cols","rows"]:[c.i,c.c,c.s]}),ht=!0)}function Wr(){dt&&ht&&(ut.disconnect(),ft.disconnect(),ht=!1)}function Hr(){if(!q){var e=ie[0],t={w:e[c.sW],h:e[c.sH]};if(T){var n=Si(t,Je);Je=t,n&&Zr(!0,!1)}else Je=t}}function Cr(){St&&ii(!0)}function Tr(){St&&!ee.hasClass(cr)&&ii(!1)}function kr(){gt&&(ii(!0),clearTimeout(xt),xt=setTimeout(function(){gt&&!k&&ii(!1)},100))}function Er(e){q||(V!==n?clearTimeout(V):((bt||gt)&&ii(!0),yi()||Mi(ne,Tn),li("onScrollStart",e)),ai(!0,se[ln]()),ai(!1,se[un]()),li("onScroll",e),V=setTimeout(function(){k||(Lr(),li("onScrollStop",e))},jt))}function Lr(){clearTimeout(V),V=n,(bt||gt)&&ii(!1),yi()||Wi(ne,Tn)}function Pr(){Gr(),Tt.update(Gt)}function Dr(e){var t=e.keyCode;if(!pi(t)){if(0===xr.length){var n=function(){Gr(),Tt.update(Gt)};n(),vt=setInterval(n,1e3/60)}-1===f.inArray(t,xr)&&xr.push(t)}}function Rr(e){var t=e.keyCode;if(!pi(t)){var n=f.inArray(t,xr);n>-1&&xr.splice(n,1),0===xr.length&&(Gr(),Tt.update(Gt),clearInterval(vt))}}function jr(){setTimeout(function(){k||(Gr(),Tt.update(Gt))},50)}function Nr(){pt=!0}function Fr(){pt=!1,clearInterval(vt),xr=[],Gr(),Tt.update(Gt)}function Ir(e){return te[ln](m.i&&nt?9999999:0),te[un](0),l.prvD(e),l.stpP(e),!1}function Ur(e){if(!q){var t=(e.originalEvent||e).touches!==n;(1===l.mBtn(e)||t)&&(ht&&(At=!0,Wr()),mr=l.page(e),wr.w=ne[0][c.oW]-(D?0:j),wr.h=ne[0][c.oH]-(D?0:N),G.on(mn,qr).on(dn,_r).on(hn,Br),Mi(ee,cr),fe.setCapture&&fe.setCapture(),l.prvD(e),l.stpP(e))}}function _r(e){var t=l.page(e),n={};(Ht||Wt)&&(n[Kt]=wr.w+t.x-mr.x),(Ct||Wt)&&(n[$t]=wr.h+t.y-mr.y),ne.css(n),l.stpP(e)}function Br(e){var t=e!==n;G.off(mn,qr).off(dn,_r).off(hn,Br),Wi(ee,cr),fe.releaseCapture&&fe.releaseCapture(),t&&(At&&Mr(),Tt.update(Gt)),At=!1}function qr(e){return l.prvD(e),!1}function Vr(){Zr()}function Xr(){var e={};return L&&ce&&(e.w=di(ce.css(Xt+Kt)),e.h=di(ce.css(Xt+$t)),e.c=Si(e,st),e.f=!0),st=e,e.c||!1}function Yr(e,t){var r=t!==n&&null!==t?t.split(on):Qt,i=e!==n&&null!==e?e.split(on):Qt;if(r===Qt&&i===Qt)return!1;var o,a,s,c,l=hi(i,r),u=!1,h=it!==n&&null!==it?it.split(on):[Qt],d=rt!==n&&null!==rt?rt.split(on):[Qt],v=f.inArray(lr,l),p=l[o];for(v>-1&&l.splice(v,1),o=0;o0&&T&&o-$0?Q:lr)),Xe&&(!0===Ve?(Wr(),v.add(Tt)):null===Ve&&w?(Wr(),v.add(Tt)):(v.remove(Tt),Mr())),_e)if(ke)if(oe===n&&(oe=f(mi(_n)),ae.before(oe)),R)re.show();else{re=f(mi(Bn)),oe.before(re);var ft={w:-1,h:-1};Sr(re,function(){var e={w:re[0][c.oW],h:re[0][c.oH]};Si(e,ft)&&(T&&ze&&e.h>0||Oe&&e.w>0?Zr():(T&&!ze&&0===e.h||!Oe&&0===e.w)&&Zr()),ft=e}),R=!0,null!==S&&re.css($t,S+"(100% + 1px)")}else R&&re.hide();r&&(ie.find("*").trigger(Zt),R&&re.find("*").trigger(Zt));var dt,vt=ne.css("direction"),yt=gi(vt,Te,r),xt=ne.css("box-sizing"),zt=gi(xt,Me,r),At={c:r,t:di(ne.css(It+_t)),r:di(ne.css(It+Bt)),b:di(ne.css(It+qt)),l:di(ne.css(It+Vt))};try{dt=R?re[0].getBoundingClientRect():null}catch(Ii){return}D="border-box"===xt;var kt=(B="rtl"===vt)?Vt:Bt,Lt=B?Bt:Vt,Pt=ne[0],jt=ae[0],Nt=!1,rn=!(!R||"none"===ne.css(Jt))&&(0===Math.round(dt.right-dt.left)&&(!!ve||Pt[c.cW]-j>0));if(ke&&!rn){var an=Pt[c.oW],sn=oe.css(Kt);oe.css(Kt,Gt);var cn=Pt[c.oW];oe.css(Kt,sn),(Nt=an!==cn)||(oe.css(Kt,an+1),cn=Pt[c.oW],oe.css(Kt,sn),Nt=an!==cn)}var hn=(rn||Nt)&&ke&&!s,yn=gi(hn,Oe,r),xn=!hn&&Oe,mn=!(!R||s)&&0===Math.round(dt.bottom-dt.top),wn=gi(mn,ze,r),bn=!mn&&ze,gn="-"+Kt,Sn=hn&&D||!D,On=mn&&D||!D,zn={c:r,t:On?di(ne.css(Ut+_t+gn),!0):0,r:Sn?di(ne.css(Ut+Bt+gn),!0):0,b:On?di(ne.css(Ut+qt+gn),!0):0,l:Sn?di(ne.css(Ut+Vt+gn),!0):0},An={c:r,t:di(ne.css(Ft+_t)),r:di(ne.css(Ft+Bt)),b:di(ne.css(Ft+qt)),l:di(ne.css(Ft+Vt))},Mn={h:String(ne.css(Yt+$t)),w:String(ne.css(Yt+Kt))},Wn={},Pn={},Dn=function(){return{w:Pt[c.cW],h:Pt[c.cH]}},Rn=function(){var e=jt.getBoundingClientRect();return e[Kt]?{w:e[Kt],h:e[$t]}:{w:jt[c.oW],h:jt[c.oH]}};if(j=At.l+At.r,N=At.t+At.b,At.ax=ve?j:0,At.ay=ve?N:0,At.c=Oi(At,We),F=zn.l+zn.r,I=zn.t+zn.b,zn.c=Oi(zn,He),U=An.l+An.r,_=An.t+An.b,An.c=Oi(An,Ce),Mn.ih=di(Mn.h),Mn.iw=di(Mn.w),Mn.ch=Mn.h.indexOf("px")>-1,Mn.cw=Mn.w.indexOf("px")>-1,Mn.c=Si(Mn,Ae,r),Te=vt,Me=xt,Oe=hn,ze=mn,We=At,He=zn,Ce=An,Ae=Mn,yt&&R&&re.css(Jt,Lt),At.c||yt||pe||yn||wn||zt||_e){var jn={},Nn={};ui(Pn,Ft,[-At.t,-At.r,-At.b,-At.l]),ve?(ui(jn,Qt,[At.t,At.r,At.b,At.l]),ui(E?Nn:Wn,It)):(ui(jn,Qt),ui(E?Nn:Wn,It,[At.t,At.r,At.b,At.l])),ae.css(jn),te.css(Nn)}Dt=Rn();var Fn=!!E&&Gr();if(mn&&(wn||pe||zt||Mn.c||At.c||zn.c)?(Mn.cw&&(Wn[Yt+$t]=Mn.ch?Mn.ih-At.ay+(D?-I:N):Qt),Wn[$t]=Gt):(wn||pe)&&(Wn[Yt+$t]=Qt,Wn[$t]=en),hn&&(yn||pe||zt||Mn.c||At.c||zn.c||yt)?(Mn.cw&&(Wn[Yt+Kt]=Mn.cw?Mn.iw-At.ax+(D?-F:j)+(y.y?x.y:0):Qt),Wn[Kt]=Gt,Pn[Yt+Kt]=en):(yn||pe)&&(Wn[Yt+Kt]=Qt,Wn[Kt]=en,Wn[Jt]=Qt,Pn[Yt+Kt]=Qt),hn&&(Mn.cw||(Wn[Yt+Kt]=Qt),Pn[Kt]=E&&$e?Fn.dw:Gt,Wn[Kt]=Gt,Wn[Jt]=Lt),mn&&(Mn.ch||(Wn[Yt+$t]=Qt),Pn[$t]=E?ct?Fn.dh:Gt:le[0][c.cH]),ke&&oe.css(Pn),le.css(Wn),Wn={},Pn={},e||t||yt||zt||pe||yn||hn||wn||mn||Mn.c||qe||Ke||xe||ee||A||Je||ut||de||r){var In="overflow",qn=In+"-x",Vn=In+"-y",Xn="hidden",Yn="visible",Kn=C?y.x||y.y||Dt.w0&&(Pn[Kt]=Math.max(1,Pn[Kt]),Pn[$t]=Math.max(1,Pn[$t])),E&&ue.css(vr),oe.css(Pn)}hn&&(Wn[Kt]=en),!hn||D||ht||(Wn[Jt]="none"),le.css(Wn),Wn={};var pr=Gn.getBoundingClientRect(),yr=pr[Kt]||0,xr=pr[$t]||0,mr={w:Math.max(Gn[c.sW],Zn[c.sW])+di(yr)-yr,h:Math.max(Gn[c.sH],Zn[c.sH])+di(xr)-xr};mr.c=t=Si(mr,we,r),we=mr,Kn&&le.css(In,Qt),Dt=Rn(),e=Si(sr=Dn(),me),me=sr;var wr={x:"v-s"===Ye.x,y:"v-s"===Ye.y},Or={x:"v-h"===Ye.x,y:"v-h"===Ye.y},Hr={x:"s"===Ye.x,y:"s"===Ye.y},Er={x:Math.max(0,Math.round(100*(mr.w-Dt.w))/100),y:Math.max(0,Math.round(100*(mr.h-Dt.h))/100)},Lr=E&&(0===Dt.w||0===Dt.h),Pr=0===se[0].scrollLeftMax&&Er.x>0&&Er.x<1||0===se[0].scrollTopMax&&Er.y>0&&Er.y<1;(Lr||Pr)&&(Er.x=Er.y=0);var Dr={x:Er.x>0,y:Er.y>0},Rr={x:Dr.x,y:Dr.y};(wr.x||Or.x)&&(Rr.x=Dr.y&&!wr.y&&!Or.y),(wr.y||Or.y)&&(Rr.y=Dr.x&&!wr.x&&!Or.x),Rr.xs=!!Rr.x&&(Hr.x||wr.x),Rr.ys=!!Rr.y&&(Hr.y||wr.y);var jr={x:Dr.x&&Rr.xs,y:Dr.y&&Rr.ys},Nr=Re;if(Er.c=Si(Er,Re,tn,nn,r),Re=Er,Dr.c=Si(Dr,ge,tn,nn,r),ge=Dr,Rr.c=Si(Rr,Se,tn,nn,r),Se=Rr,y.x||y.y){var Fr="px solid transparent",Ir={},_r={},Br=r;(Dr.x||Dr.y)&&(_r.w=y.y&&Dr.y?mr.w+x.y:Qt,_r.h=y.x&&Dr.x?mr.h+x.x:Qt,Br=gi(_r,be,r),be=_r),(Dr.c||Rr.c||mr.c||yt||yn||wn||hn||mn||qe)&&(Wn[Ft+Lt]=Wn[Ut+Lt]=Qt,y.x&&Dr.x&&Rr.xs?(Wn[Ft+qt]=mn?Be?Qt:x.x:Qt,Wn[Ut+qt]=mn||Be?Qt:x.x+Fr):(_r.h=Wn[Ft+qt]=Wn[Ut+qt]=Qt,Br=!0),y.y&&Dr.y&&Rr.ys?(Wn[Ft+kt]=hn?Be?Qt:x.y:Qt,Wn[Ut+kt]=Be?Qt:x.y+Fr):(_r.w=Wn[Ft+kt]=Wn[Ut+kt]=Qt,Br=!0)),Be&&(_r.w=_r.h=Qt,Br=!0),Br&&(Ir[Kt]=Rr.y?_r.w:Qt,Ir[$t]=Rr.x?_r.h:Qt,ce||(ce=f(mi(Un)),se.prepend(ce)),ce.css(Ir)),le.css(Wn)}var qr={};jn={};if(e||Dr.c||Rr.c||mr.c||Ke||zt||qe||yt||xe||wn){qr[Lt]=Qt;var Vr=function(){qr[qt]=Qt,Et.h=0},Yr=function(){qr[kt]=Qt,Et.w=0};if(Dr.x&&Rr.xs?(qr[qn]=Zt,Be?Vr():(qr[qt]=-(y.x?x.x:O.x),Et.h=y.x?x.y:0)):(qr[qn]=Qt,Vr()),Dr.y&&Rr.ys?(qr[Vn]=Zt,Be?Yr():(qr[kt]=-(y.y?x.y:O.y),Et.w=y.y?x.x:0)):(qr[Vn]=Qt,Yr()),(Dt.h-1,Fi=ji.y>-1;(Ni||Fi)&&(Fi&&se[un](ji.y),Ni&&(B&&nt&&m.i?se[ln](0):se[ln](ji.x)))}Ue=Hi}else E||(B&&m.i&&y.y&&Dr.x&&nt&&(h.l+=Et.w||0),se[ln](h.l),se[un](h.t));yt&&li("onDirectionChanged",{isRTL:B,dir:vt}),e&&li("onHostSizeChanged",{width:me.w,height:me.h}),t&&li("onContentSizeChanged",{width:we.w,height:we.h}),(Dr.c||Rr.c)&&li("onOverflowChanged",{x:Dr.x,y:Dr.y,xScrollable:Rr.xs,yScrollable:Rr.ys,clipped:Rr.x||Rr.y}),Er.c&&li("onOverflowAmountChanged",{x:Er.x,y:Er.y})}L&&(ge.c||st.c)&&(st.f||Xr(),y.y&&ge.x&&le.css(Xt+Kt,st.w+x.y),y.x&&ge.y&&le.css(Xt+$t,st.h+x.x),st.c=!1),Ar(ie),Ar(re),li("onUpdated",{forced:r})}}function ei(e){Y=Ai(!0,{},Y,A.v(e,A.t,!0)),K=Ai(!0,{},K,A.v(e,A.t,!1,!0))}function ti(){he=f(mi(Kn+on+ar)),de=f(mi($n)),ve=f(mi(Qn)),pe=f(mi(Kn+on+sr)),ye=f(mi($n)),xe=f(mi(Qn)),he.append(de),de.append(ve),pe.append(ye),ye.append(xe),ae.after(pe),ae.after(he),z&&(he.on(wn,function(e){e.target===he[0]&&(oi(!0),ai(!0,se[ln]()))}),pe.on(wn,function(e){e.target===pe[0]&&(oi(!1),ai(!1,se[un]()))})),ni(!0),ni(!1),fe=f(mi(tr)),ne.append(fe)}function ni(e){var t,r,i,o=ci(e),a=Q.top!==Q,s=o.xy,c=o.XY,u=Zt+o.LT,h="active",d=1,v=[16,17];function p(){d=.5}function y(){d=1}function x(e){f.inArray(e.keyCode,v)>-1&&p()}function w(e){f.inArray(e.keyCode,v)>-1&&y()}function g(e){var t=(e.originalEvent||e).touches!==n;return!(q||yi()||!et||t&&!Ot)&&(1===l.mBtn(e)||t)}function S(n){if(g(n)){var i=o.i.tl,f=o.i.hl,h=o.i.ms*(((b&&a?n["screen"+c]:l.page(n)[s])-r)/(i-f));h=isFinite(h)?h:0,B&&e&&!m.i&&(h*=-1),se[u](t+h),W||l.prvD(n)}else O(n)}function O(e){e=e||e.originalEvent,Wi(ee,cr),Wi(o.h,h),Wi(o.t,h),Wi(o.s,h),G.off(dn,S).off(hn,O).off(yn,x).off(xn,w).off(mn,qr),y(),t=n,r=n,i!==n&&(Tt.scrollStop(),clearTimeout(i),i=n);var a=ne[0].getBoundingClientRect();e.clientX>=a.left&&e.clientX<=a.right&&e.clientY>=a.top&&e.clientY<=a.bottom||Tr(),(bt||gt)&&ii(!1)}function z(i){t=(t=se[u]())===n?0:t,(B&&e&&!m.n||!B)&&(t=t<0?0:t),r=b&&a?i["screen"+c]:l.page(i)[s],Mi(ee,cr),Mi(o.h,h),Mi(o.s,h),G.on(dn,S).on(hn,O).on(mn,qr),!b&&P||l.prvD(i),l.stpP(i)}o.h.on(fn,function(e){g(e)&&z(e)}),o.t.on(fn,function(t){if(g(t)){var a,c,f=Dt[o._wh],v=o.t.offset()[o.lt],y=t.ctrlKey,b=t.shiftKey,S=b&&y,A=!0,M="linear",W=function(){if(!k){var l=r-v,h=o.i.tl,p=o.i.ho,y=o.i.hl,x=o.i.ms,w=270*d,g=A?Math.max(400,w):w,O=x*((l-y/2)/(h-y)),H=B&&e&&(!m.i&&!m.n||nt),C=H?pl,T={};b?(O=isFinite(O)?O:0,B&&e&&!m.i&&(O=x-O),S?(T.n=!1,T[s]=O,Tt.scroll(T,130,M,function(){z(t)})):(se[u](O),z(t))):(a=A?C:a,c=H?a?p+y>=l:p<=l:a?p<=l:p+y>=l,T[s]=a?"-="+f:"+="+f,Tt.scrollStop(),Tt.scroll(T,w,M),c?(clearTimeout(i),Tt.scrollStop(),i=n):i=setTimeout(W,g),A=!1)}};y&&p(),r=l.page(t)[s],Mi(ee,cr),Mi(o.t,h),Mi(o.s,h),G.on(hn,O).on(yn,x).on(xn,w).on(mn,qr),W(),l.prvD(t),l.stpP(t)}}).on(vn,function(){(bt||gt)&&(zt=!0,ii(!0))}).on(pn,function(){(bt||gt)&&(zt=!1,ii(!1))}),o.s.on(fn,function(e){l.stpP(e)})}function ri(e,t,n){var r=e?An:Mn,i=e?he:pe;t?Wi(ne,r):Mi(ne,r),n?Wi(i,Zn):Mi(i,Zn)}function ii(e,t){if(clearTimeout(yt),e)Wi(he,er),Wi(pe,er);else{var n="active",r=function(){if(!zt&&!k){var e=ve.hasClass(n)||xe.hasClass(n);!e&&(bt||gt||St)&&Mi(he,er),!e&&(bt||gt||St)&&Mi(pe,er)}};mt>0&&!0!==t?yt=setTimeout(r,mt):r()}}function oi(e){var t={},n=ci(e),r=1e6,i=Math.min(1,(me[n._wh]-(Ee?e?j:N:0))/we[n._wh]);t[n.wh]=Math.floor(100*i*r)/r+"%",yi()||n.h.css(t),n.i.hl=n.h[0]["offset"+n.WH],n.i.hlr=i}function ai(e,t){var n,r,i,o=B&&e,a={},s=ci(e),c="translate(",l="transform",u=se[0][Zt+s.WH]-se[0]["client"+s.WH],f=s.i.hl,h=s.t[0]["offset"+s.WH],d=h-f;m.n&&o&&(u*=-1),i=t/u,i=isNaN(i)?0:Math.min(1,i),s.i.ms=u,s.i.cs=t,s.i.csr=i,d*=i,d=isNaN(d)?0:d,o&&!m.i&&(d=h-f-d),d=Math.max(0,d),M?(r=o?-(h-f-d):d,n=e?c+r+"px, 0)":c+"0, "+r+"px)",a["-webkit-"+l]=n,a["-moz-"+l]=n,a["-ms-"+l]=n,a["-o-"+l]=n,a[l]=n):a[s.lt]=d,yi()||s.h.css(a),s.i.ho=d,s.i.tl=h}function si(e,t){var n=t?"removeClass":"addClass",r=e?ye:xe,i=e?Jn:Gn;(e?de:ve)[n](i),r[n](i)}function ci(e){return{wh:e?Kt:$t,WH:e?"Width":"Height",lt:e?Vt:_t,LT:e?"Left":"Top",xy:e?tn:nn,XY:e?"X":"Y",_wh:e?"w":"h",_lt:e?"l":"t",t:e?de:ye,h:e?ve:xe,s:e?he:pe,i:e?Lt:Pt}}function li(e,t){if(T){var n,r=K.callbacks[e],i=e;"on"===i.substr(0,2)&&(i=i.substr(2,1).toLowerCase()+i.substr(3)),zi(r)==s.f&&r.call(Tt,t),f.each(ur,function(){zi((n=this).on)==s.f&&n.on(i,t)})}}function ui(e,t,r){r===n&&(r=[Qt,Qt,Qt,Qt]),e[t+_t]=r[0],e[t+Bt]=r[1],e[t+qt]=r[2],e[t+Vt]=r[3]}function fi(t){var n="ownerDocument",r="HTMLElement",i=t&&t[n]&&t[n].parentWindow||e;return typeof i[r]==s.o?t instanceof i[r]:t&&typeof t==s.o&&null!==t&&1===t.nodeType&&typeof t.nodeName==s.s}function hi(e,t){var n,r,i=[],o=[];for(n=0;nf&&(u=r+1,f=t);return{cR:h,cC:d,r:c,c:f,w:u,p:e,m:a}}}function pi(e){for(var t=0;t"+(t||Qt)+""}function wi(e,t){for(var n,r=t.split(rn),i=0;i9||!w?te.on("input",Pr):te.on(yn,Dr).on(xn,Rr)}else Mi(te,On),(ne=te).wrapInner(mi(In)).wrapInner(mi(jn)).wrapInner(mi(Rn)),le=Ci(ne,rn+In),se=Ci(ne,rn+jn),ae=Ci(ne,rn+Rn),le.on(wn,function(e){!0!==Ne&&Qr((e=e.originalEvent||e).propertyName)&&Zr(Gt)});if(ti(),W?br(se,Zt,Er):se.on(Zt,Er),g&&Mi(se,y.x&&y.y?Fn:Nn),dt){var a,u,h,v,p,A,D=l.mO(),R=l.now();ut=new D(function(e){if(T&&!q){var t,n=!1;f.each(e,function(){if(a=(t=this).target,u=t.attributeName,n=u===c.c?Yr(t.oldValue,a.className):u!==c.s||t.oldValue!==a[c.s].cssText)return!1}),n&&Tt.update(Gt)}}),ft=new D(function(e){if(T&&!q){var t=!1;f.each(e,function(){return!(t=Kr(this))}),t&&(v=l.now(),p=ze||Oe,A=function(){k||(R=v,E&&Gr(),p?Zr():Tt.update(Gt))},clearTimeout(h),pr<=0||v-R>pr||!p?A():h=setTimeout(A,pr))}})}return L&&(Mi(Z,Sn),se[ln](i.l),se[un](i.t)),ie=f(mi("os-resize-observer-host")),ne.prepend(ie),Sr(ie,Hr),Hr(),Tt.update(Gt),setTimeout(function(){z&&!k&&Mi(ne,Wn)},333),T=!0,li("onInitialized"),zi(r)==s.s&&(r=[r]),l.isA(r)?f.each(r,function(){Tt.addExt(this)}):f.isPlainObject(r)&&f.each(r,function(e,t){Tt.addExt(e,t)}),T}}return e[a]=function(t,o,s){if(0===arguments.length)return this;M();var c,l,u=[];return f.isPlainObject(o)?t&&t.length?(f.each(t,function(){(c=this)!==n&&u.push(C(c,o,s,r,i))}),l=u.length>1?u:u[0]):l=C(t,o,s,r,i):t&&(t.length&&t.length>0?(f.each(t,function(){c=h(this),"!"===o?c instanceof e[a]&&u.push(c):u.push(c)}),l=u.length>1?u:u[0]):l=h(t)),l},e[a].globals=function(){M();var e=f.extend(!0,{},r);return delete e.msie,e},e[a].defaultOptions=function(e){M();var t=r.defaultOptions;if(e===n)return f.extend(!0,{},t);r.defaultOptions=f.extend(!0,{},t,A.v(e,A.t,!0))},e[a].extension=function(e,t,n){var r=l.type(e)==s.s,i=arguments[c.l],o=0;if(i<1||!r)return f.extend(!0,{length:z[c.l]},z);if(r)if(l.type(t)==s.f)z.push({name:e,extension:t,defaultOptions:n});else for(;o1))return f.extend(!0,{},z[o]);z.splice(o,1)}},e[a]}();return u&&u.fn&&(u.fn.overlayScrollbars=function(e,t){var n=this;return u.isPlainObject(e)?(u.each(n,function(){d(this,e,t)}),n):d(n,e)}),d}); \ No newline at end of file +!function(e,t){"function"==typeof define&&define.amd?define(["jquery"],function(n){return t(e,e.document,undefined,n)}):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(e,e.document,undefined,require("jquery")):t(e,e.document,undefined,e.jQuery)}("undefined"!=typeof window?window:this,function(e,t,n,r){"use strict";var i,o,a="OverlayScrollbars",s={o:"object",f:"function",a:"array",s:"string",b:"boolean",n:"number",u:"undefined",z:"null"},c={c:"class",s:"style",i:"id",l:"length",p:"prototype",oH:"offsetHeight",cH:"clientHeight",sH:"scrollHeight",oW:"offsetWidth",cW:"clientWidth",sW:"scrollWidth"},l={wW:function(){return e.innerWidth||t.documentElement[c.cW]||t.body[c.cW]},wH:function(){return e.innerHeight||t.documentElement[c.cH]||t.body[c.cH]},mO:function(){return e.MutationObserver||e.WebKitMutationObserver||e.WebkitMutationObserver||e.MozMutationObserver||n},rO:function(){return e.ResizeObserver||e.WebKitResizeObserver||e.WebkitResizeObserver||e.MozResizeObserver||n},rAF:function(){return e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t){return e.setTimeout(t,1e3/60)}},cAF:function(){return e.cancelAnimationFrame||e.webkitCancelAnimationFrame||e.mozCancelAnimationFrame||e.oCancelAnimationFrame||e.msCancelAnimationFrame||function(t){return e.clearTimeout(t)}},now:function(){return Date.now()||(new Date).getTime()},stpP:function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},prvD:function(e){e.preventDefault&&e.cancelable?e.preventDefault():e.returnValue=!1},page:function(e){var r="page",i="client",o="X",a="Y",s=((e=e.originalEvent||e).target||e.srcElement||t).ownerDocument||t,c=s.documentElement,l=s.body;if(e.touches!==n){var u=e.touches[0];return{x:u[r+o],y:u[r+a]}}return!e[r+o]&&e[i+o]&&null!=e[i+o]?{x:e[i+o]+(c&&c.scrollLeft||l&&l.scrollLeft||0)-(c&&c.clientLeft||l&&l.clientLeft||0),y:e[i+a]+(c&&c.scrollTop||l&&l.scrollTop||0)-(c&&c.clientTop||l&&l.clientTop||0)}:{x:e[r+o],y:e[r+a]}},mBtn:function(e){var t=e.button;return e.which||t===n?e.which:1&t?1:2&t?3:4&t?2:0},inA:function(e,t){for(var n=0;n-1){if(!(n>1))return i[r][o];delete e[o],i.splice(r,1)}}}),v=function(){var r,i,o,v,p,y,x,m,w,b,g,S,O,z,A=[],W=(o=[s.b,s.n,s.s,s.a,s.o,s.f,s.z],v=" ",p=":",y=[s.z,s.s],x=s.n,m=[s.z,s.b],w=[!0,s.b],b=[!1,s.b],g=[null,[s.z,s.f]],O={className:["os-theme-dark",y],resize:["none","n:none b:both h:horizontal v:vertical"],sizeAutoCapable:w,clipAlways:w,normalizeRTL:w,paddingAbsolute:b,autoUpdate:[null,m],autoUpdateInterval:[33,x],nativeScrollbarsOverlaid:{showNativeScrollbars:b,initialize:w},overflowBehavior:{x:["scroll",S="v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden"],y:["scroll",S]},scrollbars:{visibility:["auto","v:visible h:hidden a:auto"],autoHide:["never","n:never s:scroll l:leave m:move"],autoHideDelay:[800,x],dragScrolling:w,clickScrolling:b,touchSupport:w},textarea:{dynWidth:b,dynHeight:b,inheritedAttrs:[["style","class"],[s.s,s.a,s.z]]},callbacks:{onInitialized:g,onInitializationWithdrawn:g,onDestroyed:g,onScrollStart:g,onScroll:g,onScrollStop:g,onOverflowChanged:g,onOverflowAmountChanged:g,onDirectionChanged:g,onContentSizeChanged:g,onHostSizeChanged:g,onUpdated:g}},{d:(z=function(e){var t=function(n){var r,i,o;for(r in n)n.hasOwnProperty(r)&&(i=n[r],(o=l.type(i))==s.a?n[r]=i[e?1:0]:o==s.o&&(n[r]=t(i)));return n};return t(d.extend(!0,{},O))})(),t:z(!0),v:function(t,n,r,i,a){var c={},u=d.extend(!0,{},t),f=function(e,t,n,a){for(var c in t)if(t.hasOwnProperty(c)&&e.hasOwnProperty(c)){var u,h,y,x,m,w,b,g,S=!1,O=t[c],z=l.type(O),A=l.type(O)!=s.a?[O]:O,W=e[c],C=l.type(W),H=a?a+".":"",T='The option "'+H+c+"\" wasn't set, because",k=[],L=[];if(z==s.o)n[c]={},f(W,O,n[c],H+c),d.isEmptyObject(W)&&delete e[c];else{for(w=0;w0?"\r\nValid strings are: [ "+L.join(", ").split(p).join(", ")+" ].":"")),delete e[c]}}};return f(u,n,c),a?d.extend(!0,c,u):!d.isEmptyObject(u)&&r&&console.warn("The following options are discarded due to invalidity:\r\n"+e.JSON.stringify(u,null,2)),c}});function C(){r||(r=new H(W.d)),i||(i=new T(r))}function H(r){var i=this,o="overflow",a="hidden",s="scroll",f=d("body"),v=d('
'),p=v[0],y=d(v.children("div").eq(0));f.append(v),v.hide().show();var x,m,w,b,g,S,O,z,A,W=T(p),C={x:0===W.x,y:0===W.y};function H(e){var r=!1,i="Webkit Moz ms O".split(" "),o=t.createElement("div"),a=null,s=0;if(e=e.toLowerCase(),o[c.s][e]!==n&&(r=!0),!r)for(a=e.charAt(0).toUpperCase()+e.substr(1);s0?x=A(m[b](g+5,m[w](".",g)),10):S>0?x=A(m[b](z+3,m[w](".",z)),10):O>0&&(x=A(m[b](O+5,m[w](".",O)),10)),x),cssCalc:function(){var e,n,r=t.createElement("div"),i=["calc","-webkit-calc","-moz-calc","-o-calc"];for(e=0;e0){var e=l.wW(),a=l.wH(),p=e-n,y=a-r;if(0===p&&0===y)return;var x,m=u.round(e/(n/100)),w=u.round(a/(r/100)),b=t(p),g=t(y),S=t(m),O=t(w),z=c(),A=b>2&&g>2,W=!s(S,O),C=A&&W&&(z!==o&&o>0),H=i.nativeScrollbarSize;C&&(f.append(v),x=i.nativeScrollbarSize=T(v[0]),v.remove(),H.x===x.x&&H.y===x.y||d.each(h(),function(){h(this)&&h(this).update("zoom")})),n=e,r=a,o=z}};d(e).on("resize",a)}function s(e,n){var r=t(e),i=t(n);return!(r===i||r+1===i||r-1===i)}function c(){var t=e.screen.deviceXDPI||0,n=e.screen.logicalXDPI||1;return e.devicePixelRatio||t/n}}()}function T(e){var t,r=this,i="autoUpdate",o=i+"Interval",a=c.l,s=[],f=[],h=!1,v=33,p=v,y=l.now(),x=function(){if(s[a]>0&&h){t=l.rAF()(function(){x()});var e=l.now(),r=e-y;if(r>p){y=e-r%p;for(var c=v,d=0;dg&&(m.update("auto"),f[d]=new Date(S+=g)),c=u.max(1,u.min(c,g))}}p=c}}else p=v};r.add=function(t){-1===d.inArray(t,s)&&(s.push(t),f.push(l.now()),s[a]>0&&!h&&(h=!0,e.autoUpdateLoop=h,x()))},r.remove=function(r){var i=d.inArray(r,s);i>-1&&(f.splice(i,1),s.splice(i,1),0===s[a]&&h&&(h=!1,e.autoUpdateLoop=h,t!==n&&(l.cAF()(t),t=-1)))}}function k(r,i,o,v,p){if(ti(r)){if(h(r)){var y=h(r);return y.options(i),y}var x,m,w,b,g,S,O,z,A,C,H,T,k,L,E,P,R,D,j,F,N,I,M,U,_,B,q,V,X,Y,K,$,J,Q,G,Z,ee,te,ne,re,ie,oe,ae,se,ce,le,ue,fe,de,he,ve,pe,ye,xe,me,we,be,ge,Se,Oe,ze,Ae,We,Ce,He,Te,ke,Le,Ee,Pe,Re,De,je,Fe,Ne,Ie,Me,Ue,_e,Be,qe,Ve,Xe,Ye,Ke,$e,Je,Qe,Ge,Ze,et,tt,nt,rt,it,ot,at,st,ct,lt,ut,ft,dt,ht,vt,pt,yt,xt,mt,wt,bt,gt,St,Ot,zt,At,Wt,Ct,Ht,Tt,kt,Lt=new e[a],Et=d[c.p],Pt={},Rt={},Dt={},jt={},Ft={},Nt="-hidden",It="margin-",Mt="padding-",Ut="border-",_t="top",Bt="right",qt="bottom",Vt="left",Xt="min-",Yt="max-",Kt="width",$t="height",Jt="float",Qt="",Gt="auto",Zt="scroll",en="100%",tn="x",nn="y",rn=".",on=" ",an="scrollbar",sn="-horizontal",cn="-vertical",ln=Zt+"Left",un=Zt+"Top",fn="mousedown touchstart",dn="mouseup touchend touchcancel",hn="mousemove touchmove",vn="mouseenter",pn="mouseleave",yn="keydown",xn="keyup",mn="selectstart",wn="transitionend webkitTransitionEnd oTransitionEnd",bn="__overlayScrollbarsRO__",gn="os-",Sn=gn+"html",On=gn+"host",zn=On+"-textarea",An=On+"-"+an+sn+Nt,Wn=On+"-"+an+cn+Nt,Cn=On+"-transition",Hn=On+"-rtl",Tn=On+"-resize-disabled",kn=On+"-scrolling",Ln=On+"-overflow",En=Ln+"-x",Pn=Ln+"-y",Rn=gn+"textarea",Dn=Rn+"-cover",jn=gn+"padding",Fn=gn+"viewport",Nn=Fn+"-native-scrollbars-invisible",In=Fn+"-native-scrollbars-overlaid",Mn=gn+"content",Un=gn+"content-arrange",_n=gn+"content-glue",Bn=gn+"size-auto-observer",qn=gn+"resize-observer",Vn=gn+"resize-observer-item",Xn=Vn+"-final",Yn=gn+"text-inherit",Kn=gn+an,$n=Kn+"-track",Jn=$n+"-off",Qn=Kn+"-handle",Gn=Qn+"-off",Zn=Kn+"-unusable",er=Kn+"-"+Gt+Nt,tr=Kn+"-corner",nr=tr+"-resize",rr=nr+"-both",ir=nr+sn,or=nr+cn,ar=Kn+sn,sr=Kn+cn,cr=gn+"dragging",lr=gn+"theme-none",ur=[],fr={},dr="added removed on contract",hr={},vr=42,pr=[];if(Lt.sleep=function(){X=!0},Lt.update=function(e){var t,n,r=hi(e)==s.s,i="img",o="load";r?0===e.indexOf(Gt)?(t=jr(),n=Dr(),(t||n)&&Ir(!1,n,!1,"+"==e.slice(-1))):"zoom"===e&&Ir(!0,!0):(e=X||e,X=!1,Ir(!1,!1,e,!0)),R||ue.find(i).each(function(e,t){-1===l.inA(t,pr)&&d(t).off(o,Lr).on(o,Lr)})},Lt.options=function(e,t){if(d.isEmptyObject(e)||!d.isPlainObject(e)){if(hi(e)==s.s){if(arguments.length>1){var n={};return li(n,e,t),Mr(n),void Ir()}return ci(K,e)}return K}Mr(e);var r=X||!1;X=!1,Ir(),X=r},Lt.destroy=function(){for(var e in P=!0,p.remove(Lt),zr(),wr(oe),N&&wr(ie),fr)Lt.removeExt(e);Tr(!0),_r(!0),ae&&xi(ae),le&&xi(le),N&&xi(ie),Br(!0),Qr(!0),Ur(!0);for(var t=0;t2){var m=t.substr(0,2);for(x=0;x/g,(v?"-":Qt)+en))[p](/px/g,Qt))[p](/%/g,d+f*(h&&w.n?-1:1)/100))[p](/vw/g,d+jt.w))[p](/vh/g,d+jt.h)),!0).toFixed())}else i=t;if(i!==n&&!isNaN(i)&&hi(i)==s.n){var b=H&&h,g=l*(b&&w.n?-1:1),S=b&&w.i,O=b&&w.n;switch(g=S?f-g:g,r){case"+=":a=g+i;break;case"-=":a=g-i;break;case"*=":a=g*i;break;case"/=":a=g/i;break;default:a=i}a=S?f-a:a,a*=O?-1:1,a=h&&w.n?u.min(0,u.max(f,a)):u.max(0,u.min(f,a))}return a===l?n:a},ne=function(e,t,n,r){var i,o,a=[n,n],c=hi(e);if(c==t)e=[e,e];else if(c==s.a){if((i=e[B])>2||i<1)e=a;else for(1===i&&(e[1]=n),x=0;x=4?re(oe):fe:de==s.o?re([oe[_t],oe[Bt],oe[qt],oe[Vt]]):fe,S=Z(ae,q)?ae:"xy",O=ne(le,s.s,M,Y),z=ne(ue,s.s,F,X),A=oe;var he={l:Rt.cs,t:Dt.cs},ve=se.offset(),pe=W.offset(),ye={x:O.x==U||S==nn,y:O.y==U||S==tn};pe[_t]-=A[0],pe[Vt]-=A[3];var xe={x:u.round(pe[Vt]-ve[Vt]+he.l),y:u.round(pe[_t]-ve[_t]+he.t)};if(V&&(w.n||w.i||(xe.x=u.round(ve[Vt]-pe[Vt]+he.l)),w.n&&H&&(xe.x*=-1),w.i&&H&&(xe.x=u.round(ve[Vt]-pe[Vt]+(Rt.ms-he.l)))),z.x!=F||z.y!=F||O.x==_||O.y==_||V){var me=W[0],we=C?me.getBoundingClientRect():{width:me[c.oW],height:me[c.oH]},be={w:we[Kt]+A[3]+A[1],h:we[$t]+A[0]+A[2]},ge=function(e){var t=Jr(e),n=t._wh,r=t.lt,i=t.xy,o=z[i]==(e&&V?F:j),a=z[i]==N,s=z[i]==I,c=O[i]==U,l=O[i]==_,u=jt[n],f=ve[r],d=be[n],h=pe[r],v=a?2:1,p=h+d/2,y=f+u/2,x=d<=u&&h>=f&&h+d<=f+u;c?ye[i]=!0:ye[i]||((s||l)&&(ye[i]=!!l&&x,o=dy:p0||E)?E?(t.complete=G,ce.animate(R,t)):(g={duration:t,complete:G},hi(r)==s.a||d.isPlainObject(r)?(D[ln]=r[0]||r.x,D[un]=r[1]||r.y,g.specialEasing=D):g.easing=r,ce.animate(R,g)):(m&&ce[ln](R[ln]),b&&ce[un](R[un]))},Lt.scrollStop=function(e,t,n){return ce.stop(e,t,n),Lt},Lt.getElements=function(e){var t={target:ne[0],host:re[0],padding:se[0],viewport:ce[0],content:ue[0],scrollbarHorizontal:{scrollbar:he[0],track:ve[0],handle:pe[0]},scrollbarVertical:{scrollbar:ye[0],track:xe[0],handle:me[0]},scrollbarCorner:de[0]};return hi(e)==s.s?ci(t,e):t},Lt.getState=function(e){var t=function(e){if(!d.isPlainObject(e))return e;var t=vi(!0,{},e),n=function(e,n){t.hasOwnProperty(e)&&(t[n]=t[e],delete t[e])};return n("w",Kt),n("h",$t),delete t.c,t},n={sleeping:t(X)||!1,autoUpdate:t(!ht),widthAuto:t(ze),heightAuto:t(Ae),padding:t(He),overflowAmount:t(Fe),hideOverflow:t(Oe),hasOverflow:t(Se),contentScrollSize:t(be),viewportSize:t(jt),hostSize:t(we),documentMixed:t(j)};return hi(e)==s.s?ci(n,e):n},Lt.ext=function(e){var t,n=dr.split(" "),r=0;if(hi(e)==s.s){if(fr.hasOwnProperty(e))for(t=vi(!0,{},fr[e]);r9||!b){e.prepend(si(qn,si({className:Vn,dir:"ltr"},si(Vn,si(Xn))+si(Vn,si({className:Xn,style:"width: 200%; height: 200%"})))));var h,p,y,x,m=e[0][a][0][a][0],S=d(m[a][1]),O=d(m[a][0]),z=d(O[0][a][0]),A=m[c.oW],W=m[c.oH],C=2,H=v.nativeScrollbarSize,k=function(){O[ln](r)[un](r),S[ln](r)[un](r)},L=function(){p=0,h&&(A=y,W=x,u())},E=function(e){return y=m[c.oW],x=m[c.oH],h=y!=A||x!=W,e&&h&&!p?(l.cAF()(p),p=l.rAF()(L)):e||L(),k(),e&&(l.prvD(e),l.stpP(e)),!1},P={},R={};R[_t]=-(H.y+1)*C,R[Bt]=H.x*-C,R[qt]=H.y*-C,R[Vt]=-(H.x+1)*C,d(m).css(R),O.on(Zt,E),S.on(Zt,E),e.on(o,function(){E(!1)}),P[Kt]=r,P[$t]=r,z.css(P),k()}else{var D=Z[0],j=D.attachEvent,F=g!==n;if(j)e.prepend(si(qn)),mi(e,rn+qn)[0].attachEvent("onresize",u);else{var N=D.createElement(s.o);N.setAttribute("tabindex","-1"),N.setAttribute(c.c,qn),N.onload=function(){var e=this.contentDocument.defaultView;e.addEventListener("resize",u),e.document.documentElement.style.display="none"},N.type="text/html",F&&e.prepend(N),N.data="about:blank",F||e.prepend(N),e.on(o,u)}}if(e[0]===oe[0]){var I=function(){var t=re.css("direction"),n={},i=0,o=!1;return t!==Ee&&("ltr"===t?(n[Vt]=0,n[Bt]=Gt,i=r):(n[Vt]=Gt,n[Bt]=0,i=w.n?-r:w.i?0:r),oe.children().eq(0).css(n),e[ln](i)[un](r),Ee=t,o=!0),o};I(),e.on(Zt,function(e){return I()&&Ir(),l.prvD(e),l.stpP(e),!1})}}function wr(e){if(T){var t=e.contents()[0];t[bn].disconnect(),delete t[bn]}else xi(e.children(rn+qn).eq(0))}function br(e){}function gr(e){}function Sr(){if(k){var e,t,n,r,i,o,a=11,s=l.mO(),u=l.now();ft=new s(function(n){if(E&&!X){var r,i=!1;d.each(n,function(){if(e=(r=this).target,t=r.attributeName,i=t===c.c?Pr(r.oldValue,e.className):t!==c.s||r.oldValue!==e[c.s].cssText)return!1}),i&&Lt.update(Gt)}}),dt=new s(function(e){if(E&&!X){var t=!1;d.each(e,function(){return!(t=Rr(this))}),t&&(r=l.now(),i=Ae||ze,o=function(){P||(u=r,R&&Nr(),i?Ir():Lt.update(Gt))},clearTimeout(n),a<=0||r-u>a||!i?o():n=setTimeout(o,a))}})}}function Or(){k&&!ht&&(ft.observe(re[0],{attributes:!0,attributeOldValue:!0,attributeFilter:[c.i,c.c,c.s]}),dt.observe(R?ne[0]:ue[0],{attributes:!0,attributeOldValue:!0,subtree:!R,childList:!R,characterData:!R,attributeFilter:R?["wrap","cols","rows"]:[c.i,c.c,c.s]}),ht=!0)}function zr(){k&&ht&&(ft.disconnect(),dt.disconnect(),ht=!1)}function Ar(){if(!X){var e=oe[0],t={w:e[c.sW],h:e[c.sH]};if(E){var n=fi(t,Qe);Qe=t,n&&Ir(!0,!1)}else Qe=t}}function Wr(){St&&Xr(!0)}function Cr(){St&&!te.hasClass(cr)&&Xr(!1)}function Hr(){gt&&(Xr(!0),clearTimeout(xt),xt=setTimeout(function(){gt&&!P&&Xr(!1)},100))}function Tr(e){var t=e?xr:yr,n=e?"off":"on",r=function(e,r,i){H?t(e,r,i):e[n](r,i)};gt&&!e?r(re,hn,Hr):(e&&r(re,hn,Hr),r(re,vn,Wr),r(re,pn,Cr)),E||e||re.one("mouseover",Wr)}function kr(e){return l.prvD(e),!1}function Lr(){Ir()}function Er(){var e={};return D&&le&&(e.w=ri(le.css(Xt+Kt)),e.h=ri(le.css(Xt+$t)),e.c=fi(e,ct),e.f=!0),ct=e,e.c||!1}function Pr(e,t){var r=t!==n&&null!==t?t.split(on):Qt,i=e!==n&&null!==e?e.split(on):Qt;if(r===Qt&&i===Qt)return!1;var o,a,s,c,l,u=ni(i,r),f=!1,h=ot!==n&&null!==ot?ot.split(on):[Qt],v=it!==n&&null!==it?it.split(on):[Qt],p=d.inArray(lr,u);for(p>-1&&u.splice(p,1),a=0;a0&&E&&o-J0?K:lr)),Xe&&(!0===Ve?(zr(),p.add(Lt)):null===Ve&&b?(zr(),p.add(Lt)):(p.remove(Lt),Or())),Ee)if(me)if(ae===n&&(ae=d(si(_n)),se.before(ae)),N)ie.show();else{ie=d(si(Bn)),ae.before(ie);var ft={w:-1,h:-1};mr(ie,function(){var e={w:ie[0][c.oW],h:ie[0][c.oH]};fi(e,ft)&&(E&&Ae&&e.h>0||ze&&e.w>0?Ir():(E&&!Ae&&0===e.h||!ze&&0===e.w)&&Ir()),ft=e}),N=!0,null!==O&&ie.css($t,O+"(100% + 1px)")}else N&&ie.hide();r&&(oe.find("*").trigger(Zt),N&&ie.find("*").trigger(Zt));var dt,vt=re.css("direction"),yt=ui(vt,Le,r),xt=re.css("box-sizing"),zt=ui(xt,Ce,r),At={c:r,t:ri(re.css(Mt+_t)),r:ri(re.css(Mt+Bt)),b:ri(re.css(Mt+qt)),l:ri(re.css(Mt+Vt))};try{dt=N?ie[0].getBoundingClientRect():null}catch(ki){return}F="border-box"===xt;var Et=(V="rtl"===vt)?Vt:Bt,Rt=V?Bt:Vt,Dt=re[0],Nt=se[0],rn=!1,an=!(!N||"none"===re.css(Jt))&&(0===u.round(dt.right-dt.left)&&(!!ve||Dt[c.cW]-I>0));if(me&&!an){var sn=Dt[c.oW],cn=ae.css(Kt);ae.css(Kt,Gt);var dn=Dt[c.oW];ae.css(Kt,cn),(rn=sn!==dn)||(ae.css(Kt,sn+1),dn=Dt[c.oW],ae.css(Kt,cn),rn=sn!==dn)}var hn=(an||rn)&&me&&!s,vn=ui(hn,ze,r),pn=!hn&&ze,yn=!(!N||s)&&0===u.round(dt.bottom-dt.top),xn=ui(yn,Ae,r),mn=!yn&&Ae,wn="-"+Kt,bn=hn&&F||!F,gn=yn&&F||!F,Sn={c:r,t:gn?ri(re.css(Ut+_t+wn),!0):0,r:bn?ri(re.css(Ut+Bt+wn),!0):0,b:gn?ri(re.css(Ut+qt+wn),!0):0,l:bn?ri(re.css(Ut+Vt+wn),!0):0},On={c:r,t:ri(re.css(It+_t)),r:ri(re.css(It+Bt)),b:ri(re.css(It+qt)),l:ri(re.css(It+Vt))},zn={h:String(re.css(Yt+$t)),w:String(re.css(Yt+Kt))},An={},Wn={},Cn=function(){return{w:Dt[c.cW],h:Dt[c.cH]}},Rn=function(){var e=Nt.getBoundingClientRect();return e[Kt]?{w:e[Kt],h:e[$t]}:{w:Nt[c.oW],h:Nt[c.oH]}};if(I=At.l+At.r,M=At.t+At.b,At.ax=ve?I:0,At.ay=ve?M:0,At.c=di(At,He),U=Sn.l+Sn.r,_=Sn.t+Sn.b,Sn.c=di(Sn,Te),B=On.l+On.r,q=On.t+On.b,On.c=di(On,ke),zn.ih=ri(zn.h),zn.iw=ri(zn.w),zn.ch=zn.h.indexOf("px")>-1,zn.cw=zn.w.indexOf("px")>-1,zn.c=fi(zn,We,r),Le=vt,Ce=xt,ze=hn,Ae=yn,He=At,Te=Sn,ke=On,We=zn,yt&&N&&ie.css(Jt,Rt),At.c||yt||pe||vn||xn||zt||Ee){var Dn={},jn={};ei(Wn,It,[-At.t,-At.r,-At.b,-At.l]),ve?(ei(Dn,Qt,[At.t,At.r,At.b,At.l]),ei(R?jn:An,Mt)):(ei(Dn,Qt),ei(R?jn:An,Mt,[At.t,At.r,At.b,At.l])),se.css(Dn),ne.css(jn)}jt=Rn();var Fn=!!R&&Nr();if(yn&&(xn||pe||zt||zn.c||At.c||Sn.c)?(zn.cw&&(An[Yt+$t]=zn.ch?zn.ih-At.ay+(F?-_:M):Qt),An[$t]=Gt):(xn||pe)&&(An[Yt+$t]=Qt,An[$t]=en),hn&&(vn||pe||zt||zn.c||At.c||Sn.c||yt)?(zn.cw&&(An[Yt+Kt]=zn.cw?zn.iw-At.ax+(F?-U:I)+(x.y?m.y:0):Qt),An[Kt]=Gt,Wn[Yt+Kt]=en):(vn||pe)&&(An[Yt+Kt]=Qt,An[Kt]=en,An[Jt]=Qt,Wn[Yt+Kt]=Qt),hn&&(zn.cw||(An[Yt+Kt]=Qt),Wn[Kt]=R&&$e?Fn.dw:Gt,An[Kt]=Gt,An[Jt]=Rt),yn&&(zn.ch||(An[Yt+$t]=Qt),Wn[$t]=R?Qe?Fn.dh:Gt:ue[0][c.cH]),me&&ae.css(Wn),ue.css(An),An={},Wn={},e||t||yt||zt||pe||vn||hn||xn||yn||zn.c||qe||Ke||xe||ee||W||Je||lt||he||r){var Nn="overflow",In=Nn+"-x",Mn=Nn+"-y",qn="hidden",Vn="visible",Xn=L?x.x||x.y||jt.w0&&(Wn[Kt]=u.max(1,Wn[Kt]),Wn[$t]=u.max(1,Wn[$t])),R&&fe.css(ur),ae.css(Wn)}hn&&(An[Kt]=en),!hn||F||ht||(An[Jt]="none"),ue.css(An),An={};var fr=Jn.getBoundingClientRect(),dr=fr[Kt]||0,pr=fr[$t]||0,yr={w:u.max(Jn[c.sW],Qn[c.sW])+ri(dr)-dr,h:u.max(Jn[c.sH],Qn[c.sH])+ri(pr)-pr};yr.c=t=fi(yr,be,r),be=yr,Xn&&ue.css(Nn,Qt),jt=Rn(),e=fi(tr=Cn(),we),we=tr;var xr={x:"v-s"===Ye.x,y:"v-s"===Ye.y},wr={x:"v-h"===Ye.x,y:"v-h"===Ye.y},Sr={x:"s"===Ye.x,y:"s"===Ye.y},Ar={x:u.max(0,u.round(100*(yr.w-jt.w))/100),y:u.max(0,u.round(100*(yr.h-jt.h))/100)},Wr=R&&(0===jt.w||0===jt.h),Cr=0===ce[0].scrollLeftMax&&Ar.x>0&&Ar.x<1||0===ce[0].scrollTopMax&&Ar.y>0&&Ar.y<1;(Wr||Cr)&&(Ar.x=Ar.y=0);var Hr={x:Ar.x>0,y:Ar.y>0},kr={x:Hr.x,y:Hr.y};(xr.x||wr.x)&&(kr.x=Hr.y&&!xr.y&&!wr.y),(xr.y||wr.y)&&(kr.y=Hr.x&&!xr.x&&!wr.x),kr.xs=!!kr.x&&(Sr.x||xr.x),kr.ys=!!kr.y&&(Sr.y||xr.y);var Lr={x:Hr.x&&kr.xs,y:Hr.y&&kr.ys},Pr=Fe;if(Ar.c=fi(Ar,Fe,tn,nn,r),Fe=Ar,Hr.c=fi(Hr,Se,tn,nn,r),Se=Hr,kr.c=fi(kr,Oe,tn,nn,r),Oe=kr,x.x||x.y){var Rr="px solid transparent",Dr={},jr={},Fr=r;(Hr.x||Hr.y)&&(jr.w=x.y&&Hr.y?yr.w+m.y:Qt,jr.h=x.x&&Hr.x?yr.h+m.x:Qt,Fr=ui(jr,ge,r),ge=jr),(Hr.c||kr.c||yr.c||yt||vn||xn||hn||yn||qe)&&(An[It+Rt]=An[Ut+Rt]=Qt,x.x&&Hr.x&&kr.xs?(An[It+qt]=yn?Be?Qt:m.x:Qt,An[Ut+qt]=yn||Be?Qt:m.x+Rr):(jr.h=An[It+qt]=An[Ut+qt]=Qt,Fr=!0),x.y&&Hr.y&&kr.ys?(An[It+Et]=hn?Be?Qt:m.y:Qt,An[Ut+Et]=Be?Qt:m.y+Rr):(jr.w=An[It+Et]=An[Ut+Et]=Qt,Fr=!0)),Be&&(jr.w=jr.h=Qt,Fr=!0),Fr&&(Dr[Kt]=kr.y?jr.w:Qt,Dr[$t]=kr.x?jr.h:Qt,le||(le=d(si(Un)),ce.prepend(le)),le.css(Dr)),ue.css(An)}var Mr={};Dn={};if(e||Hr.c||kr.c||yr.c||Ke||zt||qe||yt||xe||xn){Mr[Rt]=Qt;var Ur=function(){Mr[qt]=Qt,Pt.h=0},_r=function(){Mr[Et]=Qt,Pt.w=0};if(Hr.x&&kr.xs?(Mr[In]=Zt,Be?Ur():(Mr[qt]=-(x.x?m.x:z.x),Pt.h=x.x?m.y:0)):(Mr[In]=Qt,Ur()),Hr.y&&kr.ys?(Mr[Mn]=Zt,Be?_r():(Mr[Et]=-(x.y?m.y:z.y),Pt.w=x.y?m.x:0)):(Mr[Mn]=Qt,_r()),(jt.h=wi.m&&pt,Ci={x:te||Si!==Ai||gi!==Oi?-1:Fe.x,y:(te?Wi||bi&&Pr!==n&&h.t===Pr.y:(Wi||bi)&&gi===zi)?Fe.y:-1},Hi=Ci.x>-1,Ti=Ci.y>-1;(Hi||Ti)&&(Ti&&ce[un](Ci.y),Hi&&(V&&rt&&w.i?ce[ln](0):ce[ln](Ci.x)))}_e=wi}else R||(V&&w.i&&x.y&&Hr.x&&rt&&(h.l+=Pt.w||0),ce[ln](h.l),ce[un](h.t));yt&&Zr("onDirectionChanged",{isRTL:V,dir:vt}),e&&Zr("onHostSizeChanged",{width:we.w,height:we.h}),t&&Zr("onContentSizeChanged",{width:be.w,height:be.h}),(Hr.c||kr.c)&&Zr("onOverflowChanged",{x:Hr.x,y:Hr.y,xScrollable:kr.xs,yScrollable:kr.ys,clipped:kr.x||kr.y}),Ar.c&&Zr("onOverflowAmountChanged",{x:Ar.x,y:Ar.y})}D&&(Se.c||ct.c)&&(ct.f||Er(),x.y&&Se.x&&ue.css(Xt+Kt,ct.w+m.y),x.x&&Se.y&&ue.css(Xt+$t,ct.h+m.x),ct.c=!1),gr(oe),gr(ie),Zr("onUpdated",{forced:r})}}function Mr(e){K=vi(!0,{},K,W.v(e,W.t,!0)),$=vi(!0,{},$,W.v(e,W.t,!1,!0))}function Ur(e){var t=$.textarea.inheritedAttrs,n={},r=function(){var t=e?ne:re;d.each(n,function(e,n){hi(n)==s.s&&(e==c.c?t.addClass(n):t.attr(e,n))})},i=[On,zn,Tn,Hn,An,Wn,Cn,kn,Ln,En,Pn,lr,it].join(on);if(hi(t=hi(t)==s.s?t.split(" "):t)==s.a&&d.each(t,function(t,r){hi(r)==s.s&&(n[r]=e?re.attr(r):ne.attr(r))}),e)ue.contents().unwrap().unwrap().unwrap(),R?(ne.removeAttr(c.s),r(),yi(ne,i+on+Rn+on+Yn).unwrap(),xi(fe),xi(re)):(yi(ne,On),yi(re,i)),D&&yi(ee,Sn),xi(oe);else{if(R){var o={};$.sizeAutoCapable||(o[Kt]=ne.css(Kt),o[$t]=ne.css($t)),ne.wrap(si(zn)),(re=ne.parent()).css(o).wrapInner(si(Mn+on+Yn)).wrapInner(si(Fn+on+Yn)).wrapInner(si(jn+on+Yn)),ue=mi(re,rn+Mn),ce=mi(re,rn+Fn),se=mi(re,rn+jn),fe=d(si(Dn)),ue.prepend(fe),pi(ne,Rn+on+Yn),r()}else(re=ne).wrapInner(si(Mn)).wrapInner(si(Fn)).wrapInner(si(jn)),ue=mi(re,rn+Mn),ce=mi(re,rn+Fn),se=mi(re,rn+jn),pi(ne,On);S&&pi(ce,x.x&&x.y?In:Nn),D&&pi(ee,Sn),oe=d(si("os-resize-observer-host")),re.prepend(oe)}}function _r(e){var t,r,i,o,a=[112,113,114,115,116,117,118,119,120,121,123,33,34,37,38,39,40,16,17,18,19,20,144],s=[],c=175,u=e?"off":"on";!e&&R&&(i=function(e){Nr(),Lt.update(Gt),e&&clearInterval(t)},(vt={})[Zt]=function(e){return ne[ln](w.i&&rt?9999999:0),ne[un](0),l.prvD(e),l.stpP(e),!1},vt.drop=function(){setTimeout(function(){P||i()},50)},vt.focus=function(){pt=!0},vt.focusout=function(){pt=!1,s=[],i(!0)},g>9||!b?vt.input=function(){i()}:(vt[yn]=function(e){var n=e.keyCode;d.inArray(n,a)>-1||(s.length||(i(),t=setInterval(i,1e3/60)),-1===d.inArray(n,s)&&s.push(n))},vt[xn]=function(e){var t=e.keyCode,n=d.inArray(t,s);d.inArray(t,a)>-1||(n>-1&&s.splice(n,1),s.length||i(!0))})),R?d.each(vt,function(e,t){ne[u](e,t)}):ue[u](wn,function(e){!0!==Ie&&Fr((e=e.originalEvent||e).propertyName)&&Ir(Gt)}),e||(o=function(e){X||(r!==n?clearTimeout(r):((bt||gt)&&Xr(!0),oi()||pi(re,kn),Zr("onScrollStart",e)),Kr(!0),Kr(!1),Zr("onScroll",e),r=setTimeout(function(){P||(clearTimeout(r),r=n,(bt||gt)&&Xr(!1),oi()||yi(re,kn),Zr("onScrollStop",e))},c))},H?yr(ce,Zt,o):ce.on(Zt,o))}function Br(e){e?(xi(he),xi(ye)):(he=d(si(Kn+on+ar)),ve=d(si($n)),pe=d(si(Qn)),ye=d(si(Kn+on+sr)),xe=d(si($n)),me=d(si(Qn)),he.append(ve),ve.append(pe),ye.append(xe),xe.append(me),se.after(ye),se.after(he))}function qr(e){var t,r,i,o=Jr(e),a=G.top!==G,s=o.xy,c=o.XY,f=Zt+o.LT,h="active",v=1,p=[16,17];function y(){v=.5}function x(){v=1}function m(e){d.inArray(e.keyCode,p)>-1&&y()}function b(e){d.inArray(e.keyCode,p)>-1&&x()}function S(e){var t=(e.originalEvent||e).touches!==n;return!(X||P||oi()||!tt||t&&!Ot)&&(1===l.mBtn(e)||t)}function O(n){if(S(n)){var i=o.i.tl,u=o.i.hl,d=o.i.ms*(((g&&a?n["screen"+c]:l.page(n)[s])-r)/(i-u));d=isFinite(d)?d:0,V&&e&&!w.i&&(d*=-1),ce[f](t+d),H||l.prvD(n)}else z(n)}function z(e){if(e=e||e.originalEvent,yi(te,cr),yi(o.h,h),yi(o.t,h),yi(o.s,h),Z.off(hn,O).off(dn,z).off(yn,m).off(xn,b).off(mn,kr),x(),t=n,r=n,i!==n&&(Lt.scrollStop(),clearTimeout(i),i=n),e){var a=re[0].getBoundingClientRect();e.clientX>=a.left&&e.clientX<=a.right&&e.clientY>=a.top&&e.clientY<=a.bottom||Cr(),(bt||gt)&&Xr(!1)}}function W(i){t=(t=ce[f]())===n?0:t,(V&&e&&!w.n||!V)&&(t=t<0?0:t),r=g&&a?i["screen"+c]:l.page(i)[s],pi(te,cr),pi(o.h,h),pi(o.s,h),Z.on(hn,O).on(dn,z).on(mn,kr),!g&&j||l.prvD(i),l.stpP(i)}o.h.on(fn,function(e){S(e)&&W(e)}),o.t.on(fn,function(t){if(S(t)){var a,c,d=jt[o._wh],p=o.t.offset()[o.lt],x=t.ctrlKey,g=t.shiftKey,O=g&&x,A=!0,C="linear",H=function(){if(!P){var l=r-p,h=o.i.tl,y=o.i.ho,x=o.i.hl,m=o.i.ms,b=270*v,S=A?u.max(400,b):b,z=m*((l-x/2)/(h-x)),T=V&&e&&(!w.i&&!w.n||rt),k=T?yl,L={};g?(z=isFinite(z)?z:0,V&&e&&!w.i&&(z=m-z),O?(L.n=!1,L[s]=z,Lt.scroll(L,130,C,function(){W(t)})):(ce[f](z),W(t))):(a=A?k:a,c=T?a?y+x>=l:y<=l:a?y<=l:y+x>=l,L[s]=a?"-="+d:"+="+d,Lt.scrollStop(),Lt.scroll(L,b,C),c?(clearTimeout(i),Lt.scrollStop(),i=n):i=setTimeout(H,S),A=!1)}};x&&y(),r=l.page(t)[s],pi(te,cr),pi(o.t,h),pi(o.s,h),Z.on(dn,z).on(yn,m).on(xn,b).on(mn,kr),H(),l.prvD(t),l.stpP(t)}}).on(vn,function(){(bt||gt)&&(zt=!0,Xr(!0))}).on(pn,function(){(bt||gt)&&(zt=!1,Xr(!1))}),o.s.on(fn,function(e){l.stpP(e)}),A&&o.s.on(wn,function(t){t.target===o.s[0]&&(Yr(e),Kr(e))})}function Vr(e,t,n){var r=e?An:Wn,i=e?he:ye;t?yi(re,r):pi(re,r),n?yi(i,Zn):pi(i,Zn)}function Xr(e,t){if(clearTimeout(yt),e)yi(he,er),yi(ye,er);else{var n="active",r=function(){if(!zt&&!P){var e=pe.hasClass(n)||me.hasClass(n);!e&&(bt||gt||St)&&pi(he,er),!e&&(bt||gt||St)&&pi(ye,er)}};mt>0&&!0!==t?yt=setTimeout(r,mt):r()}}function Yr(e){var t={},n=Jr(e),r=1e6,i=u.min(1,(we[n._wh]-(Pe?e?I:M:0))/be[n._wh]);t[n.wh]=u.floor(100*i*r)/r+"%",oi()||n.h.css(t),n.i.hl=n.h[0]["offset"+n.WH],n.i.hlr=i}function Kr(e,t){t=t===n?e?ce[ln]():ce[un]():t;var r,i,o,a=V&&e,s={},c=Jr(e),l="translate(",f="transform",d=ce[0][Zt+c.WH]-ce[0]["client"+c.WH],h=c.i.hl,v=c.t[0]["offset"+c.WH],p=v-h;w.n&&a&&(d*=-1),o=t/d,o=isNaN(o)?0:u.min(1,o),c.i.ms=d,c.i.cs=t,c.i.csr=o,p*=o,p=isNaN(p)?0:p,a&&!w.i&&(p=v-h-p),p=u.max(0,p),C?(i=a?-(v-h-p):p,r=e?l+i+"px, 0)":l+"0, "+i+"px)",s["-webkit-"+f]=r,s["-moz-"+f]=r,s["-ms-"+f]=r,s["-o-"+f]=r,s[f]=r):s[c.lt]=p,oi()||c.h.css(s),c.i.ho=p,c.i.tl=v}function $r(e,t){var n=t?"removeClass":"addClass",r=e?xe:me,i=e?Jn:Gn;(e?ve:pe)[n](i),r[n](i)}function Jr(e){return{wh:e?Kt:$t,WH:e?"Width":"Height",lt:e?Vt:_t,LT:e?"Left":"Top",xy:e?tn:nn,XY:e?"X":"Y",_wh:e?"w":"h",_lt:e?"l":"t",t:e?ve:xe,h:e?pe:me,s:e?he:ye,i:e?Rt:Dt}}function Qr(e){e?xi(de):(de=d(si(tr)),re.append(de))}function Gr(){var e=G.top!==G,t={},r={};function i(e){if(a(e)){var n=s(e),i={};(Ht||Ct)&&(i[Kt]=r.w+n.x-t.x),(Tt||Ct)&&(i[$t]=r.h+n.y-t.y),re.css(i),l.stpP(e)}else o(e)}function o(e){var t=e!==n;Z.off(mn,kr).off(hn,i).off(dn,o),yi(te,cr),de.releaseCapture&&de.releaseCapture(),t&&(At&&Or(),Lt.update(Gt)),At=!1}function a(e){var t=(e.originalEvent||e).touches!==n;return!X&&!P&&(1===l.mBtn(e)||t)}function s(t){return g&&e?{x:t.screenX,y:t.screenY}:l.page(t)}kt=function(e){a(e)&&(ht&&(At=!0,zr()),t=s(e),r.w=re[0][c.oW]-(F?0:I),r.h=re[0][c.oH]-(F?0:M),Z.on(mn,kr).on(hn,i).on(dn,o),pi(te,cr),de.setCapture&&de.setCapture(),l.prvD(e),l.stpP(e))}}function Zr(e,t){if(E){var n,r=$.callbacks[e],i=e;"on"===i.substr(0,2)&&(i=i.substr(2,1).toLowerCase()+i.substr(3)),hi(r)==s.f&&r.call(Lt,t),d.each(fr,function(){hi((n=this).on)==s.f&&n.on(i,t)})}else P||ur.push({n:e,a:t})}function ei(e,t,r){r===n&&(r=[Qt,Qt,Qt,Qt]),e[t+_t]=r[0],e[t+Bt]=r[1],e[t+qt]=r[2],e[t+Vt]=r[3]}function ti(t){var n="ownerDocument",r="HTMLElement",i=t&&t[n]&&t[n].parentWindow||e;return typeof i[r]==s.o?t instanceof i[r]:t&&typeof t==s.o&&null!==t&&1===t.nodeType&&typeof t.nodeName==s.s}function ni(e,t){var n,r,i=[],o=[];for(n=0;nf&&(u=r+1,f=t);return{cR:d,cC:h,r:c,c:f,w:u,p:e,m:a}}}function oi(){return Ne&&x.x&&x.y}function ai(){return R?fe[0]:ue[0]}function si(e,t){return"
"+(t||Qt)+"
"}function ci(e,t){for(var n,r=t.split(rn),i=0;i0&&(d.isPlainObject(o)?d.each(t,function(e,t){(u=t)!==n&&v.push(k(u,o,c,r,i))}):d.each(t,function(t,r){u=h(r),"!"===o&&u instanceof e[a]||l.type(o)==s.f&&o(r,u)?v.push(u):o===n&&v.push(u)}),f=1===v.length?v[0]:v),f},e[a].globals=function(){C();var e=d.extend(!0,{},r);return delete e.msie,e},e[a].defaultOptions=function(e){C();var t=r.defaultOptions;if(e===n)return d.extend(!0,{},t);r.defaultOptions=d.extend(!0,{},t,W.v(e,W.t,!0))},e[a].extension=function(e,t,n){var r=l.type(e)==s.s,i=arguments[c.l],o=0;if(i<1||!r)return d.extend(!0,{length:A[c.l]},A);if(r)if(l.type(t)==s.f)A.push({name:e,extensionFactory:t,defaultOptions:n});else for(;o1))return d.extend(!0,{},A[o]);A.splice(o,1)}},e[a]}();return f&&f.fn&&(f.fn.overlayScrollbars=function(e,t){var n=this;return f.isPlainObject(e)?(f.each(n,function(){v(this,e,t)}),n):v(n,e)}),v}); \ No newline at end of file diff --git a/package.json b/package.json index 0002621..5f268be 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "overlayscrollbars", - "version": "1.5.3", + "version": "1.6.0", "description": "A javascript scrollbar plugin which hides the native scrollbars and provides custom styleable overlay scrollbars, but keeps the native functionality and feeling.", "keywords" : [ "overlayscrollbars",