From 9416cdd72a2afb9407310a01c15f5b9f6d5fae07 Mon Sep 17 00:00:00 2001 From: William Troup Date: Wed, 3 Jul 2024 18:58:21 +0100 Subject: [PATCH 01/44] Updated to v2.0.0. --- README.md | 6 +++--- README_NUGET.md | 6 +++--- dist/journey.export.js | 2 +- dist/journey.export.min.js | 2 +- dist/journey.js | 4 ++-- dist/journey.js.css | 2 +- dist/journey.js.min.css | 2 +- dist/journey.min.js | 4 ++-- dist/translations/journey.translations.af.js | 2 +- dist/translations/journey.translations.ar.js | 2 +- dist/translations/journey.translations.be.js | 2 +- dist/translations/journey.translations.bg.js | 2 +- dist/translations/journey.translations.bn.js | 2 +- dist/translations/journey.translations.ca.js | 2 +- dist/translations/journey.translations.da.js | 2 +- dist/translations/journey.translations.de.js | 2 +- dist/translations/journey.translations.el.js | 2 +- dist/translations/journey.translations.en.js | 2 +- dist/translations/journey.translations.eo.js | 2 +- dist/translations/journey.translations.es.js | 2 +- dist/translations/journey.translations.et.js | 2 +- dist/translations/journey.translations.fa.js | 2 +- dist/translations/journey.translations.fi.js | 2 +- dist/translations/journey.translations.fr.js | 2 +- dist/translations/journey.translations.fy.js | 2 +- dist/translations/journey.translations.ga.js | 2 +- dist/translations/journey.translations.gl.js | 2 +- dist/translations/journey.translations.he.js | 2 +- dist/translations/journey.translations.hi.js | 2 +- dist/translations/journey.translations.hu.js | 2 +- dist/translations/journey.translations.hy.js | 2 +- dist/translations/journey.translations.id.js | 2 +- dist/translations/journey.translations.is.js | 2 +- dist/translations/journey.translations.it.js | 2 +- dist/translations/journey.translations.ja.js | 2 +- dist/translations/journey.translations.ka.js | 2 +- dist/translations/journey.translations.ko.js | 2 +- dist/translations/journey.translations.lb.js | 2 +- dist/translations/journey.translations.lt.js | 2 +- dist/translations/journey.translations.lv.js | 2 +- dist/translations/journey.translations.ms.js | 2 +- dist/translations/journey.translations.ne.js | 2 +- dist/translations/journey.translations.nl.js | 2 +- dist/translations/journey.translations.no.js | 2 +- dist/translations/journey.translations.pl.js | 2 +- dist/translations/journey.translations.pt.js | 2 +- dist/translations/journey.translations.ro.js | 2 +- dist/translations/journey.translations.si.js | 2 +- dist/translations/journey.translations.sk.js | 2 +- dist/translations/journey.translations.sl.js | 2 +- dist/translations/journey.translations.sv.js | 2 +- dist/translations/journey.translations.ta.js | 2 +- dist/translations/journey.translations.te.js | 2 +- dist/translations/journey.translations.th.js | 2 +- dist/translations/journey.translations.tl.js | 2 +- dist/translations/journey.translations.tr.js | 2 +- dist/translations/journey.translations.uk.js | 2 +- dist/translations/journey.translations.zh-tw.js | 2 +- dist/translations/journey.translations.zh.js | 2 +- journey.js.nuspec | 2 +- package.json | 2 +- src/journey.export.js | 2 +- src/journey.js | 4 ++-- src/journey.js.scss | 2 +- 64 files changed, 71 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index 4c1f025..c893429 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,15 @@ Journey.js [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Journey.js%2C%20a%20free%20JavaScript%journey%builder&url=https://github.com/williamtroup/Journey.js&hashtags=javascript,html,journey,guide) -[![npm](https://img.shields.io/badge/npmjs-v1.7.2-blue)](https://www.npmjs.com/package/jjourney.js) -[![nuget](https://img.shields.io/badge/nuget-v1.7.2-purple)](https://www.nuget.org/packages/jJourney.js/) +[![npm](https://img.shields.io/badge/npmjs-v2.0.0-blue)](https://www.npmjs.com/package/jjourney.js) +[![nuget](https://img.shields.io/badge/nuget-v2.0.0-purple)](https://www.nuget.org/packages/jJourney.js/) [![license](https://img.shields.io/badge/license-MIT-green)](https://github.com/williamtroup/Journey.js/blob/main/LICENSE.txt) [![discussions Welcome](https://img.shields.io/badge/discussions-Welcome-red)](https://github.com/williamtroup/Journey.js/discussions) [![coded by William Troup](https://img.shields.io/badge/coded_by-William_Troup-yellow)](https://www.william-troup.com/) >

🚶 A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!

->

v1.7.2

+>

v2.0.0


![Journey.js](docs/images/main.png) diff --git a/README_NUGET.md b/README_NUGET.md index df75eaf..2bd7767 100644 --- a/README_NUGET.md +++ b/README_NUGET.md @@ -1,8 +1,8 @@ -# Journey.js v1.7.2 +# Journey.js v2.0.0 [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Journey.js%2C%20a%20free%20JavaScript%journey%builder&url=https://github.com/williamtroup/Journey.js&hashtags=javascript,html,journey,guide) -[![npm](https://img.shields.io/badge/npmjs-v1.7.2-blue)](https://www.npmjs.com/package/jjourney.js) -[![nuget](https://img.shields.io/badge/nuget-v1.7.2-purple)](https://www.nuget.org/packages/jJourney.js/) +[![npm](https://img.shields.io/badge/npmjs-v2.0.0-blue)](https://www.npmjs.com/package/jjourney.js) +[![nuget](https://img.shields.io/badge/nuget-v2.0.0-purple)](https://www.nuget.org/packages/jJourney.js/) [![license](https://img.shields.io/badge/license-MIT-green)](https://github.com/williamtroup/Journey.js/blob/main/LICENSE.txt) [![discussions Welcome](https://img.shields.io/badge/discussions-Welcome-red)](https://github.com/williamtroup/Journey.js/discussions) [![coded by William Troup](https://img.shields.io/badge/coded_by-William_Troup-yellow)](https://www.william-troup.com/) diff --git a/dist/journey.export.js b/dist/journey.export.js index 7c5118e..f1cb46f 100644 --- a/dist/journey.export.js +++ b/dist/journey.export.js @@ -1,4 +1,4 @@ -/*! Journey.js v1.7.2 | (c) Bunoon 2024 | MIT License */ +/*! Journey.js v2.0.0 | (c) Bunoon 2024 | MIT License */ var journey = {js:function() { return window.$journey; }}; diff --git a/dist/journey.export.min.js b/dist/journey.export.min.js index c765481..8faf634 100644 --- a/dist/journey.export.min.js +++ b/dist/journey.export.min.js @@ -1,2 +1,2 @@ -/*! Journey.js v1.7.2 | (c) Bunoon 2024 | MIT License */ +/*! Journey.js v2.0.0 | (c) Bunoon 2024 | MIT License */ var journey={js:function(){return window.$journey}};Object.assign(window,{journey});export{journey}; \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index 86b83c5..cf1941f 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -1,4 +1,4 @@ -/*! Journey.js v1.7.2 | (c) Bunoon 2024 | MIT License */ +/*! Journey.js v2.0.0 | (c) Bunoon 2024 | MIT License */ (function() { var _parameter_Document = null, _parameter_Window = null, _parameter_Math = null, _parameter_Json = null, _public = {}, _configuration = {}, _configuration_ShortcutKeysEnabled = true, _enum_KeyCodes = {escape:27, left:37, up:38, right:39, down:40}, _string = {empty:"", space:" "}, _elements_Type = {}, _groups_Default = "default", _groups_Current = _groups_Default, _groups = {}, _element_Focus_Element_PositionStyle = null, _element_Disabled_Background = null, _element_Dialog = null, _element_Dialog_Close_Button = null, _element_Dialog_Title = null, _element_Dialog_Description = null, _element_Dialog_CheckBox_Container = null, _element_Dialog_CheckBox_Input = null, _element_Dialog_ProgressDots = null, _element_Dialog_ProgressBar = null, _element_Dialog_ProgressBar_Percentage = null, _element_Dialog_ProgressBar_Percentage_Text = null, _element_Dialog_Buttons = null, _element_Dialog_Buttons_Back_Button = null, _element_Dialog_Buttons_Next_Button = null, _element_Dialog_IsHint = false, _element_Dialog_Move_Original_X = @@ -859,7 +859,7 @@ _configuration.onDoNotShowAgainChange = getDefaultFunction(_configuration.onDoNotShowAgainChange, null); } _public.getVersion = function() { - return "1.7.2"; + return "2.0.0"; }; (function(documentObject, windowObject, mathObject, jsonObject) { _parameter_Document = documentObject; diff --git a/dist/journey.js.css b/dist/journey.js.css index 18a68c5..35ac8c3 100644 --- a/dist/journey.js.css +++ b/dist/journey.js.css @@ -1,5 +1,5 @@ /* - * Journey.js Library v1.7.2 + * Journey.js Library v2.0.0 * * Copyright 2024 Bunoon * Released under the MIT License diff --git a/dist/journey.js.min.css b/dist/journey.js.min.css index 63cdc74..e629127 100644 --- a/dist/journey.js.min.css +++ b/dist/journey.js.min.css @@ -1,2 +1,2 @@ -/*! Journey.js v1.7.2 | (c) Bunoon 2024 | MIT License */ +/*! Journey.js v2.0.0 | (c) Bunoon 2024 | MIT License */ :root{--journey-js-default-font:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--journey-js-text-bold-weight:100;--journey-js-title-bold-weight:700;--journey-js-tooltip-bold-weight:300;--journey-js-color-black:#3b3a3a;--journey-js-color-white:#F5F5F5;--journey-js-color-gray:#AAAAAA;--journey-js-color-hint:rgba( 170, 170, 170, 0.5 );--journey-js-dialog-background-color:#002244;--journey-js-dialog-text-color:var(--journey-js-color-white);--journey-js-dialog-border-color:#72A0C1;--journey-js-dialog-button-background-color:#002D62;--journey-js-dialog-button-border-color:#3457D5;--journey-js-dialog-button-text-color:var(--journey-js-color-white);--journey-js-dialog-button-hover-background-color:#007FFF;--journey-js-dialog-button-hover-border-color:var(--journey-js-dialog-button-border-color);--journey-js-dialog-button-hover-text-color:var(--journey-js-dialog-button-text-color);--journey-js-dialog-button-active-background-color:#00b7ff;--journey-js-dialog-button-active-border-color:var(--journey-js-dialog-button-border-color);--journey-js-dialog-button-active-text-color:var(--journey-js-dialog-button-text-color);--journey-js-dialog-button-disabled-background-color:var(--journey-js-dialog-background-color);--journey-js-dialog-close-button-background-color:var(--journey-js-dialog-button-background-color);--journey-js-dialog-close-button-border-color:var(--journey-js-dialog-button-border-color);--journey-js-dialog-close-button-size:1.1rem;--journey-js-dialog-close-button-x-color:var(--journey-js-color-white);--journey-js-dialog-close-button-hover-background-color:var(--journey-js-dialog-button-hover-background-color);--journey-js-dialog-close-button-hover-x-color:var(--journey-js-dialog-close-button-x-color);--journey-js-dialog-close-button-hover-border-color:var(--journey-js-dialog-close-button-border-color);--journey-js-dialog-close-button-active-background-color:var(--journey-js-dialog-button-active-background-color);--journey-js-dialog-close-button-active-x-color:var(--journey-js-dialog-close-button-x-color);--journey-js-dialog-close-button-active-border-color:var(--journey-js-dialog-close-button-border-color);--journey-js-checkbox-background-color-checked:var(--journey-js-dialog-button-border-color);--journey-js-checkbox-background-color:var(--journey-js-dialog-button-background-color);--journey-js-checkbox-border-color-checked:var(--journey-js-checkbox-background-color-checked);--journey-js-checkbox-border-color:var(--journey-js-dialog-button-border-color);--journey-js-checkbox-border-hover-color:var(--journey-js-dialog-button-hover-background-color);--journey-js-tooltip-background-color:var(--journey-js-dialog-background-color);--journey-js-tooltip-border-color:var(--journey-js-dialog-border-color);--journey-js-tooltip-text-color:var(--journey-js-color-white);--journey-js-border-control-radius:0.25rem;--journey-js-border-radius:0.5rem;--journey-js-border-size:0.5px;--journey-js-spacing:10px;--journey-js-spacing-font-size:0.85rem;--journey-js-transition:all .3s;--journey-js-animation-length:0.5s}div.journey-js-dialog{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default;box-sizing:border-box;line-height:normal;font-family:var(--journey-js-default-font);position:absolute;display:none;border-radius:var(--journey-js-border-radius);background-color:var(--journey-js-dialog-background-color);color:var(--journey-js-dialog-text-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-border-color);padding:var(--journey-js-spacing);font-size:var(--journey-js-spacing-font-size);z-index:1001;width:300px;height:auto;transition:var(--journey-js-transition);transition-property:top,left}div.journey-js-dialog *{box-sizing:border-box;line-height:normal}div.journey-js-dialog *::before,div.journey-js-dialog *::after{box-sizing:border-box;line-height:normal}div.journey-js-dialog div:first-of-type{padding-right:calc(var(--journey-js-dialog-close-button-size) + var(--journey-js-spacing))}div.journey-js-dialog div.title{font-size:large;font-weight:var(--journey-js-title-bold-weight);margin-bottom:var(--journey-js-spacing)}div.journey-js-dialog div.description{font-weight:var(--journey-js-text-bold-weight)}div.journey-js-dialog-moving{transition:none!important;transition-property:none!important}div.journey-js-dialog button.close{position:absolute;top:var(--journey-js-spacing);right:var(--journey-js-spacing);width:var(--journey-js-dialog-close-button-size);height:var(--journey-js-dialog-close-button-size);border-radius:.25rem;padding:0;background-color:var(--journey-js-dialog-close-button-background-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-close-button-border-color);transition:var(--journey-js-transition)}div.journey-js-dialog button.close::before,div.journey-js-dialog button.close::after{content:"";width:2px;height:100%;background:var(--journey-js-dialog-close-button-x-color);display:block;transform:rotate(45deg) translateX(0);position:absolute;left:calc(50% - 0.5px);top:0}div.journey-js-dialog button.close::after{transform:rotate(-45deg) translateX(0)}div.journey-js-dialog button.close:active{border:var(--journey-js-border-size) solid var(--journey-js-dialog-close-button-active-border-color)!important;background-color:var(--journey-js-dialog-close-button-active-background-color)!important}div.journey-js-dialog button.close:active::before,div.journey-js-dialog button.close:active::after{background:var(--journey-js-dialog-close-button-active-x-color)!important}div.journey-js-dialog button.close:hover{cursor:pointer;border:var(--journey-js-border-size) solid var(--journey-js-dialog-close-button-hover-border-color);background-color:var(--journey-js-dialog-close-button-hover-background-color)}div.journey-js-dialog button.close:hover::before,div.journey-js-dialog button.close:hover::after{background:var(--journey-js-dialog-close-button-hover-x-color)}div.journey-js-dialog div.progress-dots{margin-top:var(--journey-js-spacing);margin-bottom:var(--journey-js-spacing);text-align:center}div.journey-js-dialog div.progress-dots div.dot,div.journey-js-dialog div.progress-dots div.dot-active{margin:2.5px;display:inline-block;padding:0!important}div.journey-js-dialog div.progress-dots div.dot{border-radius:50%;height:10px;width:10px;background-color:var(--journey-js-dialog-button-background-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-border-color);transition:var(--journey-js-transition)}div.journey-js-dialog div.progress-dots div.dot:active{background-color:var(--journey-js-dialog-button-active-background-color)!important;border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-active-border-color)!important;color:var(--journey-js-color-white)!important}div.journey-js-dialog div.progress-dots div.dot:hover{cursor:pointer;background-color:var(--journey-js-dialog-button-hover-background-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-hover-border-color);color:var(--journey-js-color-white)!important}div.journey-js-dialog div.progress-dots div.dot-number{height:25px!important;width:25px!important;padding:3px;display:inline-flex;justify-content:center;align-content:center;flex-direction:column;font-size:.8rem;border-radius:50%!important;color:var(--journey-js-color-gray)!important}div.journey-js-dialog div.progress-dots div.dot-active{position:relative;transition:var(--journey-js-transition);transition-property:width;border-radius:10px;height:10px;width:20px;background-color:var(--journey-js-dialog-button-border-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-border-color);color:var(--journey-js-color-white)!important}div.journey-js-dialog div.progress-dots div.dot-active::after{content:"";position:absolute;width:15px;height:1px;background-color:var(--journey-js-dialog-button-border-color);bottom:-5px;left:50%;transform:translate(-50%)}div.journey-js-dialog div.progress-bar{border-radius:var(--journey-js-border-radius);margin-top:var(--journey-js-spacing);margin-bottom:var(--journey-js-spacing);background-color:var(--journey-js-dialog-button-background-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-border-color);text-wrap:nowrap;overflow:hidden}div.journey-js-dialog div.progress-bar div.progress-bar-percentage{min-height:10px;background-color:var(--journey-js-dialog-button-border-color);transition:var(--journey-js-transition);transition-property:width;text-align:center;padding:0!important;margin:0!important}div.journey-js-dialog div.progress-bar div.progress-bar-percentage p.progress-bar-percentage-text{padding:calc(var(--journey-js-spacing) / 2)!important;font-size:smaller;margin:0!important;color:var(--journey-js-color-white)}div.journey-js-dialog div.checkbox-container{margin-top:var(--journey-js-spacing);margin-bottom:var(--journey-js-spacing)}div.journey-js-dialog div.checkbox-container label.checkbox{display:inline-block;position:relative;padding-left:25px;color:var(--journey-js-color-white)}div.journey-js-dialog div.checkbox-container label.checkbox input{display:none!important}div.journey-js-dialog div.checkbox-container label.checkbox input:checked~span.check-mark{background-color:var(--journey-js-checkbox-background-color-checked);border:var(--journey-js-border-size) solid var(--journey-js-checkbox-border-color-checked)}div.journey-js-dialog div.checkbox-container label.checkbox input:checked~span.check-mark::before{display:block}div.journey-js-dialog div.checkbox-container label.checkbox input:disabled~span.check-mark,div.journey-js-dialog div.checkbox-container label.checkbox input:disabled~span.text{opacity:.5}div.journey-js-dialog div.checkbox-container label.checkbox input:disabled~span.check-mark{border:var(--journey-js-border-size) solid var(--journey-js-color-black)!important}div.journey-js-dialog div.checkbox-container label.checkbox span.check-mark{position:absolute;top:.5px;left:0;height:15px;width:15px;background-color:var(--journey-js-checkbox-background-color);border-radius:var(--journey-js-border-control-radius);border:var(--journey-js-border-size) solid var(--journey-js-checkbox-border-color);transition:var(--journey-js-transition)}div.journey-js-dialog div.checkbox-container label.checkbox span.check-mark::before{content:"";transform:rotate(45deg);position:absolute;display:none;left:4px;top:.5px;width:6px;height:11px;border:solid var(--journey-js-color-white);border-width:0 2.5px 2.5px 0}div.journey-js-dialog div.checkbox-container label.checkbox:hover span.check-mark{border:var(--journey-js-border-size) solid var(--journey-js-checkbox-border-hover-color)}div.journey-js-dialog div.buttons{margin-top:calc(var(--journey-js-spacing) * 2);text-align:right;border-top:var(--journey-js-border-size) dotted var(--journey-js-dialog-button-border-color);padding-top:var(--journey-js-spacing)}div.journey-js-dialog div.buttons button:first-child{margin-left:0!important}div.journey-js-dialog div.buttons button.back,div.journey-js-dialog div.buttons button.next{border-radius:var(--journey-js-border-radius);background-color:var(--journey-js-dialog-button-background-color);color:var(--journey-js-dialog-button-text-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-border-color);min-width:100px;padding:var(--journey-js-spacing);transition:var(--journey-js-transition);outline:none;margin-left:var(--journey-js-spacing)}div.journey-js-dialog div.buttons button.back:not([disabled]):active,div.journey-js-dialog div.buttons button.next:not([disabled]):active{background-color:var(--journey-js-dialog-button-active-background-color)!important;color:var(--journey-js-dialog-button-active-text-color)!important;border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-active-border-color)!important}div.journey-js-dialog div.buttons button.back:not([disabled]):hover,div.journey-js-dialog div.buttons button.next:not([disabled]):hover{cursor:pointer;background-color:var(--journey-js-dialog-button-hover-background-color);color:var(--journey-js-dialog-button-hover-text-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-hover-border-color)}div.journey-js-dialog div.buttons button.back:disabled,div.journey-js-dialog div.buttons button.next:disabled{background-color:var(--journey-js-dialog-button-disabled-background-color)!important;color:var(--journey-js-color-gray)}div.journey-js-dialog div.buttons button.back{float:left}div.journey-js-dialog div.buttons button.next{font-weight:var(--journey-js-title-bold-weight);float:right}div.journey-js-hint{position:absolute;width:15px;height:15px;border-radius:50%;background-color:var(--journey-js-color-gray);right:-7.5px;top:-7.5px;animation:journey-js-hint-effect 2s infinite;cursor:pointer}@keyframes journey-js-hint-effect{0%{box-shadow:0 0 0 0 var(--journey-js-color-hint)}70%{box-shadow:0 0 0 10px var(--journey-js-color-hint)}100%{box-shadow:0 0 0 0 var(--journey-js-color-hint)}}div.journey-js-disabled-background{z-index:1000;position:fixed;background-color:#000;background-color:rgb(0 0 0 / .5);top:0;left:0;height:100%;width:100%}.journey-js-element-focus{z-index:1001!important}div.journey-js-tooltip{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default;box-sizing:border-box;line-height:normal;font-family:var(--journey-js-default-font);animation:fade-in-animation var(--journey-js-animation-length);position:absolute;background-color:var(--journey-js-tooltip-background-color);border:var(--journey-js-border-size) solid var(--journey-js-tooltip-border-color);color:var(--journey-js-tooltip-text-color);border-radius:var(--journey-js-border-radius);z-index:2000;max-width:300px;padding:var(--journey-js-spacing);font-size:var(--journey-js-spacing-font-size);font-weight:var(--journey-js-tooltip-bold-weight);display:none}@keyframes fade-in-animation{0%{opacity:0}100%{opacity:1}} \ No newline at end of file diff --git a/dist/journey.min.js b/dist/journey.min.js index f19b594..933a562 100644 --- a/dist/journey.min.js +++ b/dist/journey.min.js @@ -1,4 +1,4 @@ -/*! Journey.js v1.7.2 | (c) Bunoon 2024 | MIT License */ +/*! Journey.js v2.0.0 | (c) Bunoon 2024 | MIT License */ (function(){function oa(a){e=ea(a,{});e["default"]={json:{},keys:[],position:0}}function U(){return e[f].json[e[f].keys[e[f].position]]}function Ia(){M=p("div","journey-js-disabled-background");M.onclick=function(){d.closeDialogOnDisabledBackgroundClick&&G()}}function Ja(){g=p("div","journey-js-dialog");g.style.display="none";q.body.appendChild(g);N=p("button","close");g.appendChild(N);N.onclick=function(){G()};fa(N,d.closeButtonToolTipText);E=p("div","title");g.appendChild(E);V=p("div", "description");g.appendChild(V);O=p("div","checkbox-container");g.appendChild(O);ha=Ka(O,d.doNotShowAgainText).input;ha.onchange=function(){d.showDoNotShowAgain&&w(d.onDoNotShowAgainChange,ha.checked)};H=p("div","progress-dots");g.appendChild(H);I=p("div","progress-bar");g.appendChild(I);W=p("div","progress-bar-percentage");I.appendChild(W);X=p("p","progress-bar-percentage-text");W.appendChild(X);J=p("div","buttons");g.appendChild(J);P=p("button","back");P.onclick=pa;J.appendChild(P);Y=p("button", "next");Y.onclick=qa;J.appendChild(Y);E.onmousedown=La;E.onmouseup=ra;E.oncontextmenu=ra;q.body.addEventListener("mousemove",Ma);q.body.addEventListener("mouseleave",Na)}function G(a){a=m(a,!0);if(u(d.closeDialogConfirmationText)&&a?confirm(d.closeDialogConfirmationText):1)a=U(),n(a)&&n(a.currentView.element)&&w(a.events.onClose,a.currentView.element),K(!1),sa(q.body,M),Q(),g.style.display="none"}function pa(){0=e[f].keys.length-1};k.addDocumentSteps=function(){Ca();return k};k.addStep=function(a,b){D(a)&&D(b)&&(Da(a,Ea(b)),e[f].keys.sort(),da());return k};k.removeStep=function(a){if(D(a)){var b=!1,c;for(c in e)if(e.hasOwnProperty(c))for(var h in e[c].json)if(e[c].json.hasOwnProperty(h)){var l=e[c].json[h];if(l.currentView.element===a){w(l.events.onRemoveStep,l.currentView.element);e[c].keys.splice(e[c].keys.indexOf(l.order),1);delete e[c].json[l.order];e[c].keys.sort();b= !0;break}}b?da():la(a,"journey-js-hint")}return k};k.clearSteps=function(a){da();for(var b in e)if(e.hasOwnProperty(b)&&(!u(a)||a===b))for(var c in e[b].json)if(e[b].json.hasOwnProperty(c)){var h=e[b].json[c];w(h.events.onRemoveStep,h.currentView.element)}u(a)?e.hasOwnProperty(a)&&delete e[a]:e={};u(a)&&"default"!==a||oa(e);return k};k.clearHints=function(){la(q.body,"journey-js-hint");return k};k.reverseStepOrder=function(){e[f].keys.reverse();da();return k};k.setConfiguration=function(a){if(D(a)){var b= -!1,c;for(c in a)a.hasOwnProperty(c)&&d.hasOwnProperty(c)&&d[c]!==a[c]&&(d[c]=a[c],b=!0);b&&Ga(d)}return k};k.getVersion=function(){return"1.7.2"};(function(a,b,c,h){q=a;r=b;Z=c;Fa=h;Ga();q.addEventListener("DOMContentLoaded",function(){oa();Ia();Ja();Pa();Ca();var l=void 0,C=(l=n(l)?l:!0)?q.addEventListener:q.removeEventListener;l=l?r.addEventListener:r.removeEventListener;d.shortcutKeysEnabled&&C("keydown",Ta);l("resize",Ua);C=!1;if(d.browserUrlParametersEnabled){l={};var t=r.location.href.split("?"); +!1,c;for(c in a)a.hasOwnProperty(c)&&d.hasOwnProperty(c)&&d[c]!==a[c]&&(d[c]=a[c],b=!0);b&&Ga(d)}return k};k.getVersion=function(){return"2.0.0"};(function(a,b,c,h){q=a;r=b;Z=c;Fa=h;Ga();q.addEventListener("DOMContentLoaded",function(){oa();Ia();Ja();Pa();Ca();var l=void 0,C=(l=n(l)?l:!0)?q.addEventListener:q.removeEventListener;l=l?r.addEventListener:r.removeEventListener;d.shortcutKeysEnabled&&C("keydown",Ta);l("resize",Ua);C=!1;if(d.browserUrlParametersEnabled){l={};var t=r.location.href.split("?"); if(1 jJourney.js - 1.7.2 + 2.0.0 Journey.js A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps! William Troup diff --git a/package.json b/package.json index 1da9999..2e39e97 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "jjourney.js", "title": "Journey.js", "description": "A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!", - "version": "1.7.2", + "version": "2.0.0", "main": "dist/journey.js", "homepage": "https://www.william-troup.com/journey-js/", "author": { diff --git a/src/journey.export.js b/src/journey.export.js index 82e1a24..53ede22 100644 --- a/src/journey.export.js +++ b/src/journey.export.js @@ -4,7 +4,7 @@ * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps! * * @file journey.js - * @version v1.7.2 + * @version v2.0.0 * @author Bunoon * @license MIT License * @copyright Bunoon 2024 diff --git a/src/journey.js b/src/journey.js index fae30d2..b1c845b 100644 --- a/src/journey.js +++ b/src/journey.js @@ -4,7 +4,7 @@ * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps! * * @file journey.js - * @version v1.7.2 + * @version v2.0.0 * @author Bunoon * @license MIT License * @copyright Bunoon 2024 @@ -1517,7 +1517,7 @@ * @returns {string} The version number. */ _public.getVersion = function() { - return "1.7.2"; + return "2.0.0"; }; diff --git a/src/journey.js.scss b/src/journey.js.scss index 37c2c81..4aa68f0 100644 --- a/src/journey.js.scss +++ b/src/journey.js.scss @@ -1,5 +1,5 @@ /* - * Journey.js Library v1.7.2 + * Journey.js Library v2.0.0 * * Copyright 2024 Bunoon * Released under the MIT License From 803efecbaf2ed69ab481e815c94e898ff5e612af Mon Sep 17 00:00:00 2001 From: William Troup Date: Wed, 3 Jul 2024 18:58:45 +0100 Subject: [PATCH 02/44] Deleted export files. --- dist/journey.export.js | 6 ------ dist/journey.export.min.js | 2 -- src/journey.export.js | 21 --------------------- 3 files changed, 29 deletions(-) delete mode 100644 dist/journey.export.js delete mode 100644 dist/journey.export.min.js delete mode 100644 src/journey.export.js diff --git a/dist/journey.export.js b/dist/journey.export.js deleted file mode 100644 index f1cb46f..0000000 --- a/dist/journey.export.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! Journey.js v2.0.0 | (c) Bunoon 2024 | MIT License */ -var journey = {js:function() { - return window.$journey; -}}; -Object.assign(window, {journey}); -export{journey}; \ No newline at end of file diff --git a/dist/journey.export.min.js b/dist/journey.export.min.js deleted file mode 100644 index 8faf634..0000000 --- a/dist/journey.export.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! Journey.js v2.0.0 | (c) Bunoon 2024 | MIT License */ -var journey={js:function(){return window.$journey}};Object.assign(window,{journey});export{journey}; \ No newline at end of file diff --git a/src/journey.export.js b/src/journey.export.js deleted file mode 100644 index 53ede22..0000000 --- a/src/journey.export.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Journey.js - * - * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps! - * - * @file journey.js - * @version v2.0.0 - * @author Bunoon - * @license MIT License - * @copyright Bunoon 2024 - */ - -var journey = { - js: function() { - return window.$journey; - } -}; - -Object.assign( window, { journey } ); - -export { journey }; \ No newline at end of file From 023063077801d808293923ee5681833bafb68807 Mon Sep 17 00:00:00 2001 From: William Troup Date: Wed, 3 Jul 2024 19:00:20 +0100 Subject: [PATCH 03/44] Added CDN links. --- README.md | 7 +++++++ README_NUGET.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/README.md b/README.md index c893429..6d9c81d 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,13 @@ npm install jjourney.js ``` Or, you can download the latest zipped up version [here](https://www.william-troup.com/journey-js/download.html). + +Or, you can also use the following CDN links: + +```markdown +https://cdn.jsdelivr.net/gh/williamtroup/Journey.js@main/dist/journey.min.js +https://cdn.jsdelivr.net/gh/williamtroup/Journey.js@main/dist/journey.js.min.css +```

diff --git a/README_NUGET.md b/README_NUGET.md index 2bd7767..777e623 100644 --- a/README_NUGET.md +++ b/README_NUGET.md @@ -110,6 +110,13 @@ npm install jjourney.js Or, you can download the latest zipped up version [here](https://www.william-troup.com/journey-js/download.html). +Or, you can also use the following CDN links: + +```markdown +https://cdn.jsdelivr.net/gh/williamtroup/Journey.js@main/dist/journey.min.js +https://cdn.jsdelivr.net/gh/williamtroup/Journey.js@main/dist/journey.js.min.css +``` + ## How do I get started? From e32eb10fe1631f21b99e7c22a81b686ca2529a6c Mon Sep 17 00:00:00 2001 From: William Troup Date: Wed, 3 Jul 2024 19:04:51 +0100 Subject: [PATCH 04/44] Added build instructions and packages. --- .gitignore | 4 +- BUILD_INSTRUCTIONS.md | 83 ++ package-lock.json | 2281 +++++++++++++++++++++++++++++++++++++++++ package.json | 9 +- 4 files changed, 2375 insertions(+), 2 deletions(-) create mode 100644 BUILD_INSTRUCTIONS.md create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index d1c40b7..005d2f2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ /.vs /.vscode .DS_Store -*.nupkg \ No newline at end of file +*.nupkg +/build +/node_modules \ No newline at end of file diff --git a/BUILD_INSTRUCTIONS.md b/BUILD_INSTRUCTIONS.md new file mode 100644 index 0000000..ed811c2 --- /dev/null +++ b/BUILD_INSTRUCTIONS.md @@ -0,0 +1,83 @@ +# Building Journey.js v2.0.0 + +Before getting started with Journey.js, please read through the following instructions: + + +## Step 1: Install Packages: + +Install the packages using the following NPM commands: + +### 1. Install TypeScript: + +```markdown +npm install -g typescript +``` + +### 2. Install tsup: + +```markdown +npm i tsup -D +``` + +### 3. Install terser: + +```markdown +npm install terser -D +``` + +### 4. Install swc/core (if ES5 is required): + +```markdown +npm install @swc/core -D +``` + + +## Step 2: Build Project: + +### 1. Full Build: + +To build the TypeScript, run the following command: + +```markdown +npm run build-typescript +``` + +To build the SASS, run the following command: + +```markdown +npm run build-sass +``` + +To build the everything, run the following command: + +```markdown +npm run build +``` + +### 2. Minimized Build: + +To build the TypeScript, run the following command: + +```markdown +npm run build-minimized-typescript +``` + +To build the SASS, run the following command: + +```markdown +npm run build-minimized-sass +``` + +To build the everything, run the following command: + +```markdown +npm run build-minimized +``` + +### 3. ESM Build: + +To build the TypeScript, run the following command: + +```markdown +npm run build-typescript-esm +``` \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4cfe690 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2281 @@ +{ + "name": "jjourney.js", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "jjourney.js", + "version": "2.0.0", + "license": "MIT", + "devDependencies": { + "terser": "^5.31.1", + "tsup": "^8.1.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-require": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.2.1.tgz", + "integrity": "sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.17" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/terser": { + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tsup": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.1.0.tgz", + "integrity": "sha512-UFdfCAXukax+U6KzeTNO2kAARHcWxmKsnvSPXUcfA1D+kU05XDccCrkffCQpFaWDsZfV0jMyTsxU39VfCp6EOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-require": "^4.0.0", + "cac": "^6.7.12", + "chokidar": "^3.5.1", + "debug": "^4.3.1", + "esbuild": "^0.21.4", + "execa": "^5.0.0", + "globby": "^11.0.3", + "joycon": "^3.0.1", + "postcss-load-config": "^4.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.0.2", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.20.3", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yaml": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/package.json b/package.json index 2e39e97..8944fbf 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "author": { "name": "Bunoon" }, + "license": "MIT", "repository": { "type": "git", "url": "https://github.com/williamtroup/Journey.js" @@ -21,5 +22,11 @@ "bugs": { "url": "https://github.com/williamtroup/Journey.js/issues" }, - "license": "MIT" + "devDependencies": { + "@swc/core": "^1.6.6", + "sass": "^1.77.6", + "terser": "^5.31.1", + "tsup": "^8.1.0", + "typescript": "^5.5.2" + } } \ No newline at end of file From d02bc243188e7cd2d0b0eedb2f2fff9190cdeafe Mon Sep 17 00:00:00 2001 From: William Troup Date: Wed, 3 Jul 2024 19:07:26 +0100 Subject: [PATCH 05/44] Added configuration files for tsup and tsc, and updated packages, and added npm ignore list. --- .npmignore | 18 ++++++++++++++++++ package.json | 12 +++++++++++- tsconfig.json | 23 +++++++++++++++++++++++ tsup.build.config.ts | 28 ++++++++++++++++++++++++++++ tsup.build.esm.config.ts | 33 +++++++++++++++++++++++++++++++++ tsup.build.min.config.ts | 33 +++++++++++++++++++++++++++++++++ 6 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 .npmignore create mode 100644 tsconfig.json create mode 100644 tsup.build.config.ts create mode 100644 tsup.build.esm.config.ts create mode 100644 tsup.build.min.config.ts diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..3a12718 --- /dev/null +++ b/.npmignore @@ -0,0 +1,18 @@ +/.github +/.vscode +/test +/build +CODE_OF_CONDUCT.md +CONTRIBUTING.md +heat.js.nuspec +PACK.sh +PUBLISH.sh +README_NUGET.md +SECURITY.md +SERVE.sh +package-lock.json +tsconfig.json +tsup.build.config.ts +tsup.build.esm.config.ts +tsup.build.min.config.ts +BUILD_INSTRUCTIONS.md \ No newline at end of file diff --git a/package.json b/package.json index 8944fbf..928aaae 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,6 @@ "title": "Journey.js", "description": "A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!", "version": "2.0.0", - "main": "dist/journey.js", "homepage": "https://www.william-troup.com/journey-js/", "author": { "name": "Bunoon" @@ -22,6 +21,17 @@ "bugs": { "url": "https://github.com/williamtroup/Journey.js/issues" }, + "main": "dist/journey.js", + "types": "dist/journey.d.ts", + "scripts": { + "build": "tsup --config tsup.build.config.ts && tsup --config tsup.build.esm.config.ts && sass src/journey.js.scss dist/journey.js.css", + "build-minimized": "tsup --config tsup.build.min.config.ts && sass src/journey.js.scss dist/journey.js.min.css --style=compressed --no-source-map", + "build-typescript": "tsup --config tsup.build.config.ts", + "build-typescript-esm": "tsup --config tsup.build.esm.config.ts", + "build-typescript-minimized": "tsup --config tsup.build.min.config.ts", + "build-sass": "sass src/journey.js.scss dist/journey.js.css", + "build-sass-minimized": "sass src/journey.js.scss dist/journey.js.min.css --style=compressed --no-source-map" + }, "devDependencies": { "@swc/core": "^1.6.6", "sass": "^1.77.6", diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..42eb67d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2016", + "module": "ESNext", + "moduleResolution": "node", + "declaration": true, + "outDir": "./build", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "removeComments": true, + "sourceMap": true, + "strict": false + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "node_modules", + "dist", + "**/*.test.ts" + ] +} \ No newline at end of file diff --git a/tsup.build.config.ts b/tsup.build.config.ts new file mode 100644 index 0000000..5b6e1d4 --- /dev/null +++ b/tsup.build.config.ts @@ -0,0 +1,28 @@ +import { defineConfig } from "tsup"; + + +export default defineConfig( [ + { + entry: [ + "src/journey.ts" + ], + platform: "neutral", + format: [ + "cjs" + ], + outDir: "./dist", + dts: true, + splitting: false, + sourcemap: true, + clean: false, + minify: "terser", + terserOptions: { + compress: false, + sourceMap: true, + format: { + beautify: true, + comments: false + } + } + } +] ); \ No newline at end of file diff --git a/tsup.build.esm.config.ts b/tsup.build.esm.config.ts new file mode 100644 index 0000000..e850b81 --- /dev/null +++ b/tsup.build.esm.config.ts @@ -0,0 +1,33 @@ +import { defineConfig } from "tsup"; + + +export default defineConfig( [ + { + entry: [ + "src/journey.ts" + ], + platform: "neutral", + outExtension({ format }) { + return { + js: `.${format}.js`, + }; + }, + format: [ + "esm" + ], + outDir: "./dist", + dts: true, + splitting: false, + sourcemap: true, + clean: false, + minify: "terser", + terserOptions: { + compress: false, + sourceMap: true, + format: { + beautify: true, + comments: false + } + } + } +] ); \ No newline at end of file diff --git a/tsup.build.min.config.ts b/tsup.build.min.config.ts new file mode 100644 index 0000000..d5f0f30 --- /dev/null +++ b/tsup.build.min.config.ts @@ -0,0 +1,33 @@ +import { defineConfig } from "tsup"; + + +export default defineConfig( [ + { + entry: [ + "src/journey.ts" + ], + outExtension({ }) { + return { + js: ".min.js", + }; + }, + platform: "neutral", + format: [ + "cjs" + ], + outDir: "./dist", + dts: false, + splitting: false, + sourcemap: false, + clean: false, + minify: "terser", + terserOptions: { + compress: true, + sourceMap: false, + format: { + comments: false, + shorthand: true + } + } + } +] ); \ No newline at end of file From 59ee23cc745813374573ac365ba8257b5af1ba80 Mon Sep 17 00:00:00 2001 From: William Troup Date: Wed, 3 Jul 2024 19:09:37 +0100 Subject: [PATCH 06/44] Moved old JS code to temp folder and added constants.ts. --- src/{ => old}/journey.js | 0 src/ts/constant.ts | 16 ++++++++++++++++ 2 files changed, 16 insertions(+) rename src/{ => old}/journey.js (100%) create mode 100644 src/ts/constant.ts diff --git a/src/journey.js b/src/old/journey.js similarity index 100% rename from src/journey.js rename to src/old/journey.js diff --git a/src/ts/constant.ts b/src/ts/constant.ts new file mode 100644 index 0000000..6e94cb2 --- /dev/null +++ b/src/ts/constant.ts @@ -0,0 +1,16 @@ +/** + * Journey.js + * + * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps! + * + * @file journey.js + * @version v2.0.0 + * @author Bunoon + * @license MIT License + * @copyright Bunoon 2024 + */ + + +export namespace Constants { + export const JOURNEY_JS_ATTRIBUTE_NAME = "data-journey-js"; +} \ No newline at end of file From d59bc63b3acb35bad09b9b460bf57ce025d8949c Mon Sep 17 00:00:00 2001 From: William Troup Date: Wed, 3 Jul 2024 19:13:28 +0100 Subject: [PATCH 07/44] Added core ts file and ran first build. --- dist/journey.d.mts | 2 + dist/journey.d.ts | 2 + dist/journey.esm.js | 1 + dist/journey.esm.js.map | 1 + dist/journey.js | 886 +--------------------------------------- dist/journey.js.css | 4 +- dist/journey.js.map | 1 + package-lock.json | 280 ++++++++++++- package.json | 4 +- src/journey.ts | 16 + 10 files changed, 308 insertions(+), 889 deletions(-) create mode 100644 dist/journey.d.mts create mode 100644 dist/journey.d.ts create mode 100644 dist/journey.esm.js create mode 100644 dist/journey.esm.js.map create mode 100644 dist/journey.js.map create mode 100644 src/journey.ts diff --git a/dist/journey.d.mts b/dist/journey.d.mts new file mode 100644 index 0000000..223e65e --- /dev/null +++ b/dist/journey.d.mts @@ -0,0 +1,2 @@ + +export { } diff --git a/dist/journey.d.ts b/dist/journey.d.ts new file mode 100644 index 0000000..223e65e --- /dev/null +++ b/dist/journey.d.ts @@ -0,0 +1,2 @@ + +export { } diff --git a/dist/journey.esm.js b/dist/journey.esm.js new file mode 100644 index 0000000..fd5238d --- /dev/null +++ b/dist/journey.esm.js @@ -0,0 +1 @@ +//# sourceMappingURL=journey.esm.js.map \ No newline at end of file diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map new file mode 100644 index 0000000..a464c67 --- /dev/null +++ b/dist/journey.esm.js.map @@ -0,0 +1 @@ +{"version":3,"sources":[],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index cf1941f..5bfa212 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -1,885 +1 @@ -/*! Journey.js v2.0.0 | (c) Bunoon 2024 | MIT License */ -(function() { - var _parameter_Document = null, _parameter_Window = null, _parameter_Math = null, _parameter_Json = null, _public = {}, _configuration = {}, _configuration_ShortcutKeysEnabled = true, _enum_KeyCodes = {escape:27, left:37, up:38, right:39, down:40}, _string = {empty:"", space:" "}, _elements_Type = {}, _groups_Default = "default", _groups_Current = _groups_Default, _groups = {}, _element_Focus_Element_PositionStyle = null, _element_Disabled_Background = null, _element_Dialog = null, _element_Dialog_Close_Button = - null, _element_Dialog_Title = null, _element_Dialog_Description = null, _element_Dialog_CheckBox_Container = null, _element_Dialog_CheckBox_Input = null, _element_Dialog_ProgressDots = null, _element_Dialog_ProgressBar = null, _element_Dialog_ProgressBar_Percentage = null, _element_Dialog_ProgressBar_Percentage_Text = null, _element_Dialog_Buttons = null, _element_Dialog_Buttons_Back_Button = null, _element_Dialog_Buttons_Next_Button = null, _element_Dialog_IsHint = false, _element_Dialog_Move_Original_X = - 0, _element_Dialog_Move_Original_Y = 0, _element_Dialog_Move_IsMoving = false, _element_Dialog_Move_X = 0, _element_Dialog_Move_Y = 0, _element_ToolTip = null, _element_ToolTip_Timer = null, _attribute_Name_Options = "data-journey-js"; - function setupDefaultGroup(groups) { - _groups = getDefaultObject(groups, {}); - _groups[_groups_Default] = {json:{}, keys:[], position:0}; - } - function setupNewGroup(group) { - if (!_groups.hasOwnProperty(group)) { - _groups[group] = {json:{}, keys:[], position:0}; - } - } - function getGroupBindingOptions() { - return _groups[_groups_Current].json[_groups[_groups_Current].keys[_groups[_groups_Current].position]]; - } - function renderDisabledBackground() { - _element_Disabled_Background = createElement("div", "journey-js-disabled-background"); - _element_Disabled_Background.onclick = function() { - if (_configuration.closeDialogOnDisabledBackgroundClick) { - onDialogClose(); - } - }; - } - function showDisabledBackground() { - addNode(_parameter_Document.body, _element_Disabled_Background); - } - function hideDisabledBackground() { - removeNode(_parameter_Document.body, _element_Disabled_Background); - } - function renderDialog() { - _element_Dialog = createElement("div", "journey-js-dialog"); - _element_Dialog.style.display = "none"; - _parameter_Document.body.appendChild(_element_Dialog); - _element_Dialog_Close_Button = createElement("button", "close"); - _element_Dialog.appendChild(_element_Dialog_Close_Button); - _element_Dialog_Close_Button.onclick = function() { - onDialogClose(); - }; - addToolTip(_element_Dialog_Close_Button, _configuration.closeButtonToolTipText); - _element_Dialog_Title = createElement("div", "title"); - _element_Dialog.appendChild(_element_Dialog_Title); - _element_Dialog_Description = createElement("div", "description"); - _element_Dialog.appendChild(_element_Dialog_Description); - _element_Dialog_CheckBox_Container = createElement("div", "checkbox-container"); - _element_Dialog.appendChild(_element_Dialog_CheckBox_Container); - _element_Dialog_CheckBox_Input = buildCheckBox(_element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText).input; - _element_Dialog_CheckBox_Input.onchange = function() { - if (_configuration.showDoNotShowAgain) { - fireCustomTrigger(_configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked); - } - }; - _element_Dialog_ProgressDots = createElement("div", "progress-dots"); - _element_Dialog.appendChild(_element_Dialog_ProgressDots); - _element_Dialog_ProgressBar = createElement("div", "progress-bar"); - _element_Dialog.appendChild(_element_Dialog_ProgressBar); - _element_Dialog_ProgressBar_Percentage = createElement("div", "progress-bar-percentage"); - _element_Dialog_ProgressBar.appendChild(_element_Dialog_ProgressBar_Percentage); - _element_Dialog_ProgressBar_Percentage_Text = createElement("p", "progress-bar-percentage-text"); - _element_Dialog_ProgressBar_Percentage.appendChild(_element_Dialog_ProgressBar_Percentage_Text); - _element_Dialog_Buttons = createElement("div", "buttons"); - _element_Dialog.appendChild(_element_Dialog_Buttons); - _element_Dialog_Buttons_Back_Button = createElement("button", "back"); - _element_Dialog_Buttons_Back_Button.onclick = onDialogBack; - _element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Back_Button); - _element_Dialog_Buttons_Next_Button = createElement("button", "next"); - _element_Dialog_Buttons_Next_Button.onclick = onDialogNext; - _element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Next_Button); - makeDialogMovable(); - } - function onDialogClose(showConfirmationBox) { - var confirmed = false; - showConfirmationBox = getDefaultBoolean(showConfirmationBox, true); - if (isDefinedString(_configuration.closeDialogConfirmationText) && showConfirmationBox) { - confirmed = confirm(_configuration.closeDialogConfirmationText); - } else { - confirmed = true; - } - if (confirmed) { - var bindingOptions = getGroupBindingOptions(); - if (isDefined(bindingOptions) && isDefined(bindingOptions.currentView.element)) { - fireCustomTrigger(bindingOptions.events.onClose, bindingOptions.currentView.element); - } - removeFocusClassFromLastElement(false); - hideDisabledBackground(); - hideToolTip(); - _element_Dialog.style.display = "none"; - } - } - function onDialogBack() { - if (_groups[_groups_Current].position > 0) { - removeFocusClassFromLastElement(); - _groups[_groups_Current].position--; - showDialogAndSetPosition(); - } - } - function onDialogNext() { - if (_groups[_groups_Current].position === _groups[_groups_Current].keys.length - 1) { - var bindingOptions = getGroupBindingOptions(); - onDialogClose(false); - fireCustomTrigger(bindingOptions.events.onFinish, bindingOptions.currentView.element); - } else { - removeFocusClassFromLastElement(); - _groups[_groups_Current].position++; - showDialogAndSetPosition(); - } - } - function showDialogAndSetPosition() { - var bindingOptions = getGroupBindingOptions(); - if (isDefined(bindingOptions) && isDefined(bindingOptions.currentView.element)) { - if (bindingOptions.showDisabledBackground) { - showDisabledBackground(); - } else { - hideDisabledBackground(); - } - hideToolTip(); - _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? "block" : "none"; - _configuration_ShortcutKeysEnabled = true; - bindingOptions.currentView.element.className += _string.space + "journey-js-element-focus"; - if (_configuration.scrollToElements) { - bindingOptions.currentView.element.scrollIntoView(); - } - var lastPositionStyle = getStyleValueByName(bindingOptions.currentView.element, "position"); - if (lastPositionStyle !== _string.empty && lastPositionStyle.toLowerCase() === "static") { - _element_Focus_Element_PositionStyle = lastPositionStyle; - bindingOptions.currentView.element.style.position = "relative"; - } - showElementBasedOnCondition(_element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain); - showElementBasedOnCondition(_element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[_groups_Current].keys.length > 1); - showElementBasedOnCondition(_element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[_groups_Current].keys.length > 1); - showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText); - showElementBasedOnCondition(_element_Dialog_Buttons, _configuration.showButtons); - _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText; - _element_Dialog_Buttons_Back_Button.disabled = _groups[_groups_Current].position === 0; - if (_groups[_groups_Current].position >= _groups[_groups_Current].keys.length - 1) { - _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText; - } else { - _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText; - } - setDialogText(bindingOptions); - setDialogPosition(null, bindingOptions); - buildProcessDots(); - setProgressBarPosition(); - fireCustomTrigger(bindingOptions.events.onEnter, bindingOptions.currentView.element); - if (bindingOptions.sendClick) { - bindingOptions.currentView.element.click(); - } - } - } - function setDialogText(bindingOptions) { - if (isDefinedString(bindingOptions.title)) { - _element_Dialog_Title.innerHTML = bindingOptions.title; - } else { - _element_Dialog_Title.innerHTML = _string.empty; - } - if (isDefinedString(bindingOptions.description)) { - _element_Dialog_Description.innerHTML = bindingOptions.description; - } else { - _element_Dialog_Description.innerHTML = _string.empty; - } - } - function setDialogPosition(e, bindingOptions) { - if (_element_Dialog.style.display !== "block") { - _element_Dialog.style.display = "block"; - fireCustomTrigger(bindingOptions.events.onOpen, bindingOptions.currentView.element); - } - if (_groups[_groups_Current].position === 0) { - fireCustomTrigger(bindingOptions.events.onStart, bindingOptions.currentView.element); - } - _element_Dialog_IsHint = bindingOptions.isHint === true; - if (bindingOptions.attach || bindingOptions.isHint) { - if (bindingOptions.isHint && bindingOptions.alignHintToClickPosition) { - showElementAtMousePosition(e, _element_Dialog); - } else { - var offset = getOffset(bindingOptions.currentView.element), top = offset.top + bindingOptions.currentView.element.offsetHeight, left = offset.left; - if (left + _element_Dialog.offsetWidth > _parameter_Window.innerWidth || bindingOptions.alignRight) { - left -= _element_Dialog.offsetWidth; - left += bindingOptions.currentView.element.offsetWidth; - } - if (top + _element_Dialog.offsetHeight > _parameter_Window.innerHeight || bindingOptions.alignTop) { - top -= _element_Dialog.offsetHeight + bindingOptions.currentView.element.offsetHeight; - } - _element_Dialog.style.top = top + "px"; - _element_Dialog.style.left = left + "px"; - } - } else { - var scrollPosition = getScrollPosition(), centerLeft = _parameter_Math.max(0, (_parameter_Window.innerWidth - _element_Dialog.offsetWidth) / 2 + scrollPosition.left), centerTop = _parameter_Math.max(0, (_parameter_Window.innerHeight - _element_Dialog.offsetHeight) / 2 + scrollPosition.top); - _element_Dialog.style.left = centerLeft + "px"; - _element_Dialog.style.top = centerTop + "px"; - } - } - function removeFocusClassFromLastElement(callCustomTrigger) { - callCustomTrigger = isDefined(callCustomTrigger) ? callCustomTrigger : true; - var bindingOptions = getGroupBindingOptions(); - if (isDefined(bindingOptions) && isDefined(bindingOptions.currentView.element)) { - bindingOptions.currentView.element.className = bindingOptions.currentView.element.className.replace(_string.space + "journey-js-element-focus", _string.empty); - if (isDefined(_element_Focus_Element_PositionStyle)) { - bindingOptions.currentView.element.style.position = _element_Focus_Element_PositionStyle; - } - if (callCustomTrigger) { - fireCustomTrigger(bindingOptions.events.onLeave, bindingOptions.currentView.element); - } - } - } - function buildProcessDots() { - _element_Dialog_ProgressDots.innerHTML = _string.empty; - if (_configuration.showProgressDots) { - var keysLength = _groups[_groups_Current].keys.length; - for (var keyIndex = 0; keyIndex < keysLength; keyIndex++) { - buildProgressDot(keyIndex, _groups[_groups_Current].keys[keyIndex]); - } - } - } - function buildProgressDot(keyIndex, order) { - var bindingOptions = _groups[_groups_Current].json[order], dot = null; - if (keyIndex === _groups[_groups_Current].position) { - dot = createElement("div", "dot-active"); - } else { - dot = createElement("div", "dot"); - dot.onclick = function() { - removeFocusClassFromLastElement(); - _groups[_groups_Current].position = keyIndex; - showDialogAndSetPosition(); - }; - } - _element_Dialog_ProgressDots.appendChild(dot); - if (_configuration.showProgressDotToolTips) { - if (isDefinedString(bindingOptions.tooltip)) { - addToolTip(dot, bindingOptions.tooltip); - } else { - addToolTip(dot, bindingOptions.title); - } - } - if (_configuration.showProgressDotNumbers) { - dot.className += " dot-number"; - dot.innerHTML = (keyIndex + 1).toString(); - } - } - function setProgressBarPosition() { - if (_configuration.showProgressBar) { - var pixelsPerStage = _element_Dialog_ProgressBar.offsetWidth / _groups[_groups_Current].keys.length, width = (_groups[_groups_Current].position + 1) * pixelsPerStage, percentageComplete = _parameter_Math.ceil((_groups[_groups_Current].position + 1) / _groups[_groups_Current].keys.length * 100); - _element_Dialog_ProgressBar_Percentage.style.width = width + "px"; - _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + "%"; - } - } - function makeDialogMovable() { - _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown; - _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp; - _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp; - _parameter_Document.body.addEventListener("mousemove", onMoveDocumentMouseMove); - _parameter_Document.body.addEventListener("mouseleave", onMoveDocumentMouseLeave); - } - function onMoveTitleBarMouseDown(e) { - if (!_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled) { - _element_Dialog.className += " journey-js-dialog-moving"; - _element_Dialog_Move_IsMoving = true; - _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft; - _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop; - _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft; - _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop; - } - } - function onMoveTitleBarMouseUp() { - if (_element_Dialog_Move_IsMoving) { - _element_Dialog_Move_IsMoving = false; - _element_Dialog_Move_Original_X = 0; - _element_Dialog_Move_Original_Y = 0; - _element_Dialog.className = "journey-js-dialog"; - } - } - function onMoveDocumentMouseMove(e) { - if (_element_Dialog_Move_IsMoving) { - _element_Dialog.style.left = e.pageX - _element_Dialog_Move_X + "px"; - _element_Dialog.style.top = e.pageY - _element_Dialog_Move_Y + "px"; - } - } - function onMoveDocumentMouseLeave() { - if (_element_Dialog_Move_IsMoving) { - _element_Dialog.style.left = _element_Dialog_Move_Original_X + "px"; - _element_Dialog.style.top = _element_Dialog_Move_Original_Y + "px"; - _element_Dialog_Move_IsMoving = false; - _element_Dialog_Move_Original_X = 0; - _element_Dialog_Move_Original_Y = 0; - _element_Dialog.className = "journey-js-dialog"; - } - } - function renderToolTip() { - if (!isDefined(_element_ToolTip)) { - _element_ToolTip = createElement("div", "journey-js-tooltip"); - _element_ToolTip.style.display = "none"; - _parameter_Document.body.appendChild(_element_ToolTip); - _parameter_Document.body.addEventListener("mousemove", function() { - hideToolTip(); - }); - _parameter_Document.addEventListener("scroll", function() { - hideToolTip(); - }); - } - } - function addToolTip(element, text) { - if (element !== null) { - element.onmousemove = function(e) { - showToolTip(e, text); - }; - } - } - function showToolTip(e, text) { - cancelBubble(e); - hideToolTip(); - _element_ToolTip_Timer = setTimeout(function() { - _element_ToolTip.innerHTML = text; - _element_ToolTip.style.display = "block"; - showElementAtMousePosition(e, _element_ToolTip); - }, _configuration.tooltipDelay); - } - function hideToolTip() { - if (isDefined(_element_ToolTip)) { - if (isDefined(_element_ToolTip_Timer)) { - clearTimeout(_element_ToolTip_Timer); - _element_ToolTip_Timer = null; - } - if (_element_ToolTip.style.display === "block") { - _element_ToolTip.style.display = "none"; - } - } - } - function getElements() { - var tagTypes = _configuration.domElementTypes, tagTypesLength = tagTypes.length; - for (var tagTypeIndex = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++) { - var domElements = _parameter_Document.getElementsByTagName(tagTypes[tagTypeIndex]), elements = [].slice.call(domElements), elementsLength = elements.length; - for (var elementIndex = 0; elementIndex < elementsLength; elementIndex++) { - if (!getElement(elements[elementIndex])) { - break; - } - } - } - _groups[_groups_Current].keys.sort(); - } - function getElement(element) { - var result = true; - if (isDefined(element) && element.hasAttribute(_attribute_Name_Options)) { - var bindingOptionsData = element.getAttribute(_attribute_Name_Options); - if (isDefinedString(bindingOptionsData)) { - var bindingOptions = getObjectFromString(bindingOptionsData); - if (bindingOptions.parsed && isDefinedObject(bindingOptions.result)) { - setupElement(element, buildAttributeOptions(bindingOptions.result)); - } else { - if (!_configuration.safeMode) { - console.error(_configuration.attributeNotValidErrorText.replace("{{attribute_name}}", _attribute_Name_Options)); - result = false; - } - } - } else { - if (!_configuration.safeMode) { - console.error(_configuration.attributeNotSetErrorText.replace("{{attribute_name}}", _attribute_Name_Options)); - result = false; - } - } - } - return result; - } - function setupElement(element, bindingOptions) { - bindingOptions.currentView = {}; - bindingOptions.currentView.element = element; - if (isDefinedNumber(bindingOptions.order) && (isDefinedString(bindingOptions.title) || isDefinedString(bindingOptions.description))) { - element.removeAttribute(_attribute_Name_Options); - if (!bindingOptions.isHint) { - setupNewGroup(bindingOptions.group); - _groups[bindingOptions.group].json[bindingOptions.order] = bindingOptions; - _groups[bindingOptions.group].keys.push(bindingOptions.order); - fireCustomTrigger(bindingOptions.events.onAddStep, element); - } else { - renderHint(bindingOptions); - } - } - } - function renderHint(bindingOptions) { - var positionStyle = getStyleValueByName(bindingOptions.currentView.element, "position"); - if (positionStyle !== _string.empty && positionStyle.toLowerCase() === "static") { - bindingOptions.currentView.element.style.position = "relative"; - } - var hint = createElement("div", "journey-js-hint"); - bindingOptions.currentView.element.appendChild(hint); - hint.onclick = function(e) { - cancelBubble(e); - _element_Dialog_CheckBox_Container.style.display = "none"; - _element_Dialog_ProgressDots.style.display = "none"; - _element_Dialog_ProgressBar.style.display = "none"; - _element_Dialog_Buttons.style.display = "none"; - _configuration_ShortcutKeysEnabled = false; - setDialogText(bindingOptions); - setDialogPosition(e, bindingOptions); - if (bindingOptions.removeHintWhenViewed) { - clearElementsByClassName(bindingOptions.currentView.element, "journey-js-hint"); - } - }; - } - function buildDocumentEvents(addEvents) { - addEvents = isDefined(addEvents) ? addEvents : true; - var documentFunc = addEvents ? _parameter_Document.addEventListener : _parameter_Document.removeEventListener, windowFunc = addEvents ? _parameter_Window.addEventListener : _parameter_Window.removeEventListener; - if (_configuration.shortcutKeysEnabled) { - documentFunc("keydown", onWindowKeyDown); - } - windowFunc("resize", onWindowResize); - } - function onWindowKeyDown(e) { - if (_public.isOpen() && _configuration.shortcutKeysEnabled) { - if (e.keyCode === _enum_KeyCodes.escape) { - e.preventDefault(); - onDialogClose(); - } else { - if (_configuration_ShortcutKeysEnabled) { - if (e.keyCode === _enum_KeyCodes.left) { - e.preventDefault(); - onDialogBack(); - } else if (e.keyCode === _enum_KeyCodes.right) { - e.preventDefault(); - onDialogNext(); - } else if (e.keyCode === _enum_KeyCodes.up) { - e.preventDefault(); - onWindowKeyCodeUp(); - } else if (e.keyCode === _enum_KeyCodes.down) { - e.preventDefault(); - onWindowKeyCodeDown(); - } - } - } - } - } - function onWindowResize() { - if (_public.isOpen()) { - showDialogAndSetPosition(); - } - } - function onWindowKeyCodeUp() { - if (_groups[_groups_Current].position !== 0) { - removeFocusClassFromLastElement(); - _groups[_groups_Current].position = 0; - showDialogAndSetPosition(); - } - } - function onWindowKeyCodeDown() { - if (_groups[_groups_Current].position !== _groups[_groups_Current].keys.length - 1) { - removeFocusClassFromLastElement(); - _groups[_groups_Current].position = _groups[_groups_Current].keys.length - 1; - showDialogAndSetPosition(); - } - } - function buildAttributeOptions(newOptions) { - var options = !isDefinedObject(newOptions) ? {} : newOptions; - options.order = getDefaultNumber(options.order, 0); - options.attach = getDefaultBoolean(options.attach, true); - options.sendClick = getDefaultBoolean(options.sendClick, false); - options.alignTop = getDefaultBoolean(options.alignTop, false); - options.alignRight = getDefaultBoolean(options.alignRight, false); - options.isHint = getDefaultBoolean(options.isHint, false); - options.alignHintToClickPosition = getDefaultBoolean(options.alignHintToClickPosition, false); - options.showDisabledBackground = getDefaultBoolean(options.showDisabledBackground, true); - options.removeHintWhenViewed = getDefaultBoolean(options.removeHintWhenViewed, false); - options.group = getDefaultString(options.group, _groups_Default); - options = buildAttributeOptionStrings(options); - return buildAttributeOptionCustomTriggers(options); - } - function buildAttributeOptionStrings(options) { - options.title = getDefaultString(options.title, null); - options.description = getDefaultString(options.description, null); - options.tooltip = getDefaultString(options.tooltip, null); - return options; - } - function buildAttributeOptionCustomTriggers(options) { - options.events = getDefaultObject(options.events, {}); - options.events.onEnter = getDefaultFunction(options.events.onEnter, null); - options.events.onLeave = getDefaultFunction(options.events.onLeave, null); - options.events.onClose = getDefaultFunction(options.events.onClose, null); - options.events.onFinish = getDefaultFunction(options.events.onFinish, null); - options.events.onOpen = getDefaultFunction(options.events.onOpen, null); - options.events.onStart = getDefaultFunction(options.events.onStart, null); - options.events.onAddStep = getDefaultFunction(options.events.onAddStep, null); - options.events.onRemoveStep = getDefaultFunction(options.events.onRemoveStep, null); - return options; - } - function getBrowserUrlParameters() { - var show = false; - if (_configuration.browserUrlParametersEnabled) { - var url = _parameter_Window.location.href, urlArguments = getBrowserUrlArguments(url); - if (isDefined(urlArguments.sjOrderId)) { - var orderId = parseInt(urlArguments.sjOrderId, 10); - if (!isNaN(orderId) && orderId <= _groups[_groups_Current].keys.length - 1) { - _groups[_groups_Current].position = orderId; - } - } - if (isDefined(urlArguments.sjShow)) { - show = urlArguments.sjShow === "true"; - } - } - return show; - } - function getBrowserUrlArguments(url) { - var urlArguments = {}, urlDataParts = url.split("?"); - if (urlDataParts.length > 1) { - var parsedArgs = urlDataParts[1].split("&"), parsedArgsLength = parsedArgs.length; - for (var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++) { - var parsedArg = parsedArgs[parsedArgsIndex].split("="); - urlArguments[parsedArg[0]] = parsedArg[1]; - } - } - return urlArguments; - } - function isDefined(value) { - return value !== null && value !== undefined && value !== _string.empty; - } - function isDefinedObject(object) { - return isDefined(object) && typeof object === "object"; - } - function isDefinedBoolean(object) { - return isDefined(object) && typeof object === "boolean"; - } - function isDefinedString(object) { - return isDefined(object) && typeof object === "string"; - } - function isDefinedFunction(object) { - return isDefined(object) && typeof object === "function"; - } - function isDefinedNumber(object) { - return isDefined(object) && typeof object === "number"; - } - function isDefinedArray(object) { - return isDefinedObject(object) && object instanceof Array; - } - function createElement(type, className) { - var result = null, nodeType = type.toLowerCase(), isText = nodeType === "text"; - if (!_elements_Type.hasOwnProperty(nodeType)) { - _elements_Type[nodeType] = isText ? _parameter_Document.createTextNode(_string.empty) : _parameter_Document.createElement(nodeType); - } - result = _elements_Type[nodeType].cloneNode(false); - if (isDefined(className)) { - result.className = className; - } - return result; - } - function getOffset(element) { - var left = 0, top = 0; - while (element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) { - left += element.offsetLeft - element.scrollLeft; - top += element.offsetTop - element.scrollTop; - element = element.offsetParent; - } - return {left:left, top:top}; - } - function getScrollPosition() { - var doc = _parameter_Document.documentElement, left = (_parameter_Window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0), top = (_parameter_Window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0); - return {left:left, top:top}; - } - function getStyleValueByName(element, stylePropertyName) { - var value = null; - if (_parameter_Window.getComputedStyle) { - value = _parameter_Document.defaultView.getComputedStyle(element, null).getPropertyValue(stylePropertyName); - } else if (element.currentStyle) { - value = element.currentStyle[stylePropertyName]; - } - return value; - } - function addNode(parent, node) { - try { - if (!parent.contains(node)) { - parent.appendChild(node); - } - } catch (e) { - console.warn(e.message); - } - } - function removeNode(parent, node) { - try { - if (parent.contains(node)) { - parent.removeChild(node); - } - } catch (e) { - console.warn(e.message); - } - } - function cancelBubble(e) { - e.preventDefault(); - e.cancelBubble = true; - } - function showElementAtMousePosition(e, element) { - var left = e.pageX, top = e.pageY, scrollPosition = getScrollPosition(); - element.style.display = "block"; - if (left + element.offsetWidth > _parameter_Window.innerWidth) { - left -= element.offsetWidth; - } else { - left++; - } - if (top + element.offsetHeight > _parameter_Window.innerHeight) { - top -= element.offsetHeight; - } else { - top++; - } - if (left < scrollPosition.left) { - left = e.pageX + 1; - } - if (top < scrollPosition.top) { - top = e.pageY + 1; - } - element.style.left = left + "px"; - element.style.top = top + "px"; - } - function showElementBasedOnCondition(element, condition) { - if (condition) { - if (element.style.display !== "block") { - element.style.display = "block"; - } - } else { - if (element.style.display !== "none") { - element.style.display = "none"; - } - } - } - function buildCheckBox(container, labelText) { - var lineContainer = createElement("div"), label = createElement("label", "checkbox"), input = createElement("input"); - container.appendChild(lineContainer); - lineContainer.appendChild(label); - label.appendChild(input); - input.type = "checkbox"; - var checkMark = createElement("span", "check-mark"), text = createElement("span", "text"); - text.innerHTML = labelText; - label.appendChild(checkMark); - label.appendChild(text); - return {input:input, label:label}; - } - function clearElementsByClassName(container, className) { - var elements = container.getElementsByClassName(className); - while (elements[0]) { - elements[0].parentNode.removeChild(elements[0]); - } - } - function fireCustomTrigger(triggerFunction) { - if (isDefinedFunction(triggerFunction)) { - triggerFunction.apply(null, [].slice.call(arguments, 1)); - } - } - function getDefaultAnyString(value, defaultValue) { - return typeof value === "string" ? value : defaultValue; - } - function getDefaultString(value, defaultValue) { - return isDefinedString(value) ? value : defaultValue; - } - function getDefaultBoolean(value, defaultValue) { - return isDefinedBoolean(value) ? value : defaultValue; - } - function getDefaultNumber(value, defaultValue) { - return isDefinedNumber(value) ? value : defaultValue; - } - function getDefaultFunction(value, defaultValue) { - return isDefinedFunction(value) ? value : defaultValue; - } - function getDefaultObject(value, defaultValue) { - return isDefinedObject(value) ? value : defaultValue; - } - function getDefaultArray(value, defaultValue) { - return isDefinedArray(value) ? value : defaultValue; - } - function getDefaultStringOrArray(value, defaultValue) { - if (isDefinedString(value)) { - value = value.split(_string.space); - if (value.length === 0) { - value = defaultValue; - } - } else { - value = getDefaultArray(value, defaultValue); - } - return value; - } - function getObjectFromString(objectString) { - var parsed = true, result = null; - try { - if (isDefinedString(objectString)) { - result = _parameter_Json.parse(objectString); - } - } catch (e1) { - try { - result = eval("(" + objectString + ")"); - if (isDefinedFunction(result)) { - result = result(); - } - } catch (e2) { - if (!_configuration.safeMode) { - console.error(_configuration.objectErrorText.replace("{{error_1}}", e1.message).replace("{{error_2}}", e2.message)); - parsed = false; - } - result = null; - } - } - return {parsed:parsed, result:result}; - } - _public.start = function(group) { - if (!_public.isOpen()) { - _groups_Current = getDefaultString(group, _groups_Default); - if (_groups.hasOwnProperty(_groups_Current)) { - _groups[_groups_Current].position = 0; - showDialogAndSetPosition(); - } - } - return _public; - }; - _public.show = function(group) { - if (!_public.isOpen()) { - _groups_Current = getDefaultString(group, _groups_Current); - if (_groups.hasOwnProperty(_groups_Current)) { - if (_groups[_groups_Current].position === _groups[_groups_Current].keys.length - 1) { - _groups[_groups_Current].position = 0; - } - showDialogAndSetPosition(); - } - } - return _public; - }; - _public.hide = function() { - if (_public.isOpen()) { - onDialogClose(); - } - return _public; - }; - _public.isOpen = function() { - return isDefined(_element_Dialog) && _element_Dialog.style.display === "block"; - }; - _public.isComplete = function() { - return _groups[_groups_Current].position >= _groups[_groups_Current].keys.length - 1; - }; - _public.addDocumentSteps = function() { - getElements(); - return _public; - }; - _public.addStep = function(element, options) { - if (isDefinedObject(element) && isDefinedObject(options)) { - setupElement(element, buildAttributeOptions(options)); - _groups[_groups_Current].keys.sort(); - resetDialogPosition(); - } - return _public; - }; - _public.removeStep = function(element) { - if (isDefinedObject(element)) { - var removed = false; - for (var group in _groups) { - if (_groups.hasOwnProperty(group)) { - for (var order in _groups[group].json) { - if (_groups[group].json.hasOwnProperty(order)) { - var bindingOptions = _groups[group].json[order]; - if (bindingOptions.currentView.element === element) { - fireCustomTrigger(bindingOptions.events.onRemoveStep, bindingOptions.currentView.element); - _groups[group].keys.splice(_groups[group].keys.indexOf(bindingOptions.order), 1); - delete _groups[group].json[bindingOptions.order]; - _groups[group].keys.sort(); - removed = true; - break; - } - } - } - } - } - if (!removed) { - clearElementsByClassName(element, "journey-js-hint"); - } else { - resetDialogPosition(); - } - } - return _public; - }; - _public.clearSteps = function(group) { - resetDialogPosition(); - for (var groupName in _groups) { - if (_groups.hasOwnProperty(groupName)) { - if (!isDefinedString(group) || group === groupName) { - for (var order in _groups[groupName].json) { - if (_groups[groupName].json.hasOwnProperty(order)) { - var bindingOptions = _groups[groupName].json[order]; - fireCustomTrigger(bindingOptions.events.onRemoveStep, bindingOptions.currentView.element); - } - } - } - } - } - if (isDefinedString(group)) { - if (_groups.hasOwnProperty(group)) { - delete _groups[group]; - } - } else { - _groups = {}; - } - if (!isDefinedString(group) || group === _groups_Default) { - setupDefaultGroup(_groups); - } - return _public; - }; - _public.clearHints = function() { - clearElementsByClassName(_parameter_Document.body, "journey-js-hint"); - return _public; - }; - _public.reverseStepOrder = function() { - _groups[_groups_Current].keys.reverse(); - resetDialogPosition(); - return _public; - }; - function resetDialogPosition() { - if (_public.isOpen()) { - onDialogClose(false); - _groups[_groups_Current].position = 0; - } - } - _public.setConfiguration = function(newConfiguration) { - if (isDefinedObject(newConfiguration)) { - var configurationHasChanged = false; - for (var propertyName in newConfiguration) { - if (newConfiguration.hasOwnProperty(propertyName) && _configuration.hasOwnProperty(propertyName) && _configuration[propertyName] !== newConfiguration[propertyName]) { - _configuration[propertyName] = newConfiguration[propertyName]; - configurationHasChanged = true; - } - } - if (configurationHasChanged) { - buildDefaultConfiguration(_configuration); - } - } - return _public; - }; - function buildDefaultConfiguration(newConfiguration) { - _configuration = getDefaultObject(newConfiguration, {}); - _configuration.safeMode = getDefaultBoolean(_configuration.safeMode, true); - _configuration.domElementTypes = getDefaultStringOrArray(_configuration.domElementTypes, ["*"]); - _configuration.showCloseButton = getDefaultBoolean(_configuration.showCloseButton, true); - _configuration.shortcutKeysEnabled = getDefaultBoolean(_configuration.shortcutKeysEnabled, true); - _configuration.showProgressDots = getDefaultBoolean(_configuration.showProgressDots, true); - _configuration.browserUrlParametersEnabled = getDefaultBoolean(_configuration.browserUrlParametersEnabled, true); - _configuration.showProgressDotNumbers = getDefaultBoolean(_configuration.showProgressDotNumbers, false); - _configuration.showButtons = getDefaultBoolean(_configuration.showButtons, true); - _configuration.showDoNotShowAgain = getDefaultBoolean(_configuration.showDoNotShowAgain, false); - _configuration.tooltipDelay = getDefaultNumber(_configuration.tooltipDelay, 750); - _configuration.showProgressDotToolTips = getDefaultBoolean(_configuration.showProgressDotToolTips, true); - _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean(_configuration.closeDialogOnDisabledBackgroundClick, false); - _configuration.showProgressBar = getDefaultBoolean(_configuration.showProgressBar, false); - _configuration.scrollToElements = getDefaultBoolean(_configuration.scrollToElements, false); - _configuration.dialogMovingEnabled = getDefaultBoolean(_configuration.dialogMovingEnabled, false); - _configuration.showProgressBarText = getDefaultBoolean(_configuration.showProgressBarText, false); - buildDefaultConfigurationStrings(); - buildDefaultConfigurationCustomTriggers(); - } - function buildDefaultConfigurationStrings() { - _configuration.backButtonText = getDefaultAnyString(_configuration.backButtonText, "Back"); - _configuration.nextButtonText = getDefaultAnyString(_configuration.nextButtonText, "Next"); - _configuration.finishButtonText = getDefaultAnyString(_configuration.finishButtonText, "Finish"); - _configuration.closeButtonToolTipText = getDefaultAnyString(_configuration.closeButtonToolTipText, "Close"); - _configuration.doNotShowAgainText = getDefaultAnyString(_configuration.doNotShowAgainText, "Do not show again"); - _configuration.objectErrorText = getDefaultAnyString(_configuration.objectErrorText, "Errors in object: {{error_1}}, {{error_2}}"); - _configuration.attributeNotValidErrorText = getDefaultAnyString(_configuration.attributeNotValidErrorText, "The attribute '{{attribute_name}}' is not a valid object."); - _configuration.attributeNotSetErrorText = getDefaultAnyString(_configuration.attributeNotSetErrorText, "The attribute '{{attribute_name}}' has not been set correctly."); - _configuration.closeDialogConfirmationText = getDefaultAnyString(_configuration.closeDialogConfirmationText, null); - } - function buildDefaultConfigurationCustomTriggers() { - _configuration.onDoNotShowAgainChange = getDefaultFunction(_configuration.onDoNotShowAgainChange, null); - } - _public.getVersion = function() { - return "2.0.0"; - }; - (function(documentObject, windowObject, mathObject, jsonObject) { - _parameter_Document = documentObject; - _parameter_Window = windowObject; - _parameter_Math = mathObject; - _parameter_Json = jsonObject; - buildDefaultConfiguration(); - _parameter_Document.addEventListener("DOMContentLoaded", function() { - setupDefaultGroup(); - renderDisabledBackground(); - renderDialog(); - renderToolTip(); - getElements(); - buildDocumentEvents(); - if (getBrowserUrlParameters()) { - _public.show(); - } - }); - if (!isDefined(_parameter_Window.$journey)) { - _parameter_Window.$journey = _public; - } - })(document, window, Math, JSON); -})(); \ No newline at end of file +//# sourceMappingURL=journey.js.map \ No newline at end of file diff --git a/dist/journey.js.css b/dist/journey.js.css index 35ac8c3..d179e88 100644 --- a/dist/journey.js.css +++ b/dist/journey.js.css @@ -452,4 +452,6 @@ div.journey-js-tooltip { 100% { opacity: 1; } -}/*# sourceMappingURL=journey.js.css.map */ \ No newline at end of file +} + +/*# sourceMappingURL=journey.js.css.map */ diff --git a/dist/journey.js.map b/dist/journey.js.map new file mode 100644 index 0000000..a464c67 --- /dev/null +++ b/dist/journey.js.map @@ -0,0 +1 @@ +{"version":3,"sources":[],"names":[],"mappings":""} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4cfe690..b12de42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,11 @@ "version": "2.0.0", "license": "MIT", "devDependencies": { + "@swc/core": "^1.6.6", + "sass": "^1.77.6", "terser": "^5.31.1", - "tsup": "^8.1.0" + "tsup": "^8.1.0", + "typescript": "^5.5.3" } }, "node_modules/@esbuild/aix-ppc64": { @@ -759,6 +762,232 @@ "win32" ] }, + "node_modules/@swc/core": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.6.7.tgz", + "integrity": "sha512-BBzORL9qWz5hZqAZ83yn+WNaD54RH5eludjqIOboolFOK/Pw+2l00/H77H4CEBJnzCIBQszsyqtITmrn4evp0g==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.9" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.6.7", + "@swc/core-darwin-x64": "1.6.7", + "@swc/core-linux-arm-gnueabihf": "1.6.7", + "@swc/core-linux-arm64-gnu": "1.6.7", + "@swc/core-linux-arm64-musl": "1.6.7", + "@swc/core-linux-x64-gnu": "1.6.7", + "@swc/core-linux-x64-musl": "1.6.7", + "@swc/core-win32-arm64-msvc": "1.6.7", + "@swc/core-win32-ia32-msvc": "1.6.7", + "@swc/core-win32-x64-msvc": "1.6.7" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.7.tgz", + "integrity": "sha512-sNb+ghP2OhZyUjS7E5Mf3PqSvoXJ5gY6GBaH2qp8WQxx9VL7ozC4HVo6vkeFJBN5cmYqUCLnhrM3HU4W+7yMSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.6.7.tgz", + "integrity": "sha512-LQwYm/ATYN5fYSYVPMfComPiFo5i8jh75h1ASvNWhXtS+/+k1dq1zXTJWZRuojd5NXgW3bb6mJtJ2evwYIgYbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.7.tgz", + "integrity": "sha512-kEDzVhNci38LX3kdY99t68P2CDf+2QFDk5LawVamXH0iN5DRAO/+wjOhxL8KOHa6wQVqKEt5WrhD+Rrvk/34Yw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.7.tgz", + "integrity": "sha512-SyOBUGfl31xLGpIJ/Jd6GKHtkfZyHBXSwFlK7FmPN//MBQLtTBm4ZaWTnWnGo4aRsJwQdXWDKPyqlMBtnIl1nQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.7.tgz", + "integrity": "sha512-1fOAXkDFbRfItEdMZPxT3du1QWYhgToa4YsnqTujjE8EqJW8K27hIcHRIkVuzp7PNhq8nLBg0JpJM4g27EWD7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.7.tgz", + "integrity": "sha512-Gp7uCwPsNO5ATxbyvfTyeNCHUGD9oA+xKMm43G1tWCy+l07gLqWMKp7DIr3L3qPD05TfAVo3OuiOn2abpzOFbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.7.tgz", + "integrity": "sha512-QeruGBZJ15tadqEMQ77ixT/CYGk20MtlS8wmvJiV+Wsb8gPW5LgCjtupzcLLnoQzDG54JGNCeeZ0l/T8NYsOvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.7.tgz", + "integrity": "sha512-ouRqgSnT95lTCiU/6kJRNS5b1o+p8I/V9jxtL21WUj/JOVhsFmBErqQ0MZyCu514noWiR5BIqOrZXR8C1Knx6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.7.tgz", + "integrity": "sha512-eZAP/EmJ0IcfgAx6B4/SpSjq3aT8gr0ooktfMqw/w0/5lnNrbMl2v+2kvxcneNcF7bp8VNcYZnoHlsP+LvmVbA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.7.tgz", + "integrity": "sha512-QOdE+7GQg1UQPS6p0KxzJOh/8GLbJ5zI1vqKArCCB0unFqUfKIjYb2TaH0geEBy3w9qtXxe3ZW6hzxtZSS9lDg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.9.tgz", + "integrity": "sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -1266,6 +1495,13 @@ "node": ">= 4" } }, + "node_modules/immutable": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1781,6 +2017,24 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/sass": { + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1834,6 +2088,16 @@ "node": ">= 8" } }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -2131,6 +2395,20 @@ } } }, + "node_modules/typescript": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", diff --git a/package.json b/package.json index 928aaae..c6f266a 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "sass": "^1.77.6", "terser": "^5.31.1", "tsup": "^8.1.0", - "typescript": "^5.5.2" + "typescript": "^5.5.3" } -} \ No newline at end of file +} diff --git a/src/journey.ts b/src/journey.ts new file mode 100644 index 0000000..17926fb --- /dev/null +++ b/src/journey.ts @@ -0,0 +1,16 @@ +/** + * Journey.js + * + * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps! + * + * @file journey.js + * @version v2.0.0 + * @author Bunoon + * @license MIT License + * @copyright Bunoon 2024 + */ + + +( () => { + +} ); \ No newline at end of file From 1a97031496494a4f57920ff0b471191a258ada3e Mon Sep 17 00:00:00 2001 From: William Troup Date: Wed, 3 Jul 2024 20:13:32 +0100 Subject: [PATCH 08/44] Ignore fix. --- .npmignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.npmignore b/.npmignore index 3a12718..06bedd1 100644 --- a/.npmignore +++ b/.npmignore @@ -4,7 +4,7 @@ /build CODE_OF_CONDUCT.md CONTRIBUTING.md -heat.js.nuspec +journey.js.nuspec PACK.sh PUBLISH.sh README_NUGET.md From 5f96b13597915a58b6b242b76b06d63ea7923363 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 10:45:14 +0100 Subject: [PATCH 09/44] NuGet and NPM packages now only contain the right files. --- .npmignore | 3 ++- journey.js.nuspec | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.npmignore b/.npmignore index 06bedd1..7114ac1 100644 --- a/.npmignore +++ b/.npmignore @@ -15,4 +15,5 @@ tsconfig.json tsup.build.config.ts tsup.build.esm.config.ts tsup.build.min.config.ts -BUILD_INSTRUCTIONS.md \ No newline at end of file +BUILD_INSTRUCTIONS.md +*.nupkg \ No newline at end of file diff --git a/journey.js.nuspec b/journey.js.nuspec index d21cd3f..6f39f92 100644 --- a/journey.js.nuspec +++ b/journey.js.nuspec @@ -15,6 +15,6 @@ William Troup
- + \ No newline at end of file From a8607f78a402ca67e2539734fc255e9eff39680a Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 12:25:39 +0100 Subject: [PATCH 10/44] Added intializer. --- src/journey.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/journey.ts b/src/journey.ts index 17926fb..1390159 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -13,4 +13,12 @@ ( () => { + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Initialize Journey.js + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + ( () => { + } ) (); } ); \ No newline at end of file From 4bfb3c725fb4bf74df782f51cca99c29a2dbd9a1 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 12:31:21 +0100 Subject: [PATCH 11/44] Added first type and file structure. --- src/journey.ts | 3 +++ src/ts/type.ts | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/ts/type.ts diff --git a/src/journey.ts b/src/journey.ts index 1390159..c555bde 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -11,6 +11,9 @@ */ +import { type Configuration } from "./ts/type"; + + ( () => { /* diff --git a/src/ts/type.ts b/src/ts/type.ts new file mode 100644 index 0000000..bc7b43f --- /dev/null +++ b/src/ts/type.ts @@ -0,0 +1,27 @@ +export type Configuration = { + safeMode?: boolean; + domElementTypes?: string[] | string; + showCloseButton?: boolean; + shortcutKeysEnabled?: boolean; + showProgressDots?: boolean; + browserUrlParametersEnabled?: boolean; + showProgressDotNumbers?: boolean; + showButtons?: boolean; + showDoNotShowAgain?: boolean; + tooltipDelay?: number; + showProgressDotToolTips?: boolean; + closeDialogOnDisabledBackgroundClick?: boolean; + showProgressBar?: boolean; + scrollToElements?: boolean; + dialogMovingEnabled?: boolean; + showProgressBarText?: boolean; + backButtonText?: string; + nextButtonText?: string; + finishButtonText?: string; + closeButtonToolTipText?: string; + doNotShowAgainText?: string; + objectErrorText?: string; + attributeNotValidErrorText?: string; + attributeNotSetErrorText?: string; + closeDialogConfirmationText?: string; +}; \ No newline at end of file From 91effe1e0ed8c060732028bd93da4757b27938f4 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 12:40:44 +0100 Subject: [PATCH 12/44] Added more types. --- src/journey.ts | 5 ++++- src/ts/type.ts | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/journey.ts b/src/journey.ts index c555bde..dce5552 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -11,7 +11,10 @@ */ -import { type Configuration } from "./ts/type"; +import { + type Configuration, + type BindingOptions, + type Events } from "./ts/type"; ( () => { diff --git a/src/ts/type.ts b/src/ts/type.ts index bc7b43f..f57809f 100644 --- a/src/ts/type.ts +++ b/src/ts/type.ts @@ -24,4 +24,31 @@ export type Configuration = { attributeNotValidErrorText?: string; attributeNotSetErrorText?: string; closeDialogConfirmationText?: string; +}; + +export type BindingOptions = { + order?: number; + attach?: boolean; + sendClick: boolean; + alignTop: boolean; + alignRight: boolean; + isHint: boolean; + alignHintToClickPosition: boolean; + showDisabledBackground: boolean; + removeHintWhenViewed: boolean; + group?: string; + description?: string; + tooltip?: string; + events?: Events; +}; + +export type Events = { + onEnter?: ( element: HTMLElement ) => void; + onLeave?: ( element: HTMLElement ) => void; + onClose?: ( element: HTMLElement ) => void; + onFinish?: ( element: HTMLElement ) => void; + onOpen?: ( element: HTMLElement ) => void; + onStart?: ( element: HTMLElement ) => void; + onAddStep?: ( element: HTMLElement ) => void; + onRemoveStep?: ( element: HTMLElement ) => void; }; \ No newline at end of file From aad1aaa874dda52e218c771332f3dc2353639014 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 13:01:50 +0100 Subject: [PATCH 13/44] Added private functions. --- dist/journey.esm.js | 147 ++++++++++++++++++++++++++++- dist/journey.esm.js.map | 2 +- dist/journey.js | 124 ++++++++++++++++++++++++- dist/journey.js.map | 2 +- src/journey.ts | 198 ++++++++++++++++++++++++++++++++++++++++ src/ts/enum.ts | 4 + 6 files changed, 473 insertions(+), 4 deletions(-) create mode 100644 src/ts/enum.ts diff --git a/dist/journey.esm.js b/dist/journey.esm.js index fd5238d..1d412d4 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -1 +1,146 @@ -//# sourceMappingURL=journey.esm.js.map \ No newline at end of file +var __getOwnPropNames = Object.getOwnPropertyNames; + +var __esm = (e, t) => function n() { + return e && (t = (0, e[__getOwnPropNames(e)[0]])(e = 0)), t; +}; + +var __commonJS = (e, t) => function n() { + return t || (0, e[__getOwnPropNames(e)[0]])((t = { + exports: {} + }).exports, t), t.exports; +}; + +var init_enum = __esm({ + "src/ts/enum.ts"() {} +}); + +var require_journey = __commonJS({ + "src/journey.ts"(exports, module) { + init_enum(); + () => { + let _configuration = {}; + const _groups_Default = "default"; + let _groups_Current = _groups_Default; + const _groups = {}; + function fireCustomTriggerEvent(e, ...t) { + if (isDefinedFunction(e)) { + e.apply(null, [].slice.call(t, 0)); + } + } + function getBrowserUrlParameters() { + let e = false; + if (_configuration.browserUrlParametersEnabled) { + const t = window.location.href; + const n = getBrowserUrlArguments(t); + if (isDefined(n.sjOrderId)) { + const e = parseInt(n.sjOrderId, 10); + if (!isNaN(e) && e <= _groups[_groups_Current].keys.length - 1) { + _groups[_groups_Current].position = e; + } + } + if (isDefined(n.sjShow)) { + e = n.sjShow === "true"; + } + } + return e; + } + function getBrowserUrlArguments(e) { + const t = {}; + const n = e.split("?"); + if (n.length > 1) { + const e = n[1].split("&"); + const i = e.length; + for (var r = 0; r < i; r++) { + const n = e[r].split("="); + t[n[0]] = n[1]; + } + } + return t; + } + function isDefined(e) { + return e !== null && e !== void 0 && e !== ""; + } + function isDefinedObject(e) { + return isDefined(e) && typeof e === "object"; + } + function isDefinedBoolean(e) { + return isDefined(e) && typeof e === "boolean"; + } + function isDefinedString(e) { + return isDefined(e) && typeof e === "string"; + } + function isDefinedFunction(e) { + return isDefined(e) && typeof e === "function"; + } + function isDefinedNumber(e) { + return isDefined(e) && typeof e === "number"; + } + function isDefinedArray(e) { + return isDefinedObject(e) && e instanceof Array; + } + function getDefaultAnyString(e, t) { + return typeof e === "string" ? e : t; + } + function getDefaultString(e, t) { + return isDefinedString(e) ? e : t; + } + function getDefaultBoolean(e, t) { + return isDefinedBoolean(e) ? e : t; + } + function getDefaultNumber(e, t) { + return isDefinedNumber(e) ? e : t; + } + function getDefaultFunction(e, t) { + return isDefinedFunction(e) ? e : t; + } + function getDefaultObject(e, t) { + return isDefinedObject(e) ? e : t; + } + function getDefaultArray(e, t) { + return isDefinedArray(e) ? e : t; + } + function getDefaultStringOrArray(e, t) { + let n = t; + if (isDefinedString(e)) { + const r = e.toString().split(" "); + if (r.length === 0) { + e = t; + } else { + n = r; + } + } else { + n = getDefaultArray(e, t); + } + return n; + } + function getObjectFromString(objectString) { + const result = { + parsed: true, + object: null + }; + try { + if (isDefinedString(objectString)) { + result.object = JSON.parse(objectString); + } + } catch (e1) { + try { + result.object = eval("(" + objectString + ")"); + if (isDefinedFunction(result.object)) { + result.object = result.object(); + } + } catch (e) { + if (!_configuration.safeMode) { + console.error(_configuration.objectErrorText.replace("{{error_1}}", e1.message).replace("{{error_2}}", e.message)); + result.parsed = false; + } + result.object = null; + } + } + return result; + } + (() => {})(); + }; + } +}); + +export default require_journey();//# sourceMappingURL=journey.esm.js.map \ No newline at end of file diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index a464c67..a82fced 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":[],"names":[],"mappings":""} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index 5bfa212..68dfbc9 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -1 +1,123 @@ -//# sourceMappingURL=journey.js.map \ No newline at end of file +() => { + let _configuration = {}; + const _groups_Default = "default"; + let _groups_Current = _groups_Default; + const _groups = {}; + function fireCustomTriggerEvent(e, ...t) { + if (isDefinedFunction(e)) { + e.apply(null, [].slice.call(t, 0)); + } + } + function getBrowserUrlParameters() { + let e = false; + if (_configuration.browserUrlParametersEnabled) { + const t = window.location.href; + const n = getBrowserUrlArguments(t); + if (isDefined(n.sjOrderId)) { + const e = parseInt(n.sjOrderId, 10); + if (!isNaN(e) && e <= _groups[_groups_Current].keys.length - 1) { + _groups[_groups_Current].position = e; + } + } + if (isDefined(n.sjShow)) { + e = n.sjShow === "true"; + } + } + return e; + } + function getBrowserUrlArguments(e) { + const t = {}; + const n = e.split("?"); + if (n.length > 1) { + const e = n[1].split("&"); + const i = e.length; + for (var r = 0; r < i; r++) { + const n = e[r].split("="); + t[n[0]] = n[1]; + } + } + return t; + } + function isDefined(e) { + return e !== null && e !== void 0 && e !== ""; + } + function isDefinedObject(e) { + return isDefined(e) && typeof e === "object"; + } + function isDefinedBoolean(e) { + return isDefined(e) && typeof e === "boolean"; + } + function isDefinedString(e) { + return isDefined(e) && typeof e === "string"; + } + function isDefinedFunction(e) { + return isDefined(e) && typeof e === "function"; + } + function isDefinedNumber(e) { + return isDefined(e) && typeof e === "number"; + } + function isDefinedArray(e) { + return isDefinedObject(e) && e instanceof Array; + } + function getDefaultAnyString(e, t) { + return typeof e === "string" ? e : t; + } + function getDefaultString(e, t) { + return isDefinedString(e) ? e : t; + } + function getDefaultBoolean(e, t) { + return isDefinedBoolean(e) ? e : t; + } + function getDefaultNumber(e, t) { + return isDefinedNumber(e) ? e : t; + } + function getDefaultFunction(e, t) { + return isDefinedFunction(e) ? e : t; + } + function getDefaultObject(e, t) { + return isDefinedObject(e) ? e : t; + } + function getDefaultArray(e, t) { + return isDefinedArray(e) ? e : t; + } + function getDefaultStringOrArray(e, t) { + let n = t; + if (isDefinedString(e)) { + const r = e.toString().split(" "); + if (r.length === 0) { + e = t; + } else { + n = r; + } + } else { + n = getDefaultArray(e, t); + } + return n; + } + function getObjectFromString(objectString) { + const result = { + parsed: true, + object: null + }; + try { + if (isDefinedString(objectString)) { + result.object = JSON.parse(objectString); + } + } catch (e1) { + try { + result.object = eval("(" + objectString + ")"); + if (isDefinedFunction(result.object)) { + result.object = result.object(); + } + } catch (e) { + if (!_configuration.safeMode) { + console.error(_configuration.objectErrorText.replace("{{error_1}}", e1.message).replace("{{error_2}}", e.message)); + result.parsed = false; + } + result.object = null; + } + } + return result; + } + (() => {})(); +};//# sourceMappingURL=journey.js.map \ No newline at end of file diff --git a/dist/journey.js.map b/dist/journey.js.map index a464c67..927e512 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":[],"names":[],"mappings":""} \ No newline at end of file +{"version":3,"sources":["../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index dce5552..da81daf 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -16,8 +16,206 @@ import { type BindingOptions, type Events } from "./ts/type"; +import { Char } from "./ts/enum"; + + +type StringToJson = { + parsed: boolean; + object: any; +}; + ( () => { + // Variables: Configuration + let _configuration: Configuration = {} as Configuration; + + // Variables: Groups + const _groups_Default: string = "default"; + let _groups_Current: string = _groups_Default; + const _groups: object = {}; + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Triggering Custom Events + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void { + if ( isDefinedFunction( triggerFunction ) ) { + triggerFunction.apply( null, [].slice.call( args, 0 ) ); + } + } + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Browser URL Parameters + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function getBrowserUrlParameters() : boolean { + let show: boolean = false; + + if ( _configuration.browserUrlParametersEnabled ) { + const url: string = window.location.href; + const urlArguments: any = getBrowserUrlArguments( url ); + + if ( isDefined( urlArguments.sjOrderId ) ) { + const orderId: number = parseInt( urlArguments.sjOrderId, 10 ); + + if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) { + _groups[ _groups_Current ].position = orderId; + } + } + + if ( isDefined( urlArguments.sjShow ) ) { + show = urlArguments.sjShow === "true"; + } + } + + return show; + } + + function getBrowserUrlArguments( url: string ) : any { + const urlArguments: object = {}; + const urlDataParts: string[] = url.split( "?" ); + + if ( urlDataParts.length > 1 ) { + const parsedArgs: string[] = urlDataParts[ 1 ].split( "&" ); + const parsedArgsLength: number = parsedArgs.length; + + for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) { + const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( "=" ); + + urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ]; + } + } + + return urlArguments; + } + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Validation + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function isDefined( value: any ) : boolean { + return value !== null && value !== undefined && value !== Char.empty; + } + + function isDefinedObject( object: any ) : boolean { + return isDefined( object ) && typeof object === "object"; + } + + function isDefinedBoolean( object: any ) : boolean { + return isDefined( object ) && typeof object === "boolean"; + } + + function isDefinedString( object: any ) : boolean { + return isDefined( object ) && typeof object === "string"; + } + + function isDefinedFunction( object: any ) : boolean { + return isDefined( object ) && typeof object === "function"; + } + + function isDefinedNumber( object: any ) : boolean { + return isDefined( object ) && typeof object === "number"; + } + + function isDefinedArray( object: any ) : boolean { + return isDefinedObject( object ) && object instanceof Array; + } + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Default Parameter/Option Handling + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function getDefaultAnyString( value: any, defaultValue: string ) : string { + return typeof value === "string" ? value : defaultValue; + } + + function getDefaultString( value: any, defaultValue: string ) : string { + return isDefinedString( value ) ? value : defaultValue; + } + + function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean { + return isDefinedBoolean( value ) ? value : defaultValue; + } + + function getDefaultNumber( value: any, defaultValue: number ) : number { + return isDefinedNumber( value ) ? value : defaultValue; + } + + function getDefaultFunction( value: any, defaultValue: object ) : any { + return isDefinedFunction( value ) ? value : defaultValue; + } + + function getDefaultObject( value: any, defaultValue: object ) : object { + return isDefinedObject( value ) ? value : defaultValue; + } + + function getDefaultArray( value: any, defaultValue: any[] ) : any[] { + return isDefinedArray( value ) ? value : defaultValue; + } + + function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] { + let result: any[] = defaultValue; + + if ( isDefinedString( value ) ) { + const values: string[] = value.toString().split( Char.space ); + + if ( values.length === 0 ) { + value = defaultValue; + } else { + result = values; + } + + } else { + result = getDefaultArray( value, defaultValue ); + } + + return result; + } + + function getObjectFromString( objectString: any ) : StringToJson { + const result: StringToJson = { + parsed: true, + object: null + } as StringToJson; + + try { + if ( isDefinedString( objectString ) ) { + result.object = JSON.parse( objectString ); + } + + } catch ( e1 ) { + try { + result.object = eval( "(" + objectString + ")" ); + + if ( isDefinedFunction( result.object ) ) { + result.object = result.object(); + } + + } catch ( e2 ) { + if ( !_configuration.safeMode ) { + console.error( _configuration.objectErrorText.replace( "{{error_1}}", e1.message ).replace( "{{error_2}}", e2.message ) ); + result.parsed = false; + } + + result.object = null; + } + } + + return result; + } + /* * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/ts/enum.ts b/src/ts/enum.ts new file mode 100644 index 0000000..e0a592f --- /dev/null +++ b/src/ts/enum.ts @@ -0,0 +1,4 @@ +export const enum Char { + empty = "", + space = " ", +} \ No newline at end of file From 3cd0054e23eaea078adcb15fed07cdef9cf81a9f Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 13:40:22 +0100 Subject: [PATCH 14/44] More private methods. --- dist/journey.esm.js | 122 +++++++++++++++++++++++++++++- dist/journey.esm.js.map | 2 +- dist/journey.js | 130 ++++++++++++++++++++++++++++++-- dist/journey.js.map | 2 +- src/journey.ts | 162 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 408 insertions(+), 10 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index 1d412d4..bf00dc9 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -22,6 +22,124 @@ var require_journey = __commonJS({ const _groups_Default = "default"; let _groups_Current = _groups_Default; const _groups = {}; + function createElement(e, t = "") { + const n = e.toLowerCase(); + const r = n === "text"; + let o = r ? document.createTextNode("") : document.createElement(n); + if (isDefined(t)) { + o.className = t; + } + return o; + } + function getOffset(e) { + let t = 0; + let n = 0; + while (e && !isNaN(e.offsetLeft) && !isNaN(e.offsetTop)) { + t += e.offsetLeft - e.scrollLeft; + n += e.offsetTop - e.scrollTop; + e = e.offsetParent; + } + return { + left: t, + top: n + }; + } + function getScrollPosition() { + const e = document.documentElement; + const t = (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0); + const n = (window.pageYOffset || e.scrollTop) - (e.clientTop || 0); + return { + left: t, + top: n + }; + } + function getStyleValueByName(e, t) { + let n = null; + if (document.defaultView.getComputedStyle) { + n = document.defaultView.getComputedStyle(e, null).getPropertyValue(t); + } else if (e.currentStyle) { + n = e.currentStyle[t]; + } + return n; + } + function addNode(e, t) { + try { + if (!e.contains(t)) { + e.appendChild(t); + } + } catch (e) { + console.warn(e.message); + } + } + function removeNode(e, t) { + try { + if (e.contains(t)) { + e.removeChild(t); + } + } catch (e) { + console.warn(e.message); + } + } + function cancelBubble(e) { + e.preventDefault(); + e.cancelBubble = true; + } + function showElementAtMousePosition(e, t) { + var n = e.pageX, r = e.pageY, o = getScrollPosition(); + t.style.display = "block"; + if (n + t.offsetWidth > window.innerWidth) { + n -= t.offsetWidth; + } else { + n++; + } + if (r + t.offsetHeight > window.innerHeight) { + r -= t.offsetHeight; + } else { + r++; + } + if (n < o.left) { + n = e.pageX + 1; + } + if (r < o.top) { + r = e.pageY + 1; + } + t.style.left = n + "px"; + t.style.top = r + "px"; + } + function showElementBasedOnCondition(e, t) { + if (t) { + if (e.style.display !== "block") { + e.style.display = "block"; + } + } else { + if (e.style.display !== "none") { + e.style.display = "none"; + } + } + } + function buildCheckBox(e, t) { + const n = createElement("div"); + const r = createElement("label", "checkbox"); + const o = createElement("input"); + e.appendChild(n); + n.appendChild(r); + r.appendChild(o); + o.type = "checkbox"; + var i = createElement("span", "check-mark"), s = createElement("span", "text"); + s.innerHTML = t; + r.appendChild(i); + r.appendChild(s); + return { + input: o, + label: r + }; + } + function clearElementsByClassName(e, t) { + let n = e.getElementsByClassName(t); + while (n[0]) { + n[0].parentNode.removeChild(n[0]); + } + } function fireCustomTriggerEvent(e, ...t) { if (isDefinedFunction(e)) { e.apply(null, [].slice.call(t, 0)); @@ -49,8 +167,8 @@ var require_journey = __commonJS({ const n = e.split("?"); if (n.length > 1) { const e = n[1].split("&"); - const i = e.length; - for (var r = 0; r < i; r++) { + const o = e.length; + for (var r = 0; r < o; r++) { const n = e[r].split("="); t[n[0]] = n[1]; } diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index a82fced..7fb626b 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n var left = e.pageX,\n top = e.pageY,\n scrollPosition = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n var checkMark = createElement( \"span\", \"check-mark\" ),\n text = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index 68dfbc9..c55145f 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -3,6 +3,124 @@ const _groups_Default = "default"; let _groups_Current = _groups_Default; const _groups = {}; + function createElement(e, t = "") { + const n = e.toLowerCase(); + const i = n === "text"; + let r = i ? document.createTextNode("") : document.createElement(n); + if (isDefined(t)) { + r.className = t; + } + return r; + } + function getOffset(e) { + let t = 0; + let n = 0; + while (e && !isNaN(e.offsetLeft) && !isNaN(e.offsetTop)) { + t += e.offsetLeft - e.scrollLeft; + n += e.offsetTop - e.scrollTop; + e = e.offsetParent; + } + return { + left: t, + top: n + }; + } + function getScrollPosition() { + const e = document.documentElement; + const t = (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0); + const n = (window.pageYOffset || e.scrollTop) - (e.clientTop || 0); + return { + left: t, + top: n + }; + } + function getStyleValueByName(e, t) { + let n = null; + if (document.defaultView.getComputedStyle) { + n = document.defaultView.getComputedStyle(e, null).getPropertyValue(t); + } else if (e.currentStyle) { + n = e.currentStyle[t]; + } + return n; + } + function addNode(e, t) { + try { + if (!e.contains(t)) { + e.appendChild(t); + } + } catch (e) { + console.warn(e.message); + } + } + function removeNode(e, t) { + try { + if (e.contains(t)) { + e.removeChild(t); + } + } catch (e) { + console.warn(e.message); + } + } + function cancelBubble(e) { + e.preventDefault(); + e.cancelBubble = true; + } + function showElementAtMousePosition(e, t) { + var n = e.pageX, i = e.pageY, r = getScrollPosition(); + t.style.display = "block"; + if (n + t.offsetWidth > window.innerWidth) { + n -= t.offsetWidth; + } else { + n++; + } + if (i + t.offsetHeight > window.innerHeight) { + i -= t.offsetHeight; + } else { + i++; + } + if (n < r.left) { + n = e.pageX + 1; + } + if (i < r.top) { + i = e.pageY + 1; + } + t.style.left = n + "px"; + t.style.top = i + "px"; + } + function showElementBasedOnCondition(e, t) { + if (t) { + if (e.style.display !== "block") { + e.style.display = "block"; + } + } else { + if (e.style.display !== "none") { + e.style.display = "none"; + } + } + } + function buildCheckBox(e, t) { + const n = createElement("div"); + const i = createElement("label", "checkbox"); + const r = createElement("input"); + e.appendChild(n); + n.appendChild(i); + i.appendChild(r); + r.type = "checkbox"; + var o = createElement("span", "check-mark"), s = createElement("span", "text"); + s.innerHTML = t; + i.appendChild(o); + i.appendChild(s); + return { + input: r, + label: i + }; + } + function clearElementsByClassName(e, t) { + let n = e.getElementsByClassName(t); + while (n[0]) { + n[0].parentNode.removeChild(n[0]); + } + } function fireCustomTriggerEvent(e, ...t) { if (isDefinedFunction(e)) { e.apply(null, [].slice.call(t, 0)); @@ -30,9 +148,9 @@ const n = e.split("?"); if (n.length > 1) { const e = n[1].split("&"); - const i = e.length; - for (var r = 0; r < i; r++) { - const n = e[r].split("="); + const r = e.length; + for (var i = 0; i < r; i++) { + const n = e[i].split("="); t[n[0]] = n[1]; } } @@ -83,11 +201,11 @@ function getDefaultStringOrArray(e, t) { let n = t; if (isDefinedString(e)) { - const r = e.toString().split(" "); - if (r.length === 0) { + const i = e.toString().split(" "); + if (i.length === 0) { e = t; } else { - n = r; + n = i; } } else { n = getDefaultArray(e, t); diff --git a/dist/journey.js.map b/dist/journey.js.map index 927e512..c5ec306 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file +{"version":3,"sources":["../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n var left = e.pageX,\n top = e.pageY,\n scrollPosition = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n var checkMark = createElement( \"span\", \"check-mark\" ),\n text = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index da81daf..3532b5c 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -35,6 +35,168 @@ type StringToJson = { const _groups: object = {}; + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Element Handling + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function createElement( type: string, className: string = Char.empty ) : HTMLElement { + const nodeType: string = type.toLowerCase(); + const isText: boolean = nodeType === "text"; + + let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType ); + + if ( isDefined( className ) ) { + result.className = className; + } + + return result; + } + + function getOffset( element: HTMLElement ) : any { + let left: number = 0; + let top: number = 0; + + while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) { + left += element.offsetLeft - element.scrollLeft; + top += element.offsetTop - element.scrollTop; + + element = element.offsetParent as HTMLElement; + } + + return { + left: left, + top: top + }; + } + + function getScrollPosition() : any { + const doc: HTMLElement = document.documentElement; + const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ); + const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 ); + + return { + left: left, + top: top + }; + } + + function getStyleValueByName( element: any, stylePropertyName: string ) : any { + let value: any = null; + + if ( document.defaultView.getComputedStyle ) { + value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); + } else if ( element.currentStyle ) { + value = element.currentStyle[ stylePropertyName ]; + } + + return value; + } + + function addNode( parent: HTMLElement, node: HTMLElement ) : void { + try { + if ( !parent.contains( node ) ) { + parent.appendChild( node ); + } + } catch ( e ) { + console.warn( e.message ); + } + } + + function removeNode( parent: HTMLElement, node: HTMLElement ) : void { + try { + if ( parent.contains( node ) ) { + parent.removeChild( node ); + } + } catch ( e ) { + console.warn( e.message ); + } + } + + function cancelBubble( e: any ) : void { + e.preventDefault(); + e.cancelBubble = true; + } + + function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void { + var left = e.pageX, + top = e.pageY, + scrollPosition = getScrollPosition(); + + element.style.display = "block"; + + if ( left + element.offsetWidth > window.innerWidth ) { + left -= element.offsetWidth; + } else { + left++; + } + + if ( top + element.offsetHeight > window.innerHeight ) { + top -= element.offsetHeight; + } else { + top++; + } + + if ( left < scrollPosition.left ) { + left = e.pageX + 1; + } + + if ( top < scrollPosition.top ) { + top = e.pageY + 1; + } + + element.style.left = left + "px"; + element.style.top = top + "px"; + } + + function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void { + if ( condition ) { + if ( element.style.display !== "block" ) { + element.style.display = "block"; + } + + } else { + if ( element.style.display !== "none" ) { + element.style.display = "none"; + } + } + } + + function buildCheckBox( container: HTMLElement, labelText: string ) : any { + const lineContainer: HTMLElement = createElement( "div" ); + const label: HTMLElement = createElement( "label", "checkbox" ); + const input: HTMLInputElement = createElement( "input" ) as HTMLInputElement; + + container.appendChild( lineContainer ); + lineContainer.appendChild( label ); + label.appendChild( input ); + + input.type = "checkbox"; + + var checkMark = createElement( "span", "check-mark" ), + text = createElement( "span", "text" ); + + text.innerHTML = labelText; + + label.appendChild( checkMark ); + label.appendChild( text ); + + return { + input: input, + label: label + }; + } + + function clearElementsByClassName( container: HTMLElement, className: string ) : void { + let elements: HTMLCollectionOf = container.getElementsByClassName( className ); + + while ( elements[ 0 ] ) { + elements[ 0 ].parentNode.removeChild( elements[ 0 ] ); + } + } + + /* * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * Triggering Custom Events From deac627ef4afb3a5c12948b0da4fcda93e673f8b Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 13:44:00 +0100 Subject: [PATCH 15/44] Added private binding option functions. --- dist/journey.esm.js | 91 ++++++++++++++++++++++++++++------------- dist/journey.esm.js.map | 2 +- dist/journey.js | 91 ++++++++++++++++++++++++++++------------- dist/journey.js.map | 2 +- src/journey.ts | 47 +++++++++++++++++++++ src/ts/type.ts | 1 + 6 files changed, 174 insertions(+), 60 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index bf00dc9..35a595a 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -22,14 +22,47 @@ var require_journey = __commonJS({ const _groups_Default = "default"; let _groups_Current = _groups_Default; const _groups = {}; + function buildAttributeOptions(e) { + let t = !isDefinedObject(e) ? {} : e; + t.order = getDefaultNumber(t.order, 0); + t.attach = getDefaultBoolean(t.attach, true); + t.sendClick = getDefaultBoolean(t.sendClick, false); + t.alignTop = getDefaultBoolean(t.alignTop, false); + t.alignRight = getDefaultBoolean(t.alignRight, false); + t.isHint = getDefaultBoolean(t.isHint, false); + t.alignHintToClickPosition = getDefaultBoolean(t.alignHintToClickPosition, false); + t.showDisabledBackground = getDefaultBoolean(t.showDisabledBackground, true); + t.removeHintWhenViewed = getDefaultBoolean(t.removeHintWhenViewed, false); + t.group = getDefaultString(t.group, _groups_Default); + t = buildAttributeOptionStrings(t); + return buildAttributeOptionCustomTriggers(t); + } + function buildAttributeOptionStrings(e) { + e.title = getDefaultString(e.title, null); + e.description = getDefaultString(e.description, null); + e.tooltip = getDefaultString(e.tooltip, null); + return e; + } + function buildAttributeOptionCustomTriggers(e) { + e.events = getDefaultObject(e.events, {}); + e.events.onEnter = getDefaultFunction(e.events.onEnter, null); + e.events.onLeave = getDefaultFunction(e.events.onLeave, null); + e.events.onClose = getDefaultFunction(e.events.onClose, null); + e.events.onFinish = getDefaultFunction(e.events.onFinish, null); + e.events.onOpen = getDefaultFunction(e.events.onOpen, null); + e.events.onStart = getDefaultFunction(e.events.onStart, null); + e.events.onAddStep = getDefaultFunction(e.events.onAddStep, null); + e.events.onRemoveStep = getDefaultFunction(e.events.onRemoveStep, null); + return e; + } function createElement(e, t = "") { const n = e.toLowerCase(); - const r = n === "text"; - let o = r ? document.createTextNode("") : document.createElement(n); + const o = n === "text"; + let i = o ? document.createTextNode("") : document.createElement(n); if (isDefined(t)) { - o.className = t; + i.className = t; } - return o; + return i; } function getOffset(e) { let t = 0; @@ -85,26 +118,26 @@ var require_journey = __commonJS({ e.cancelBubble = true; } function showElementAtMousePosition(e, t) { - var n = e.pageX, r = e.pageY, o = getScrollPosition(); + var n = e.pageX, o = e.pageY, i = getScrollPosition(); t.style.display = "block"; if (n + t.offsetWidth > window.innerWidth) { n -= t.offsetWidth; } else { n++; } - if (r + t.offsetHeight > window.innerHeight) { - r -= t.offsetHeight; + if (o + t.offsetHeight > window.innerHeight) { + o -= t.offsetHeight; } else { - r++; + o++; } - if (n < o.left) { + if (n < i.left) { n = e.pageX + 1; } - if (r < o.top) { - r = e.pageY + 1; + if (o < i.top) { + o = e.pageY + 1; } t.style.left = n + "px"; - t.style.top = r + "px"; + t.style.top = o + "px"; } function showElementBasedOnCondition(e, t) { if (t) { @@ -119,19 +152,19 @@ var require_journey = __commonJS({ } function buildCheckBox(e, t) { const n = createElement("div"); - const r = createElement("label", "checkbox"); - const o = createElement("input"); + const o = createElement("label", "checkbox"); + const i = createElement("input"); e.appendChild(n); - n.appendChild(r); - r.appendChild(o); - o.type = "checkbox"; - var i = createElement("span", "check-mark"), s = createElement("span", "text"); - s.innerHTML = t; - r.appendChild(i); - r.appendChild(s); + n.appendChild(o); + o.appendChild(i); + i.type = "checkbox"; + var r = createElement("span", "check-mark"), l = createElement("span", "text"); + l.innerHTML = t; + o.appendChild(r); + o.appendChild(l); return { - input: o, - label: r + input: i, + label: o }; } function clearElementsByClassName(e, t) { @@ -167,9 +200,9 @@ var require_journey = __commonJS({ const n = e.split("?"); if (n.length > 1) { const e = n[1].split("&"); - const o = e.length; - for (var r = 0; r < o; r++) { - const n = e[r].split("="); + const i = e.length; + for (var o = 0; o < i; o++) { + const n = e[o].split("="); t[n[0]] = n[1]; } } @@ -220,11 +253,11 @@ var require_journey = __commonJS({ function getDefaultStringOrArray(e, t) { let n = t; if (isDefinedString(e)) { - const r = e.toString().split(" "); - if (r.length === 0) { + const o = e.toString().split(" "); + if (o.length === 0) { e = t; } else { - n = r; + n = o; } } else { n = getDefaultArray(e, t); diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 7fb626b..2212295 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n var left = e.pageX,\n top = e.pageY,\n scrollPosition = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n var checkMark = createElement( \"span\", \"check-mark\" ),\n text = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n var left = e.pageX,\n top = e.pageY,\n scrollPosition = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n var checkMark = createElement( \"span\", \"check-mark\" ),\n text = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index c55145f..1150394 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -3,14 +3,47 @@ const _groups_Default = "default"; let _groups_Current = _groups_Default; const _groups = {}; + function buildAttributeOptions(e) { + let t = !isDefinedObject(e) ? {} : e; + t.order = getDefaultNumber(t.order, 0); + t.attach = getDefaultBoolean(t.attach, true); + t.sendClick = getDefaultBoolean(t.sendClick, false); + t.alignTop = getDefaultBoolean(t.alignTop, false); + t.alignRight = getDefaultBoolean(t.alignRight, false); + t.isHint = getDefaultBoolean(t.isHint, false); + t.alignHintToClickPosition = getDefaultBoolean(t.alignHintToClickPosition, false); + t.showDisabledBackground = getDefaultBoolean(t.showDisabledBackground, true); + t.removeHintWhenViewed = getDefaultBoolean(t.removeHintWhenViewed, false); + t.group = getDefaultString(t.group, _groups_Default); + t = buildAttributeOptionStrings(t); + return buildAttributeOptionCustomTriggers(t); + } + function buildAttributeOptionStrings(e) { + e.title = getDefaultString(e.title, null); + e.description = getDefaultString(e.description, null); + e.tooltip = getDefaultString(e.tooltip, null); + return e; + } + function buildAttributeOptionCustomTriggers(e) { + e.events = getDefaultObject(e.events, {}); + e.events.onEnter = getDefaultFunction(e.events.onEnter, null); + e.events.onLeave = getDefaultFunction(e.events.onLeave, null); + e.events.onClose = getDefaultFunction(e.events.onClose, null); + e.events.onFinish = getDefaultFunction(e.events.onFinish, null); + e.events.onOpen = getDefaultFunction(e.events.onOpen, null); + e.events.onStart = getDefaultFunction(e.events.onStart, null); + e.events.onAddStep = getDefaultFunction(e.events.onAddStep, null); + e.events.onRemoveStep = getDefaultFunction(e.events.onRemoveStep, null); + return e; + } function createElement(e, t = "") { const n = e.toLowerCase(); - const i = n === "text"; - let r = i ? document.createTextNode("") : document.createElement(n); + const o = n === "text"; + let i = o ? document.createTextNode("") : document.createElement(n); if (isDefined(t)) { - r.className = t; + i.className = t; } - return r; + return i; } function getOffset(e) { let t = 0; @@ -66,26 +99,26 @@ e.cancelBubble = true; } function showElementAtMousePosition(e, t) { - var n = e.pageX, i = e.pageY, r = getScrollPosition(); + var n = e.pageX, o = e.pageY, i = getScrollPosition(); t.style.display = "block"; if (n + t.offsetWidth > window.innerWidth) { n -= t.offsetWidth; } else { n++; } - if (i + t.offsetHeight > window.innerHeight) { - i -= t.offsetHeight; + if (o + t.offsetHeight > window.innerHeight) { + o -= t.offsetHeight; } else { - i++; + o++; } - if (n < r.left) { + if (n < i.left) { n = e.pageX + 1; } - if (i < r.top) { - i = e.pageY + 1; + if (o < i.top) { + o = e.pageY + 1; } t.style.left = n + "px"; - t.style.top = i + "px"; + t.style.top = o + "px"; } function showElementBasedOnCondition(e, t) { if (t) { @@ -100,19 +133,19 @@ } function buildCheckBox(e, t) { const n = createElement("div"); - const i = createElement("label", "checkbox"); - const r = createElement("input"); + const o = createElement("label", "checkbox"); + const i = createElement("input"); e.appendChild(n); - n.appendChild(i); - i.appendChild(r); - r.type = "checkbox"; - var o = createElement("span", "check-mark"), s = createElement("span", "text"); - s.innerHTML = t; - i.appendChild(o); - i.appendChild(s); + n.appendChild(o); + o.appendChild(i); + i.type = "checkbox"; + var l = createElement("span", "check-mark"), r = createElement("span", "text"); + r.innerHTML = t; + o.appendChild(l); + o.appendChild(r); return { - input: r, - label: i + input: i, + label: o }; } function clearElementsByClassName(e, t) { @@ -148,9 +181,9 @@ const n = e.split("?"); if (n.length > 1) { const e = n[1].split("&"); - const r = e.length; - for (var i = 0; i < r; i++) { - const n = e[i].split("="); + const i = e.length; + for (var o = 0; o < i; o++) { + const n = e[o].split("="); t[n[0]] = n[1]; } } @@ -201,11 +234,11 @@ function getDefaultStringOrArray(e, t) { let n = t; if (isDefinedString(e)) { - const i = e.toString().split(" "); - if (i.length === 0) { + const o = e.toString().split(" "); + if (o.length === 0) { e = t; } else { - n = i; + n = o; } } else { n = getDefaultArray(e, t); diff --git a/dist/journey.js.map b/dist/journey.js.map index c5ec306..4eaae78 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/journey.ts"],"names":["result"],"mappings":";AA2BE,MAAM;AAEJ,MAAI,iBAAgC,CAAC;AAGrC,QAAM,kBAA0B;AAChC,MAAI,kBAA0B;AAC9B,QAAM,UAAkB,CAAC;AASzB,WAAS,cAAe,MAAc,4BAA+C;AACjF,UAAM,WAAmB,KAAK,YAAY;AAC1C,UAAM,SAAkB,aAAa;AAErC,QAAIA,UAAc,SAAS,SAAS,6BAA2B,IAAI,SAAS,cAAe,QAAS;AAEpG,QAAK,UAAW,SAAU,GAAI;AAC1B,MAAAA,QAAO,YAAY;AAAA,IACvB;AAEA,WAAOA;AAAA,EACX;AAEA,WAAS,UAAW,SAA6B;AAC7C,QAAI,OAAe;AACnB,QAAI,MAAc;AAElB,WAAQ,WAAW,CAAC,MAAO,QAAQ,UAAW,KAAK,CAAC,MAAO,QAAQ,SAAU,GAAI;AAC7E,cAAQ,QAAQ,aAAa,QAAQ;AACrC,aAAO,QAAQ,YAAY,QAAQ;AAEnC,gBAAU,QAAQ;AAAA,IACtB;AAEA,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,oBAA0B;AAC/B,UAAM,MAAmB,SAAS;AAClC,UAAM,QAAiB,OAAO,eAAe,IAAI,eAAkB,IAAI,cAAc;AACrF,UAAM,OAAgB,OAAO,eAAe,IAAI,cAAgB,IAAI,aAAa;AAEjF,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,oBAAqB,SAAc,mBAAkC;AAC1E,QAAI,QAAa;AAEjB,QAAK,SAAS,YAAY,kBAAmB;AACzC,cAAQ,SAAS,YAAY,iBAAkB,SAAS,IAAK,EAAE,iBAAkB,iBAAkB;AAAA,IACvG,WAAY,QAAQ,cAAe;AAC/B,cAAQ,QAAQ,aAAc,iBAAkB;AAAA,IACpD;AAEA,WAAO;AAAA,EACX;AAEA,WAAS,QAAS,QAAqB,MAA2B;AAC9D,QAAI;AACA,UAAK,CAAC,OAAO,SAAU,IAAK,GAAI;AAC5B,eAAO,YAAa,IAAK;AAAA,MAC7B;AAAA,IACJ,SAAU,GAAI;AACV,cAAQ,KAAM,EAAE,OAAQ;AAAA,IAC5B;AAAA,EACJ;AAEA,WAAS,WAAY,QAAqB,MAA2B;AACjE,QAAI;AACA,UAAK,OAAO,SAAU,IAAK,GAAI;AAC3B,eAAO,YAAa,IAAK;AAAA,MAC7B;AAAA,IACJ,SAAU,GAAI;AACV,cAAQ,KAAM,EAAE,OAAQ;AAAA,IAC5B;AAAA,EACJ;AAEA,WAAS,aAAc,GAAgB;AACnC,MAAE,eAAe;AACjB,MAAE,eAAe;AAAA,EACrB;AAEA,WAAS,2BAA4B,GAAe,SAA8B;AAC9E,QAAI,OAAO,EAAE,OACT,MAAM,EAAE,OACR,iBAAiB,kBAAkB;AAEvC,YAAQ,MAAM,UAAU;AAExB,QAAK,OAAO,QAAQ,cAAc,OAAO,YAAa;AAClD,cAAQ,QAAQ;AAAA,IACpB,OAAO;AACH;AAAA,IACJ;AAEA,QAAK,MAAM,QAAQ,eAAe,OAAO,aAAc;AACnD,aAAO,QAAQ;AAAA,IACnB,OAAO;AACH;AAAA,IACJ;AAEA,QAAK,OAAO,eAAe,MAAO;AAC9B,aAAO,EAAE,QAAQ;AAAA,IACrB;AAEA,QAAK,MAAM,eAAe,KAAM;AAC5B,YAAM,EAAE,QAAQ;AAAA,IACpB;AAEA,YAAQ,MAAM,OAAO,OAAO;AAC5B,YAAQ,MAAM,MAAM,MAAM;AAAA,EAC9B;AAEA,WAAS,4BAA6B,SAAsB,WAA4B;AACpF,QAAK,WAAY;AACb,UAAK,QAAQ,MAAM,YAAY,SAAU;AACrC,gBAAQ,MAAM,UAAU;AAAA,MAC5B;AAAA,IAEJ,OAAO;AACH,UAAK,QAAQ,MAAM,YAAY,QAAS;AACpC,gBAAQ,MAAM,UAAU;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,cAAe,WAAwB,WAA0B;AACtE,UAAM,gBAA6B,cAAe,KAAM;AACxD,UAAM,QAAqB,cAAe,SAAS,UAAW;AAC9D,UAAM,QAA0B,cAAe,OAAQ;AAEvD,cAAU,YAAa,aAAc;AACrC,kBAAc,YAAa,KAAM;AACjC,UAAM,YAAa,KAAM;AAEzB,UAAM,OAAO;AAEb,QAAI,YAAY,cAAe,QAAQ,YAAa,GAChD,OAAO,cAAe,QAAQ,MAAO;AAEzC,SAAK,YAAY;AAEjB,UAAM,YAAa,SAAU;AAC7B,UAAM,YAAa,IAAK;AAExB,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAA0B,WAAwB,WAA2B;AAClF,QAAI,WAAsC,UAAU,uBAAwB,SAAU;AAEtF,WAAQ,SAAU,CAAE,GAAI;AACpB,eAAU,CAAE,EAAE,WAAW,YAAa,SAAU,CAAE,CAAE;AAAA,IACxD;AAAA,EACJ;AASA,WAAS,uBAAwB,oBAA8B,MAAsB;AACjF,QAAK,kBAAmB,eAAgB,GAAI;AACxC,sBAAgB,MAAO,MAAM,CAAC,EAAE,MAAM,KAAM,MAAM,CAAE,CAAE;AAAA,IAC1D;AAAA,EACJ;AASA,WAAS,0BAAoC;AACzC,QAAI,OAAgB;AAEpB,QAAK,eAAe,6BAA8B;AAC9C,YAAM,MAAc,OAAO,SAAS;AACpC,YAAM,eAAoB,uBAAwB,GAAI;AAEtD,UAAK,UAAW,aAAa,SAAU,GAAI;AACvC,cAAM,UAAkB,SAAU,aAAa,WAAW,EAAG;AAE7D,YAAK,CAAC,MAAO,OAAQ,KAAK,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AAC9E,kBAAS,eAAgB,EAAE,WAAW;AAAA,QAC1C;AAAA,MACJ;AAEA,UAAK,UAAW,aAAa,MAAO,GAAI;AACpC,eAAO,aAAa,WAAW;AAAA,MACnC;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAEA,WAAS,uBAAwB,KAAoB;AACjD,UAAM,eAAuB,CAAC;AAC9B,UAAM,eAAyB,IAAI,MAAO,GAAI;AAE9C,QAAK,aAAa,SAAS,GAAI;AAC3B,YAAM,aAAuB,aAAc,CAAE,EAAE,MAAO,GAAI;AAC1D,YAAM,mBAA2B,WAAW;AAE5C,eAAU,kBAAkB,GAAG,kBAAkB,kBAAkB,mBAAoB;AACnF,cAAM,YAAsB,WAAY,eAAgB,EAAE,MAAO,GAAI;AAErE,qBAAc,UAAW,CAAE,CAAE,IAAI,UAAW,CAAE;AAAA,MAClD;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AASA,WAAS,UAAW,OAAuB;AACvC,WAAO,UAAU,QAAQ,UAAU,UAAa;AAAA,EACpD;AAEA,WAAS,gBAAiB,QAAwB;AAC9C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,iBAAkB,QAAwB;AAC/C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,gBAAiB,QAAwB;AAC9C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,kBAAmB,QAAwB;AAChD,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,gBAAiB,QAAwB;AAC9C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,eAAgB,QAAwB;AAC7C,WAAO,gBAAiB,MAAO,KAAK,kBAAkB;AAAA,EAC1D;AASA,WAAS,oBAAqB,OAAY,cAAgC;AACtE,WAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,EAC/C;AAEA,WAAS,iBAAkB,OAAY,cAAgC;AACnE,WAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAEA,WAAS,kBAAmB,OAAY,cAAkC;AACtE,WAAO,iBAAkB,KAAM,IAAI,QAAQ;AAAA,EAC/C;AAEA,WAAS,iBAAkB,OAAY,cAAgC;AACnE,WAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAEA,WAAS,mBAAoB,OAAY,cAA6B;AAClE,WAAO,kBAAmB,KAAM,IAAI,QAAQ;AAAA,EAChD;AAEA,WAAS,iBAAkB,OAAY,cAAgC;AACnE,WAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAEA,WAAS,gBAAiB,OAAY,cAA8B;AAChE,WAAO,eAAgB,KAAM,IAAI,QAAQ;AAAA,EAC7C;AAEA,WAAS,wBAAyB,OAAY,cAA8B;AACxE,QAAIA,UAAgB;AAEpB,QAAK,gBAAiB,KAAM,GAAI;AAC5B,YAAM,SAAmB,MAAM,SAAS,EAAE,qBAAkB;AAE5D,UAAK,OAAO,WAAW,GAAI;AACvB,gBAAQ;AAAA,MACZ,OAAO;AACH,QAAAA,UAAS;AAAA,MACb;AAAA,IAEJ,OAAO;AACH,MAAAA,UAAS,gBAAiB,OAAO,YAAa;AAAA,IAClD;AAEA,WAAOA;AAAA,EACX;AAEA,WAAS,oBAAqB,cAAmC;AAC7D,UAAM,SAAuB;AAAA,MACzB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAEA,QAAI;AACA,UAAK,gBAAiB,YAAa,GAAI;AACnC,eAAO,SAAS,KAAK,MAAO,YAAa;AAAA,MAC7C;AAAA,IAEJ,SAAU,IAAK;AACX,UAAI;AACA,eAAO,SAAS,KAAM,MAAM,eAAe,GAAI;AAE/C,YAAK,kBAAmB,OAAO,MAAO,GAAI;AACtC,iBAAO,SAAS,OAAO,OAAO;AAAA,QAClC;AAAA,MAEJ,SAAU,IAAK;AACX,YAAK,CAAC,eAAe,UAAW;AAC5B,kBAAQ,MAAO,eAAe,gBAAgB,QAAS,eAAgB,GAAG,OAAQ,EAAE,QAAS,eAAgB,GAAG,OAAQ,CAAE;AAC1H,iBAAO,SAAS;AAAA,QACpB;AAEA,eAAO,SAAS;AAAA,MACpB;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AASA,EAAE,uBAAM;AAAA,EACR,GAAK;AACT","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n var left = e.pageX,\n top = e.pageY,\n scrollPosition = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n var checkMark = createElement( \"span\", \"check-mark\" ),\n text = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file +{"version":3,"sources":["../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n var left = e.pageX,\n top = e.pageY,\n scrollPosition = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n var checkMark = createElement( \"span\", \"check-mark\" ),\n text = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 3532b5c..7053175 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -35,6 +35,53 @@ type StringToJson = { const _groups: object = {}; + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Options + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function buildAttributeOptions( newOptions: any ) { + let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions; + options.order = getDefaultNumber( options.order, 0 ); + options.attach = getDefaultBoolean( options.attach, true ); + options.sendClick = getDefaultBoolean( options.sendClick, false ); + options.alignTop = getDefaultBoolean( options.alignTop, false ); + options.alignRight = getDefaultBoolean( options.alignRight, false ); + options.isHint = getDefaultBoolean( options.isHint, false ); + options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false ); + options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true ); + options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false ); + options.group = getDefaultString( options.group, _groups_Default ); + + options = buildAttributeOptionStrings( options ); + + return buildAttributeOptionCustomTriggers( options ); + } + + function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions { + options.title = getDefaultString( options.title, null ); + options.description = getDefaultString( options.description, null ); + options.tooltip = getDefaultString( options.tooltip, null ); + + return options; + } + + function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions { + options.events = getDefaultObject( options.events, {} as Events ); + options.events.onEnter = getDefaultFunction( options.events.onEnter, null ); + options.events.onLeave = getDefaultFunction( options.events.onLeave, null ); + options.events.onClose = getDefaultFunction( options.events.onClose, null ); + options.events.onFinish = getDefaultFunction( options.events.onFinish, null ); + options.events.onOpen = getDefaultFunction( options.events.onOpen, null ); + options.events.onStart = getDefaultFunction( options.events.onStart, null ); + options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null ); + options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null ); + + return options; + } + + /* * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * Element Handling diff --git a/src/ts/type.ts b/src/ts/type.ts index f57809f..40d19d9 100644 --- a/src/ts/type.ts +++ b/src/ts/type.ts @@ -37,6 +37,7 @@ export type BindingOptions = { showDisabledBackground: boolean; removeHintWhenViewed: boolean; group?: string; + title?: string; description?: string; tooltip?: string; events?: Events; From 0197b70499353654cd570a8dcfedf3fce9d615a7 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 13:48:09 +0100 Subject: [PATCH 16/44] Added variables. --- dist/journey.esm.js | 82 ++++++++++++++++++++++++++--------------- dist/journey.esm.js.map | 2 +- dist/journey.js | 80 ++++++++++++++++++++++++++-------------- dist/journey.js.map | 2 +- src/journey.ts | 38 ++++++++++++++++++- src/ts/enum.ts | 8 ++++ 6 files changed, 152 insertions(+), 60 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index 35a595a..8b5925c 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -19,9 +19,33 @@ var require_journey = __commonJS({ init_enum(); () => { let _configuration = {}; + let _configuration_ShortcutKeysEnabled = true; const _groups_Default = "default"; let _groups_Current = _groups_Default; const _groups = {}; + let _element_Focus_Element_PositionStyle = null; + let _element_Disabled_Background = null; + let _element_Dialog = null; + let _element_Dialog_Close_Button = null; + let _element_Dialog_Title = null; + let _element_Dialog_Description = null; + let _element_Dialog_CheckBox_Container = null; + let _element_Dialog_CheckBox_Input = null; + let _element_Dialog_ProgressDots = null; + let _element_Dialog_ProgressBar = null; + let _element_Dialog_ProgressBar_Percentage = null; + let _element_Dialog_ProgressBar_Percentage_Text = null; + let _element_Dialog_Buttons = null; + let _element_Dialog_Buttons_Back_Button = null; + let _element_Dialog_Buttons_Next_Button = null; + let _element_Dialog_IsHint = false; + let _element_Dialog_Move_Original_X = 0; + let _element_Dialog_Move_Original_Y = 0; + let _element_Dialog_Move_IsMoving = false; + let _element_Dialog_Move_X = 0; + let _element_Dialog_Move_Y = 0; + let _element_ToolTip = null; + let _element_ToolTip_Timer = 0; function buildAttributeOptions(e) { let t = !isDefinedObject(e) ? {} : e; t.order = getDefaultNumber(t.order, 0); @@ -57,12 +81,12 @@ var require_journey = __commonJS({ } function createElement(e, t = "") { const n = e.toLowerCase(); - const o = n === "text"; - let i = o ? document.createTextNode("") : document.createElement(n); + const l = n === "text"; + let o = l ? document.createTextNode("") : document.createElement(n); if (isDefined(t)) { - i.className = t; + o.className = t; } - return i; + return o; } function getOffset(e) { let t = 0; @@ -118,26 +142,26 @@ var require_journey = __commonJS({ e.cancelBubble = true; } function showElementAtMousePosition(e, t) { - var n = e.pageX, o = e.pageY, i = getScrollPosition(); + var n = e.pageX, l = e.pageY, o = getScrollPosition(); t.style.display = "block"; if (n + t.offsetWidth > window.innerWidth) { n -= t.offsetWidth; } else { n++; } - if (o + t.offsetHeight > window.innerHeight) { - o -= t.offsetHeight; + if (l + t.offsetHeight > window.innerHeight) { + l -= t.offsetHeight; } else { - o++; + l++; } - if (n < i.left) { + if (n < o.left) { n = e.pageX + 1; } - if (o < i.top) { - o = e.pageY + 1; + if (l < o.top) { + l = e.pageY + 1; } t.style.left = n + "px"; - t.style.top = o + "px"; + t.style.top = l + "px"; } function showElementBasedOnCondition(e, t) { if (t) { @@ -152,19 +176,19 @@ var require_journey = __commonJS({ } function buildCheckBox(e, t) { const n = createElement("div"); - const o = createElement("label", "checkbox"); - const i = createElement("input"); + const l = createElement("label", "checkbox"); + const o = createElement("input"); e.appendChild(n); - n.appendChild(o); - o.appendChild(i); - i.type = "checkbox"; - var r = createElement("span", "check-mark"), l = createElement("span", "text"); - l.innerHTML = t; - o.appendChild(r); - o.appendChild(l); + n.appendChild(l); + l.appendChild(o); + o.type = "checkbox"; + var i = createElement("span", "check-mark"), r = createElement("span", "text"); + r.innerHTML = t; + l.appendChild(i); + l.appendChild(r); return { - input: i, - label: o + input: o, + label: l }; } function clearElementsByClassName(e, t) { @@ -200,9 +224,9 @@ var require_journey = __commonJS({ const n = e.split("?"); if (n.length > 1) { const e = n[1].split("&"); - const i = e.length; - for (var o = 0; o < i; o++) { - const n = e[o].split("="); + const o = e.length; + for (var l = 0; l < o; l++) { + const n = e[l].split("="); t[n[0]] = n[1]; } } @@ -253,11 +277,11 @@ var require_journey = __commonJS({ function getDefaultStringOrArray(e, t) { let n = t; if (isDefinedString(e)) { - const o = e.toString().split(" "); - if (o.length === 0) { + const l = e.toString().split(" "); + if (l.length === 0) { e = t; } else { - n = o; + n = l; } } else { n = getDefaultArray(e, t); diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 2212295..274dcfc 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n var left = e.pageX,\n top = e.pageY,\n scrollPosition = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n var checkMark = createElement( \"span\", \"check-mark\" ),\n text = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/journey.ts"],"names":["result"],"mappings":";;;;;;;;;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAkBA;AASA,IAAE,MAAM;AAEJ,UAAI,iBAAgC,CAAC;AAGrC,UAAI,qCAA8C;AAGlD,YAAM,kBAA0B;AAChC,UAAI,kBAA0B;AAC9B,YAAM,UAAkB,CAAC;AAGzB,UAAI,uCAA+C;AAGnD,UAAI,+BAA4C;AAGhD,UAAI,kBAA+B;AACnC,UAAI,+BAA4C;AAChD,UAAI,wBAAqC;AACzC,UAAI,8BAA2C;AAC/C,UAAI,qCAAkD;AACtD,UAAI,iCAA8C;AAClD,UAAI,+BAA4C;AAChD,UAAI,8BAA2C;AAC/C,UAAI,yCAAsD;AAC1D,UAAI,8CAA2D;AAC/D,UAAI,0BAAuC;AAC3C,UAAI,sCAAmD;AACvD,UAAI,sCAAmD;AACvD,UAAI,yBAAkC;AAGtC,UAAI,kCAA0C;AAC9C,UAAI,kCAA0C;AAC9C,UAAI,gCAAyC;AAC7C,UAAI,yBAAiC;AACrC,UAAI,yBAAiC;AAGrC,UAAI,mBAAmB;AACvB,UAAI,yBAAiC;AASrC,eAAS,sBAAuB,YAAkB;AAC9C,YAAI,UAA0B,CAAC,gBAAiB,UAAW,IAAI,CAAC,IAAsB;AACtF,gBAAQ,QAAQ,iBAAkB,QAAQ,OAAO,CAAE;AACnD,gBAAQ,SAAS,kBAAmB,QAAQ,QAAQ,IAAK;AACzD,gBAAQ,YAAY,kBAAmB,QAAQ,WAAW,KAAM;AAChE,gBAAQ,WAAW,kBAAmB,QAAQ,UAAU,KAAM;AAC9D,gBAAQ,aAAa,kBAAmB,QAAQ,YAAY,KAAM;AAClE,gBAAQ,SAAS,kBAAmB,QAAQ,QAAQ,KAAM;AAC1D,gBAAQ,2BAA2B,kBAAmB,QAAQ,0BAA0B,KAAM;AAC9F,gBAAQ,yBAAyB,kBAAmB,QAAQ,wBAAwB,IAAK;AACzF,gBAAQ,uBAAuB,kBAAmB,QAAQ,sBAAsB,KAAM;AACtF,gBAAQ,QAAQ,iBAAkB,QAAQ,OAAO,eAAgB;AAEjE,kBAAU,4BAA6B,OAAQ;AAE/C,eAAO,mCAAoC,OAAQ;AAAA,MACvD;AAEA,eAAS,4BAA6B,SAA2C;AAC7E,gBAAQ,QAAQ,iBAAkB,QAAQ,OAAO,IAAK;AACtD,gBAAQ,cAAc,iBAAkB,QAAQ,aAAa,IAAK;AAClE,gBAAQ,UAAU,iBAAkB,QAAQ,SAAS,IAAK;AAE1D,eAAO;AAAA,MACX;AAEA,eAAS,mCAAoC,SAA2C;AACpF,gBAAQ,SAAS,iBAAkB,QAAQ,QAAQ,CAAC,CAAY;AAChE,gBAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,gBAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,gBAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,gBAAQ,OAAO,WAAW,mBAAoB,QAAQ,OAAO,UAAU,IAAK;AAC5E,gBAAQ,OAAO,SAAS,mBAAoB,QAAQ,OAAO,QAAQ,IAAK;AACxE,gBAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,gBAAQ,OAAO,YAAY,mBAAoB,QAAQ,OAAO,WAAW,IAAK;AAC9E,gBAAQ,OAAO,eAAe,mBAAoB,QAAQ,OAAO,cAAc,IAAK;AAEpF,eAAO;AAAA,MACX;AASA,eAAS,cAAe,MAAc,4BAA+C;AACjF,cAAM,WAAmB,KAAK,YAAY;AAC1C,cAAM,SAAkB,aAAa;AAErC,YAAIA,UAAc,SAAS,SAAS,6BAA2B,IAAI,SAAS,cAAe,QAAS;AAEpG,YAAK,UAAW,SAAU,GAAI;AAC1B,UAAAA,QAAO,YAAY;AAAA,QACvB;AAEA,eAAOA;AAAA,MACX;AAEA,eAAS,UAAW,SAA6B;AAC7C,YAAI,OAAe;AACnB,YAAI,MAAc;AAElB,eAAQ,WAAW,CAAC,MAAO,QAAQ,UAAW,KAAK,CAAC,MAAO,QAAQ,SAAU,GAAI;AAC7E,kBAAQ,QAAQ,aAAa,QAAQ;AACrC,iBAAO,QAAQ,YAAY,QAAQ;AAEnC,oBAAU,QAAQ;AAAA,QACtB;AAEA,eAAO;AAAA,UACH;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,oBAA0B;AAC/B,cAAM,MAAmB,SAAS;AAClC,cAAM,QAAiB,OAAO,eAAe,IAAI,eAAkB,IAAI,cAAc;AACrF,cAAM,OAAgB,OAAO,eAAe,IAAI,cAAgB,IAAI,aAAa;AAEjF,eAAO;AAAA,UACH;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,oBAAqB,SAAc,mBAAkC;AAC1E,YAAI,QAAa;AAEjB,YAAK,SAAS,YAAY,kBAAmB;AACzC,kBAAQ,SAAS,YAAY,iBAAkB,SAAS,IAAK,EAAE,iBAAkB,iBAAkB;AAAA,QACvG,WAAY,QAAQ,cAAe;AAC/B,kBAAQ,QAAQ,aAAc,iBAAkB;AAAA,QACpD;AAEA,eAAO;AAAA,MACX;AAEA,eAAS,QAAS,QAAqB,MAA2B;AAC9D,YAAI;AACA,cAAK,CAAC,OAAO,SAAU,IAAK,GAAI;AAC5B,mBAAO,YAAa,IAAK;AAAA,UAC7B;AAAA,QACJ,SAAU,GAAI;AACV,kBAAQ,KAAM,EAAE,OAAQ;AAAA,QAC5B;AAAA,MACJ;AAEA,eAAS,WAAY,QAAqB,MAA2B;AACjE,YAAI;AACA,cAAK,OAAO,SAAU,IAAK,GAAI;AAC3B,mBAAO,YAAa,IAAK;AAAA,UAC7B;AAAA,QACJ,SAAU,GAAI;AACV,kBAAQ,KAAM,EAAE,OAAQ;AAAA,QAC5B;AAAA,MACJ;AAEA,eAAS,aAAc,GAAgB;AACnC,UAAE,eAAe;AACjB,UAAE,eAAe;AAAA,MACrB;AAEA,eAAS,2BAA4B,GAAe,SAA8B;AAC9E,YAAI,OAAO,EAAE,OACT,MAAM,EAAE,OACR,iBAAiB,kBAAkB;AAEvC,gBAAQ,MAAM,UAAU;AAExB,YAAK,OAAO,QAAQ,cAAc,OAAO,YAAa;AAClD,kBAAQ,QAAQ;AAAA,QACpB,OAAO;AACH;AAAA,QACJ;AAEA,YAAK,MAAM,QAAQ,eAAe,OAAO,aAAc;AACnD,iBAAO,QAAQ;AAAA,QACnB,OAAO;AACH;AAAA,QACJ;AAEA,YAAK,OAAO,eAAe,MAAO;AAC9B,iBAAO,EAAE,QAAQ;AAAA,QACrB;AAEA,YAAK,MAAM,eAAe,KAAM;AAC5B,gBAAM,EAAE,QAAQ;AAAA,QACpB;AAEA,gBAAQ,MAAM,OAAO,OAAO;AAC5B,gBAAQ,MAAM,MAAM,MAAM;AAAA,MAC9B;AAEA,eAAS,4BAA6B,SAAsB,WAA4B;AACpF,YAAK,WAAY;AACb,cAAK,QAAQ,MAAM,YAAY,SAAU;AACrC,oBAAQ,MAAM,UAAU;AAAA,UAC5B;AAAA,QAEJ,OAAO;AACH,cAAK,QAAQ,MAAM,YAAY,QAAS;AACpC,oBAAQ,MAAM,UAAU;AAAA,UAC5B;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,cAAe,WAAwB,WAA0B;AACtE,cAAM,gBAA6B,cAAe,KAAM;AACxD,cAAM,QAAqB,cAAe,SAAS,UAAW;AAC9D,cAAM,QAA0B,cAAe,OAAQ;AAEvD,kBAAU,YAAa,aAAc;AACrC,sBAAc,YAAa,KAAM;AACjC,cAAM,YAAa,KAAM;AAEzB,cAAM,OAAO;AAEb,YAAI,YAAY,cAAe,QAAQ,YAAa,GAChD,OAAO,cAAe,QAAQ,MAAO;AAEzC,aAAK,YAAY;AAEjB,cAAM,YAAa,SAAU;AAC7B,cAAM,YAAa,IAAK;AAExB,eAAO;AAAA,UACH;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,yBAA0B,WAAwB,WAA2B;AAClF,YAAI,WAAsC,UAAU,uBAAwB,SAAU;AAEtF,eAAQ,SAAU,CAAE,GAAI;AACpB,mBAAU,CAAE,EAAE,WAAW,YAAa,SAAU,CAAE,CAAE;AAAA,QACxD;AAAA,MACJ;AASA,eAAS,uBAAwB,oBAA8B,MAAsB;AACjF,YAAK,kBAAmB,eAAgB,GAAI;AACxC,0BAAgB,MAAO,MAAM,CAAC,EAAE,MAAM,KAAM,MAAM,CAAE,CAAE;AAAA,QAC1D;AAAA,MACJ;AASA,eAAS,0BAAoC;AACzC,YAAI,OAAgB;AAEpB,YAAK,eAAe,6BAA8B;AAC9C,gBAAM,MAAc,OAAO,SAAS;AACpC,gBAAM,eAAoB,uBAAwB,GAAI;AAEtD,cAAK,UAAW,aAAa,SAAU,GAAI;AACvC,kBAAM,UAAkB,SAAU,aAAa,WAAW,EAAG;AAE7D,gBAAK,CAAC,MAAO,OAAQ,KAAK,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AAC9E,sBAAS,eAAgB,EAAE,WAAW;AAAA,YAC1C;AAAA,UACJ;AAEA,cAAK,UAAW,aAAa,MAAO,GAAI;AACpC,mBAAO,aAAa,WAAW;AAAA,UACnC;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AAEA,eAAS,uBAAwB,KAAoB;AACjD,cAAM,eAAuB,CAAC;AAC9B,cAAM,eAAyB,IAAI,MAAO,GAAI;AAE9C,YAAK,aAAa,SAAS,GAAI;AAC3B,gBAAM,aAAuB,aAAc,CAAE,EAAE,MAAO,GAAI;AAC1D,gBAAM,mBAA2B,WAAW;AAE5C,mBAAU,kBAAkB,GAAG,kBAAkB,kBAAkB,mBAAoB;AACnF,kBAAM,YAAsB,WAAY,eAAgB,EAAE,MAAO,GAAI;AAErE,yBAAc,UAAW,CAAE,CAAE,IAAI,UAAW,CAAE;AAAA,UAClD;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AASA,eAAS,UAAW,OAAuB;AACvC,eAAO,UAAU,QAAQ,UAAU,UAAa;AAAA,MACpD;AAEA,eAAS,gBAAiB,QAAwB;AAC9C,eAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,MACpD;AAEA,eAAS,iBAAkB,QAAwB;AAC/C,eAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,MACpD;AAEA,eAAS,gBAAiB,QAAwB;AAC9C,eAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,MACpD;AAEA,eAAS,kBAAmB,QAAwB;AAChD,eAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,MACpD;AAEA,eAAS,gBAAiB,QAAwB;AAC9C,eAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,MACpD;AAEA,eAAS,eAAgB,QAAwB;AAC7C,eAAO,gBAAiB,MAAO,KAAK,kBAAkB;AAAA,MAC1D;AASA,eAAS,oBAAqB,OAAY,cAAgC;AACtE,eAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,MAC/C;AAEA,eAAS,iBAAkB,OAAY,cAAgC;AACnE,eAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,MAC9C;AAEA,eAAS,kBAAmB,OAAY,cAAkC;AACtE,eAAO,iBAAkB,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAEA,eAAS,iBAAkB,OAAY,cAAgC;AACnE,eAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,MAC9C;AAEA,eAAS,mBAAoB,OAAY,cAA6B;AAClE,eAAO,kBAAmB,KAAM,IAAI,QAAQ;AAAA,MAChD;AAEA,eAAS,iBAAkB,OAAY,cAAgC;AACnE,eAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,MAC9C;AAEA,eAAS,gBAAiB,OAAY,cAA8B;AAChE,eAAO,eAAgB,KAAM,IAAI,QAAQ;AAAA,MAC7C;AAEA,eAAS,wBAAyB,OAAY,cAA8B;AACxE,YAAIA,UAAgB;AAEpB,YAAK,gBAAiB,KAAM,GAAI;AAC5B,gBAAM,SAAmB,MAAM,SAAS,EAAE,qBAAkB;AAE5D,cAAK,OAAO,WAAW,GAAI;AACvB,oBAAQ;AAAA,UACZ,OAAO;AACH,YAAAA,UAAS;AAAA,UACb;AAAA,QAEJ,OAAO;AACH,UAAAA,UAAS,gBAAiB,OAAO,YAAa;AAAA,QAClD;AAEA,eAAOA;AAAA,MACX;AAEA,eAAS,oBAAqB,cAAmC;AAC7D,cAAM,SAAuB;AAAA,UACzB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACZ;AAEA,YAAI;AACA,cAAK,gBAAiB,YAAa,GAAI;AACnC,mBAAO,SAAS,KAAK,MAAO,YAAa;AAAA,UAC7C;AAAA,QAEJ,SAAU,IAAK;AACX,cAAI;AACA,mBAAO,SAAS,KAAM,MAAM,eAAe,GAAI;AAE/C,gBAAK,kBAAmB,OAAO,MAAO,GAAI;AACtC,qBAAO,SAAS,OAAO,OAAO;AAAA,YAClC;AAAA,UAEJ,SAAU,IAAK;AACX,gBAAK,CAAC,eAAe,UAAW;AAC5B,sBAAQ,MAAO,eAAe,gBAAgB,QAAS,eAAgB,GAAG,OAAQ,EAAE,QAAS,eAAgB,GAAG,OAAQ,CAAE;AAC1H,qBAAO,SAAS;AAAA,YACpB;AAEA,mBAAO,SAAS;AAAA,UACpB;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AASA,MAAE,uBAAM;AAAA,MACR,GAAK;AAAA,IACT;AAAA;AAAA","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = 27,\n left = 37,\n up = 38,\n right = 39,\n down = 40,\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n var left = e.pageX,\n top = e.pageY,\n scrollPosition = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n var checkMark = createElement( \"span\", \"check-mark\" ),\n text = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index 1150394..de1e0a8 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -1,8 +1,32 @@ () => { let _configuration = {}; + let _configuration_ShortcutKeysEnabled = true; const _groups_Default = "default"; let _groups_Current = _groups_Default; const _groups = {}; + let _element_Focus_Element_PositionStyle = null; + let _element_Disabled_Background = null; + let _element_Dialog = null; + let _element_Dialog_Close_Button = null; + let _element_Dialog_Title = null; + let _element_Dialog_Description = null; + let _element_Dialog_CheckBox_Container = null; + let _element_Dialog_CheckBox_Input = null; + let _element_Dialog_ProgressDots = null; + let _element_Dialog_ProgressBar = null; + let _element_Dialog_ProgressBar_Percentage = null; + let _element_Dialog_ProgressBar_Percentage_Text = null; + let _element_Dialog_Buttons = null; + let _element_Dialog_Buttons_Back_Button = null; + let _element_Dialog_Buttons_Next_Button = null; + let _element_Dialog_IsHint = false; + let _element_Dialog_Move_Original_X = 0; + let _element_Dialog_Move_Original_Y = 0; + let _element_Dialog_Move_IsMoving = false; + let _element_Dialog_Move_X = 0; + let _element_Dialog_Move_Y = 0; + let _element_ToolTip = null; + let _element_ToolTip_Timer = 0; function buildAttributeOptions(e) { let t = !isDefinedObject(e) ? {} : e; t.order = getDefaultNumber(t.order, 0); @@ -38,12 +62,12 @@ } function createElement(e, t = "") { const n = e.toLowerCase(); - const o = n === "text"; - let i = o ? document.createTextNode("") : document.createElement(n); + const l = n === "text"; + let o = l ? document.createTextNode("") : document.createElement(n); if (isDefined(t)) { - i.className = t; + o.className = t; } - return i; + return o; } function getOffset(e) { let t = 0; @@ -99,26 +123,26 @@ e.cancelBubble = true; } function showElementAtMousePosition(e, t) { - var n = e.pageX, o = e.pageY, i = getScrollPosition(); + var n = e.pageX, l = e.pageY, o = getScrollPosition(); t.style.display = "block"; if (n + t.offsetWidth > window.innerWidth) { n -= t.offsetWidth; } else { n++; } - if (o + t.offsetHeight > window.innerHeight) { - o -= t.offsetHeight; + if (l + t.offsetHeight > window.innerHeight) { + l -= t.offsetHeight; } else { - o++; + l++; } - if (n < i.left) { + if (n < o.left) { n = e.pageX + 1; } - if (o < i.top) { - o = e.pageY + 1; + if (l < o.top) { + l = e.pageY + 1; } t.style.left = n + "px"; - t.style.top = o + "px"; + t.style.top = l + "px"; } function showElementBasedOnCondition(e, t) { if (t) { @@ -133,19 +157,19 @@ } function buildCheckBox(e, t) { const n = createElement("div"); - const o = createElement("label", "checkbox"); - const i = createElement("input"); + const l = createElement("label", "checkbox"); + const o = createElement("input"); e.appendChild(n); - n.appendChild(o); - o.appendChild(i); - i.type = "checkbox"; - var l = createElement("span", "check-mark"), r = createElement("span", "text"); + n.appendChild(l); + l.appendChild(o); + o.type = "checkbox"; + var i = createElement("span", "check-mark"), r = createElement("span", "text"); r.innerHTML = t; - o.appendChild(l); - o.appendChild(r); + l.appendChild(i); + l.appendChild(r); return { - input: i, - label: o + input: o, + label: l }; } function clearElementsByClassName(e, t) { @@ -181,9 +205,9 @@ const n = e.split("?"); if (n.length > 1) { const e = n[1].split("&"); - const i = e.length; - for (var o = 0; o < i; o++) { - const n = e[o].split("="); + const o = e.length; + for (var l = 0; l < o; l++) { + const n = e[l].split("="); t[n[0]] = n[1]; } } @@ -234,11 +258,11 @@ function getDefaultStringOrArray(e, t) { let n = t; if (isDefinedString(e)) { - const o = e.toString().split(" "); - if (o.length === 0) { + const l = e.toString().split(" "); + if (l.length === 0) { e = t; } else { - n = o; + n = l; } } else { n = getDefaultArray(e, t); diff --git a/dist/journey.js.map b/dist/journey.js.map index 4eaae78..35c2c0f 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n var left = e.pageX,\n top = e.pageY,\n scrollPosition = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n var checkMark = createElement( \"span\", \"check-mark\" ),\n text = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file +{"version":3,"sources":["../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n var left = e.pageX,\n top = e.pageY,\n scrollPosition = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n var checkMark = createElement( \"span\", \"check-mark\" ),\n text = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 7053175..9263377 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -16,7 +16,7 @@ import { type BindingOptions, type Events } from "./ts/type"; -import { Char } from "./ts/enum"; +import { Char, KeyCode } from "./ts/enum"; type StringToJson = { @@ -29,11 +29,47 @@ type StringToJson = { // Variables: Configuration let _configuration: Configuration = {} as Configuration; + // Variables: Configuration (overrides) + let _configuration_ShortcutKeysEnabled: boolean = true; + // Variables: Groups const _groups_Default: string = "default"; let _groups_Current: string = _groups_Default; const _groups: object = {}; + // Variables: Focus Element + let _element_Focus_Element_PositionStyle: string = null; + + // Variables: Disabled Background + let _element_Disabled_Background: HTMLElement = null; + + // Variables: Dialog + let _element_Dialog: HTMLElement = null; + let _element_Dialog_Close_Button: HTMLElement = null; + let _element_Dialog_Title: HTMLElement = null; + let _element_Dialog_Description: HTMLElement = null; + let _element_Dialog_CheckBox_Container: HTMLElement = null; + let _element_Dialog_CheckBox_Input: HTMLElement = null; + let _element_Dialog_ProgressDots: HTMLElement = null; + let _element_Dialog_ProgressBar: HTMLElement = null; + let _element_Dialog_ProgressBar_Percentage: HTMLElement = null; + let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null; + let _element_Dialog_Buttons: HTMLElement = null; + let _element_Dialog_Buttons_Back_Button: HTMLElement = null; + let _element_Dialog_Buttons_Next_Button: HTMLElement = null; + let _element_Dialog_IsHint: boolean = false; + + // Variables: Dialog - Move + let _element_Dialog_Move_Original_X: number = 0; + let _element_Dialog_Move_Original_Y: number = 0; + let _element_Dialog_Move_IsMoving: boolean = false; + let _element_Dialog_Move_X: number = 0; + let _element_Dialog_Move_Y: number = 0; + + // Variables: Dialog + let _element_ToolTip = null; + let _element_ToolTip_Timer: number = 0; + /* * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/ts/enum.ts b/src/ts/enum.ts index e0a592f..c08b7b2 100644 --- a/src/ts/enum.ts +++ b/src/ts/enum.ts @@ -1,4 +1,12 @@ export const enum Char { empty = "", space = " ", +} + +export const enum KeyCode { + escape = 27, + left = 37, + up = 38, + right = 39, + down = 40, } \ No newline at end of file From ebfd614ef77897fc8e58cf978ab969590c316298 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 14:30:11 +0100 Subject: [PATCH 17/44] Added all private functions and upgraded. --- dist/journey.esm.js | 573 ++++++++++++++++++++++++++++-- dist/journey.esm.js.map | 2 +- dist/journey.js | 568 ++++++++++++++++++++++++++++-- dist/journey.js.map | 2 +- src/journey.ts | 761 +++++++++++++++++++++++++++++++++++++++- src/ts/api.ts | 200 +++++++++++ src/ts/type.ts | 6 + 7 files changed, 2041 insertions(+), 71 deletions(-) create mode 100644 src/ts/api.ts diff --git a/dist/journey.esm.js b/dist/journey.esm.js index 8b5925c..215d215 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -14,15 +14,26 @@ var init_enum = __esm({ "src/ts/enum.ts"() {} }); +var Constants; + +var init_constant = __esm({ + "src/ts/constant.ts"() { + (e => { + e.JOURNEY_JS_ATTRIBUTE_NAME = "data-journey-js"; + })(Constants || (Constants = {})); + } +}); + var require_journey = __commonJS({ "src/journey.ts"(exports, module) { init_enum(); + init_constant(); () => { let _configuration = {}; let _configuration_ShortcutKeysEnabled = true; const _groups_Default = "default"; let _groups_Current = _groups_Default; - const _groups = {}; + let _groups = {}; let _element_Focus_Element_PositionStyle = null; let _element_Disabled_Background = null; let _element_Dialog = null; @@ -46,6 +57,466 @@ var require_journey = __commonJS({ let _element_Dialog_Move_Y = 0; let _element_ToolTip = null; let _element_ToolTip_Timer = 0; + function setupDefaultGroup(e) { + _groups = getDefaultObject(e, {}); + _groups[_groups_Default] = { + json: {}, + keys: [], + position: 0 + }; + } + function setupNewGroup(e) { + if (!_groups.hasOwnProperty(e)) { + _groups[e] = { + json: {}, + keys: [], + position: 0 + }; + } + } + function getGroupBindingOptions() { + return _groups[_groups_Current].json[_groups[_groups_Current].keys[_groups[_groups_Current].position]]; + } + function renderDisabledBackground() { + _element_Disabled_Background = createElement("div", "journey-js-disabled-background"); + _element_Disabled_Background.onclick = function() { + if (_configuration.closeDialogOnDisabledBackgroundClick) { + onDialogClose(); + } + }; + } + function showDisabledBackground() { + addNode(document.body, _element_Disabled_Background); + } + function hideDisabledBackground() { + removeNode(document.body, _element_Disabled_Background); + } + function renderDialog() { + _element_Dialog = createElement("div", "journey-js-dialog"); + _element_Dialog.style.display = "none"; + document.body.appendChild(_element_Dialog); + _element_Dialog_Close_Button = createElement("button", "close"); + _element_Dialog.appendChild(_element_Dialog_Close_Button); + _element_Dialog_Close_Button.onclick = function() { + onDialogClose(); + }; + addToolTip(_element_Dialog_Close_Button, _configuration.closeButtonToolTipText); + _element_Dialog_Title = createElement("div", "title"); + _element_Dialog.appendChild(_element_Dialog_Title); + _element_Dialog_Description = createElement("div", "description"); + _element_Dialog.appendChild(_element_Dialog_Description); + _element_Dialog_CheckBox_Container = createElement("div", "checkbox-container"); + _element_Dialog.appendChild(_element_Dialog_CheckBox_Container); + _element_Dialog_CheckBox_Input = buildCheckBox(_element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText).input; + _element_Dialog_CheckBox_Input.onchange = function() { + if (_configuration.showDoNotShowAgain) { + fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked); + } + }; + _element_Dialog_ProgressDots = createElement("div", "progress-dots"); + _element_Dialog.appendChild(_element_Dialog_ProgressDots); + _element_Dialog_ProgressBar = createElement("div", "progress-bar"); + _element_Dialog.appendChild(_element_Dialog_ProgressBar); + _element_Dialog_ProgressBar_Percentage = createElement("div", "progress-bar-percentage"); + _element_Dialog_ProgressBar.appendChild(_element_Dialog_ProgressBar_Percentage); + _element_Dialog_ProgressBar_Percentage_Text = createElement("p", "progress-bar-percentage-text"); + _element_Dialog_ProgressBar_Percentage.appendChild(_element_Dialog_ProgressBar_Percentage_Text); + _element_Dialog_Buttons = createElement("div", "buttons"); + _element_Dialog.appendChild(_element_Dialog_Buttons); + _element_Dialog_Buttons_Back_Button = createElement("button", "back"); + _element_Dialog_Buttons_Back_Button.onclick = onDialogBack; + _element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Back_Button); + _element_Dialog_Buttons_Next_Button = createElement("button", "next"); + _element_Dialog_Buttons_Next_Button.onclick = onDialogNext; + _element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Next_Button); + makeDialogMovable(); + } + function onDialogClose(e = true) { + let t = false; + if (isDefinedString(_configuration.closeDialogConfirmationText) && e) { + t = confirm(_configuration.closeDialogConfirmationText); + } else { + t = true; + } + if (t) { + const e = getGroupBindingOptions(); + if (isDefined(e) && isDefined(e._currentView.element)) { + fireCustomTriggerEvent(e.events.onClose, e._currentView.element); + } + removeFocusClassFromLastElement(false); + hideDisabledBackground(); + hideToolTip(); + _element_Dialog.style.display = "none"; + } + } + function onDialogBack() { + if (_groups[_groups_Current].position > 0) { + removeFocusClassFromLastElement(); + _groups[_groups_Current].position--; + showDialogAndSetPosition(); + } + } + function onDialogNext() { + if (_groups[_groups_Current].position === _groups[_groups_Current].keys.length - 1) { + const e = getGroupBindingOptions(); + onDialogClose(false); + fireCustomTriggerEvent(e.events.onFinish, e._currentView.element); + } else { + removeFocusClassFromLastElement(); + _groups[_groups_Current].position++; + showDialogAndSetPosition(); + } + } + function showDialogAndSetPosition() { + const e = getGroupBindingOptions(); + if (isDefined(e) && isDefined(e._currentView.element)) { + if (e.showDisabledBackground) { + showDisabledBackground(); + } else { + hideDisabledBackground(); + } + hideToolTip(); + _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? "block" : "none"; + _configuration_ShortcutKeysEnabled = true; + e._currentView.element.className += " " + "journey-js-element-focus"; + if (_configuration.scrollToElements) { + e._currentView.element.scrollIntoView(); + } + const t = getStyleValueByName(e._currentView.element, "position"); + if (t !== "" && t.toLowerCase() === "static") { + _element_Focus_Element_PositionStyle = t; + e._currentView.element.style.position = "relative"; + } + showElementBasedOnCondition(_element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain); + showElementBasedOnCondition(_element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[_groups_Current].keys.length > 1); + showElementBasedOnCondition(_element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[_groups_Current].keys.length > 1); + showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText); + showElementBasedOnCondition(_element_Dialog_Buttons, _configuration.showButtons); + _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText; + _element_Dialog_Buttons_Back_Button.disabled = _groups[_groups_Current].position === 0; + if (_groups[_groups_Current].position >= _groups[_groups_Current].keys.length - 1) { + _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText; + } else { + _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText; + } + setDialogText(e); + setDialogPosition(null, e); + buildProcessDots(); + setProgressBarPosition(); + fireCustomTriggerEvent(e.events.onEnter, e._currentView.element); + if (e.sendClick) { + e._currentView.element.click(); + } + } + } + function setDialogText(e) { + if (isDefinedString(e.title)) { + _element_Dialog_Title.innerHTML = e.title; + } else { + _element_Dialog_Title.innerHTML = ""; + } + if (isDefinedString(e.description)) { + _element_Dialog_Description.innerHTML = e.description; + } else { + _element_Dialog_Description.innerHTML = ""; + } + } + function setDialogPosition(e, t) { + if (_element_Dialog.style.display !== "block") { + _element_Dialog.style.display = "block"; + fireCustomTriggerEvent(t.events.onOpen, t._currentView.element); + } + if (_groups[_groups_Current].position === 0) { + fireCustomTriggerEvent(t.events.onStart, t._currentView.element); + } + _element_Dialog_IsHint = t.isHint === true; + if (t.attach || t.isHint) { + if (t.isHint && t.alignHintToClickPosition) { + showElementAtMousePosition(e, _element_Dialog); + } else { + const e = getOffset(t._currentView.element); + let n = e.top + t._currentView.element.offsetHeight; + let o = e.left; + if (o + _element_Dialog.offsetWidth > window.innerWidth || t.alignRight) { + o -= _element_Dialog.offsetWidth; + o += t._currentView.element.offsetWidth; + } + if (n + _element_Dialog.offsetHeight > window.innerHeight || t.alignTop) { + n -= _element_Dialog.offsetHeight + t._currentView.element.offsetHeight; + } + _element_Dialog.style.top = n + "px"; + _element_Dialog.style.left = o + "px"; + } + } else { + const e = getScrollPosition(); + const t = Math.max(0, (window.innerWidth - _element_Dialog.offsetWidth) / 2 + e.left); + const n = Math.max(0, (window.innerHeight - _element_Dialog.offsetHeight) / 2 + e.top); + _element_Dialog.style.left = t + "px"; + _element_Dialog.style.top = n + "px"; + } + } + function removeFocusClassFromLastElement(e = true) { + const t = getGroupBindingOptions(); + if (isDefined(t) && isDefined(t._currentView.element)) { + t._currentView.element.className = t._currentView.element.className.replace(" " + "journey-js-element-focus", ""); + if (isDefined(_element_Focus_Element_PositionStyle)) { + t._currentView.element.style.position = _element_Focus_Element_PositionStyle; + } + if (e) { + fireCustomTriggerEvent(t.events.onLeave, t._currentView.element); + } + } + } + function buildProcessDots() { + _element_Dialog_ProgressDots.innerHTML = ""; + if (_configuration.showProgressDots) { + const e = _groups[_groups_Current].keys.length; + for (let t = 0; t < e; t++) { + buildProgressDot(t, _groups[_groups_Current].keys[t]); + } + } + } + function buildProgressDot(e, t) { + const n = _groups[_groups_Current].json[t]; + let o = null; + if (e === _groups[_groups_Current].position) { + o = createElement("div", "dot-active"); + } else { + o = createElement("div", "dot"); + o.onclick = function() { + removeFocusClassFromLastElement(); + _groups[_groups_Current].position = e; + showDialogAndSetPosition(); + }; + } + _element_Dialog_ProgressDots.appendChild(o); + if (_configuration.showProgressDotToolTips) { + if (isDefinedString(n.tooltip)) { + addToolTip(o, n.tooltip); + } else { + addToolTip(o, n.title); + } + } + if (_configuration.showProgressDotNumbers) { + o.className += " dot-number"; + o.innerHTML = (e + 1).toString(); + } + } + function setProgressBarPosition() { + if (_configuration.showProgressBar) { + const e = _element_Dialog_ProgressBar.offsetWidth / _groups[_groups_Current].keys.length; + const t = (_groups[_groups_Current].position + 1) * e; + const n = Math.ceil((_groups[_groups_Current].position + 1) / _groups[_groups_Current].keys.length * 100); + _element_Dialog_ProgressBar_Percentage.style.width = t + "px"; + _element_Dialog_ProgressBar_Percentage_Text.innerHTML = n + "%"; + } + } + function makeDialogMovable() { + _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown; + _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp; + _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp; + document.body.addEventListener("mousemove", onMoveDocumentMouseMove); + document.body.addEventListener("mouseleave", onMoveDocumentMouseLeave); + } + function onMoveTitleBarMouseDown(e) { + if (!_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled) { + _element_Dialog.className += " journey-js-dialog-moving"; + _element_Dialog_Move_IsMoving = true; + _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft; + _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop; + _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft; + _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop; + } + } + function onMoveTitleBarMouseUp() { + if (_element_Dialog_Move_IsMoving) { + _element_Dialog_Move_IsMoving = false; + _element_Dialog_Move_Original_X = 0; + _element_Dialog_Move_Original_Y = 0; + _element_Dialog.className = "journey-js-dialog"; + } + } + function onMoveDocumentMouseMove(e) { + if (_element_Dialog_Move_IsMoving) { + _element_Dialog.style.left = e.pageX - _element_Dialog_Move_X + "px"; + _element_Dialog.style.top = e.pageY - _element_Dialog_Move_Y + "px"; + } + } + function onMoveDocumentMouseLeave() { + if (_element_Dialog_Move_IsMoving) { + _element_Dialog.style.left = _element_Dialog_Move_Original_X + "px"; + _element_Dialog.style.top = _element_Dialog_Move_Original_Y + "px"; + _element_Dialog_Move_IsMoving = false; + _element_Dialog_Move_Original_X = 0; + _element_Dialog_Move_Original_Y = 0; + _element_Dialog.className = "journey-js-dialog"; + } + } + function renderToolTip() { + if (!isDefined(_element_ToolTip)) { + _element_ToolTip = createElement("div", "journey-js-tooltip"); + _element_ToolTip.style.display = "none"; + document.body.appendChild(_element_ToolTip); + document.body.addEventListener("mousemove", (function() { + hideToolTip(); + })); + document.addEventListener("scroll", (function() { + hideToolTip(); + })); + } + } + function addToolTip(e, t) { + if (e !== null) { + e.onmousemove = function(e) { + showToolTip(e, t); + }; + } + } + function showToolTip(e, t) { + cancelBubble(e); + hideToolTip(); + _element_ToolTip_Timer = setTimeout((function() { + _element_ToolTip.innerHTML = t; + _element_ToolTip.style.display = "block"; + showElementAtMousePosition(e, _element_ToolTip); + }), _configuration.tooltipDelay); + } + function hideToolTip() { + if (isDefined(_element_ToolTip)) { + if (_element_ToolTip_Timer !== 0) { + clearTimeout(_element_ToolTip_Timer); + _element_ToolTip_Timer = 0; + } + if (_element_ToolTip.style.display === "block") { + _element_ToolTip.style.display = "none"; + } + } + } + function getElements() { + const e = _configuration.domElementTypes; + const t = e.length; + for (let n = 0; n < t; n++) { + const t = document.getElementsByTagName(e[n]); + const o = [].slice.call(t); + const i = o.length; + for (let e = 0; e < i; e++) { + if (!getElement(o[e])) { + break; + } + } + } + _groups[_groups_Current].keys.sort(); + } + function getElement(e) { + let t = true; + if (isDefined(e) && e.hasAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME)) { + const n = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); + if (isDefinedString(n)) { + const o = getObjectFromString(n); + if (o.parsed && isDefinedObject(o.object)) { + setupElement(e, buildAttributeOptions(o.object)); + } else { + if (!_configuration.safeMode) { + console.error(_configuration.attributeNotValidErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); + t = false; + } + } + } else { + if (!_configuration.safeMode) { + console.error(_configuration.attributeNotSetErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); + t = false; + } + } + } + return t; + } + function setupElement(e, t) { + t._currentView = {}; + t._currentView.element = e; + if (isDefinedNumber(t.order) && (isDefinedString(t.title) || isDefinedString(t.description))) { + e.removeAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); + if (!t.isHint) { + setupNewGroup(t.group); + _groups[t.group].json[t.order] = t; + _groups[t.group].keys.push(t.order); + fireCustomTriggerEvent(t.events.onAddStep, e); + } else { + renderHint(t); + } + } + } + function renderHint(e) { + const t = getStyleValueByName(e._currentView.element, "position"); + if (t !== "" && t.toLowerCase() === "static") { + e._currentView.element.style.position = "relative"; + } + const n = createElement("div", "journey-js-hint"); + e._currentView.element.appendChild(n); + n.onclick = function(t) { + cancelBubble(t); + _element_Dialog_CheckBox_Container.style.display = "none"; + _element_Dialog_ProgressDots.style.display = "none"; + _element_Dialog_ProgressBar.style.display = "none"; + _element_Dialog_Buttons.style.display = "none"; + _configuration_ShortcutKeysEnabled = false; + setDialogText(e); + setDialogPosition(t, e); + if (e.removeHintWhenViewed) { + clearElementsByClassName(e._currentView.element, "journey-js-hint"); + } + }; + } + function buildDocumentEvents(e = true) { + const t = e ? document.addEventListener : document.removeEventListener; + const n = e ? window.addEventListener : window.removeEventListener; + if (_configuration.shortcutKeysEnabled) { + t("keydown", onWindowKeyDown); + } + n("resize", onWindowResize); + } + function onWindowKeyDown(e) { + if (_public.isOpen() && _configuration.shortcutKeysEnabled) { + if (e.keyCode === 27) { + e.preventDefault(); + onDialogClose(); + } else { + if (_configuration_ShortcutKeysEnabled) { + if (e.keyCode === 37) { + e.preventDefault(); + onDialogBack(); + } else if (e.keyCode === 39) { + e.preventDefault(); + onDialogNext(); + } else if (e.keyCode === 38) { + e.preventDefault(); + onWindowKeyCodeUp(); + } else if (e.keyCode === 40) { + e.preventDefault(); + onWindowKeyCodeDown(); + } + } + } + } + } + function onWindowResize() { + if (_public.isOpen()) { + showDialogAndSetPosition(); + } + } + function onWindowKeyCodeUp() { + if (_groups[_groups_Current].position !== 0) { + removeFocusClassFromLastElement(); + _groups[_groups_Current].position = 0; + showDialogAndSetPosition(); + } + } + function onWindowKeyCodeDown() { + if (_groups[_groups_Current].position !== _groups[_groups_Current].keys.length - 1) { + removeFocusClassFromLastElement(); + _groups[_groups_Current].position = _groups[_groups_Current].keys.length - 1; + showDialogAndSetPosition(); + } + } function buildAttributeOptions(e) { let t = !isDefinedObject(e) ? {} : e; t.order = getDefaultNumber(t.order, 0); @@ -81,12 +552,12 @@ var require_journey = __commonJS({ } function createElement(e, t = "") { const n = e.toLowerCase(); - const l = n === "text"; - let o = l ? document.createTextNode("") : document.createElement(n); + const o = n === "text"; + let i = o ? document.createTextNode("") : document.createElement(n); if (isDefined(t)) { - o.className = t; + i.className = t; } - return o; + return i; } function getOffset(e) { let t = 0; @@ -142,26 +613,28 @@ var require_journey = __commonJS({ e.cancelBubble = true; } function showElementAtMousePosition(e, t) { - var n = e.pageX, l = e.pageY, o = getScrollPosition(); + let n = e.pageX; + let o = e.pageY; + const i = getScrollPosition(); t.style.display = "block"; if (n + t.offsetWidth > window.innerWidth) { n -= t.offsetWidth; } else { n++; } - if (l + t.offsetHeight > window.innerHeight) { - l -= t.offsetHeight; + if (o + t.offsetHeight > window.innerHeight) { + o -= t.offsetHeight; } else { - l++; + o++; } - if (n < o.left) { + if (n < i.left) { n = e.pageX + 1; } - if (l < o.top) { - l = e.pageY + 1; + if (o < i.top) { + o = e.pageY + 1; } t.style.left = n + "px"; - t.style.top = l + "px"; + t.style.top = o + "px"; } function showElementBasedOnCondition(e, t) { if (t) { @@ -176,19 +649,20 @@ var require_journey = __commonJS({ } function buildCheckBox(e, t) { const n = createElement("div"); - const l = createElement("label", "checkbox"); - const o = createElement("input"); + const o = createElement("label", "checkbox"); + const i = createElement("input"); e.appendChild(n); - n.appendChild(l); - l.appendChild(o); - o.type = "checkbox"; - var i = createElement("span", "check-mark"), r = createElement("span", "text"); + n.appendChild(o); + o.appendChild(i); + i.type = "checkbox"; + const l = createElement("span", "check-mark"); + const r = createElement("span", "text"); r.innerHTML = t; - l.appendChild(i); - l.appendChild(r); + o.appendChild(l); + o.appendChild(r); return { - input: o, - label: l + input: i, + label: o }; } function clearElementsByClassName(e, t) { @@ -225,9 +699,9 @@ var require_journey = __commonJS({ if (n.length > 1) { const e = n[1].split("&"); const o = e.length; - for (var l = 0; l < o; l++) { - const n = e[l].split("="); - t[n[0]] = n[1]; + for (let n = 0; n < o; n++) { + const o = e[n].split("="); + t[o[0]] = o[1]; } } return t; @@ -277,11 +751,11 @@ var require_journey = __commonJS({ function getDefaultStringOrArray(e, t) { let n = t; if (isDefinedString(e)) { - const l = e.toString().split(" "); - if (l.length === 0) { + const o = e.toString().split(" "); + if (o.length === 0) { e = t; } else { - n = l; + n = o; } } else { n = getDefaultArray(e, t); @@ -313,6 +787,47 @@ var require_journey = __commonJS({ } return result; } + const _public = { + start: function(e) { + throw new Error("Function not implemented."); + }, + show: function(e) { + throw new Error("Function not implemented."); + }, + hide: function() { + throw new Error("Function not implemented."); + }, + isOpen: function() { + throw new Error("Function not implemented."); + }, + isComplete: function() { + throw new Error("Function not implemented."); + }, + addDocumentSteps: function() { + throw new Error("Function not implemented."); + }, + addStep: function(e, t) { + throw new Error("Function not implemented."); + }, + removeStep: function(e) { + throw new Error("Function not implemented."); + }, + clearSteps: function(e) { + throw new Error("Function not implemented."); + }, + clearHints: function() { + throw new Error("Function not implemented."); + }, + reverseStepOrder: function() { + throw new Error("Function not implemented."); + }, + setConfiguration: function(e) { + throw new Error("Function not implemented."); + }, + getVersion: function() { + throw new Error("Function not implemented."); + } + }; (() => {})(); }; } diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 274dcfc..0395e19 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = 27,\n left = 37,\n up = 38,\n right = 39,\n down = 40,\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n var left = e.pageX,\n top = e.pageY,\n scrollPosition = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n var checkMark = createElement( \"span\", \"check-mark\" ),\n text = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = 27,\n left = 37,\n up = 38,\n right = 39,\n down = 40,\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function (group: string): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n show: function (group: string): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n hide: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n isOpen: function (): boolean {\n throw new Error(\"Function not implemented.\");\n },\n \n isComplete: function (): boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n addStep: function (element: HTMLElement, options: BindingOptions): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n removeStep: function (element: HTMLElement): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n clearSteps: function (group: string): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n clearHints: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n reverseStepOrder: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function (newConfiguration: Configuration): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n throw new Error(\"Function not implemented.\");\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index de1e0a8..41fcfc6 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -1,9 +1,15 @@ +var Constants; + +(e => { + e.JOURNEY_JS_ATTRIBUTE_NAME = "data-journey-js"; +})(Constants || (Constants = {})); + () => { let _configuration = {}; let _configuration_ShortcutKeysEnabled = true; const _groups_Default = "default"; let _groups_Current = _groups_Default; - const _groups = {}; + let _groups = {}; let _element_Focus_Element_PositionStyle = null; let _element_Disabled_Background = null; let _element_Dialog = null; @@ -27,6 +33,466 @@ let _element_Dialog_Move_Y = 0; let _element_ToolTip = null; let _element_ToolTip_Timer = 0; + function setupDefaultGroup(e) { + _groups = getDefaultObject(e, {}); + _groups[_groups_Default] = { + json: {}, + keys: [], + position: 0 + }; + } + function setupNewGroup(e) { + if (!_groups.hasOwnProperty(e)) { + _groups[e] = { + json: {}, + keys: [], + position: 0 + }; + } + } + function getGroupBindingOptions() { + return _groups[_groups_Current].json[_groups[_groups_Current].keys[_groups[_groups_Current].position]]; + } + function renderDisabledBackground() { + _element_Disabled_Background = createElement("div", "journey-js-disabled-background"); + _element_Disabled_Background.onclick = function() { + if (_configuration.closeDialogOnDisabledBackgroundClick) { + onDialogClose(); + } + }; + } + function showDisabledBackground() { + addNode(document.body, _element_Disabled_Background); + } + function hideDisabledBackground() { + removeNode(document.body, _element_Disabled_Background); + } + function renderDialog() { + _element_Dialog = createElement("div", "journey-js-dialog"); + _element_Dialog.style.display = "none"; + document.body.appendChild(_element_Dialog); + _element_Dialog_Close_Button = createElement("button", "close"); + _element_Dialog.appendChild(_element_Dialog_Close_Button); + _element_Dialog_Close_Button.onclick = function() { + onDialogClose(); + }; + addToolTip(_element_Dialog_Close_Button, _configuration.closeButtonToolTipText); + _element_Dialog_Title = createElement("div", "title"); + _element_Dialog.appendChild(_element_Dialog_Title); + _element_Dialog_Description = createElement("div", "description"); + _element_Dialog.appendChild(_element_Dialog_Description); + _element_Dialog_CheckBox_Container = createElement("div", "checkbox-container"); + _element_Dialog.appendChild(_element_Dialog_CheckBox_Container); + _element_Dialog_CheckBox_Input = buildCheckBox(_element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText).input; + _element_Dialog_CheckBox_Input.onchange = function() { + if (_configuration.showDoNotShowAgain) { + fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked); + } + }; + _element_Dialog_ProgressDots = createElement("div", "progress-dots"); + _element_Dialog.appendChild(_element_Dialog_ProgressDots); + _element_Dialog_ProgressBar = createElement("div", "progress-bar"); + _element_Dialog.appendChild(_element_Dialog_ProgressBar); + _element_Dialog_ProgressBar_Percentage = createElement("div", "progress-bar-percentage"); + _element_Dialog_ProgressBar.appendChild(_element_Dialog_ProgressBar_Percentage); + _element_Dialog_ProgressBar_Percentage_Text = createElement("p", "progress-bar-percentage-text"); + _element_Dialog_ProgressBar_Percentage.appendChild(_element_Dialog_ProgressBar_Percentage_Text); + _element_Dialog_Buttons = createElement("div", "buttons"); + _element_Dialog.appendChild(_element_Dialog_Buttons); + _element_Dialog_Buttons_Back_Button = createElement("button", "back"); + _element_Dialog_Buttons_Back_Button.onclick = onDialogBack; + _element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Back_Button); + _element_Dialog_Buttons_Next_Button = createElement("button", "next"); + _element_Dialog_Buttons_Next_Button.onclick = onDialogNext; + _element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Next_Button); + makeDialogMovable(); + } + function onDialogClose(e = true) { + let t = false; + if (isDefinedString(_configuration.closeDialogConfirmationText) && e) { + t = confirm(_configuration.closeDialogConfirmationText); + } else { + t = true; + } + if (t) { + const e = getGroupBindingOptions(); + if (isDefined(e) && isDefined(e._currentView.element)) { + fireCustomTriggerEvent(e.events.onClose, e._currentView.element); + } + removeFocusClassFromLastElement(false); + hideDisabledBackground(); + hideToolTip(); + _element_Dialog.style.display = "none"; + } + } + function onDialogBack() { + if (_groups[_groups_Current].position > 0) { + removeFocusClassFromLastElement(); + _groups[_groups_Current].position--; + showDialogAndSetPosition(); + } + } + function onDialogNext() { + if (_groups[_groups_Current].position === _groups[_groups_Current].keys.length - 1) { + const e = getGroupBindingOptions(); + onDialogClose(false); + fireCustomTriggerEvent(e.events.onFinish, e._currentView.element); + } else { + removeFocusClassFromLastElement(); + _groups[_groups_Current].position++; + showDialogAndSetPosition(); + } + } + function showDialogAndSetPosition() { + const e = getGroupBindingOptions(); + if (isDefined(e) && isDefined(e._currentView.element)) { + if (e.showDisabledBackground) { + showDisabledBackground(); + } else { + hideDisabledBackground(); + } + hideToolTip(); + _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? "block" : "none"; + _configuration_ShortcutKeysEnabled = true; + e._currentView.element.className += " " + "journey-js-element-focus"; + if (_configuration.scrollToElements) { + e._currentView.element.scrollIntoView(); + } + const t = getStyleValueByName(e._currentView.element, "position"); + if (t !== "" && t.toLowerCase() === "static") { + _element_Focus_Element_PositionStyle = t; + e._currentView.element.style.position = "relative"; + } + showElementBasedOnCondition(_element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain); + showElementBasedOnCondition(_element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[_groups_Current].keys.length > 1); + showElementBasedOnCondition(_element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[_groups_Current].keys.length > 1); + showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText); + showElementBasedOnCondition(_element_Dialog_Buttons, _configuration.showButtons); + _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText; + _element_Dialog_Buttons_Back_Button.disabled = _groups[_groups_Current].position === 0; + if (_groups[_groups_Current].position >= _groups[_groups_Current].keys.length - 1) { + _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText; + } else { + _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText; + } + setDialogText(e); + setDialogPosition(null, e); + buildProcessDots(); + setProgressBarPosition(); + fireCustomTriggerEvent(e.events.onEnter, e._currentView.element); + if (e.sendClick) { + e._currentView.element.click(); + } + } + } + function setDialogText(e) { + if (isDefinedString(e.title)) { + _element_Dialog_Title.innerHTML = e.title; + } else { + _element_Dialog_Title.innerHTML = ""; + } + if (isDefinedString(e.description)) { + _element_Dialog_Description.innerHTML = e.description; + } else { + _element_Dialog_Description.innerHTML = ""; + } + } + function setDialogPosition(e, t) { + if (_element_Dialog.style.display !== "block") { + _element_Dialog.style.display = "block"; + fireCustomTriggerEvent(t.events.onOpen, t._currentView.element); + } + if (_groups[_groups_Current].position === 0) { + fireCustomTriggerEvent(t.events.onStart, t._currentView.element); + } + _element_Dialog_IsHint = t.isHint === true; + if (t.attach || t.isHint) { + if (t.isHint && t.alignHintToClickPosition) { + showElementAtMousePosition(e, _element_Dialog); + } else { + const e = getOffset(t._currentView.element); + let n = e.top + t._currentView.element.offsetHeight; + let o = e.left; + if (o + _element_Dialog.offsetWidth > window.innerWidth || t.alignRight) { + o -= _element_Dialog.offsetWidth; + o += t._currentView.element.offsetWidth; + } + if (n + _element_Dialog.offsetHeight > window.innerHeight || t.alignTop) { + n -= _element_Dialog.offsetHeight + t._currentView.element.offsetHeight; + } + _element_Dialog.style.top = n + "px"; + _element_Dialog.style.left = o + "px"; + } + } else { + const e = getScrollPosition(); + const t = Math.max(0, (window.innerWidth - _element_Dialog.offsetWidth) / 2 + e.left); + const n = Math.max(0, (window.innerHeight - _element_Dialog.offsetHeight) / 2 + e.top); + _element_Dialog.style.left = t + "px"; + _element_Dialog.style.top = n + "px"; + } + } + function removeFocusClassFromLastElement(e = true) { + const t = getGroupBindingOptions(); + if (isDefined(t) && isDefined(t._currentView.element)) { + t._currentView.element.className = t._currentView.element.className.replace(" " + "journey-js-element-focus", ""); + if (isDefined(_element_Focus_Element_PositionStyle)) { + t._currentView.element.style.position = _element_Focus_Element_PositionStyle; + } + if (e) { + fireCustomTriggerEvent(t.events.onLeave, t._currentView.element); + } + } + } + function buildProcessDots() { + _element_Dialog_ProgressDots.innerHTML = ""; + if (_configuration.showProgressDots) { + const e = _groups[_groups_Current].keys.length; + for (let t = 0; t < e; t++) { + buildProgressDot(t, _groups[_groups_Current].keys[t]); + } + } + } + function buildProgressDot(e, t) { + const n = _groups[_groups_Current].json[t]; + let o = null; + if (e === _groups[_groups_Current].position) { + o = createElement("div", "dot-active"); + } else { + o = createElement("div", "dot"); + o.onclick = function() { + removeFocusClassFromLastElement(); + _groups[_groups_Current].position = e; + showDialogAndSetPosition(); + }; + } + _element_Dialog_ProgressDots.appendChild(o); + if (_configuration.showProgressDotToolTips) { + if (isDefinedString(n.tooltip)) { + addToolTip(o, n.tooltip); + } else { + addToolTip(o, n.title); + } + } + if (_configuration.showProgressDotNumbers) { + o.className += " dot-number"; + o.innerHTML = (e + 1).toString(); + } + } + function setProgressBarPosition() { + if (_configuration.showProgressBar) { + const e = _element_Dialog_ProgressBar.offsetWidth / _groups[_groups_Current].keys.length; + const t = (_groups[_groups_Current].position + 1) * e; + const n = Math.ceil((_groups[_groups_Current].position + 1) / _groups[_groups_Current].keys.length * 100); + _element_Dialog_ProgressBar_Percentage.style.width = t + "px"; + _element_Dialog_ProgressBar_Percentage_Text.innerHTML = n + "%"; + } + } + function makeDialogMovable() { + _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown; + _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp; + _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp; + document.body.addEventListener("mousemove", onMoveDocumentMouseMove); + document.body.addEventListener("mouseleave", onMoveDocumentMouseLeave); + } + function onMoveTitleBarMouseDown(e) { + if (!_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled) { + _element_Dialog.className += " journey-js-dialog-moving"; + _element_Dialog_Move_IsMoving = true; + _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft; + _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop; + _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft; + _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop; + } + } + function onMoveTitleBarMouseUp() { + if (_element_Dialog_Move_IsMoving) { + _element_Dialog_Move_IsMoving = false; + _element_Dialog_Move_Original_X = 0; + _element_Dialog_Move_Original_Y = 0; + _element_Dialog.className = "journey-js-dialog"; + } + } + function onMoveDocumentMouseMove(e) { + if (_element_Dialog_Move_IsMoving) { + _element_Dialog.style.left = e.pageX - _element_Dialog_Move_X + "px"; + _element_Dialog.style.top = e.pageY - _element_Dialog_Move_Y + "px"; + } + } + function onMoveDocumentMouseLeave() { + if (_element_Dialog_Move_IsMoving) { + _element_Dialog.style.left = _element_Dialog_Move_Original_X + "px"; + _element_Dialog.style.top = _element_Dialog_Move_Original_Y + "px"; + _element_Dialog_Move_IsMoving = false; + _element_Dialog_Move_Original_X = 0; + _element_Dialog_Move_Original_Y = 0; + _element_Dialog.className = "journey-js-dialog"; + } + } + function renderToolTip() { + if (!isDefined(_element_ToolTip)) { + _element_ToolTip = createElement("div", "journey-js-tooltip"); + _element_ToolTip.style.display = "none"; + document.body.appendChild(_element_ToolTip); + document.body.addEventListener("mousemove", (function() { + hideToolTip(); + })); + document.addEventListener("scroll", (function() { + hideToolTip(); + })); + } + } + function addToolTip(e, t) { + if (e !== null) { + e.onmousemove = function(e) { + showToolTip(e, t); + }; + } + } + function showToolTip(e, t) { + cancelBubble(e); + hideToolTip(); + _element_ToolTip_Timer = setTimeout((function() { + _element_ToolTip.innerHTML = t; + _element_ToolTip.style.display = "block"; + showElementAtMousePosition(e, _element_ToolTip); + }), _configuration.tooltipDelay); + } + function hideToolTip() { + if (isDefined(_element_ToolTip)) { + if (_element_ToolTip_Timer !== 0) { + clearTimeout(_element_ToolTip_Timer); + _element_ToolTip_Timer = 0; + } + if (_element_ToolTip.style.display === "block") { + _element_ToolTip.style.display = "none"; + } + } + } + function getElements() { + const e = _configuration.domElementTypes; + const t = e.length; + for (let n = 0; n < t; n++) { + const t = document.getElementsByTagName(e[n]); + const o = [].slice.call(t); + const i = o.length; + for (let e = 0; e < i; e++) { + if (!getElement(o[e])) { + break; + } + } + } + _groups[_groups_Current].keys.sort(); + } + function getElement(e) { + let t = true; + if (isDefined(e) && e.hasAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME)) { + const n = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); + if (isDefinedString(n)) { + const o = getObjectFromString(n); + if (o.parsed && isDefinedObject(o.object)) { + setupElement(e, buildAttributeOptions(o.object)); + } else { + if (!_configuration.safeMode) { + console.error(_configuration.attributeNotValidErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); + t = false; + } + } + } else { + if (!_configuration.safeMode) { + console.error(_configuration.attributeNotSetErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); + t = false; + } + } + } + return t; + } + function setupElement(e, t) { + t._currentView = {}; + t._currentView.element = e; + if (isDefinedNumber(t.order) && (isDefinedString(t.title) || isDefinedString(t.description))) { + e.removeAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); + if (!t.isHint) { + setupNewGroup(t.group); + _groups[t.group].json[t.order] = t; + _groups[t.group].keys.push(t.order); + fireCustomTriggerEvent(t.events.onAddStep, e); + } else { + renderHint(t); + } + } + } + function renderHint(e) { + const t = getStyleValueByName(e._currentView.element, "position"); + if (t !== "" && t.toLowerCase() === "static") { + e._currentView.element.style.position = "relative"; + } + const n = createElement("div", "journey-js-hint"); + e._currentView.element.appendChild(n); + n.onclick = function(t) { + cancelBubble(t); + _element_Dialog_CheckBox_Container.style.display = "none"; + _element_Dialog_ProgressDots.style.display = "none"; + _element_Dialog_ProgressBar.style.display = "none"; + _element_Dialog_Buttons.style.display = "none"; + _configuration_ShortcutKeysEnabled = false; + setDialogText(e); + setDialogPosition(t, e); + if (e.removeHintWhenViewed) { + clearElementsByClassName(e._currentView.element, "journey-js-hint"); + } + }; + } + function buildDocumentEvents(e = true) { + const t = e ? document.addEventListener : document.removeEventListener; + const n = e ? window.addEventListener : window.removeEventListener; + if (_configuration.shortcutKeysEnabled) { + t("keydown", onWindowKeyDown); + } + n("resize", onWindowResize); + } + function onWindowKeyDown(e) { + if (_public.isOpen() && _configuration.shortcutKeysEnabled) { + if (e.keyCode === 27) { + e.preventDefault(); + onDialogClose(); + } else { + if (_configuration_ShortcutKeysEnabled) { + if (e.keyCode === 37) { + e.preventDefault(); + onDialogBack(); + } else if (e.keyCode === 39) { + e.preventDefault(); + onDialogNext(); + } else if (e.keyCode === 38) { + e.preventDefault(); + onWindowKeyCodeUp(); + } else if (e.keyCode === 40) { + e.preventDefault(); + onWindowKeyCodeDown(); + } + } + } + } + } + function onWindowResize() { + if (_public.isOpen()) { + showDialogAndSetPosition(); + } + } + function onWindowKeyCodeUp() { + if (_groups[_groups_Current].position !== 0) { + removeFocusClassFromLastElement(); + _groups[_groups_Current].position = 0; + showDialogAndSetPosition(); + } + } + function onWindowKeyCodeDown() { + if (_groups[_groups_Current].position !== _groups[_groups_Current].keys.length - 1) { + removeFocusClassFromLastElement(); + _groups[_groups_Current].position = _groups[_groups_Current].keys.length - 1; + showDialogAndSetPosition(); + } + } function buildAttributeOptions(e) { let t = !isDefinedObject(e) ? {} : e; t.order = getDefaultNumber(t.order, 0); @@ -62,12 +528,12 @@ } function createElement(e, t = "") { const n = e.toLowerCase(); - const l = n === "text"; - let o = l ? document.createTextNode("") : document.createElement(n); + const o = n === "text"; + let i = o ? document.createTextNode("") : document.createElement(n); if (isDefined(t)) { - o.className = t; + i.className = t; } - return o; + return i; } function getOffset(e) { let t = 0; @@ -123,26 +589,28 @@ e.cancelBubble = true; } function showElementAtMousePosition(e, t) { - var n = e.pageX, l = e.pageY, o = getScrollPosition(); + let n = e.pageX; + let o = e.pageY; + const i = getScrollPosition(); t.style.display = "block"; if (n + t.offsetWidth > window.innerWidth) { n -= t.offsetWidth; } else { n++; } - if (l + t.offsetHeight > window.innerHeight) { - l -= t.offsetHeight; + if (o + t.offsetHeight > window.innerHeight) { + o -= t.offsetHeight; } else { - l++; + o++; } - if (n < o.left) { + if (n < i.left) { n = e.pageX + 1; } - if (l < o.top) { - l = e.pageY + 1; + if (o < i.top) { + o = e.pageY + 1; } t.style.left = n + "px"; - t.style.top = l + "px"; + t.style.top = o + "px"; } function showElementBasedOnCondition(e, t) { if (t) { @@ -157,19 +625,20 @@ } function buildCheckBox(e, t) { const n = createElement("div"); - const l = createElement("label", "checkbox"); - const o = createElement("input"); + const o = createElement("label", "checkbox"); + const i = createElement("input"); e.appendChild(n); - n.appendChild(l); - l.appendChild(o); - o.type = "checkbox"; - var i = createElement("span", "check-mark"), r = createElement("span", "text"); + n.appendChild(o); + o.appendChild(i); + i.type = "checkbox"; + const l = createElement("span", "check-mark"); + const r = createElement("span", "text"); r.innerHTML = t; - l.appendChild(i); - l.appendChild(r); + o.appendChild(l); + o.appendChild(r); return { - input: o, - label: l + input: i, + label: o }; } function clearElementsByClassName(e, t) { @@ -206,9 +675,9 @@ if (n.length > 1) { const e = n[1].split("&"); const o = e.length; - for (var l = 0; l < o; l++) { - const n = e[l].split("="); - t[n[0]] = n[1]; + for (let n = 0; n < o; n++) { + const o = e[n].split("="); + t[o[0]] = o[1]; } } return t; @@ -258,11 +727,11 @@ function getDefaultStringOrArray(e, t) { let n = t; if (isDefinedString(e)) { - const l = e.toString().split(" "); - if (l.length === 0) { + const o = e.toString().split(" "); + if (o.length === 0) { e = t; } else { - n = l; + n = o; } } else { n = getDefaultArray(e, t); @@ -294,5 +763,46 @@ } return result; } + const _public = { + start: function(e) { + throw new Error("Function not implemented."); + }, + show: function(e) { + throw new Error("Function not implemented."); + }, + hide: function() { + throw new Error("Function not implemented."); + }, + isOpen: function() { + throw new Error("Function not implemented."); + }, + isComplete: function() { + throw new Error("Function not implemented."); + }, + addDocumentSteps: function() { + throw new Error("Function not implemented."); + }, + addStep: function(e, t) { + throw new Error("Function not implemented."); + }, + removeStep: function(e) { + throw new Error("Function not implemented."); + }, + clearSteps: function(e) { + throw new Error("Function not implemented."); + }, + clearHints: function() { + throw new Error("Function not implemented."); + }, + reverseStepOrder: function() { + throw new Error("Function not implemented."); + }, + setConfiguration: function(e) { + throw new Error("Function not implemented."); + }, + getVersion: function() { + throw new Error("Function not implemented."); + } + }; (() => {})(); };//# sourceMappingURL=journey.js.map \ No newline at end of file diff --git a/dist/journey.js.map b/dist/journey.js.map index 35c2c0f..4b8f827 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/journey.ts"],"names":["result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events } from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n const _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n var left = e.pageX,\n top = e.pageY,\n scrollPosition = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n var checkMark = createElement( \"span\", \"check-mark\" ),\n text = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function (group: string): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n show: function (group: string): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n hide: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n isOpen: function (): boolean {\n throw new Error(\"Function not implemented.\");\n },\n \n isComplete: function (): boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n addStep: function (element: HTMLElement, options: BindingOptions): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n removeStep: function (element: HTMLElement): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n clearSteps: function (group: string): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n clearHints: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n reverseStepOrder: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function (newConfiguration: Configuration): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n throw new Error(\"Function not implemented.\");\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 9263377..aae2d80 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -14,9 +14,12 @@ import { type Configuration, type BindingOptions, - type Events } from "./ts/type"; + type Events, + CurrentView} from "./ts/type"; import { Char, KeyCode } from "./ts/enum"; +import { Constants } from "./ts/constant"; +import { PublicApi } from "./ts/api"; type StringToJson = { @@ -35,7 +38,7 @@ type StringToJson = { // Variables: Groups const _groups_Default: string = "default"; let _groups_Current: string = _groups_Default; - const _groups: object = {}; + let _groups: object = {}; // Variables: Focus Element let _element_Focus_Element_PositionStyle: string = null; @@ -49,14 +52,14 @@ type StringToJson = { let _element_Dialog_Title: HTMLElement = null; let _element_Dialog_Description: HTMLElement = null; let _element_Dialog_CheckBox_Container: HTMLElement = null; - let _element_Dialog_CheckBox_Input: HTMLElement = null; + let _element_Dialog_CheckBox_Input: HTMLInputElement = null; let _element_Dialog_ProgressDots: HTMLElement = null; let _element_Dialog_ProgressBar: HTMLElement = null; let _element_Dialog_ProgressBar_Percentage: HTMLElement = null; let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null; let _element_Dialog_Buttons: HTMLElement = null; - let _element_Dialog_Buttons_Back_Button: HTMLElement = null; - let _element_Dialog_Buttons_Next_Button: HTMLElement = null; + let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null; + let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null; let _element_Dialog_IsHint: boolean = false; // Variables: Dialog - Move @@ -71,6 +74,654 @@ type StringToJson = { let _element_ToolTip_Timer: number = 0; + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Groups + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function setupDefaultGroup( groups: any ) : void { + _groups = getDefaultObject( groups, {} ); + + _groups[ _groups_Default ] = { + json: {}, + keys: [], + position: 0 + }; + } + + function setupNewGroup( group: string ) : void { + if ( !_groups.hasOwnProperty( group ) ) { + _groups[ group ] = { + json: {}, + keys: [], + position: 0 + }; + } + } + + function getGroupBindingOptions() : BindingOptions { + return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ]; + } + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Disabled Background + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function renderDisabledBackground() : void { + _element_Disabled_Background = createElement( "div", "journey-js-disabled-background" ); + + _element_Disabled_Background.onclick = function() { + if ( _configuration.closeDialogOnDisabledBackgroundClick ) { + onDialogClose(); + } + }; + } + + function showDisabledBackground() : void { + addNode( document.body, _element_Disabled_Background ); + } + + function hideDisabledBackground() : void { + removeNode( document.body, _element_Disabled_Background ); + } + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Render: Dialog + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function renderDialog() : void { + _element_Dialog = createElement( "div", "journey-js-dialog" ); + _element_Dialog.style.display = "none"; + document.body.appendChild( _element_Dialog ); + + _element_Dialog_Close_Button = createElement( "button", "close" ); + _element_Dialog.appendChild( _element_Dialog_Close_Button ); + + _element_Dialog_Close_Button.onclick = function() { + onDialogClose(); + }; + + addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText ); + + _element_Dialog_Title = createElement( "div", "title" ); + _element_Dialog.appendChild( _element_Dialog_Title ); + + _element_Dialog_Description = createElement( "div", "description" ); + _element_Dialog.appendChild( _element_Dialog_Description ); + + _element_Dialog_CheckBox_Container = createElement( "div", "checkbox-container" ); + _element_Dialog.appendChild( _element_Dialog_CheckBox_Container ); + + _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input; + + _element_Dialog_CheckBox_Input.onchange = function() { + if ( _configuration.showDoNotShowAgain ) { + fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked ); + } + }; + + _element_Dialog_ProgressDots = createElement( "div", "progress-dots" ); + _element_Dialog.appendChild( _element_Dialog_ProgressDots ); + + _element_Dialog_ProgressBar = createElement( "div", "progress-bar" ); + _element_Dialog.appendChild( _element_Dialog_ProgressBar ); + + _element_Dialog_ProgressBar_Percentage = createElement( "div", "progress-bar-percentage" ); + _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage ); + + _element_Dialog_ProgressBar_Percentage_Text = createElement( "p", "progress-bar-percentage-text" ); + _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text ); + + _element_Dialog_Buttons = createElement( "div", "buttons" ); + _element_Dialog.appendChild( _element_Dialog_Buttons ); + + _element_Dialog_Buttons_Back_Button = createElement( "button", "back" ) as HTMLInputElement; + _element_Dialog_Buttons_Back_Button.onclick = onDialogBack; + _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button ); + + _element_Dialog_Buttons_Next_Button = createElement( "button", "next" ) as HTMLInputElement; + _element_Dialog_Buttons_Next_Button.onclick = onDialogNext; + _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button ); + + makeDialogMovable(); + } + + function onDialogClose( showConfirmationBox: boolean = true ) : void { + let confirmed: boolean = false; + + if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) { + confirmed = confirm( _configuration.closeDialogConfirmationText ); + } else { + confirmed = true; + } + + if ( confirmed ) { + const bindingOptions: BindingOptions = getGroupBindingOptions(); + + if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) { + fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element ); + } + + removeFocusClassFromLastElement( false ); + hideDisabledBackground(); + hideToolTip(); + + _element_Dialog.style.display = "none"; + } + } + + function onDialogBack() : void { + if ( _groups[ _groups_Current ].position > 0 ) { + removeFocusClassFromLastElement(); + + _groups[ _groups_Current ].position--; + + showDialogAndSetPosition(); + } + } + + function onDialogNext() : void { + if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) { + const bindingOptions: BindingOptions = getGroupBindingOptions(); + + onDialogClose( false ); + fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element ); + + } else { + removeFocusClassFromLastElement(); + + _groups[ _groups_Current ].position++; + + showDialogAndSetPosition(); + } + } + + function showDialogAndSetPosition() : void { + const bindingOptions: BindingOptions = getGroupBindingOptions(); + + if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) { + if ( bindingOptions.showDisabledBackground ) { + showDisabledBackground(); + } else { + hideDisabledBackground(); + } + + hideToolTip(); + + _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? "block": "none"; + _configuration_ShortcutKeysEnabled = true; + + bindingOptions._currentView.element.className += Char.space + "journey-js-element-focus"; + + if ( _configuration.scrollToElements ) { + bindingOptions._currentView.element.scrollIntoView(); + } + + const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, "position" ); + + if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === "static" ) { + _element_Focus_Element_PositionStyle = lastPositionStyle; + bindingOptions._currentView.element.style.position = "relative"; + } + + showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain ); + showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 ); + showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 ); + showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText ); + showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons ); + + _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText; + _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0; + + if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) { + _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText; + } else { + _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText; + } + + setDialogText( bindingOptions ); + setDialogPosition( null, bindingOptions ); + buildProcessDots(); + setProgressBarPosition(); + fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element ); + + if ( bindingOptions.sendClick ) { + bindingOptions._currentView.element.click(); + } + } + } + + function setDialogText( bindingOptions: BindingOptions ) : void { + if ( isDefinedString( bindingOptions.title ) ) { + _element_Dialog_Title.innerHTML = bindingOptions.title; + } else { + _element_Dialog_Title.innerHTML = Char.empty; + } + + if ( isDefinedString( bindingOptions.description ) ) { + _element_Dialog_Description.innerHTML = bindingOptions.description; + } else { + _element_Dialog_Description.innerHTML = Char.empty; + } + } + + function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void { + if ( _element_Dialog.style.display !== "block" ) { + _element_Dialog.style.display = "block"; + + fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element ); + } + + if ( _groups[ _groups_Current ].position === 0 ) { + fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element ); + } + + _element_Dialog_IsHint = bindingOptions.isHint === true; + + if ( bindingOptions.attach || bindingOptions.isHint ) { + if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) { + showElementAtMousePosition( e, _element_Dialog ); + + } else { + const offset: any = getOffset( bindingOptions._currentView.element ); + let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight; + let left: number = ( offset.left ); + + if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) { + left -= _element_Dialog.offsetWidth; + left += bindingOptions._currentView.element.offsetWidth; + } + + if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) { + top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight ); + } + + _element_Dialog.style.top = top + "px"; + _element_Dialog.style.left = left + "px"; + } + + } else { + const scrollPosition: any = getScrollPosition(); + const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left ); + const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top ); + + _element_Dialog.style.left = centerLeft + "px"; + _element_Dialog.style.top = centerTop + "px"; + } + } + + function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void { + const bindingOptions: BindingOptions = getGroupBindingOptions(); + + if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) { + bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + "journey-js-element-focus", Char.empty ); + + if ( isDefined( _element_Focus_Element_PositionStyle ) ) { + bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle; + } + + if ( callCustomTrigger ) { + fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element ); + } + } + } + + function buildProcessDots() : void { + _element_Dialog_ProgressDots.innerHTML = Char.empty; + + if ( _configuration.showProgressDots ) { + const keysLength: number = _groups[ _groups_Current ].keys.length; + + for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) { + buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] ); + } + } + } + + function buildProgressDot( keyIndex: number, order: number ) : void { + const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ]; + let dot: HTMLElement = null; + + if ( keyIndex === _groups[ _groups_Current ].position ) { + dot = createElement( "div", "dot-active" ); + } else { + + dot = createElement( "div", "dot" ); + + dot.onclick = function() { + removeFocusClassFromLastElement(); + + _groups[ _groups_Current ].position = keyIndex; + + showDialogAndSetPosition(); + }; + } + + _element_Dialog_ProgressDots.appendChild( dot ); + + if ( _configuration.showProgressDotToolTips ) { + if ( isDefinedString( bindingOptions.tooltip ) ) { + addToolTip( dot, bindingOptions.tooltip ); + } else { + addToolTip( dot, bindingOptions.title ); + } + } + + if ( _configuration.showProgressDotNumbers ) { + dot.className += " dot-number"; + dot.innerHTML = ( keyIndex + 1 ).toString(); + } + } + + function setProgressBarPosition() : void { + if ( _configuration.showProgressBar ) { + const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length; + const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage; + const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 ); + + _element_Dialog_ProgressBar_Percentage.style.width = width + "px"; + _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + "%"; + } + } + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Render: Dialog - Move + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function makeDialogMovable() : void { + _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown; + _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp; + _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp; + + document.body.addEventListener( "mousemove", onMoveDocumentMouseMove ); + document.body.addEventListener( "mouseleave", onMoveDocumentMouseLeave ); + } + + function onMoveTitleBarMouseDown( e: MouseEvent ) : void { + if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) { + _element_Dialog.className += " journey-js-dialog-moving"; + _element_Dialog_Move_IsMoving = true; + _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft; + _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop; + _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft; + _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop; + } + } + + function onMoveTitleBarMouseUp() : void { + if ( _element_Dialog_Move_IsMoving ) { + _element_Dialog_Move_IsMoving = false; + _element_Dialog_Move_Original_X = 0; + _element_Dialog_Move_Original_Y = 0; + _element_Dialog.className = "journey-js-dialog"; + } + } + + function onMoveDocumentMouseMove( e: MouseEvent ) : void { + if ( _element_Dialog_Move_IsMoving ) { + _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + "px"; + _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + "px"; + } + } + + function onMoveDocumentMouseLeave() : void { + if ( _element_Dialog_Move_IsMoving ) { + _element_Dialog.style.left = _element_Dialog_Move_Original_X + "px"; + _element_Dialog.style.top = _element_Dialog_Move_Original_Y + "px"; + + _element_Dialog_Move_IsMoving = false; + _element_Dialog_Move_Original_X = 0; + _element_Dialog_Move_Original_Y = 0; + _element_Dialog.className = "journey-js-dialog"; + } + } + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Render: ToolTip + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function renderToolTip() : void { + if ( !isDefined( _element_ToolTip ) ) { + _element_ToolTip = createElement( "div", "journey-js-tooltip" ); + _element_ToolTip.style.display = "none"; + + document.body.appendChild( _element_ToolTip ); + + document.body.addEventListener( "mousemove", function() { + hideToolTip(); + } ); + + document.addEventListener( "scroll", function() { + hideToolTip(); + } ); + } + } + + function addToolTip( element: HTMLElement, text: string ) : void { + if ( element !== null ) { + element.onmousemove = function( e ) { + showToolTip( e, text ); + }; + } + } + + function showToolTip( e: any, text: string ) : void { + cancelBubble( e ); + hideToolTip(); + + _element_ToolTip_Timer = setTimeout( function() { + _element_ToolTip.innerHTML = text; + _element_ToolTip.style.display = "block"; + + showElementAtMousePosition( e, _element_ToolTip ); + }, _configuration.tooltipDelay ); + } + + function hideToolTip() : void { + if ( isDefined( _element_ToolTip ) ) { + if ( _element_ToolTip_Timer !== 0 ) { + clearTimeout( _element_ToolTip_Timer ); + _element_ToolTip_Timer = 0; + } + + if ( _element_ToolTip.style.display === "block" ) { + _element_ToolTip.style.display = "none"; + } + } + } + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Rendering + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function getElements() : void { + const tagTypes: string[] = _configuration.domElementTypes as string[]; + const tagTypesLength: number = tagTypes.length; + + for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) { + const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] ); + const elements: HTMLElement[] = [].slice.call( domElements ); + const elementsLength: number = elements.length; + + for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) { + if ( !getElement( elements[ elementIndex ] ) ) { + break; + } + } + } + + _groups[ _groups_Current ].keys.sort(); + } + + function getElement( element: HTMLElement ) : boolean { + let result: boolean = true; + + if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) { + const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ); + + if ( isDefinedString( bindingOptionsData ) ) { + const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData ); + + if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) { + setupElement( element, buildAttributeOptions( bindingOptions.object ) ); + + } else { + if ( !_configuration.safeMode ) { + console.error( _configuration.attributeNotValidErrorText.replace( "{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ); + result = false; + } + } + + } else { + if ( !_configuration.safeMode ) { + console.error( _configuration.attributeNotSetErrorText.replace( "{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ); + result = false; + } + } + } + + return result; + } + + function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void { + bindingOptions._currentView = {} as CurrentView; + bindingOptions._currentView.element = element; + + if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) { + element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ); + + if ( !bindingOptions.isHint ) { + setupNewGroup( bindingOptions.group ); + + _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions; + _groups[ bindingOptions.group ].keys.push( bindingOptions.order ); + + fireCustomTriggerEvent( bindingOptions.events.onAddStep, element ); + + } else { + renderHint( bindingOptions ); + } + } + } + + function renderHint( bindingOptions: BindingOptions ) : void { + const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, "position" ); + + if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === "static" ) { + bindingOptions._currentView.element.style.position = "relative"; + } + + const hint: HTMLElement = createElement( "div", "journey-js-hint" ); + bindingOptions._currentView.element.appendChild( hint ); + + hint.onclick = function( e ) { + cancelBubble( e ); + + _element_Dialog_CheckBox_Container.style.display = "none"; + _element_Dialog_ProgressDots.style.display = "none"; + _element_Dialog_ProgressBar.style.display = "none"; + _element_Dialog_Buttons.style.display = "none"; + _configuration_ShortcutKeysEnabled = false; + + setDialogText( bindingOptions ); + setDialogPosition( e, bindingOptions ); + + if ( bindingOptions.removeHintWhenViewed ) { + clearElementsByClassName( bindingOptions._currentView.element, "journey-js-hint" ); + } + }; + } + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Document Events + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function buildDocumentEvents( addEvents: boolean = true ) : void { + const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener; + const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener; + + if ( _configuration.shortcutKeysEnabled ) { + documentFunc( "keydown", onWindowKeyDown ); + } + + windowFunc( "resize", onWindowResize ); + } + + function onWindowKeyDown( e: KeyboardEvent ) : void { + if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) { + if ( e.keyCode === KeyCode.escape ) { + e.preventDefault(); + onDialogClose(); + } else { + + if ( _configuration_ShortcutKeysEnabled ) { + if ( e.keyCode === KeyCode.left ) { + e.preventDefault(); + onDialogBack(); + + } else if ( e.keyCode === KeyCode.right ) { + e.preventDefault(); + onDialogNext(); + + } else if ( e.keyCode === KeyCode.up ) { + e.preventDefault(); + onWindowKeyCodeUp(); + + } else if ( e.keyCode === KeyCode.down ) { + e.preventDefault(); + onWindowKeyCodeDown(); + } + } + } + } + } + + function onWindowResize() : void { + if ( _public.isOpen() ) { + showDialogAndSetPosition(); + } + } + + function onWindowKeyCodeUp() : void { + if ( _groups[ _groups_Current ].position !== 0 ) { + removeFocusClassFromLastElement(); + + _groups[ _groups_Current ].position = 0; + + showDialogAndSetPosition(); + } + } + + function onWindowKeyCodeDown() : void { + if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) { + removeFocusClassFromLastElement(); + + _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1; + + showDialogAndSetPosition(); + } + } + + /* * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * Options @@ -203,9 +854,9 @@ type StringToJson = { } function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void { - var left = e.pageX, - top = e.pageY, - scrollPosition = getScrollPosition(); + let left: number = e.pageX; + let top: number = e.pageY; + const scrollPosition: any = getScrollPosition(); element.style.display = "block"; @@ -257,8 +908,8 @@ type StringToJson = { input.type = "checkbox"; - var checkMark = createElement( "span", "check-mark" ), - text = createElement( "span", "text" ); + const checkMark: HTMLElement = createElement( "span", "check-mark" ); + const text: HTMLElement = createElement( "span", "text" ); text.innerHTML = labelText; @@ -330,7 +981,7 @@ type StringToJson = { const parsedArgs: string[] = urlDataParts[ 1 ].split( "&" ); const parsedArgsLength: number = parsedArgs.length; - for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) { + for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) { const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( "=" ); urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ]; @@ -462,6 +1113,94 @@ type StringToJson = { } + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Public API Functions: + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + const _public: PublicApi = { + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Public Functions: Show/Hide + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + start: function (group: string): PublicApi { + throw new Error("Function not implemented."); + }, + + show: function (group: string): PublicApi { + throw new Error("Function not implemented."); + }, + + hide: function (): PublicApi { + throw new Error("Function not implemented."); + }, + + isOpen: function (): boolean { + throw new Error("Function not implemented."); + }, + + isComplete: function (): boolean { + throw new Error("Function not implemented."); + }, + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Public Functions: Managing Steps + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + addDocumentSteps: function (): PublicApi { + throw new Error("Function not implemented."); + }, + + addStep: function (element: HTMLElement, options: BindingOptions): PublicApi { + throw new Error("Function not implemented."); + }, + + removeStep: function (element: HTMLElement): PublicApi { + throw new Error("Function not implemented."); + }, + + clearSteps: function (group: string): PublicApi { + throw new Error("Function not implemented."); + }, + + clearHints: function (): PublicApi { + throw new Error("Function not implemented."); + }, + + reverseStepOrder: function (): PublicApi { + throw new Error("Function not implemented."); + }, + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Public Functions: Configuration + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + setConfiguration: function (newConfiguration: Configuration): PublicApi { + throw new Error("Function not implemented."); + }, + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Public Functions: Additional Data + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + getVersion: function (): string { + throw new Error("Function not implemented."); + } + }; + + /* * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * Initialize Journey.js diff --git a/src/ts/api.ts b/src/ts/api.ts new file mode 100644 index 0000000..6a0422c --- /dev/null +++ b/src/ts/api.ts @@ -0,0 +1,200 @@ +import { type Configuration, type BindingOptions } from "./type"; + + +export type PublicApi = { + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Public Functions: Show/Hide + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + /** + * start(). + * + * Starts the Journey from the beginning. + * + * @public + * @fires onStart + * + * @param {string} [group] States the group of steps you want to start the journey for (defaults to "default"). + * + * @returns {PublicApi} The Journey.js class instance. + */ + start: ( group: string ) => PublicApi; + + /** + * show(). + * + * Shows the Journey.js dialog for the element in the last known position (defaults to the start). + * + * @public + * @fires onOpen + * + * @param {string} [group] States the group of steps you want to show the dialog for (defaults to the last group used). + * + * @returns {PublicApi} The Journey.js class instance. + */ + show: ( group: string ) => PublicApi; + + /** + * hide(). + * + * Hides the Journey.js dialog. + * + * @public + * @fires onClose + * + * @returns {PublicApi} The Journey.js class instance. + */ + hide: () => PublicApi; + + /** + * isOpen(). + * + * Returns a flag that states if the dialog is opened. + * + * @public + * + * @returns {boolean} The flag that states if the dialog is open. + */ + isOpen: () => boolean; + + /** + * isComplete(). + * + * Returns a flag that states if the full journey has been completed. + * + * @public + * + * @returns {boolean} The flag that states if the full journey has been completed. + */ + isComplete: () => boolean; + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Public Functions: Managing Steps + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + /** + * addDocumentSteps(). + * + * Finds all new elements that contain the binding attribute and adds them as new steps. + * + * @public + * @fires onAddStep + * + * @returns {PublicApi} The Journey.js class instance. + */ + addDocumentSteps: () => PublicApi; + + /** + * addStep(). + * + * Adds a new step to the journey for a specific element. + * + * @public + * @fires onAddStep + * + * @param {Object} element The element that should be added to the journey. + * @param {Object} options The options to use for this step in the journey (refer to "Binding Options" documentation for properties). + * + * @returns {PublicApi} The Journey.js class instance. + */ + addStep: ( element: HTMLElement, options: BindingOptions ) => PublicApi; + + /** + * removeStep(). + * + * Removes a step from the journey, or a hint. + * + * @public + * @fires onRemoveStep + * + * @param {Object} element The element that should be removed. + * + * @returns {PublicApi} The Journey.js class instance. + */ + removeStep: ( element: HTMLElement ) => PublicApi; + + /** + * clearSteps(). + * + * Removes all the steps from the journey. + * + * @public + * @fires onRemoveStep + * + * @param {string} [group] States the group of steps you want to remove (defaults to all groups). + * + * @returns {PublicApi} The Journey.js class instance. + */ + clearSteps: ( group: string ) => PublicApi; + + /** + * clearHints(). + * + * Removes all the hints. + * + * @public + * + * @returns {PublicApi} The Journey.js class instance. + */ + clearHints: () => PublicApi; + + /** + * reverseStepOrder(). + * + * Reverses the order the steps in the journey should in. + * + * @public + * + * @returns {PublicApi} The Journey.js class instance. + */ + reverseStepOrder: () => PublicApi; + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Public Functions: Configuration + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + /** + * setConfiguration(). + * + * Sets the specific configuration options that should be used. + * + * @public + * + * @param {Object} newConfiguration All the configuration options that should be set (refer to "Configuration Options" documentation for properties). + * + * @returns {PublicApi} The Journey.js class instance. + */ + setConfiguration: ( newConfiguration: Configuration ) => PublicApi; + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Public Functions: Additional Data + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + /** + * getVersion(). + * + * Returns the version of Journey.js. + * + * @public + * + * @returns {string} The version number. + */ + getVersion: () => string; +}; + +declare global { + interface Window { + $journey: PublicApi; + } +} \ No newline at end of file diff --git a/src/ts/type.ts b/src/ts/type.ts index 40d19d9..27626e6 100644 --- a/src/ts/type.ts +++ b/src/ts/type.ts @@ -24,9 +24,11 @@ export type Configuration = { attributeNotValidErrorText?: string; attributeNotSetErrorText?: string; closeDialogConfirmationText?: string; + onDoNotShowAgainChange?: ( flag: boolean ) => void; }; export type BindingOptions = { + _currentView: CurrentView; order?: number; attach?: boolean; sendClick: boolean; @@ -43,6 +45,10 @@ export type BindingOptions = { events?: Events; }; +export type CurrentView = { + element: HTMLElement; +}; + export type Events = { onEnter?: ( element: HTMLElement ) => void; onLeave?: ( element: HTMLElement ) => void; From 5b5ef398e4ae6bb7e03b34e1ce65870713e90d79 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 14:43:18 +0100 Subject: [PATCH 18/44] Added APIs and support functions. --- dist/journey.esm.js | 344 +++++++++++++++++++++++++++------------- dist/journey.esm.js.map | 2 +- dist/journey.js | 340 ++++++++++++++++++++++++++------------- dist/journey.js.map | 2 +- src/journey.ts | 216 ++++++++++++++++++++++--- src/ts/api.ts | 6 +- 6 files changed, 667 insertions(+), 243 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index 215d215..dedcf67 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -1,10 +1,10 @@ var __getOwnPropNames = Object.getOwnPropertyNames; -var __esm = (e, t) => function n() { +var __esm = (e, t) => function o() { return e && (t = (0, e[__getOwnPropNames(e)[0]])(e = 0)), t; }; -var __commonJS = (e, t) => function n() { +var __commonJS = (e, t) => function o() { return t || (0, e[__getOwnPropNames(e)[0]])((t = { exports: {} }).exports, t), t.exports; @@ -57,7 +57,7 @@ var require_journey = __commonJS({ let _element_Dialog_Move_Y = 0; let _element_ToolTip = null; let _element_ToolTip_Timer = 0; - function setupDefaultGroup(e) { + function setupDefaultGroup(e = null) { _groups = getDefaultObject(e, {}); _groups[_groups_Default] = { json: {}, @@ -235,24 +235,24 @@ var require_journey = __commonJS({ showElementAtMousePosition(e, _element_Dialog); } else { const e = getOffset(t._currentView.element); - let n = e.top + t._currentView.element.offsetHeight; - let o = e.left; - if (o + _element_Dialog.offsetWidth > window.innerWidth || t.alignRight) { - o -= _element_Dialog.offsetWidth; - o += t._currentView.element.offsetWidth; + let o = e.top + t._currentView.element.offsetHeight; + let n = e.left; + if (n + _element_Dialog.offsetWidth > window.innerWidth || t.alignRight) { + n -= _element_Dialog.offsetWidth; + n += t._currentView.element.offsetWidth; } - if (n + _element_Dialog.offsetHeight > window.innerHeight || t.alignTop) { - n -= _element_Dialog.offsetHeight + t._currentView.element.offsetHeight; + if (o + _element_Dialog.offsetHeight > window.innerHeight || t.alignTop) { + o -= _element_Dialog.offsetHeight + t._currentView.element.offsetHeight; } - _element_Dialog.style.top = n + "px"; - _element_Dialog.style.left = o + "px"; + _element_Dialog.style.top = o + "px"; + _element_Dialog.style.left = n + "px"; } } else { const e = getScrollPosition(); const t = Math.max(0, (window.innerWidth - _element_Dialog.offsetWidth) / 2 + e.left); - const n = Math.max(0, (window.innerHeight - _element_Dialog.offsetHeight) / 2 + e.top); + const o = Math.max(0, (window.innerHeight - _element_Dialog.offsetHeight) / 2 + e.top); _element_Dialog.style.left = t + "px"; - _element_Dialog.style.top = n + "px"; + _element_Dialog.style.top = o + "px"; } } function removeFocusClassFromLastElement(e = true) { @@ -277,38 +277,38 @@ var require_journey = __commonJS({ } } function buildProgressDot(e, t) { - const n = _groups[_groups_Current].json[t]; - let o = null; + const o = _groups[_groups_Current].json[t]; + let n = null; if (e === _groups[_groups_Current].position) { - o = createElement("div", "dot-active"); + n = createElement("div", "dot-active"); } else { - o = createElement("div", "dot"); - o.onclick = function() { + n = createElement("div", "dot"); + n.onclick = function() { removeFocusClassFromLastElement(); _groups[_groups_Current].position = e; showDialogAndSetPosition(); }; } - _element_Dialog_ProgressDots.appendChild(o); + _element_Dialog_ProgressDots.appendChild(n); if (_configuration.showProgressDotToolTips) { - if (isDefinedString(n.tooltip)) { - addToolTip(o, n.tooltip); + if (isDefinedString(o.tooltip)) { + addToolTip(n, o.tooltip); } else { - addToolTip(o, n.title); + addToolTip(n, o.title); } } if (_configuration.showProgressDotNumbers) { - o.className += " dot-number"; - o.innerHTML = (e + 1).toString(); + n.className += " dot-number"; + n.innerHTML = (e + 1).toString(); } } function setProgressBarPosition() { if (_configuration.showProgressBar) { const e = _element_Dialog_ProgressBar.offsetWidth / _groups[_groups_Current].keys.length; const t = (_groups[_groups_Current].position + 1) * e; - const n = Math.ceil((_groups[_groups_Current].position + 1) / _groups[_groups_Current].keys.length * 100); + const o = Math.ceil((_groups[_groups_Current].position + 1) / _groups[_groups_Current].keys.length * 100); _element_Dialog_ProgressBar_Percentage.style.width = t + "px"; - _element_Dialog_ProgressBar_Percentage_Text.innerHTML = n + "%"; + _element_Dialog_ProgressBar_Percentage_Text.innerHTML = o + "%"; } } function makeDialogMovable() { @@ -395,12 +395,12 @@ var require_journey = __commonJS({ function getElements() { const e = _configuration.domElementTypes; const t = e.length; - for (let n = 0; n < t; n++) { - const t = document.getElementsByTagName(e[n]); - const o = [].slice.call(t); - const i = o.length; + for (let o = 0; o < t; o++) { + const t = document.getElementsByTagName(e[o]); + const n = [].slice.call(t); + const i = n.length; for (let e = 0; e < i; e++) { - if (!getElement(o[e])) { + if (!getElement(n[e])) { break; } } @@ -410,11 +410,11 @@ var require_journey = __commonJS({ function getElement(e) { let t = true; if (isDefined(e) && e.hasAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME)) { - const n = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); - if (isDefinedString(n)) { - const o = getObjectFromString(n); - if (o.parsed && isDefinedObject(o.object)) { - setupElement(e, buildAttributeOptions(o.object)); + const o = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); + if (isDefinedString(o)) { + const n = getObjectFromString(o); + if (n.parsed && isDefinedObject(n.object)) { + setupElement(e, buildAttributeOptions(n.object)); } else { if (!_configuration.safeMode) { console.error(_configuration.attributeNotValidErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); @@ -450,9 +450,9 @@ var require_journey = __commonJS({ if (t !== "" && t.toLowerCase() === "static") { e._currentView.element.style.position = "relative"; } - const n = createElement("div", "journey-js-hint"); - e._currentView.element.appendChild(n); - n.onclick = function(t) { + const o = createElement("div", "journey-js-hint"); + e._currentView.element.appendChild(o); + o.onclick = function(t) { cancelBubble(t); _element_Dialog_CheckBox_Container.style.display = "none"; _element_Dialog_ProgressDots.style.display = "none"; @@ -468,11 +468,11 @@ var require_journey = __commonJS({ } function buildDocumentEvents(e = true) { const t = e ? document.addEventListener : document.removeEventListener; - const n = e ? window.addEventListener : window.removeEventListener; + const o = e ? window.addEventListener : window.removeEventListener; if (_configuration.shortcutKeysEnabled) { t("keydown", onWindowKeyDown); } - n("resize", onWindowResize); + o("resize", onWindowResize); } function onWindowKeyDown(e) { if (_public.isOpen() && _configuration.shortcutKeysEnabled) { @@ -551,9 +551,9 @@ var require_journey = __commonJS({ return e; } function createElement(e, t = "") { - const n = e.toLowerCase(); - const o = n === "text"; - let i = o ? document.createTextNode("") : document.createElement(n); + const o = e.toLowerCase(); + const n = o === "text"; + let i = n ? document.createTextNode("") : document.createElement(o); if (isDefined(t)) { i.className = t; } @@ -561,34 +561,34 @@ var require_journey = __commonJS({ } function getOffset(e) { let t = 0; - let n = 0; + let o = 0; while (e && !isNaN(e.offsetLeft) && !isNaN(e.offsetTop)) { t += e.offsetLeft - e.scrollLeft; - n += e.offsetTop - e.scrollTop; + o += e.offsetTop - e.scrollTop; e = e.offsetParent; } return { left: t, - top: n + top: o }; } function getScrollPosition() { const e = document.documentElement; const t = (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0); - const n = (window.pageYOffset || e.scrollTop) - (e.clientTop || 0); + const o = (window.pageYOffset || e.scrollTop) - (e.clientTop || 0); return { left: t, - top: n + top: o }; } function getStyleValueByName(e, t) { - let n = null; + let o = null; if (document.defaultView.getComputedStyle) { - n = document.defaultView.getComputedStyle(e, null).getPropertyValue(t); + o = document.defaultView.getComputedStyle(e, null).getPropertyValue(t); } else if (e.currentStyle) { - n = e.currentStyle[t]; + o = e.currentStyle[t]; } - return n; + return o; } function addNode(e, t) { try { @@ -613,28 +613,28 @@ var require_journey = __commonJS({ e.cancelBubble = true; } function showElementAtMousePosition(e, t) { - let n = e.pageX; - let o = e.pageY; + let o = e.pageX; + let n = e.pageY; const i = getScrollPosition(); t.style.display = "block"; - if (n + t.offsetWidth > window.innerWidth) { - n -= t.offsetWidth; + if (o + t.offsetWidth > window.innerWidth) { + o -= t.offsetWidth; } else { - n++; + o++; } - if (o + t.offsetHeight > window.innerHeight) { - o -= t.offsetHeight; + if (n + t.offsetHeight > window.innerHeight) { + n -= t.offsetHeight; } else { - o++; + n++; } - if (n < i.left) { - n = e.pageX + 1; + if (o < i.left) { + o = e.pageX + 1; } - if (o < i.top) { - o = e.pageY + 1; + if (n < i.top) { + n = e.pageY + 1; } - t.style.left = n + "px"; - t.style.top = o + "px"; + t.style.left = o + "px"; + t.style.top = n + "px"; } function showElementBasedOnCondition(e, t) { if (t) { @@ -648,27 +648,27 @@ var require_journey = __commonJS({ } } function buildCheckBox(e, t) { - const n = createElement("div"); - const o = createElement("label", "checkbox"); + const o = createElement("div"); + const n = createElement("label", "checkbox"); const i = createElement("input"); - e.appendChild(n); - n.appendChild(o); - o.appendChild(i); + e.appendChild(o); + o.appendChild(n); + n.appendChild(i); i.type = "checkbox"; const l = createElement("span", "check-mark"); const r = createElement("span", "text"); r.innerHTML = t; - o.appendChild(l); - o.appendChild(r); + n.appendChild(l); + n.appendChild(r); return { input: i, - label: o + label: n }; } function clearElementsByClassName(e, t) { - let n = e.getElementsByClassName(t); - while (n[0]) { - n[0].parentNode.removeChild(n[0]); + let o = e.getElementsByClassName(t); + while (o[0]) { + o[0].parentNode.removeChild(o[0]); } } function fireCustomTriggerEvent(e, ...t) { @@ -680,28 +680,28 @@ var require_journey = __commonJS({ let e = false; if (_configuration.browserUrlParametersEnabled) { const t = window.location.href; - const n = getBrowserUrlArguments(t); - if (isDefined(n.sjOrderId)) { - const e = parseInt(n.sjOrderId, 10); + const o = getBrowserUrlArguments(t); + if (isDefined(o.sjOrderId)) { + const e = parseInt(o.sjOrderId, 10); if (!isNaN(e) && e <= _groups[_groups_Current].keys.length - 1) { _groups[_groups_Current].position = e; } } - if (isDefined(n.sjShow)) { - e = n.sjShow === "true"; + if (isDefined(o.sjShow)) { + e = o.sjShow === "true"; } } return e; } function getBrowserUrlArguments(e) { const t = {}; - const n = e.split("?"); - if (n.length > 1) { - const e = n[1].split("&"); - const o = e.length; - for (let n = 0; n < o; n++) { - const o = e[n].split("="); - t[o[0]] = o[1]; + const o = e.split("?"); + if (o.length > 1) { + const e = o[1].split("&"); + const n = e.length; + for (let o = 0; o < n; o++) { + const n = e[o].split("="); + t[n[0]] = n[1]; } } return t; @@ -749,18 +749,18 @@ var require_journey = __commonJS({ return isDefinedArray(e) ? e : t; } function getDefaultStringOrArray(e, t) { - let n = t; + let o = t; if (isDefinedString(e)) { - const o = e.toString().split(" "); - if (o.length === 0) { + const n = e.toString().split(" "); + if (n.length === 0) { e = t; } else { - n = o; + o = n; } } else { - n = getDefaultArray(e, t); + o = getDefaultArray(e, t); } - return n; + return o; } function getObjectFromString(objectString) { const result = { @@ -787,11 +787,52 @@ var require_journey = __commonJS({ } return result; } + function resetDialogPosition() { + if (_public.isOpen()) { + onDialogClose(false); + _groups[_groups_Current].position = 0; + } + } + function buildDefaultConfiguration(e = null) { + _configuration = getDefaultObject(e, {}); + _configuration.safeMode = getDefaultBoolean(_configuration.safeMode, true); + _configuration.domElementTypes = getDefaultStringOrArray(_configuration.domElementTypes, [ "*" ]); + _configuration.showCloseButton = getDefaultBoolean(_configuration.showCloseButton, true); + _configuration.shortcutKeysEnabled = getDefaultBoolean(_configuration.shortcutKeysEnabled, true); + _configuration.showProgressDots = getDefaultBoolean(_configuration.showProgressDots, true); + _configuration.browserUrlParametersEnabled = getDefaultBoolean(_configuration.browserUrlParametersEnabled, true); + _configuration.showProgressDotNumbers = getDefaultBoolean(_configuration.showProgressDotNumbers, false); + _configuration.showButtons = getDefaultBoolean(_configuration.showButtons, true); + _configuration.showDoNotShowAgain = getDefaultBoolean(_configuration.showDoNotShowAgain, false); + _configuration.tooltipDelay = getDefaultNumber(_configuration.tooltipDelay, 750); + _configuration.showProgressDotToolTips = getDefaultBoolean(_configuration.showProgressDotToolTips, true); + _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean(_configuration.closeDialogOnDisabledBackgroundClick, false); + _configuration.showProgressBar = getDefaultBoolean(_configuration.showProgressBar, false); + _configuration.scrollToElements = getDefaultBoolean(_configuration.scrollToElements, false); + _configuration.dialogMovingEnabled = getDefaultBoolean(_configuration.dialogMovingEnabled, false); + _configuration.showProgressBarText = getDefaultBoolean(_configuration.showProgressBarText, false); + buildDefaultConfigurationStrings(); + buildDefaultConfigurationCustomTriggers(); + } + function buildDefaultConfigurationStrings() { + _configuration.backButtonText = getDefaultAnyString(_configuration.backButtonText, "Back"); + _configuration.nextButtonText = getDefaultAnyString(_configuration.nextButtonText, "Next"); + _configuration.finishButtonText = getDefaultAnyString(_configuration.finishButtonText, "Finish"); + _configuration.closeButtonToolTipText = getDefaultAnyString(_configuration.closeButtonToolTipText, "Close"); + _configuration.doNotShowAgainText = getDefaultAnyString(_configuration.doNotShowAgainText, "Do not show again"); + _configuration.objectErrorText = getDefaultAnyString(_configuration.objectErrorText, "Errors in object: {{error_1}}, {{error_2}}"); + _configuration.attributeNotValidErrorText = getDefaultAnyString(_configuration.attributeNotValidErrorText, "The attribute '{{attribute_name}}' is not a valid object."); + _configuration.attributeNotSetErrorText = getDefaultAnyString(_configuration.attributeNotSetErrorText, "The attribute '{{attribute_name}}' has not been set correctly."); + _configuration.closeDialogConfirmationText = getDefaultAnyString(_configuration.closeDialogConfirmationText, null); + } + function buildDefaultConfigurationCustomTriggers() { + _configuration.onDoNotShowAgainChange = getDefaultFunction(_configuration.onDoNotShowAgainChange, null); + } const _public = { - start: function(e) { + start: function(e = null) { throw new Error("Function not implemented."); }, - show: function(e) { + show: function(e = null) { throw new Error("Function not implemented."); }, hide: function() { @@ -804,31 +845,116 @@ var require_journey = __commonJS({ throw new Error("Function not implemented."); }, addDocumentSteps: function() { - throw new Error("Function not implemented."); + getElements(); + return _public; }, addStep: function(e, t) { - throw new Error("Function not implemented."); + if (isDefinedObject(e) && isDefinedObject(t)) { + setupElement(e, buildAttributeOptions(t)); + _groups[_groups_Current].keys.sort(); + resetDialogPosition(); + } + return _public; }, removeStep: function(e) { - throw new Error("Function not implemented."); + if (isDefinedObject(e)) { + let t = false; + for (let o in _groups) { + if (_groups.hasOwnProperty(o)) { + for (let n in _groups[o].json) { + if (_groups[o].json.hasOwnProperty(n)) { + const i = _groups[o].json[n]; + if (i._currentView.element === e) { + fireCustomTriggerEvent(i.events.onRemoveStep, i._currentView.element); + _groups[o].keys.splice(_groups[o].keys.indexOf(i.order), 1); + delete _groups[o].json[i.order]; + _groups[o].keys.sort(); + t = true; + break; + } + } + } + } + } + if (!t) { + clearElementsByClassName(e, "journey-js-hint"); + } else { + resetDialogPosition(); + } + } + return _public; }, - clearSteps: function(e) { - throw new Error("Function not implemented."); + clearSteps: function(e = null) { + resetDialogPosition(); + for (let t in _groups) { + if (_groups.hasOwnProperty(t)) { + if (!isDefinedString(e) || e === t) { + for (let e in _groups[t].json) { + if (_groups[t].json.hasOwnProperty(e)) { + const o = _groups[t].json[e]; + fireCustomTriggerEvent(o.events.onRemoveStep, o._currentView.element); + } + } + } + } + } + if (isDefinedString(e)) { + if (_groups.hasOwnProperty(e)) { + delete _groups[e]; + } + } else { + _groups = {}; + } + if (!isDefinedString(e) || e === _groups_Default) { + setupDefaultGroup(_groups); + } + return _public; }, clearHints: function() { - throw new Error("Function not implemented."); + clearElementsByClassName(document.body, "journey-js-hint"); + return _public; }, reverseStepOrder: function() { - throw new Error("Function not implemented."); + _groups[_groups_Current].keys.reverse(); + resetDialogPosition(); + return _public; }, setConfiguration: function(e) { - throw new Error("Function not implemented."); + if (isDefinedObject(e)) { + let t = false; + for (let o in e) { + if (e.hasOwnProperty(o) && _configuration.hasOwnProperty(o) && _configuration[o] !== e[o]) { + _configuration[o] = e[o]; + t = true; + } + } + if (t) { + buildDefaultConfiguration(_configuration); + } + } + return _public; }, getVersion: function() { - throw new Error("Function not implemented."); + return "2.0.0"; } }; - (() => {})(); + (() => { + buildDefaultConfiguration(); + document.addEventListener("DOMContentLoaded", (function() { + setupDefaultGroup(); + renderDisabledBackground(); + renderDialog(); + renderToolTip(); + getElements(); + buildDocumentEvents(); + if (getBrowserUrlParameters()) { + _public.show(); + } + })); + if (!isDefined(window.$journey)) { + window.$journey = _public; + } + })(); }; } }); diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 0395e19..9cb78c6 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = 27,\n left = 37,\n up = 38,\n right = 39,\n down = 40,\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function (group: string): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n show: function (group: string): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n hide: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n isOpen: function (): boolean {\n throw new Error(\"Function not implemented.\");\n },\n \n isComplete: function (): boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n addStep: function (element: HTMLElement, options: BindingOptions): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n removeStep: function (element: HTMLElement): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n clearSteps: function (group: string): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n clearHints: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n reverseStepOrder: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function (newConfiguration: Configuration): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n throw new Error(\"Function not implemented.\");\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = 27,\n left = 37,\n up = 38,\n right = 39,\n down = 40,\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n show: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n hide: function () : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n isOpen: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n isComplete: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", function() {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} );"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index 41fcfc6..e1b8b9d 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -33,7 +33,7 @@ var Constants; let _element_Dialog_Move_Y = 0; let _element_ToolTip = null; let _element_ToolTip_Timer = 0; - function setupDefaultGroup(e) { + function setupDefaultGroup(e = null) { _groups = getDefaultObject(e, {}); _groups[_groups_Default] = { json: {}, @@ -211,24 +211,24 @@ var Constants; showElementAtMousePosition(e, _element_Dialog); } else { const e = getOffset(t._currentView.element); - let n = e.top + t._currentView.element.offsetHeight; - let o = e.left; - if (o + _element_Dialog.offsetWidth > window.innerWidth || t.alignRight) { - o -= _element_Dialog.offsetWidth; - o += t._currentView.element.offsetWidth; + let o = e.top + t._currentView.element.offsetHeight; + let n = e.left; + if (n + _element_Dialog.offsetWidth > window.innerWidth || t.alignRight) { + n -= _element_Dialog.offsetWidth; + n += t._currentView.element.offsetWidth; } - if (n + _element_Dialog.offsetHeight > window.innerHeight || t.alignTop) { - n -= _element_Dialog.offsetHeight + t._currentView.element.offsetHeight; + if (o + _element_Dialog.offsetHeight > window.innerHeight || t.alignTop) { + o -= _element_Dialog.offsetHeight + t._currentView.element.offsetHeight; } - _element_Dialog.style.top = n + "px"; - _element_Dialog.style.left = o + "px"; + _element_Dialog.style.top = o + "px"; + _element_Dialog.style.left = n + "px"; } } else { const e = getScrollPosition(); const t = Math.max(0, (window.innerWidth - _element_Dialog.offsetWidth) / 2 + e.left); - const n = Math.max(0, (window.innerHeight - _element_Dialog.offsetHeight) / 2 + e.top); + const o = Math.max(0, (window.innerHeight - _element_Dialog.offsetHeight) / 2 + e.top); _element_Dialog.style.left = t + "px"; - _element_Dialog.style.top = n + "px"; + _element_Dialog.style.top = o + "px"; } } function removeFocusClassFromLastElement(e = true) { @@ -253,38 +253,38 @@ var Constants; } } function buildProgressDot(e, t) { - const n = _groups[_groups_Current].json[t]; - let o = null; + const o = _groups[_groups_Current].json[t]; + let n = null; if (e === _groups[_groups_Current].position) { - o = createElement("div", "dot-active"); + n = createElement("div", "dot-active"); } else { - o = createElement("div", "dot"); - o.onclick = function() { + n = createElement("div", "dot"); + n.onclick = function() { removeFocusClassFromLastElement(); _groups[_groups_Current].position = e; showDialogAndSetPosition(); }; } - _element_Dialog_ProgressDots.appendChild(o); + _element_Dialog_ProgressDots.appendChild(n); if (_configuration.showProgressDotToolTips) { - if (isDefinedString(n.tooltip)) { - addToolTip(o, n.tooltip); + if (isDefinedString(o.tooltip)) { + addToolTip(n, o.tooltip); } else { - addToolTip(o, n.title); + addToolTip(n, o.title); } } if (_configuration.showProgressDotNumbers) { - o.className += " dot-number"; - o.innerHTML = (e + 1).toString(); + n.className += " dot-number"; + n.innerHTML = (e + 1).toString(); } } function setProgressBarPosition() { if (_configuration.showProgressBar) { const e = _element_Dialog_ProgressBar.offsetWidth / _groups[_groups_Current].keys.length; const t = (_groups[_groups_Current].position + 1) * e; - const n = Math.ceil((_groups[_groups_Current].position + 1) / _groups[_groups_Current].keys.length * 100); + const o = Math.ceil((_groups[_groups_Current].position + 1) / _groups[_groups_Current].keys.length * 100); _element_Dialog_ProgressBar_Percentage.style.width = t + "px"; - _element_Dialog_ProgressBar_Percentage_Text.innerHTML = n + "%"; + _element_Dialog_ProgressBar_Percentage_Text.innerHTML = o + "%"; } } function makeDialogMovable() { @@ -371,12 +371,12 @@ var Constants; function getElements() { const e = _configuration.domElementTypes; const t = e.length; - for (let n = 0; n < t; n++) { - const t = document.getElementsByTagName(e[n]); - const o = [].slice.call(t); - const i = o.length; + for (let o = 0; o < t; o++) { + const t = document.getElementsByTagName(e[o]); + const n = [].slice.call(t); + const i = n.length; for (let e = 0; e < i; e++) { - if (!getElement(o[e])) { + if (!getElement(n[e])) { break; } } @@ -386,11 +386,11 @@ var Constants; function getElement(e) { let t = true; if (isDefined(e) && e.hasAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME)) { - const n = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); - if (isDefinedString(n)) { - const o = getObjectFromString(n); - if (o.parsed && isDefinedObject(o.object)) { - setupElement(e, buildAttributeOptions(o.object)); + const o = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); + if (isDefinedString(o)) { + const n = getObjectFromString(o); + if (n.parsed && isDefinedObject(n.object)) { + setupElement(e, buildAttributeOptions(n.object)); } else { if (!_configuration.safeMode) { console.error(_configuration.attributeNotValidErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); @@ -426,9 +426,9 @@ var Constants; if (t !== "" && t.toLowerCase() === "static") { e._currentView.element.style.position = "relative"; } - const n = createElement("div", "journey-js-hint"); - e._currentView.element.appendChild(n); - n.onclick = function(t) { + const o = createElement("div", "journey-js-hint"); + e._currentView.element.appendChild(o); + o.onclick = function(t) { cancelBubble(t); _element_Dialog_CheckBox_Container.style.display = "none"; _element_Dialog_ProgressDots.style.display = "none"; @@ -444,11 +444,11 @@ var Constants; } function buildDocumentEvents(e = true) { const t = e ? document.addEventListener : document.removeEventListener; - const n = e ? window.addEventListener : window.removeEventListener; + const o = e ? window.addEventListener : window.removeEventListener; if (_configuration.shortcutKeysEnabled) { t("keydown", onWindowKeyDown); } - n("resize", onWindowResize); + o("resize", onWindowResize); } function onWindowKeyDown(e) { if (_public.isOpen() && _configuration.shortcutKeysEnabled) { @@ -527,9 +527,9 @@ var Constants; return e; } function createElement(e, t = "") { - const n = e.toLowerCase(); - const o = n === "text"; - let i = o ? document.createTextNode("") : document.createElement(n); + const o = e.toLowerCase(); + const n = o === "text"; + let i = n ? document.createTextNode("") : document.createElement(o); if (isDefined(t)) { i.className = t; } @@ -537,34 +537,34 @@ var Constants; } function getOffset(e) { let t = 0; - let n = 0; + let o = 0; while (e && !isNaN(e.offsetLeft) && !isNaN(e.offsetTop)) { t += e.offsetLeft - e.scrollLeft; - n += e.offsetTop - e.scrollTop; + o += e.offsetTop - e.scrollTop; e = e.offsetParent; } return { left: t, - top: n + top: o }; } function getScrollPosition() { const e = document.documentElement; const t = (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0); - const n = (window.pageYOffset || e.scrollTop) - (e.clientTop || 0); + const o = (window.pageYOffset || e.scrollTop) - (e.clientTop || 0); return { left: t, - top: n + top: o }; } function getStyleValueByName(e, t) { - let n = null; + let o = null; if (document.defaultView.getComputedStyle) { - n = document.defaultView.getComputedStyle(e, null).getPropertyValue(t); + o = document.defaultView.getComputedStyle(e, null).getPropertyValue(t); } else if (e.currentStyle) { - n = e.currentStyle[t]; + o = e.currentStyle[t]; } - return n; + return o; } function addNode(e, t) { try { @@ -589,28 +589,28 @@ var Constants; e.cancelBubble = true; } function showElementAtMousePosition(e, t) { - let n = e.pageX; - let o = e.pageY; + let o = e.pageX; + let n = e.pageY; const i = getScrollPosition(); t.style.display = "block"; - if (n + t.offsetWidth > window.innerWidth) { - n -= t.offsetWidth; + if (o + t.offsetWidth > window.innerWidth) { + o -= t.offsetWidth; } else { - n++; + o++; } - if (o + t.offsetHeight > window.innerHeight) { - o -= t.offsetHeight; + if (n + t.offsetHeight > window.innerHeight) { + n -= t.offsetHeight; } else { - o++; + n++; } - if (n < i.left) { - n = e.pageX + 1; + if (o < i.left) { + o = e.pageX + 1; } - if (o < i.top) { - o = e.pageY + 1; + if (n < i.top) { + n = e.pageY + 1; } - t.style.left = n + "px"; - t.style.top = o + "px"; + t.style.left = o + "px"; + t.style.top = n + "px"; } function showElementBasedOnCondition(e, t) { if (t) { @@ -624,27 +624,27 @@ var Constants; } } function buildCheckBox(e, t) { - const n = createElement("div"); - const o = createElement("label", "checkbox"); + const o = createElement("div"); + const n = createElement("label", "checkbox"); const i = createElement("input"); - e.appendChild(n); - n.appendChild(o); - o.appendChild(i); + e.appendChild(o); + o.appendChild(n); + n.appendChild(i); i.type = "checkbox"; const l = createElement("span", "check-mark"); const r = createElement("span", "text"); r.innerHTML = t; - o.appendChild(l); - o.appendChild(r); + n.appendChild(l); + n.appendChild(r); return { input: i, - label: o + label: n }; } function clearElementsByClassName(e, t) { - let n = e.getElementsByClassName(t); - while (n[0]) { - n[0].parentNode.removeChild(n[0]); + let o = e.getElementsByClassName(t); + while (o[0]) { + o[0].parentNode.removeChild(o[0]); } } function fireCustomTriggerEvent(e, ...t) { @@ -656,28 +656,28 @@ var Constants; let e = false; if (_configuration.browserUrlParametersEnabled) { const t = window.location.href; - const n = getBrowserUrlArguments(t); - if (isDefined(n.sjOrderId)) { - const e = parseInt(n.sjOrderId, 10); + const o = getBrowserUrlArguments(t); + if (isDefined(o.sjOrderId)) { + const e = parseInt(o.sjOrderId, 10); if (!isNaN(e) && e <= _groups[_groups_Current].keys.length - 1) { _groups[_groups_Current].position = e; } } - if (isDefined(n.sjShow)) { - e = n.sjShow === "true"; + if (isDefined(o.sjShow)) { + e = o.sjShow === "true"; } } return e; } function getBrowserUrlArguments(e) { const t = {}; - const n = e.split("?"); - if (n.length > 1) { - const e = n[1].split("&"); - const o = e.length; - for (let n = 0; n < o; n++) { - const o = e[n].split("="); - t[o[0]] = o[1]; + const o = e.split("?"); + if (o.length > 1) { + const e = o[1].split("&"); + const n = e.length; + for (let o = 0; o < n; o++) { + const n = e[o].split("="); + t[n[0]] = n[1]; } } return t; @@ -725,18 +725,18 @@ var Constants; return isDefinedArray(e) ? e : t; } function getDefaultStringOrArray(e, t) { - let n = t; + let o = t; if (isDefinedString(e)) { - const o = e.toString().split(" "); - if (o.length === 0) { + const n = e.toString().split(" "); + if (n.length === 0) { e = t; } else { - n = o; + o = n; } } else { - n = getDefaultArray(e, t); + o = getDefaultArray(e, t); } - return n; + return o; } function getObjectFromString(objectString) { const result = { @@ -763,11 +763,52 @@ var Constants; } return result; } + function resetDialogPosition() { + if (_public.isOpen()) { + onDialogClose(false); + _groups[_groups_Current].position = 0; + } + } + function buildDefaultConfiguration(e = null) { + _configuration = getDefaultObject(e, {}); + _configuration.safeMode = getDefaultBoolean(_configuration.safeMode, true); + _configuration.domElementTypes = getDefaultStringOrArray(_configuration.domElementTypes, [ "*" ]); + _configuration.showCloseButton = getDefaultBoolean(_configuration.showCloseButton, true); + _configuration.shortcutKeysEnabled = getDefaultBoolean(_configuration.shortcutKeysEnabled, true); + _configuration.showProgressDots = getDefaultBoolean(_configuration.showProgressDots, true); + _configuration.browserUrlParametersEnabled = getDefaultBoolean(_configuration.browserUrlParametersEnabled, true); + _configuration.showProgressDotNumbers = getDefaultBoolean(_configuration.showProgressDotNumbers, false); + _configuration.showButtons = getDefaultBoolean(_configuration.showButtons, true); + _configuration.showDoNotShowAgain = getDefaultBoolean(_configuration.showDoNotShowAgain, false); + _configuration.tooltipDelay = getDefaultNumber(_configuration.tooltipDelay, 750); + _configuration.showProgressDotToolTips = getDefaultBoolean(_configuration.showProgressDotToolTips, true); + _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean(_configuration.closeDialogOnDisabledBackgroundClick, false); + _configuration.showProgressBar = getDefaultBoolean(_configuration.showProgressBar, false); + _configuration.scrollToElements = getDefaultBoolean(_configuration.scrollToElements, false); + _configuration.dialogMovingEnabled = getDefaultBoolean(_configuration.dialogMovingEnabled, false); + _configuration.showProgressBarText = getDefaultBoolean(_configuration.showProgressBarText, false); + buildDefaultConfigurationStrings(); + buildDefaultConfigurationCustomTriggers(); + } + function buildDefaultConfigurationStrings() { + _configuration.backButtonText = getDefaultAnyString(_configuration.backButtonText, "Back"); + _configuration.nextButtonText = getDefaultAnyString(_configuration.nextButtonText, "Next"); + _configuration.finishButtonText = getDefaultAnyString(_configuration.finishButtonText, "Finish"); + _configuration.closeButtonToolTipText = getDefaultAnyString(_configuration.closeButtonToolTipText, "Close"); + _configuration.doNotShowAgainText = getDefaultAnyString(_configuration.doNotShowAgainText, "Do not show again"); + _configuration.objectErrorText = getDefaultAnyString(_configuration.objectErrorText, "Errors in object: {{error_1}}, {{error_2}}"); + _configuration.attributeNotValidErrorText = getDefaultAnyString(_configuration.attributeNotValidErrorText, "The attribute '{{attribute_name}}' is not a valid object."); + _configuration.attributeNotSetErrorText = getDefaultAnyString(_configuration.attributeNotSetErrorText, "The attribute '{{attribute_name}}' has not been set correctly."); + _configuration.closeDialogConfirmationText = getDefaultAnyString(_configuration.closeDialogConfirmationText, null); + } + function buildDefaultConfigurationCustomTriggers() { + _configuration.onDoNotShowAgainChange = getDefaultFunction(_configuration.onDoNotShowAgainChange, null); + } const _public = { - start: function(e) { + start: function(e = null) { throw new Error("Function not implemented."); }, - show: function(e) { + show: function(e = null) { throw new Error("Function not implemented."); }, hide: function() { @@ -780,29 +821,114 @@ var Constants; throw new Error("Function not implemented."); }, addDocumentSteps: function() { - throw new Error("Function not implemented."); + getElements(); + return _public; }, addStep: function(e, t) { - throw new Error("Function not implemented."); + if (isDefinedObject(e) && isDefinedObject(t)) { + setupElement(e, buildAttributeOptions(t)); + _groups[_groups_Current].keys.sort(); + resetDialogPosition(); + } + return _public; }, removeStep: function(e) { - throw new Error("Function not implemented."); + if (isDefinedObject(e)) { + let t = false; + for (let o in _groups) { + if (_groups.hasOwnProperty(o)) { + for (let n in _groups[o].json) { + if (_groups[o].json.hasOwnProperty(n)) { + const i = _groups[o].json[n]; + if (i._currentView.element === e) { + fireCustomTriggerEvent(i.events.onRemoveStep, i._currentView.element); + _groups[o].keys.splice(_groups[o].keys.indexOf(i.order), 1); + delete _groups[o].json[i.order]; + _groups[o].keys.sort(); + t = true; + break; + } + } + } + } + } + if (!t) { + clearElementsByClassName(e, "journey-js-hint"); + } else { + resetDialogPosition(); + } + } + return _public; }, - clearSteps: function(e) { - throw new Error("Function not implemented."); + clearSteps: function(e = null) { + resetDialogPosition(); + for (let t in _groups) { + if (_groups.hasOwnProperty(t)) { + if (!isDefinedString(e) || e === t) { + for (let e in _groups[t].json) { + if (_groups[t].json.hasOwnProperty(e)) { + const o = _groups[t].json[e]; + fireCustomTriggerEvent(o.events.onRemoveStep, o._currentView.element); + } + } + } + } + } + if (isDefinedString(e)) { + if (_groups.hasOwnProperty(e)) { + delete _groups[e]; + } + } else { + _groups = {}; + } + if (!isDefinedString(e) || e === _groups_Default) { + setupDefaultGroup(_groups); + } + return _public; }, clearHints: function() { - throw new Error("Function not implemented."); + clearElementsByClassName(document.body, "journey-js-hint"); + return _public; }, reverseStepOrder: function() { - throw new Error("Function not implemented."); + _groups[_groups_Current].keys.reverse(); + resetDialogPosition(); + return _public; }, setConfiguration: function(e) { - throw new Error("Function not implemented."); + if (isDefinedObject(e)) { + let t = false; + for (let o in e) { + if (e.hasOwnProperty(o) && _configuration.hasOwnProperty(o) && _configuration[o] !== e[o]) { + _configuration[o] = e[o]; + t = true; + } + } + if (t) { + buildDefaultConfiguration(_configuration); + } + } + return _public; }, getVersion: function() { - throw new Error("Function not implemented."); + return "2.0.0"; } }; - (() => {})(); + (() => { + buildDefaultConfiguration(); + document.addEventListener("DOMContentLoaded", (function() { + setupDefaultGroup(); + renderDisabledBackground(); + renderDialog(); + renderToolTip(); + getElements(); + buildDocumentEvents(); + if (getBrowserUrlParameters()) { + _public.show(); + } + })); + if (!isDefined(window.$journey)) { + window.$journey = _public; + } + })(); };//# sourceMappingURL=journey.js.map \ No newline at end of file diff --git a/dist/journey.js.map b/dist/journey.js.map index 4b8f827..2026628 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function (group: string): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n show: function (group: string): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n hide: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n isOpen: function (): boolean {\n throw new Error(\"Function not implemented.\");\n },\n \n isComplete: function (): boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n addStep: function (element: HTMLElement, options: BindingOptions): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n removeStep: function (element: HTMLElement): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n clearSteps: function (group: string): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n clearHints: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n reverseStepOrder: function (): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function (newConfiguration: Configuration): PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n throw new Error(\"Function not implemented.\");\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n } ) ();\n} );"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n show: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n hide: function () : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n isOpen: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n isComplete: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", function() {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} );"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index aae2d80..3cc7d50 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -80,7 +80,7 @@ type StringToJson = { * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ - function setupDefaultGroup( groups: any ) : void { + function setupDefaultGroup( groups: any = null ) : void { _groups = getDefaultObject( groups, {} ); _groups[ _groups_Default ] = { @@ -1113,6 +1113,67 @@ type StringToJson = { } + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Public API Functions: Helpers: Managing Steps + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function resetDialogPosition() : void { + if ( _public.isOpen() ) { + onDialogClose( false ); + + _groups[ _groups_Current ].position = 0; + } + } + + + /* + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + * Public API Functions: Helpers: Configuration + * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + */ + + function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void { + _configuration = getDefaultObject( newConfiguration, {} as Configuration ); + _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true ); + _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ "*" ] ); + _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true ); + _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true ); + _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true ); + _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true ); + _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false ); + _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true ); + _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false ); + _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 ); + _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true ); + _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false ); + _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false ); + _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false ); + _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false ); + _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false ); + + buildDefaultConfigurationStrings(); + buildDefaultConfigurationCustomTriggers(); + } + + function buildDefaultConfigurationStrings() : void { + _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, "Back" ); + _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, "Next" ); + _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, "Finish" ); + _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, "Close" ); + _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, "Do not show again" ); + _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, "Errors in object: {{error_1}}, {{error_2}}" ); + _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, "The attribute '{{attribute_name}}' is not a valid object." ); + _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, "The attribute '{{attribute_name}}' has not been set correctly." ); + _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null ); + } + + function buildDefaultConfigurationCustomTriggers() : void { + _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null ); + } + + /* * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * Public API Functions: @@ -1126,23 +1187,23 @@ type StringToJson = { * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ - start: function (group: string): PublicApi { + start: function ( group: string = null ) : PublicApi { throw new Error("Function not implemented."); }, - show: function (group: string): PublicApi { + show: function ( group: string = null ) : PublicApi { throw new Error("Function not implemented."); }, - hide: function (): PublicApi { + hide: function () : PublicApi { throw new Error("Function not implemented."); }, - isOpen: function (): boolean { + isOpen: function () : boolean { throw new Error("Function not implemented."); }, - - isComplete: function (): boolean { + + isComplete: function () : boolean { throw new Error("Function not implemented."); }, @@ -1153,28 +1214,106 @@ type StringToJson = { * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ - addDocumentSteps: function (): PublicApi { - throw new Error("Function not implemented."); + addDocumentSteps: function () : PublicApi { + getElements(); + + return _public; }, - addStep: function (element: HTMLElement, options: BindingOptions): PublicApi { - throw new Error("Function not implemented."); + addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi { + if ( isDefinedObject( element ) && isDefinedObject( options ) ) { + setupElement( element, buildAttributeOptions( options ) ); + + _groups[ _groups_Current ].keys.sort(); + + resetDialogPosition(); + } + + return _public; }, - removeStep: function (element: HTMLElement): PublicApi { - throw new Error("Function not implemented."); + removeStep: function ( element: HTMLElement ) : PublicApi { + if ( isDefinedObject( element ) ) { + let removed: boolean = false; + + for ( let group in _groups ) { + if ( _groups.hasOwnProperty( group ) ) { + for ( let order in _groups[ group ].json ) { + if ( _groups[ group ].json.hasOwnProperty( order ) ) { + const bindingOptions: BindingOptions = _groups[ group ].json[ order ]; + + if ( bindingOptions._currentView.element === element ) { + fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element ); + + _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 ); + + delete _groups[ group ].json[ bindingOptions.order ]; + + _groups[ group ].keys.sort(); + + removed = true; + break; + } + } + } + } + } + + if ( !removed ) { + clearElementsByClassName( element, "journey-js-hint" ); + } else { + resetDialogPosition(); + } + } + + return _public; }, - clearSteps: function (group: string): PublicApi { - throw new Error("Function not implemented."); + clearSteps: function ( group: string = null ) : PublicApi { + resetDialogPosition(); + + for ( let groupName in _groups ) { + if ( _groups.hasOwnProperty( groupName ) ) { + if ( !isDefinedString( group ) || group === groupName ) { + for ( let order in _groups[ groupName ].json ) { + if ( _groups[ groupName ].json.hasOwnProperty( order ) ) { + const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ]; + + fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element ); + } + } + } + } + } + + if ( isDefinedString( group ) ) { + if ( _groups.hasOwnProperty( group ) ) { + delete _groups[ group ]; + } + + } else { + _groups = {}; + } + + if ( !isDefinedString( group ) || group === _groups_Default ) { + setupDefaultGroup( _groups ); + } + + return _public; }, - clearHints: function (): PublicApi { - throw new Error("Function not implemented."); + clearHints: function () : PublicApi { + clearElementsByClassName( document.body, "journey-js-hint" ); + + return _public; }, - reverseStepOrder: function (): PublicApi { - throw new Error("Function not implemented."); + reverseStepOrder: function () : PublicApi { + _groups[ _groups_Current ].keys.reverse(); + + resetDialogPosition(); + + return _public; }, @@ -1184,8 +1323,23 @@ type StringToJson = { * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ - setConfiguration: function (newConfiguration: Configuration): PublicApi { - throw new Error("Function not implemented."); + setConfiguration: function ( newConfiguration: Configuration ) : PublicApi { + if ( isDefinedObject( newConfiguration ) ) { + let configurationHasChanged: boolean = false; + + for ( let propertyName in newConfiguration ) { + if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) { + _configuration[ propertyName ] = newConfiguration[ propertyName ]; + configurationHasChanged = true; + } + } + + if ( configurationHasChanged ) { + buildDefaultConfiguration( _configuration ); + } + } + + return _public; }, @@ -1196,7 +1350,7 @@ type StringToJson = { */ getVersion: function (): string { - throw new Error("Function not implemented."); + return "2.0.0"; } }; @@ -1208,5 +1362,23 @@ type StringToJson = { */ ( () => { + buildDefaultConfiguration(); + + document.addEventListener( "DOMContentLoaded", function() { + setupDefaultGroup(); + renderDisabledBackground(); + renderDialog(); + renderToolTip(); + getElements(); + buildDocumentEvents(); + + if ( getBrowserUrlParameters() ) { + _public.show(); + } + } ); + + if ( !isDefined( window.$journey ) ) { + window.$journey = _public; + } } ) (); } ); \ No newline at end of file diff --git a/src/ts/api.ts b/src/ts/api.ts index 6a0422c..bccf49f 100644 --- a/src/ts/api.ts +++ b/src/ts/api.ts @@ -20,7 +20,7 @@ export type PublicApi = { * * @returns {PublicApi} The Journey.js class instance. */ - start: ( group: string ) => PublicApi; + start: ( group?: string ) => PublicApi; /** * show(). @@ -34,7 +34,7 @@ export type PublicApi = { * * @returns {PublicApi} The Journey.js class instance. */ - show: ( group: string ) => PublicApi; + show: ( group?: string ) => PublicApi; /** * hide(). @@ -130,7 +130,7 @@ export type PublicApi = { * * @returns {PublicApi} The Journey.js class instance. */ - clearSteps: ( group: string ) => PublicApi; + clearSteps: ( group?: string ) => PublicApi; /** * clearHints(). From 1cddddb702ec6f67c15e97a620a5c783df3b7583 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 14:53:04 +0100 Subject: [PATCH 19/44] Fix missing initializer. --- dist/journey.esm.js | 4 ++-- dist/journey.esm.js.map | 2 +- dist/journey.js | 4 ++-- dist/journey.js.map | 2 +- src/journey.ts | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index dedcf67..49da1c7 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -28,7 +28,7 @@ var require_journey = __commonJS({ "src/journey.ts"(exports, module) { init_enum(); init_constant(); - () => { + (() => { let _configuration = {}; let _configuration_ShortcutKeysEnabled = true; const _groups_Default = "default"; @@ -955,7 +955,7 @@ var require_journey = __commonJS({ window.$journey = _public; } })(); - }; + })(); } }); diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 9cb78c6..d2bc762 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = 27,\n left = 37,\n up = 38,\n right = 39,\n down = 40,\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n show: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n hide: function () : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n isOpen: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n isComplete: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", function() {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} );"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = 27,\n left = 37,\n up = 38,\n right = 39,\n down = 40,\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n show: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n hide: function () : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n isOpen: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n isComplete: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", function() {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index e1b8b9d..662f81a 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -4,7 +4,7 @@ var Constants; e.JOURNEY_JS_ATTRIBUTE_NAME = "data-journey-js"; })(Constants || (Constants = {})); -() => { +(() => { let _configuration = {}; let _configuration_ShortcutKeysEnabled = true; const _groups_Default = "default"; @@ -931,4 +931,4 @@ var Constants; window.$journey = _public; } })(); -};//# sourceMappingURL=journey.js.map \ No newline at end of file +})();//# sourceMappingURL=journey.js.map \ No newline at end of file diff --git a/dist/journey.js.map b/dist/journey.js.map index 2026628..dc32d0d 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":";AAaO,IAAU;AAAA,CAAV,CAAUA,eAAV;AACI,EAAMA,WAAA,4BAA4B;AAAA,GAD5B;;;ACiBf,MAAM;AAEJ,MAAI,iBAAgC,CAAC;AAGrC,MAAI,qCAA8C;AAGlD,QAAM,kBAA0B;AAChC,MAAI,kBAA0B;AAC9B,MAAI,UAAkB,CAAC;AAGvB,MAAI,uCAA+C;AAGnD,MAAI,+BAA4C;AAGhD,MAAI,kBAA+B;AACnC,MAAI,+BAA4C;AAChD,MAAI,wBAAqC;AACzC,MAAI,8BAA2C;AAC/C,MAAI,qCAAkD;AACtD,MAAI,iCAAmD;AACvD,MAAI,+BAA4C;AAChD,MAAI,8BAA2C;AAC/C,MAAI,yCAAsD;AAC1D,MAAI,8CAA2D;AAC/D,MAAI,0BAAuC;AAC3C,MAAI,sCAAwD;AAC5D,MAAI,sCAAwD;AAC5D,MAAI,yBAAkC;AAGtC,MAAI,kCAA0C;AAC9C,MAAI,kCAA0C;AAC9C,MAAI,gCAAyC;AAC7C,MAAI,yBAAiC;AACrC,MAAI,yBAAiC;AAGrC,MAAI,mBAAmB;AACvB,MAAI,yBAAiC;AASrC,WAAS,kBAAmB,SAAc,MAAc;AACpD,cAAU,iBAAkB,QAAQ,CAAC,CAAE;AAEvC,YAAS,eAAgB,IAAI;AAAA,MACzB,MAAM,CAAC;AAAA,MACP,MAAM,CAAC;AAAA,MACP,UAAU;AAAA,IACd;AAAA,EACJ;AAEA,WAAS,cAAe,OAAuB;AAC3C,QAAK,CAAC,QAAQ,eAAgB,KAAM,GAAI;AACpC,cAAS,KAAM,IAAI;AAAA,QACf,MAAM,CAAC;AAAA,QACP,MAAM,CAAC;AAAA,QACP,UAAU;AAAA,MACd;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAA0C;AAC/C,WAAO,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,QAAS,CAAE;AAAA,EACnH;AASA,WAAS,2BAAkC;AACvC,mCAA+B,cAAe,OAAO,gCAAiC;AAEtF,iCAA6B,UAAU,WAAW;AAC9C,UAAK,eAAe,sCAAuC;AACvD,sBAAc;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAAgC;AACrC,YAAS,SAAS,MAAM,4BAA6B;AAAA,EACzD;AAEA,WAAS,yBAAgC;AACrC,eAAY,SAAS,MAAM,4BAA6B;AAAA,EAC5D;AASA,WAAS,eAAsB;AAC3B,sBAAkB,cAAe,OAAO,mBAAoB;AAC5D,oBAAgB,MAAM,UAAU;AAChC,aAAS,KAAK,YAAa,eAAgB;AAE3C,mCAA+B,cAAe,UAAU,OAAQ;AAChE,oBAAgB,YAAa,4BAA6B;AAE1D,iCAA6B,UAAU,WAAW;AAC9C,oBAAc;AAAA,IAClB;AAEA,eAAY,8BAA8B,eAAe,sBAAuB;AAEhF,4BAAwB,cAAe,OAAO,OAAQ;AACtD,oBAAgB,YAAa,qBAAsB;AAEnD,kCAA8B,cAAe,OAAO,aAAc;AAClE,oBAAgB,YAAa,2BAA4B;AAEzD,yCAAqC,cAAe,OAAO,oBAAqB;AAChF,oBAAgB,YAAa,kCAAmC;AAEhE,qCAAiC,cAAe,oCAAoC,eAAe,kBAAmB,EAAE;AAExH,mCAA+B,WAAW,WAAW;AACjD,UAAK,eAAe,oBAAqB;AACrC,+BAAwB,eAAe,wBAAwB,+BAA+B,OAAQ;AAAA,MAC1G;AAAA,IACJ;AAEA,mCAA+B,cAAe,OAAO,eAAgB;AACrE,oBAAgB,YAAa,4BAA6B;AAE1D,kCAA8B,cAAe,OAAO,cAAe;AACnE,oBAAgB,YAAa,2BAA4B;AAEzD,6CAAyC,cAAe,OAAO,yBAA0B;AACzF,gCAA4B,YAAa,sCAAuC;AAEhF,kDAA8C,cAAe,KAAK,8BAA+B;AACjG,2CAAuC,YAAa,2CAA4C;AAEhG,8BAA0B,cAAe,OAAO,SAAU;AAC1D,oBAAgB,YAAa,uBAAwB;AAErD,0CAAsC,cAAe,UAAU,MAAO;AACtE,wCAAoC,UAAU;AAC9C,4BAAwB,YAAa,mCAAoC;AAEzE,0CAAsC,cAAe,UAAU,MAAO;AACtE,wCAAoC,UAAU;AAC9C,4BAAwB,YAAa,mCAAoC;AAEzE,sBAAkB;AAAA,EACtB;AAEA,WAAS,cAAe,sBAA+B,MAAc;AACjE,QAAI,YAAqB;AAEzB,QAAK,gBAAiB,eAAe,2BAA4B,KAAK,qBAAsB;AACxF,kBAAY,QAAS,eAAe,2BAA4B;AAAA,IACpE,OAAO;AACH,kBAAY;AAAA,IAChB;AAEA,QAAK,WAAY;AACb,YAAM,iBAAiC,uBAAuB;AAE9D,UAAK,UAAW,cAAe,KAAK,UAAW,eAAe,aAAa,OAAQ,GAAI;AACnF,+BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,MAC/F;AAEA,sCAAiC,KAAM;AACvC,6BAAuB;AACvB,kBAAY;AAEZ,sBAAgB,MAAM,UAAU;AAAA,IACpC;AAAA,EACJ;AAEA,WAAS,eAAsB;AAC3B,QAAK,QAAS,eAAgB,EAAE,WAAW,GAAI;AAC3C,sCAAgC;AAEhC,cAAS,eAAgB,EAAE;AAE3B,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,eAAsB;AAC3B,QAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,YAAM,iBAAiC,uBAAuB;AAE9D,oBAAe,KAAM;AACrB,6BAAwB,eAAe,OAAO,UAAU,eAAe,aAAa,OAAQ;AAAA,IAEhG,OAAO;AACH,sCAAgC;AAEhC,cAAS,eAAgB,EAAE;AAE3B,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,2BAAkC;AACvC,UAAM,iBAAiC,uBAAuB;AAE9D,QAAK,UAAW,cAAe,KAAK,UAAW,eAAe,aAAa,OAAQ,GAAI;AACnF,UAAK,eAAe,wBAAyB;AACzC,+BAAuB;AAAA,MAC3B,OAAO;AACH,+BAAuB;AAAA,MAC3B;AAEA,kBAAY;AAEZ,mCAA6B,MAAM,UAAU,eAAe,kBAAkB,UAAS;AACvF,2CAAqC;AAErC,qBAAe,aAAa,QAAQ,+BAA0B;AAE9D,UAAK,eAAe,kBAAmB;AACnC,uBAAe,aAAa,QAAQ,eAAe;AAAA,MACvD;AAEA,YAAM,oBAA4B,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAEvG,UAAK,wCAAoC,kBAAkB,YAAY,MAAM,UAAW;AACpF,+CAAuC;AACvC,uBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,MACzD;AAEA,kCAA6B,oCAAoC,eAAe,kBAAmB;AACnG,kCAA6B,8BAA8B,eAAe,oBAAoB,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AACzI,kCAA6B,6BAA6B,eAAe,mBAAmB,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AACvI,kCAA6B,6CAA6C,eAAe,mBAAoB;AAC7G,kCAA6B,yBAAyB,eAAe,WAAY;AAEjF,0CAAoC,YAAY,eAAe;AAC/D,0CAAoC,WAAW,QAAS,eAAgB,EAAE,aAAa;AAEvF,UAAK,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACrF,4CAAoC,YAAY,eAAe;AAAA,MACnE,OAAO;AACH,4CAAoC,YAAY,eAAe;AAAA,MACnE;AAEA,oBAAe,cAAe;AAC9B,wBAAmB,MAAM,cAAe;AACxC,uBAAiB;AACjB,6BAAuB;AACvB,6BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAE3F,UAAK,eAAe,WAAY;AAC5B,uBAAe,aAAa,QAAQ,MAAM;AAAA,MAC9C;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,cAAe,gBAAwC;AAC5D,QAAK,gBAAiB,eAAe,KAAM,GAAI;AAC3C,4BAAsB,YAAY,eAAe;AAAA,IACrD,OAAO;AACH,4BAAsB;AAAA,IAC1B;AAEA,QAAK,gBAAiB,eAAe,WAAY,GAAI;AACjD,kCAA4B,YAAY,eAAe;AAAA,IAC3D,OAAO;AACH,kCAA4B;AAAA,IAChC;AAAA,EACJ;AAEA,WAAS,kBAAmB,GAAQ,gBAAwC;AACxE,QAAK,gBAAgB,MAAM,YAAY,SAAU;AAC7C,sBAAgB,MAAM,UAAU;AAEhC,6BAAwB,eAAe,OAAO,QAAQ,eAAe,aAAa,OAAQ;AAAA,IAC9F;AAEA,QAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,6BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,IAC/F;AAEA,6BAAyB,eAAe,WAAW;AAEnD,QAAK,eAAe,UAAU,eAAe,QAAS;AAClD,UAAK,eAAe,UAAU,eAAe,0BAA2B;AACpE,mCAA4B,GAAG,eAAgB;AAAA,MAEnD,OAAO;AACH,cAAM,SAAc,UAAW,eAAe,aAAa,OAAQ;AACnE,YAAI,MAAgB,OAAO,MAAQ,eAAe,aAAa,QAAQ;AACvE,YAAI,OAAiB,OAAO;AAE5B,YAAK,OAAO,gBAAgB,cAAc,OAAO,cAAc,eAAe,YAAa;AACvF,kBAAS,gBAAgB;AACzB,kBAAQ,eAAe,aAAa,QAAQ;AAAA,QAChD;AAEA,YAAK,MAAM,gBAAgB,eAAe,OAAO,eAAe,eAAe,UAAW;AACtF,iBAAS,gBAAgB,eAAe,eAAe,aAAa,QAAQ;AAAA,QAChF;AAEA,wBAAgB,MAAM,MAAM,MAAM;AAClC,wBAAgB,MAAM,OAAO,OAAO;AAAA,MACxC;AAAA,IAEJ,OAAO;AACH,YAAM,iBAAsB,kBAAkB;AAC9C,YAAM,aAAqB,KAAK,IAAK,IAAO,OAAO,aAAa,gBAAgB,eAAgB,IAAM,eAAe,IAAK;AAC1H,YAAM,YAAoB,KAAK,IAAK,IAAO,OAAO,cAAc,gBAAgB,gBAAiB,IAAM,eAAe,GAAI;AAE1H,sBAAgB,MAAM,OAAO,aAAa;AAC1C,sBAAgB,MAAM,MAAM,YAAY;AAAA,IAC5C;AAAA,EACJ;AAEA,WAAS,gCAAiC,oBAA6B,MAAc;AACjF,UAAM,iBAAiC,uBAAuB;AAE9D,QAAK,UAAW,cAAe,KAAK,UAAW,eAAe,aAAa,OAAQ,GAAI;AACnF,qBAAe,aAAa,QAAQ,YAAY,eAAe,aAAa,QAAQ,UAAU,0BAAsB,0CAAuC;AAE3J,UAAK,UAAW,oCAAqC,GAAI;AACrD,uBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,MACzD;AAEA,UAAK,mBAAoB;AACrB,+BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,MAC/F;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,mBAA0B;AAC/B,iCAA6B;AAE7B,QAAK,eAAe,kBAAmB;AACnC,YAAM,aAAqB,QAAS,eAAgB,EAAE,KAAK;AAE3D,eAAU,WAAmB,GAAG,WAAW,YAAY,YAAa;AAChE,yBAAkB,UAAU,QAAS,eAAgB,EAAE,KAAM,QAAS,CAAE;AAAA,MAC5E;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,iBAAkB,UAAkB,OAAuB;AAChE,UAAM,iBAAiC,QAAS,eAAgB,EAAE,KAAM,KAAM;AAC9E,QAAI,MAAmB;AAEvB,QAAK,aAAa,QAAS,eAAgB,EAAE,UAAW;AACpD,YAAM,cAAe,OAAO,YAAa;AAAA,IAC7C,OAAO;AAEH,YAAM,cAAe,OAAO,KAAM;AAElC,UAAI,UAAU,WAAW;AACrB,wCAAgC;AAEhC,gBAAS,eAAgB,EAAE,WAAW;AAEtC,iCAAyB;AAAA,MAC7B;AAAA,IACJ;AAEA,iCAA6B,YAAa,GAAI;AAE9C,QAAK,eAAe,yBAA0B;AAC1C,UAAK,gBAAiB,eAAe,OAAQ,GAAI;AAC7C,mBAAY,KAAK,eAAe,OAAQ;AAAA,MAC5C,OAAO;AACH,mBAAY,KAAK,eAAe,KAAM;AAAA,MAC1C;AAAA,IACJ;AAEA,QAAK,eAAe,wBAAyB;AACzC,UAAI,aAAa;AACjB,UAAI,aAAc,WAAW,GAAI,SAAS;AAAA,IAC9C;AAAA,EACJ;AAEA,WAAS,yBAAgC;AACrC,QAAK,eAAe,iBAAkB;AAClC,YAAM,iBAAyB,4BAA4B,cAAc,QAAS,eAAgB,EAAE,KAAK;AACzG,YAAM,SAAkB,QAAS,eAAgB,EAAE,WAAW,KAAM;AACpE,YAAM,qBAA6B,KAAK,MAAU,QAAS,eAAgB,EAAE,WAAW,KAAM,QAAS,eAAgB,EAAE,KAAK,SAAW,GAAI;AAE7I,6CAAuC,MAAM,QAAQ,QAAQ;AAC7D,kDAA4C,YAAY,qBAAqB;AAAA,IACjF;AAAA,EACJ;AASA,WAAS,oBAA2B;AAChC,0BAAsB,cAAc;AACpC,0BAAsB,YAAY;AAClC,0BAAsB,gBAAgB;AAEtC,aAAS,KAAK,iBAAkB,aAAa,uBAAwB;AACrE,aAAS,KAAK,iBAAkB,cAAc,wBAAyB;AAAA,EAC3E;AAEA,WAAS,wBAAyB,GAAuB;AACrD,QAAK,CAAC,iCAAiC,CAAC,0BAA0B,eAAe,qBAAsB;AACnG,sBAAgB,aAAa;AAC7B,sCAAgC;AAChC,+BAAyB,EAAE,QAAQ,gBAAgB;AACnD,+BAAyB,EAAE,QAAQ,gBAAgB;AACnD,wCAAkC,gBAAgB;AAClD,wCAAkC,gBAAgB;AAAA,IACtD;AAAA,EACJ;AAEA,WAAS,wBAA+B;AACpC,QAAK,+BAAgC;AACjC,sCAAgC;AAChC,wCAAkC;AAClC,wCAAkC;AAClC,sBAAgB,YAAY;AAAA,IAChC;AAAA,EACJ;AAEA,WAAS,wBAAyB,GAAuB;AACrD,QAAK,+BAAgC;AACjC,sBAAgB,MAAM,OAAS,EAAE,QAAQ,yBAA2B;AACpE,sBAAgB,MAAM,MAAQ,EAAE,QAAQ,yBAA2B;AAAA,IACvE;AAAA,EACJ;AAEA,WAAS,2BAAkC;AACvC,QAAK,+BAAgC;AACjC,sBAAgB,MAAM,OAAO,kCAAkC;AAC/D,sBAAgB,MAAM,MAAM,kCAAkC;AAE9D,sCAAgC;AAChC,wCAAkC;AAClC,wCAAkC;AAClC,sBAAgB,YAAY;AAAA,IAChC;AAAA,EACJ;AASA,WAAS,gBAAuB;AAC5B,QAAK,CAAC,UAAW,gBAAiB,GAAI;AAClC,yBAAmB,cAAe,OAAO,oBAAqB;AAC9D,uBAAiB,MAAM,UAAU;AAEjC,eAAS,KAAK,YAAa,gBAAiB;AAE5C,eAAS,KAAK,iBAAkB,aAAa,WAAW;AACpD,oBAAY;AAAA,MAChB,CAAE;AAEF,eAAS,iBAAkB,UAAU,WAAW;AAC5C,oBAAY;AAAA,MAChB,CAAE;AAAA,IACN;AAAA,EACJ;AAEA,WAAS,WAAY,SAAsB,MAAsB;AAC7D,QAAK,YAAY,MAAO;AACpB,cAAQ,cAAc,SAAU,GAAI;AAChC,oBAAa,GAAG,IAAK;AAAA,MACzB;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,YAAa,GAAQ,MAAsB;AAChD,iBAAc,CAAE;AAChB,gBAAY;AAEZ,6BAAyB,WAAY,WAAW;AAC5C,uBAAiB,YAAY;AAC7B,uBAAiB,MAAM,UAAU;AAEjC,iCAA4B,GAAG,gBAAiB;AAAA,IACpD,GAAG,eAAe,YAAa;AAAA,EACnC;AAEA,WAAS,cAAqB;AAC1B,QAAK,UAAW,gBAAiB,GAAI;AACjC,UAAK,2BAA2B,GAAI;AAChC,qBAAc,sBAAuB;AACrC,iCAAyB;AAAA,MAC7B;AAEA,UAAK,iBAAiB,MAAM,YAAY,SAAU;AAC9C,yBAAiB,MAAM,UAAU;AAAA,MACrC;AAAA,IACJ;AAAA,EACJ;AASA,WAAS,cAAqB;AAC1B,UAAM,WAAqB,eAAe;AAC1C,UAAM,iBAAyB,SAAS;AAExC,aAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,YAAM,cAAyC,SAAS,qBAAsB,SAAU,YAAa,CAAE;AACvG,YAAM,WAA0B,CAAC,EAAE,MAAM,KAAM,WAAY;AAC3D,YAAM,iBAAyB,SAAS;AAExC,eAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,YAAK,CAAC,WAAY,SAAU,YAAa,CAAE,GAAI;AAC3C;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,YAAS,eAAgB,EAAE,KAAK,KAAK;AAAA,EACzC;AAEA,WAAS,WAAY,SAAiC;AAClD,QAAIC,UAAkB;AAEtB,QAAK,UAAW,OAAQ,KAAK,QAAQ,aAAc,UAAU,yBAA0B,GAAI;AACvF,YAAM,qBAA6B,QAAQ,aAAc,UAAU,yBAA0B;AAE7F,UAAK,gBAAiB,kBAAmB,GAAI;AACzC,cAAM,iBAA+B,oBAAqB,kBAAmB;AAE7E,YAAK,eAAe,UAAU,gBAAiB,eAAe,MAAO,GAAI;AACrE,uBAAc,SAAS,sBAAuB,eAAe,MAAO,CAAE;AAAA,QAE1E,OAAO;AACH,cAAK,CAAC,eAAe,UAAW;AAC5B,oBAAQ,MAAO,eAAe,2BAA2B,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC9H,YAAAA,UAAS;AAAA,UACb;AAAA,QACJ;AAAA,MAEJ,OAAO;AACH,YAAK,CAAC,eAAe,UAAW;AAC5B,kBAAQ,MAAO,eAAe,yBAAyB,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC5H,UAAAA,UAAS;AAAA,QACb;AAAA,MACJ;AAAA,IACJ;AAEA,WAAOA;AAAA,EACX;AAEA,WAAS,aAAc,SAAsB,gBAAwC;AACjF,mBAAe,eAAe,CAAC;AAC/B,mBAAe,aAAa,UAAU;AAEtC,QAAK,gBAAiB,eAAe,KAAM,MAAO,gBAAiB,eAAe,KAAM,KAAK,gBAAiB,eAAe,WAAY,IAAM;AAC3I,cAAQ,gBAAiB,UAAU,yBAA0B;AAE7D,UAAK,CAAC,eAAe,QAAS;AAC1B,sBAAe,eAAe,KAAM;AAEpC,gBAAS,eAAe,KAAM,EAAE,KAAM,eAAe,KAAM,IAAI;AAC/D,gBAAS,eAAe,KAAM,EAAE,KAAK,KAAM,eAAe,KAAM;AAEhE,+BAAwB,eAAe,OAAO,WAAW,OAAQ;AAAA,MAErE,OAAO;AACH,mBAAY,cAAe;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,WAAY,gBAAwC;AACzD,UAAM,gBAAwB,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAEnG,QAAK,oCAAgC,cAAc,YAAY,MAAM,UAAW;AAC5E,qBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,IACzD;AAEA,UAAM,OAAoB,cAAe,OAAO,iBAAkB;AAClE,mBAAe,aAAa,QAAQ,YAAa,IAAK;AAEtD,SAAK,UAAU,SAAU,GAAI;AACzB,mBAAc,CAAE;AAEhB,yCAAmC,MAAM,UAAU;AACnD,mCAA6B,MAAM,UAAU;AAC7C,kCAA4B,MAAM,UAAU;AAC5C,8BAAwB,MAAM,UAAU;AACxC,2CAAqC;AAErC,oBAAe,cAAe;AAC9B,wBAAmB,GAAG,cAAe;AAErC,UAAK,eAAe,sBAAuB;AACvC,iCAA0B,eAAe,aAAa,SAAS,iBAAkB;AAAA,MACrF;AAAA,IACJ;AAAA,EACJ;AASA,WAAS,oBAAqB,YAAqB,MAAc;AAC7D,UAAM,eAAyB,YAAY,SAAS,mBAAmB,SAAS;AAChF,UAAM,aAAuB,YAAY,OAAO,mBAAmB,OAAO;AAE1E,QAAK,eAAe,qBAAsB;AACtC,mBAAc,WAAW,eAAgB;AAAA,IAC7C;AAEA,eAAY,UAAU,cAAe;AAAA,EACzC;AAEA,WAAS,gBAAiB,GAA0B;AAChD,QAAK,QAAQ,OAAO,KAAK,eAAe,qBAAsB;AAC1D,UAAK,EAAE,6BAA6B;AAChC,UAAE,eAAe;AACjB,sBAAc;AAAA,MAClB,OAAO;AAEH,YAAK,oCAAqC;AACtC,cAAK,EAAE,2BAA2B;AAC9B,cAAE,eAAe;AACjB,yBAAa;AAAA,UAEjB,WAAY,EAAE,4BAA4B;AACtC,cAAE,eAAe;AACjB,yBAAa;AAAA,UAEjB,WAAY,EAAE,yBAAyB;AACnC,cAAE,eAAe;AACjB,8BAAkB;AAAA,UAEtB,WAAY,EAAE,2BAA2B;AACrC,cAAE,eAAe;AACjB,gCAAoB;AAAA,UACxB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,iBAAwB;AAC7B,QAAK,QAAQ,OAAO,GAAI;AACpB,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,oBAA2B;AAChC,QAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,sCAAgC;AAEhC,cAAS,eAAgB,EAAE,WAAW;AAEtC,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,sBAA6B;AAClC,QAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,sCAAgC;AAEhC,cAAS,eAAgB,EAAE,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS;AAE/E,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AASA,WAAS,sBAAuB,YAAkB;AAC9C,QAAI,UAA0B,CAAC,gBAAiB,UAAW,IAAI,CAAC,IAAsB;AACtF,YAAQ,QAAQ,iBAAkB,QAAQ,OAAO,CAAE;AACnD,YAAQ,SAAS,kBAAmB,QAAQ,QAAQ,IAAK;AACzD,YAAQ,YAAY,kBAAmB,QAAQ,WAAW,KAAM;AAChE,YAAQ,WAAW,kBAAmB,QAAQ,UAAU,KAAM;AAC9D,YAAQ,aAAa,kBAAmB,QAAQ,YAAY,KAAM;AAClE,YAAQ,SAAS,kBAAmB,QAAQ,QAAQ,KAAM;AAC1D,YAAQ,2BAA2B,kBAAmB,QAAQ,0BAA0B,KAAM;AAC9F,YAAQ,yBAAyB,kBAAmB,QAAQ,wBAAwB,IAAK;AACzF,YAAQ,uBAAuB,kBAAmB,QAAQ,sBAAsB,KAAM;AACtF,YAAQ,QAAQ,iBAAkB,QAAQ,OAAO,eAAgB;AAEjE,cAAU,4BAA6B,OAAQ;AAE/C,WAAO,mCAAoC,OAAQ;AAAA,EACvD;AAEA,WAAS,4BAA6B,SAA2C;AAC7E,YAAQ,QAAQ,iBAAkB,QAAQ,OAAO,IAAK;AACtD,YAAQ,cAAc,iBAAkB,QAAQ,aAAa,IAAK;AAClE,YAAQ,UAAU,iBAAkB,QAAQ,SAAS,IAAK;AAE1D,WAAO;AAAA,EACX;AAEA,WAAS,mCAAoC,SAA2C;AACpF,YAAQ,SAAS,iBAAkB,QAAQ,QAAQ,CAAC,CAAY;AAChE,YAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,YAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,YAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,YAAQ,OAAO,WAAW,mBAAoB,QAAQ,OAAO,UAAU,IAAK;AAC5E,YAAQ,OAAO,SAAS,mBAAoB,QAAQ,OAAO,QAAQ,IAAK;AACxE,YAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,YAAQ,OAAO,YAAY,mBAAoB,QAAQ,OAAO,WAAW,IAAK;AAC9E,YAAQ,OAAO,eAAe,mBAAoB,QAAQ,OAAO,cAAc,IAAK;AAEpF,WAAO;AAAA,EACX;AASA,WAAS,cAAe,MAAc,4BAA+C;AACjF,UAAM,WAAmB,KAAK,YAAY;AAC1C,UAAM,SAAkB,aAAa;AAErC,QAAIA,UAAc,SAAS,SAAS,6BAA2B,IAAI,SAAS,cAAe,QAAS;AAEpG,QAAK,UAAW,SAAU,GAAI;AAC1B,MAAAA,QAAO,YAAY;AAAA,IACvB;AAEA,WAAOA;AAAA,EACX;AAEA,WAAS,UAAW,SAA6B;AAC7C,QAAI,OAAe;AACnB,QAAI,MAAc;AAElB,WAAQ,WAAW,CAAC,MAAO,QAAQ,UAAW,KAAK,CAAC,MAAO,QAAQ,SAAU,GAAI;AAC7E,cAAQ,QAAQ,aAAa,QAAQ;AACrC,aAAO,QAAQ,YAAY,QAAQ;AAEnC,gBAAU,QAAQ;AAAA,IACtB;AAEA,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,oBAA0B;AAC/B,UAAM,MAAmB,SAAS;AAClC,UAAM,QAAiB,OAAO,eAAe,IAAI,eAAkB,IAAI,cAAc;AACrF,UAAM,OAAgB,OAAO,eAAe,IAAI,cAAgB,IAAI,aAAa;AAEjF,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,oBAAqB,SAAc,mBAAkC;AAC1E,QAAI,QAAa;AAEjB,QAAK,SAAS,YAAY,kBAAmB;AACzC,cAAQ,SAAS,YAAY,iBAAkB,SAAS,IAAK,EAAE,iBAAkB,iBAAkB;AAAA,IACvG,WAAY,QAAQ,cAAe;AAC/B,cAAQ,QAAQ,aAAc,iBAAkB;AAAA,IACpD;AAEA,WAAO;AAAA,EACX;AAEA,WAAS,QAAS,QAAqB,MAA2B;AAC9D,QAAI;AACA,UAAK,CAAC,OAAO,SAAU,IAAK,GAAI;AAC5B,eAAO,YAAa,IAAK;AAAA,MAC7B;AAAA,IACJ,SAAU,GAAI;AACV,cAAQ,KAAM,EAAE,OAAQ;AAAA,IAC5B;AAAA,EACJ;AAEA,WAAS,WAAY,QAAqB,MAA2B;AACjE,QAAI;AACA,UAAK,OAAO,SAAU,IAAK,GAAI;AAC3B,eAAO,YAAa,IAAK;AAAA,MAC7B;AAAA,IACJ,SAAU,GAAI;AACV,cAAQ,KAAM,EAAE,OAAQ;AAAA,IAC5B;AAAA,EACJ;AAEA,WAAS,aAAc,GAAgB;AACnC,MAAE,eAAe;AACjB,MAAE,eAAe;AAAA,EACrB;AAEA,WAAS,2BAA4B,GAAe,SAA8B;AAC9E,QAAI,OAAe,EAAE;AACrB,QAAI,MAAc,EAAE;AACpB,UAAM,iBAAsB,kBAAkB;AAE9C,YAAQ,MAAM,UAAU;AAExB,QAAK,OAAO,QAAQ,cAAc,OAAO,YAAa;AAClD,cAAQ,QAAQ;AAAA,IACpB,OAAO;AACH;AAAA,IACJ;AAEA,QAAK,MAAM,QAAQ,eAAe,OAAO,aAAc;AACnD,aAAO,QAAQ;AAAA,IACnB,OAAO;AACH;AAAA,IACJ;AAEA,QAAK,OAAO,eAAe,MAAO;AAC9B,aAAO,EAAE,QAAQ;AAAA,IACrB;AAEA,QAAK,MAAM,eAAe,KAAM;AAC5B,YAAM,EAAE,QAAQ;AAAA,IACpB;AAEA,YAAQ,MAAM,OAAO,OAAO;AAC5B,YAAQ,MAAM,MAAM,MAAM;AAAA,EAC9B;AAEA,WAAS,4BAA6B,SAAsB,WAA4B;AACpF,QAAK,WAAY;AACb,UAAK,QAAQ,MAAM,YAAY,SAAU;AACrC,gBAAQ,MAAM,UAAU;AAAA,MAC5B;AAAA,IAEJ,OAAO;AACH,UAAK,QAAQ,MAAM,YAAY,QAAS;AACpC,gBAAQ,MAAM,UAAU;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,cAAe,WAAwB,WAA0B;AACtE,UAAM,gBAA6B,cAAe,KAAM;AACxD,UAAM,QAAqB,cAAe,SAAS,UAAW;AAC9D,UAAM,QAA0B,cAAe,OAAQ;AAEvD,cAAU,YAAa,aAAc;AACrC,kBAAc,YAAa,KAAM;AACjC,UAAM,YAAa,KAAM;AAEzB,UAAM,OAAO;AAEb,UAAM,YAAyB,cAAe,QAAQ,YAAa;AACnE,UAAM,OAAoB,cAAe,QAAQ,MAAO;AAExD,SAAK,YAAY;AAEjB,UAAM,YAAa,SAAU;AAC7B,UAAM,YAAa,IAAK;AAExB,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAA0B,WAAwB,WAA2B;AAClF,QAAI,WAAsC,UAAU,uBAAwB,SAAU;AAEtF,WAAQ,SAAU,CAAE,GAAI;AACpB,eAAU,CAAE,EAAE,WAAW,YAAa,SAAU,CAAE,CAAE;AAAA,IACxD;AAAA,EACJ;AASA,WAAS,uBAAwB,oBAA8B,MAAsB;AACjF,QAAK,kBAAmB,eAAgB,GAAI;AACxC,sBAAgB,MAAO,MAAM,CAAC,EAAE,MAAM,KAAM,MAAM,CAAE,CAAE;AAAA,IAC1D;AAAA,EACJ;AASA,WAAS,0BAAoC;AACzC,QAAI,OAAgB;AAEpB,QAAK,eAAe,6BAA8B;AAC9C,YAAM,MAAc,OAAO,SAAS;AACpC,YAAM,eAAoB,uBAAwB,GAAI;AAEtD,UAAK,UAAW,aAAa,SAAU,GAAI;AACvC,cAAM,UAAkB,SAAU,aAAa,WAAW,EAAG;AAE7D,YAAK,CAAC,MAAO,OAAQ,KAAK,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AAC9E,kBAAS,eAAgB,EAAE,WAAW;AAAA,QAC1C;AAAA,MACJ;AAEA,UAAK,UAAW,aAAa,MAAO,GAAI;AACpC,eAAO,aAAa,WAAW;AAAA,MACnC;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAEA,WAAS,uBAAwB,KAAoB;AACjD,UAAM,eAAuB,CAAC;AAC9B,UAAM,eAAyB,IAAI,MAAO,GAAI;AAE9C,QAAK,aAAa,SAAS,GAAI;AAC3B,YAAM,aAAuB,aAAc,CAAE,EAAE,MAAO,GAAI;AAC1D,YAAM,mBAA2B,WAAW;AAE5C,eAAU,kBAA0B,GAAG,kBAAkB,kBAAkB,mBAAoB;AAC3F,cAAM,YAAsB,WAAY,eAAgB,EAAE,MAAO,GAAI;AAErE,qBAAc,UAAW,CAAE,CAAE,IAAI,UAAW,CAAE;AAAA,MAClD;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AASA,WAAS,UAAW,OAAuB;AACvC,WAAO,UAAU,QAAQ,UAAU,UAAa;AAAA,EACpD;AAEA,WAAS,gBAAiB,QAAwB;AAC9C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,iBAAkB,QAAwB;AAC/C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,gBAAiB,QAAwB;AAC9C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,kBAAmB,QAAwB;AAChD,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,gBAAiB,QAAwB;AAC9C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,eAAgB,QAAwB;AAC7C,WAAO,gBAAiB,MAAO,KAAK,kBAAkB;AAAA,EAC1D;AASA,WAAS,oBAAqB,OAAY,cAAgC;AACtE,WAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,EAC/C;AAEA,WAAS,iBAAkB,OAAY,cAAgC;AACnE,WAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAEA,WAAS,kBAAmB,OAAY,cAAkC;AACtE,WAAO,iBAAkB,KAAM,IAAI,QAAQ;AAAA,EAC/C;AAEA,WAAS,iBAAkB,OAAY,cAAgC;AACnE,WAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAEA,WAAS,mBAAoB,OAAY,cAA6B;AAClE,WAAO,kBAAmB,KAAM,IAAI,QAAQ;AAAA,EAChD;AAEA,WAAS,iBAAkB,OAAY,cAAgC;AACnE,WAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAEA,WAAS,gBAAiB,OAAY,cAA8B;AAChE,WAAO,eAAgB,KAAM,IAAI,QAAQ;AAAA,EAC7C;AAEA,WAAS,wBAAyB,OAAY,cAA8B;AACxE,QAAIA,UAAgB;AAEpB,QAAK,gBAAiB,KAAM,GAAI;AAC5B,YAAM,SAAmB,MAAM,SAAS,EAAE,qBAAkB;AAE5D,UAAK,OAAO,WAAW,GAAI;AACvB,gBAAQ;AAAA,MACZ,OAAO;AACH,QAAAA,UAAS;AAAA,MACb;AAAA,IAEJ,OAAO;AACH,MAAAA,UAAS,gBAAiB,OAAO,YAAa;AAAA,IAClD;AAEA,WAAOA;AAAA,EACX;AAEA,WAAS,oBAAqB,cAAmC;AAC7D,UAAM,SAAuB;AAAA,MACzB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAEA,QAAI;AACA,UAAK,gBAAiB,YAAa,GAAI;AACnC,eAAO,SAAS,KAAK,MAAO,YAAa;AAAA,MAC7C;AAAA,IAEJ,SAAU,IAAK;AACX,UAAI;AACA,eAAO,SAAS,KAAM,MAAM,eAAe,GAAI;AAE/C,YAAK,kBAAmB,OAAO,MAAO,GAAI;AACtC,iBAAO,SAAS,OAAO,OAAO;AAAA,QAClC;AAAA,MAEJ,SAAU,IAAK;AACX,YAAK,CAAC,eAAe,UAAW;AAC5B,kBAAQ,MAAO,eAAe,gBAAgB,QAAS,eAAgB,GAAG,OAAQ,EAAE,QAAS,eAAgB,GAAG,OAAQ,CAAE;AAC1H,iBAAO,SAAS;AAAA,QACpB;AAEA,eAAO,SAAS;AAAA,MACpB;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AASA,WAAS,sBAA6B;AAClC,QAAK,QAAQ,OAAO,GAAI;AACpB,oBAAe,KAAM;AAErB,cAAS,eAAgB,EAAE,WAAW;AAAA,IAC1C;AAAA,EACJ;AASA,WAAS,0BAA2B,mBAAkC,MAAc;AAChF,qBAAiB,iBAAkB,kBAAkB,CAAC,CAAmB;AACzE,mBAAe,WAAW,kBAAmB,eAAe,UAAU,IAAK;AAC3E,mBAAe,kBAAkB,wBAAyB,eAAe,iBAAiB,CAAE,GAAI,CAAE;AAClG,mBAAe,kBAAkB,kBAAmB,eAAe,iBAAiB,IAAK;AACzF,mBAAe,sBAAsB,kBAAmB,eAAe,qBAAqB,IAAK;AACjG,mBAAe,mBAAmB,kBAAmB,eAAe,kBAAkB,IAAK;AAC3F,mBAAe,8BAA8B,kBAAmB,eAAe,6BAA6B,IAAK;AACjH,mBAAe,yBAAyB,kBAAmB,eAAe,wBAAwB,KAAM;AACxG,mBAAe,cAAc,kBAAmB,eAAe,aAAa,IAAK;AACjF,mBAAe,qBAAqB,kBAAmB,eAAe,oBAAoB,KAAM;AAChG,mBAAe,eAAe,iBAAkB,eAAe,cAAc,GAAI;AACjF,mBAAe,0BAA0B,kBAAmB,eAAe,yBAAyB,IAAK;AACzG,mBAAe,uCAAuC,kBAAmB,eAAe,sCAAsC,KAAM;AACpI,mBAAe,kBAAkB,kBAAmB,eAAe,iBAAiB,KAAM;AAC1F,mBAAe,mBAAmB,kBAAmB,eAAe,kBAAkB,KAAM;AAC5F,mBAAe,sBAAsB,kBAAmB,eAAe,qBAAqB,KAAM;AAClG,mBAAe,sBAAsB,kBAAmB,eAAe,qBAAqB,KAAM;AAElG,qCAAiC;AACjC,4CAAwC;AAAA,EAC5C;AAEA,WAAS,mCAA0C;AAC/C,mBAAe,iBAAiB,oBAAqB,eAAe,gBAAgB,MAAO;AAC3F,mBAAe,iBAAiB,oBAAqB,eAAe,gBAAgB,MAAO;AAC3F,mBAAe,mBAAmB,oBAAqB,eAAe,kBAAkB,QAAS;AACjG,mBAAe,yBAAyB,oBAAqB,eAAe,wBAAwB,OAAQ;AAC5G,mBAAe,qBAAqB,oBAAqB,eAAe,oBAAoB,mBAAoB;AAChH,mBAAe,kBAAkB,oBAAqB,eAAe,iBAAiB,4CAA6C;AACnI,mBAAe,6BAA6B,oBAAqB,eAAe,4BAA4B,2DAA4D;AACxK,mBAAe,2BAA2B,oBAAqB,eAAe,0BAA0B,gEAAiE;AACzK,mBAAe,8BAA8B,oBAAqB,eAAe,6BAA6B,IAAK;AAAA,EACvH;AAEA,WAAS,0CAAiD;AACtD,mBAAe,yBAAyB,mBAAoB,eAAe,wBAAwB,IAAK;AAAA,EAC5G;AASA,QAAM,UAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOvB,OAAO,SAAW,QAAgB,MAAmB;AACjD,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAAA,IAEA,MAAM,SAAW,QAAgB,MAAmB;AAChD,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAAA,IAEA,MAAM,WAAwB;AAC1B,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAAA,IAEA,QAAQ,WAAsB;AAC1B,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAAA,IAEA,YAAY,WAAsB;AAC9B,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,kBAAkB,WAAwB;AACtC,kBAAY;AAEZ,aAAO;AAAA,IACX;AAAA,IAEA,SAAS,SAAW,SAAsB,SAAsC;AAC5E,UAAK,gBAAiB,OAAQ,KAAK,gBAAiB,OAAQ,GAAI;AAC5D,qBAAc,SAAS,sBAAuB,OAAQ,CAAE;AAExD,gBAAS,eAAgB,EAAE,KAAK,KAAK;AAErC,4BAAoB;AAAA,MACxB;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,SAAW,SAAmC;AACtD,UAAK,gBAAiB,OAAQ,GAAI;AAC9B,YAAI,UAAmB;AAEvB,iBAAU,SAAS,SAAU;AACzB,cAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,qBAAU,SAAS,QAAS,KAAM,EAAE,MAAO;AACvC,kBAAK,QAAS,KAAM,EAAE,KAAK,eAAgB,KAAM,GAAI;AACjD,sBAAM,iBAAiC,QAAS,KAAM,EAAE,KAAM,KAAM;AAEpE,oBAAK,eAAe,aAAa,YAAY,SAAU;AACnD,yCAAwB,eAAe,OAAO,cAAc,eAAe,aAAa,OAAQ;AAEhG,0BAAS,KAAM,EAAE,KAAK,OAAQ,QAAS,KAAM,EAAE,KAAK,QAAS,eAAe,KAAM,GAAG,CAAE;AAEvF,yBAAO,QAAS,KAAM,EAAE,KAAM,eAAe,KAAM;AAEnD,0BAAS,KAAM,EAAE,KAAK,KAAK;AAE3B,4BAAU;AACV;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAEA,YAAK,CAAC,SAAU;AACZ,mCAA0B,SAAS,iBAAkB;AAAA,QACzD,OAAO;AACH,8BAAoB;AAAA,QACxB;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,SAAW,QAAgB,MAAmB;AACtD,0BAAoB;AAEpB,eAAU,aAAa,SAAU;AAC7B,YAAK,QAAQ,eAAgB,SAAU,GAAI;AACvC,cAAK,CAAC,gBAAiB,KAAM,KAAK,UAAU,WAAY;AACpD,qBAAU,SAAS,QAAS,SAAU,EAAE,MAAO;AAC3C,kBAAK,QAAS,SAAU,EAAE,KAAK,eAAgB,KAAM,GAAI;AACrD,sBAAM,iBAAiC,QAAS,SAAU,EAAE,KAAM,KAAM;AAExE,uCAAwB,eAAe,OAAO,cAAc,eAAe,aAAa,OAAQ;AAAA,cACpG;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,UAAK,gBAAiB,KAAM,GAAI;AAC5B,YAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,iBAAO,QAAS,KAAM;AAAA,QAC1B;AAAA,MAEJ,OAAO;AACH,kBAAU,CAAC;AAAA,MACf;AAEA,UAAK,CAAC,gBAAiB,KAAM,KAAK,UAAU,iBAAkB;AAC1D,0BAAmB,OAAQ;AAAA,MAC/B;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,WAAwB;AAChC,+BAA0B,SAAS,MAAM,iBAAkB;AAE3D,aAAO;AAAA,IACX;AAAA,IAEA,kBAAkB,WAAwB;AACtC,cAAS,eAAgB,EAAE,KAAK,QAAQ;AAExC,0BAAoB;AAEpB,aAAO;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,kBAAkB,SAAW,kBAA8C;AACvE,UAAK,gBAAiB,gBAAiB,GAAI;AACvC,YAAI,0BAAmC;AAEvC,iBAAU,gBAAgB,kBAAmB;AACzC,cAAK,iBAAiB,eAAgB,YAAa,KAAK,eAAe,eAAgB,YAAa,KAAK,eAAgB,YAAa,MAAM,iBAAkB,YAAa,GAAI;AAC3K,2BAAgB,YAAa,IAAI,iBAAkB,YAAa;AAChE,sCAA0B;AAAA,UAC9B;AAAA,QACJ;AAEA,YAAK,yBAA0B;AAC3B,oCAA2B,cAAe;AAAA,QAC9C;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,YAAY,WAAoB;AAC5B,aAAO;AAAA,IACX;AAAA,EACJ;AASA,GAAE,MAAM;AACJ,8BAA0B;AAE1B,aAAS,iBAAkB,oBAAoB,WAAW;AACtD,wBAAkB;AAClB,+BAAyB;AACzB,mBAAa;AACb,oBAAc;AACd,kBAAY;AACZ,0BAAoB;AAEpB,UAAK,wBAAwB,GAAI;AAC7B,gBAAQ,KAAK;AAAA,MACjB;AAAA,IACJ,CAAE;AAEF,QAAK,CAAC,UAAW,OAAO,QAAS,GAAI;AACjC,aAAO,WAAW;AAAA,IACtB;AAAA,EACJ,GAAK;AACT","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n show: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n hide: function () : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n isOpen: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n isComplete: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", function() {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} );"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":";AAaO,IAAU;AAAA,CAAV,CAAUA,eAAV;AACI,EAAMA,WAAA,4BAA4B;AAAA,GAD5B;;;CCiBf,MAAM;AAEJ,MAAI,iBAAgC,CAAC;AAGrC,MAAI,qCAA8C;AAGlD,QAAM,kBAA0B;AAChC,MAAI,kBAA0B;AAC9B,MAAI,UAAkB,CAAC;AAGvB,MAAI,uCAA+C;AAGnD,MAAI,+BAA4C;AAGhD,MAAI,kBAA+B;AACnC,MAAI,+BAA4C;AAChD,MAAI,wBAAqC;AACzC,MAAI,8BAA2C;AAC/C,MAAI,qCAAkD;AACtD,MAAI,iCAAmD;AACvD,MAAI,+BAA4C;AAChD,MAAI,8BAA2C;AAC/C,MAAI,yCAAsD;AAC1D,MAAI,8CAA2D;AAC/D,MAAI,0BAAuC;AAC3C,MAAI,sCAAwD;AAC5D,MAAI,sCAAwD;AAC5D,MAAI,yBAAkC;AAGtC,MAAI,kCAA0C;AAC9C,MAAI,kCAA0C;AAC9C,MAAI,gCAAyC;AAC7C,MAAI,yBAAiC;AACrC,MAAI,yBAAiC;AAGrC,MAAI,mBAAmB;AACvB,MAAI,yBAAiC;AASrC,WAAS,kBAAmB,SAAc,MAAc;AACpD,cAAU,iBAAkB,QAAQ,CAAC,CAAE;AAEvC,YAAS,eAAgB,IAAI;AAAA,MACzB,MAAM,CAAC;AAAA,MACP,MAAM,CAAC;AAAA,MACP,UAAU;AAAA,IACd;AAAA,EACJ;AAEA,WAAS,cAAe,OAAuB;AAC3C,QAAK,CAAC,QAAQ,eAAgB,KAAM,GAAI;AACpC,cAAS,KAAM,IAAI;AAAA,QACf,MAAM,CAAC;AAAA,QACP,MAAM,CAAC;AAAA,QACP,UAAU;AAAA,MACd;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAA0C;AAC/C,WAAO,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,QAAS,CAAE;AAAA,EACnH;AASA,WAAS,2BAAkC;AACvC,mCAA+B,cAAe,OAAO,gCAAiC;AAEtF,iCAA6B,UAAU,WAAW;AAC9C,UAAK,eAAe,sCAAuC;AACvD,sBAAc;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAAgC;AACrC,YAAS,SAAS,MAAM,4BAA6B;AAAA,EACzD;AAEA,WAAS,yBAAgC;AACrC,eAAY,SAAS,MAAM,4BAA6B;AAAA,EAC5D;AASA,WAAS,eAAsB;AAC3B,sBAAkB,cAAe,OAAO,mBAAoB;AAC5D,oBAAgB,MAAM,UAAU;AAChC,aAAS,KAAK,YAAa,eAAgB;AAE3C,mCAA+B,cAAe,UAAU,OAAQ;AAChE,oBAAgB,YAAa,4BAA6B;AAE1D,iCAA6B,UAAU,WAAW;AAC9C,oBAAc;AAAA,IAClB;AAEA,eAAY,8BAA8B,eAAe,sBAAuB;AAEhF,4BAAwB,cAAe,OAAO,OAAQ;AACtD,oBAAgB,YAAa,qBAAsB;AAEnD,kCAA8B,cAAe,OAAO,aAAc;AAClE,oBAAgB,YAAa,2BAA4B;AAEzD,yCAAqC,cAAe,OAAO,oBAAqB;AAChF,oBAAgB,YAAa,kCAAmC;AAEhE,qCAAiC,cAAe,oCAAoC,eAAe,kBAAmB,EAAE;AAExH,mCAA+B,WAAW,WAAW;AACjD,UAAK,eAAe,oBAAqB;AACrC,+BAAwB,eAAe,wBAAwB,+BAA+B,OAAQ;AAAA,MAC1G;AAAA,IACJ;AAEA,mCAA+B,cAAe,OAAO,eAAgB;AACrE,oBAAgB,YAAa,4BAA6B;AAE1D,kCAA8B,cAAe,OAAO,cAAe;AACnE,oBAAgB,YAAa,2BAA4B;AAEzD,6CAAyC,cAAe,OAAO,yBAA0B;AACzF,gCAA4B,YAAa,sCAAuC;AAEhF,kDAA8C,cAAe,KAAK,8BAA+B;AACjG,2CAAuC,YAAa,2CAA4C;AAEhG,8BAA0B,cAAe,OAAO,SAAU;AAC1D,oBAAgB,YAAa,uBAAwB;AAErD,0CAAsC,cAAe,UAAU,MAAO;AACtE,wCAAoC,UAAU;AAC9C,4BAAwB,YAAa,mCAAoC;AAEzE,0CAAsC,cAAe,UAAU,MAAO;AACtE,wCAAoC,UAAU;AAC9C,4BAAwB,YAAa,mCAAoC;AAEzE,sBAAkB;AAAA,EACtB;AAEA,WAAS,cAAe,sBAA+B,MAAc;AACjE,QAAI,YAAqB;AAEzB,QAAK,gBAAiB,eAAe,2BAA4B,KAAK,qBAAsB;AACxF,kBAAY,QAAS,eAAe,2BAA4B;AAAA,IACpE,OAAO;AACH,kBAAY;AAAA,IAChB;AAEA,QAAK,WAAY;AACb,YAAM,iBAAiC,uBAAuB;AAE9D,UAAK,UAAW,cAAe,KAAK,UAAW,eAAe,aAAa,OAAQ,GAAI;AACnF,+BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,MAC/F;AAEA,sCAAiC,KAAM;AACvC,6BAAuB;AACvB,kBAAY;AAEZ,sBAAgB,MAAM,UAAU;AAAA,IACpC;AAAA,EACJ;AAEA,WAAS,eAAsB;AAC3B,QAAK,QAAS,eAAgB,EAAE,WAAW,GAAI;AAC3C,sCAAgC;AAEhC,cAAS,eAAgB,EAAE;AAE3B,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,eAAsB;AAC3B,QAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,YAAM,iBAAiC,uBAAuB;AAE9D,oBAAe,KAAM;AACrB,6BAAwB,eAAe,OAAO,UAAU,eAAe,aAAa,OAAQ;AAAA,IAEhG,OAAO;AACH,sCAAgC;AAEhC,cAAS,eAAgB,EAAE;AAE3B,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,2BAAkC;AACvC,UAAM,iBAAiC,uBAAuB;AAE9D,QAAK,UAAW,cAAe,KAAK,UAAW,eAAe,aAAa,OAAQ,GAAI;AACnF,UAAK,eAAe,wBAAyB;AACzC,+BAAuB;AAAA,MAC3B,OAAO;AACH,+BAAuB;AAAA,MAC3B;AAEA,kBAAY;AAEZ,mCAA6B,MAAM,UAAU,eAAe,kBAAkB,UAAS;AACvF,2CAAqC;AAErC,qBAAe,aAAa,QAAQ,+BAA0B;AAE9D,UAAK,eAAe,kBAAmB;AACnC,uBAAe,aAAa,QAAQ,eAAe;AAAA,MACvD;AAEA,YAAM,oBAA4B,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAEvG,UAAK,wCAAoC,kBAAkB,YAAY,MAAM,UAAW;AACpF,+CAAuC;AACvC,uBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,MACzD;AAEA,kCAA6B,oCAAoC,eAAe,kBAAmB;AACnG,kCAA6B,8BAA8B,eAAe,oBAAoB,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AACzI,kCAA6B,6BAA6B,eAAe,mBAAmB,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AACvI,kCAA6B,6CAA6C,eAAe,mBAAoB;AAC7G,kCAA6B,yBAAyB,eAAe,WAAY;AAEjF,0CAAoC,YAAY,eAAe;AAC/D,0CAAoC,WAAW,QAAS,eAAgB,EAAE,aAAa;AAEvF,UAAK,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACrF,4CAAoC,YAAY,eAAe;AAAA,MACnE,OAAO;AACH,4CAAoC,YAAY,eAAe;AAAA,MACnE;AAEA,oBAAe,cAAe;AAC9B,wBAAmB,MAAM,cAAe;AACxC,uBAAiB;AACjB,6BAAuB;AACvB,6BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAE3F,UAAK,eAAe,WAAY;AAC5B,uBAAe,aAAa,QAAQ,MAAM;AAAA,MAC9C;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,cAAe,gBAAwC;AAC5D,QAAK,gBAAiB,eAAe,KAAM,GAAI;AAC3C,4BAAsB,YAAY,eAAe;AAAA,IACrD,OAAO;AACH,4BAAsB;AAAA,IAC1B;AAEA,QAAK,gBAAiB,eAAe,WAAY,GAAI;AACjD,kCAA4B,YAAY,eAAe;AAAA,IAC3D,OAAO;AACH,kCAA4B;AAAA,IAChC;AAAA,EACJ;AAEA,WAAS,kBAAmB,GAAQ,gBAAwC;AACxE,QAAK,gBAAgB,MAAM,YAAY,SAAU;AAC7C,sBAAgB,MAAM,UAAU;AAEhC,6BAAwB,eAAe,OAAO,QAAQ,eAAe,aAAa,OAAQ;AAAA,IAC9F;AAEA,QAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,6BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,IAC/F;AAEA,6BAAyB,eAAe,WAAW;AAEnD,QAAK,eAAe,UAAU,eAAe,QAAS;AAClD,UAAK,eAAe,UAAU,eAAe,0BAA2B;AACpE,mCAA4B,GAAG,eAAgB;AAAA,MAEnD,OAAO;AACH,cAAM,SAAc,UAAW,eAAe,aAAa,OAAQ;AACnE,YAAI,MAAgB,OAAO,MAAQ,eAAe,aAAa,QAAQ;AACvE,YAAI,OAAiB,OAAO;AAE5B,YAAK,OAAO,gBAAgB,cAAc,OAAO,cAAc,eAAe,YAAa;AACvF,kBAAS,gBAAgB;AACzB,kBAAQ,eAAe,aAAa,QAAQ;AAAA,QAChD;AAEA,YAAK,MAAM,gBAAgB,eAAe,OAAO,eAAe,eAAe,UAAW;AACtF,iBAAS,gBAAgB,eAAe,eAAe,aAAa,QAAQ;AAAA,QAChF;AAEA,wBAAgB,MAAM,MAAM,MAAM;AAClC,wBAAgB,MAAM,OAAO,OAAO;AAAA,MACxC;AAAA,IAEJ,OAAO;AACH,YAAM,iBAAsB,kBAAkB;AAC9C,YAAM,aAAqB,KAAK,IAAK,IAAO,OAAO,aAAa,gBAAgB,eAAgB,IAAM,eAAe,IAAK;AAC1H,YAAM,YAAoB,KAAK,IAAK,IAAO,OAAO,cAAc,gBAAgB,gBAAiB,IAAM,eAAe,GAAI;AAE1H,sBAAgB,MAAM,OAAO,aAAa;AAC1C,sBAAgB,MAAM,MAAM,YAAY;AAAA,IAC5C;AAAA,EACJ;AAEA,WAAS,gCAAiC,oBAA6B,MAAc;AACjF,UAAM,iBAAiC,uBAAuB;AAE9D,QAAK,UAAW,cAAe,KAAK,UAAW,eAAe,aAAa,OAAQ,GAAI;AACnF,qBAAe,aAAa,QAAQ,YAAY,eAAe,aAAa,QAAQ,UAAU,0BAAsB,0CAAuC;AAE3J,UAAK,UAAW,oCAAqC,GAAI;AACrD,uBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,MACzD;AAEA,UAAK,mBAAoB;AACrB,+BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,MAC/F;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,mBAA0B;AAC/B,iCAA6B;AAE7B,QAAK,eAAe,kBAAmB;AACnC,YAAM,aAAqB,QAAS,eAAgB,EAAE,KAAK;AAE3D,eAAU,WAAmB,GAAG,WAAW,YAAY,YAAa;AAChE,yBAAkB,UAAU,QAAS,eAAgB,EAAE,KAAM,QAAS,CAAE;AAAA,MAC5E;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,iBAAkB,UAAkB,OAAuB;AAChE,UAAM,iBAAiC,QAAS,eAAgB,EAAE,KAAM,KAAM;AAC9E,QAAI,MAAmB;AAEvB,QAAK,aAAa,QAAS,eAAgB,EAAE,UAAW;AACpD,YAAM,cAAe,OAAO,YAAa;AAAA,IAC7C,OAAO;AAEH,YAAM,cAAe,OAAO,KAAM;AAElC,UAAI,UAAU,WAAW;AACrB,wCAAgC;AAEhC,gBAAS,eAAgB,EAAE,WAAW;AAEtC,iCAAyB;AAAA,MAC7B;AAAA,IACJ;AAEA,iCAA6B,YAAa,GAAI;AAE9C,QAAK,eAAe,yBAA0B;AAC1C,UAAK,gBAAiB,eAAe,OAAQ,GAAI;AAC7C,mBAAY,KAAK,eAAe,OAAQ;AAAA,MAC5C,OAAO;AACH,mBAAY,KAAK,eAAe,KAAM;AAAA,MAC1C;AAAA,IACJ;AAEA,QAAK,eAAe,wBAAyB;AACzC,UAAI,aAAa;AACjB,UAAI,aAAc,WAAW,GAAI,SAAS;AAAA,IAC9C;AAAA,EACJ;AAEA,WAAS,yBAAgC;AACrC,QAAK,eAAe,iBAAkB;AAClC,YAAM,iBAAyB,4BAA4B,cAAc,QAAS,eAAgB,EAAE,KAAK;AACzG,YAAM,SAAkB,QAAS,eAAgB,EAAE,WAAW,KAAM;AACpE,YAAM,qBAA6B,KAAK,MAAU,QAAS,eAAgB,EAAE,WAAW,KAAM,QAAS,eAAgB,EAAE,KAAK,SAAW,GAAI;AAE7I,6CAAuC,MAAM,QAAQ,QAAQ;AAC7D,kDAA4C,YAAY,qBAAqB;AAAA,IACjF;AAAA,EACJ;AASA,WAAS,oBAA2B;AAChC,0BAAsB,cAAc;AACpC,0BAAsB,YAAY;AAClC,0BAAsB,gBAAgB;AAEtC,aAAS,KAAK,iBAAkB,aAAa,uBAAwB;AACrE,aAAS,KAAK,iBAAkB,cAAc,wBAAyB;AAAA,EAC3E;AAEA,WAAS,wBAAyB,GAAuB;AACrD,QAAK,CAAC,iCAAiC,CAAC,0BAA0B,eAAe,qBAAsB;AACnG,sBAAgB,aAAa;AAC7B,sCAAgC;AAChC,+BAAyB,EAAE,QAAQ,gBAAgB;AACnD,+BAAyB,EAAE,QAAQ,gBAAgB;AACnD,wCAAkC,gBAAgB;AAClD,wCAAkC,gBAAgB;AAAA,IACtD;AAAA,EACJ;AAEA,WAAS,wBAA+B;AACpC,QAAK,+BAAgC;AACjC,sCAAgC;AAChC,wCAAkC;AAClC,wCAAkC;AAClC,sBAAgB,YAAY;AAAA,IAChC;AAAA,EACJ;AAEA,WAAS,wBAAyB,GAAuB;AACrD,QAAK,+BAAgC;AACjC,sBAAgB,MAAM,OAAS,EAAE,QAAQ,yBAA2B;AACpE,sBAAgB,MAAM,MAAQ,EAAE,QAAQ,yBAA2B;AAAA,IACvE;AAAA,EACJ;AAEA,WAAS,2BAAkC;AACvC,QAAK,+BAAgC;AACjC,sBAAgB,MAAM,OAAO,kCAAkC;AAC/D,sBAAgB,MAAM,MAAM,kCAAkC;AAE9D,sCAAgC;AAChC,wCAAkC;AAClC,wCAAkC;AAClC,sBAAgB,YAAY;AAAA,IAChC;AAAA,EACJ;AASA,WAAS,gBAAuB;AAC5B,QAAK,CAAC,UAAW,gBAAiB,GAAI;AAClC,yBAAmB,cAAe,OAAO,oBAAqB;AAC9D,uBAAiB,MAAM,UAAU;AAEjC,eAAS,KAAK,YAAa,gBAAiB;AAE5C,eAAS,KAAK,iBAAkB,aAAa,WAAW;AACpD,oBAAY;AAAA,MAChB,CAAE;AAEF,eAAS,iBAAkB,UAAU,WAAW;AAC5C,oBAAY;AAAA,MAChB,CAAE;AAAA,IACN;AAAA,EACJ;AAEA,WAAS,WAAY,SAAsB,MAAsB;AAC7D,QAAK,YAAY,MAAO;AACpB,cAAQ,cAAc,SAAU,GAAI;AAChC,oBAAa,GAAG,IAAK;AAAA,MACzB;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,YAAa,GAAQ,MAAsB;AAChD,iBAAc,CAAE;AAChB,gBAAY;AAEZ,6BAAyB,WAAY,WAAW;AAC5C,uBAAiB,YAAY;AAC7B,uBAAiB,MAAM,UAAU;AAEjC,iCAA4B,GAAG,gBAAiB;AAAA,IACpD,GAAG,eAAe,YAAa;AAAA,EACnC;AAEA,WAAS,cAAqB;AAC1B,QAAK,UAAW,gBAAiB,GAAI;AACjC,UAAK,2BAA2B,GAAI;AAChC,qBAAc,sBAAuB;AACrC,iCAAyB;AAAA,MAC7B;AAEA,UAAK,iBAAiB,MAAM,YAAY,SAAU;AAC9C,yBAAiB,MAAM,UAAU;AAAA,MACrC;AAAA,IACJ;AAAA,EACJ;AASA,WAAS,cAAqB;AAC1B,UAAM,WAAqB,eAAe;AAC1C,UAAM,iBAAyB,SAAS;AAExC,aAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,YAAM,cAAyC,SAAS,qBAAsB,SAAU,YAAa,CAAE;AACvG,YAAM,WAA0B,CAAC,EAAE,MAAM,KAAM,WAAY;AAC3D,YAAM,iBAAyB,SAAS;AAExC,eAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,YAAK,CAAC,WAAY,SAAU,YAAa,CAAE,GAAI;AAC3C;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,YAAS,eAAgB,EAAE,KAAK,KAAK;AAAA,EACzC;AAEA,WAAS,WAAY,SAAiC;AAClD,QAAIC,UAAkB;AAEtB,QAAK,UAAW,OAAQ,KAAK,QAAQ,aAAc,UAAU,yBAA0B,GAAI;AACvF,YAAM,qBAA6B,QAAQ,aAAc,UAAU,yBAA0B;AAE7F,UAAK,gBAAiB,kBAAmB,GAAI;AACzC,cAAM,iBAA+B,oBAAqB,kBAAmB;AAE7E,YAAK,eAAe,UAAU,gBAAiB,eAAe,MAAO,GAAI;AACrE,uBAAc,SAAS,sBAAuB,eAAe,MAAO,CAAE;AAAA,QAE1E,OAAO;AACH,cAAK,CAAC,eAAe,UAAW;AAC5B,oBAAQ,MAAO,eAAe,2BAA2B,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC9H,YAAAA,UAAS;AAAA,UACb;AAAA,QACJ;AAAA,MAEJ,OAAO;AACH,YAAK,CAAC,eAAe,UAAW;AAC5B,kBAAQ,MAAO,eAAe,yBAAyB,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC5H,UAAAA,UAAS;AAAA,QACb;AAAA,MACJ;AAAA,IACJ;AAEA,WAAOA;AAAA,EACX;AAEA,WAAS,aAAc,SAAsB,gBAAwC;AACjF,mBAAe,eAAe,CAAC;AAC/B,mBAAe,aAAa,UAAU;AAEtC,QAAK,gBAAiB,eAAe,KAAM,MAAO,gBAAiB,eAAe,KAAM,KAAK,gBAAiB,eAAe,WAAY,IAAM;AAC3I,cAAQ,gBAAiB,UAAU,yBAA0B;AAE7D,UAAK,CAAC,eAAe,QAAS;AAC1B,sBAAe,eAAe,KAAM;AAEpC,gBAAS,eAAe,KAAM,EAAE,KAAM,eAAe,KAAM,IAAI;AAC/D,gBAAS,eAAe,KAAM,EAAE,KAAK,KAAM,eAAe,KAAM;AAEhE,+BAAwB,eAAe,OAAO,WAAW,OAAQ;AAAA,MAErE,OAAO;AACH,mBAAY,cAAe;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,WAAY,gBAAwC;AACzD,UAAM,gBAAwB,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAEnG,QAAK,oCAAgC,cAAc,YAAY,MAAM,UAAW;AAC5E,qBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,IACzD;AAEA,UAAM,OAAoB,cAAe,OAAO,iBAAkB;AAClE,mBAAe,aAAa,QAAQ,YAAa,IAAK;AAEtD,SAAK,UAAU,SAAU,GAAI;AACzB,mBAAc,CAAE;AAEhB,yCAAmC,MAAM,UAAU;AACnD,mCAA6B,MAAM,UAAU;AAC7C,kCAA4B,MAAM,UAAU;AAC5C,8BAAwB,MAAM,UAAU;AACxC,2CAAqC;AAErC,oBAAe,cAAe;AAC9B,wBAAmB,GAAG,cAAe;AAErC,UAAK,eAAe,sBAAuB;AACvC,iCAA0B,eAAe,aAAa,SAAS,iBAAkB;AAAA,MACrF;AAAA,IACJ;AAAA,EACJ;AASA,WAAS,oBAAqB,YAAqB,MAAc;AAC7D,UAAM,eAAyB,YAAY,SAAS,mBAAmB,SAAS;AAChF,UAAM,aAAuB,YAAY,OAAO,mBAAmB,OAAO;AAE1E,QAAK,eAAe,qBAAsB;AACtC,mBAAc,WAAW,eAAgB;AAAA,IAC7C;AAEA,eAAY,UAAU,cAAe;AAAA,EACzC;AAEA,WAAS,gBAAiB,GAA0B;AAChD,QAAK,QAAQ,OAAO,KAAK,eAAe,qBAAsB;AAC1D,UAAK,EAAE,6BAA6B;AAChC,UAAE,eAAe;AACjB,sBAAc;AAAA,MAClB,OAAO;AAEH,YAAK,oCAAqC;AACtC,cAAK,EAAE,2BAA2B;AAC9B,cAAE,eAAe;AACjB,yBAAa;AAAA,UAEjB,WAAY,EAAE,4BAA4B;AACtC,cAAE,eAAe;AACjB,yBAAa;AAAA,UAEjB,WAAY,EAAE,yBAAyB;AACnC,cAAE,eAAe;AACjB,8BAAkB;AAAA,UAEtB,WAAY,EAAE,2BAA2B;AACrC,cAAE,eAAe;AACjB,gCAAoB;AAAA,UACxB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,iBAAwB;AAC7B,QAAK,QAAQ,OAAO,GAAI;AACpB,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,oBAA2B;AAChC,QAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,sCAAgC;AAEhC,cAAS,eAAgB,EAAE,WAAW;AAEtC,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,sBAA6B;AAClC,QAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,sCAAgC;AAEhC,cAAS,eAAgB,EAAE,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS;AAE/E,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AASA,WAAS,sBAAuB,YAAkB;AAC9C,QAAI,UAA0B,CAAC,gBAAiB,UAAW,IAAI,CAAC,IAAsB;AACtF,YAAQ,QAAQ,iBAAkB,QAAQ,OAAO,CAAE;AACnD,YAAQ,SAAS,kBAAmB,QAAQ,QAAQ,IAAK;AACzD,YAAQ,YAAY,kBAAmB,QAAQ,WAAW,KAAM;AAChE,YAAQ,WAAW,kBAAmB,QAAQ,UAAU,KAAM;AAC9D,YAAQ,aAAa,kBAAmB,QAAQ,YAAY,KAAM;AAClE,YAAQ,SAAS,kBAAmB,QAAQ,QAAQ,KAAM;AAC1D,YAAQ,2BAA2B,kBAAmB,QAAQ,0BAA0B,KAAM;AAC9F,YAAQ,yBAAyB,kBAAmB,QAAQ,wBAAwB,IAAK;AACzF,YAAQ,uBAAuB,kBAAmB,QAAQ,sBAAsB,KAAM;AACtF,YAAQ,QAAQ,iBAAkB,QAAQ,OAAO,eAAgB;AAEjE,cAAU,4BAA6B,OAAQ;AAE/C,WAAO,mCAAoC,OAAQ;AAAA,EACvD;AAEA,WAAS,4BAA6B,SAA2C;AAC7E,YAAQ,QAAQ,iBAAkB,QAAQ,OAAO,IAAK;AACtD,YAAQ,cAAc,iBAAkB,QAAQ,aAAa,IAAK;AAClE,YAAQ,UAAU,iBAAkB,QAAQ,SAAS,IAAK;AAE1D,WAAO;AAAA,EACX;AAEA,WAAS,mCAAoC,SAA2C;AACpF,YAAQ,SAAS,iBAAkB,QAAQ,QAAQ,CAAC,CAAY;AAChE,YAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,YAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,YAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,YAAQ,OAAO,WAAW,mBAAoB,QAAQ,OAAO,UAAU,IAAK;AAC5E,YAAQ,OAAO,SAAS,mBAAoB,QAAQ,OAAO,QAAQ,IAAK;AACxE,YAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,YAAQ,OAAO,YAAY,mBAAoB,QAAQ,OAAO,WAAW,IAAK;AAC9E,YAAQ,OAAO,eAAe,mBAAoB,QAAQ,OAAO,cAAc,IAAK;AAEpF,WAAO;AAAA,EACX;AASA,WAAS,cAAe,MAAc,4BAA+C;AACjF,UAAM,WAAmB,KAAK,YAAY;AAC1C,UAAM,SAAkB,aAAa;AAErC,QAAIA,UAAc,SAAS,SAAS,6BAA2B,IAAI,SAAS,cAAe,QAAS;AAEpG,QAAK,UAAW,SAAU,GAAI;AAC1B,MAAAA,QAAO,YAAY;AAAA,IACvB;AAEA,WAAOA;AAAA,EACX;AAEA,WAAS,UAAW,SAA6B;AAC7C,QAAI,OAAe;AACnB,QAAI,MAAc;AAElB,WAAQ,WAAW,CAAC,MAAO,QAAQ,UAAW,KAAK,CAAC,MAAO,QAAQ,SAAU,GAAI;AAC7E,cAAQ,QAAQ,aAAa,QAAQ;AACrC,aAAO,QAAQ,YAAY,QAAQ;AAEnC,gBAAU,QAAQ;AAAA,IACtB;AAEA,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,oBAA0B;AAC/B,UAAM,MAAmB,SAAS;AAClC,UAAM,QAAiB,OAAO,eAAe,IAAI,eAAkB,IAAI,cAAc;AACrF,UAAM,OAAgB,OAAO,eAAe,IAAI,cAAgB,IAAI,aAAa;AAEjF,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,oBAAqB,SAAc,mBAAkC;AAC1E,QAAI,QAAa;AAEjB,QAAK,SAAS,YAAY,kBAAmB;AACzC,cAAQ,SAAS,YAAY,iBAAkB,SAAS,IAAK,EAAE,iBAAkB,iBAAkB;AAAA,IACvG,WAAY,QAAQ,cAAe;AAC/B,cAAQ,QAAQ,aAAc,iBAAkB;AAAA,IACpD;AAEA,WAAO;AAAA,EACX;AAEA,WAAS,QAAS,QAAqB,MAA2B;AAC9D,QAAI;AACA,UAAK,CAAC,OAAO,SAAU,IAAK,GAAI;AAC5B,eAAO,YAAa,IAAK;AAAA,MAC7B;AAAA,IACJ,SAAU,GAAI;AACV,cAAQ,KAAM,EAAE,OAAQ;AAAA,IAC5B;AAAA,EACJ;AAEA,WAAS,WAAY,QAAqB,MAA2B;AACjE,QAAI;AACA,UAAK,OAAO,SAAU,IAAK,GAAI;AAC3B,eAAO,YAAa,IAAK;AAAA,MAC7B;AAAA,IACJ,SAAU,GAAI;AACV,cAAQ,KAAM,EAAE,OAAQ;AAAA,IAC5B;AAAA,EACJ;AAEA,WAAS,aAAc,GAAgB;AACnC,MAAE,eAAe;AACjB,MAAE,eAAe;AAAA,EACrB;AAEA,WAAS,2BAA4B,GAAe,SAA8B;AAC9E,QAAI,OAAe,EAAE;AACrB,QAAI,MAAc,EAAE;AACpB,UAAM,iBAAsB,kBAAkB;AAE9C,YAAQ,MAAM,UAAU;AAExB,QAAK,OAAO,QAAQ,cAAc,OAAO,YAAa;AAClD,cAAQ,QAAQ;AAAA,IACpB,OAAO;AACH;AAAA,IACJ;AAEA,QAAK,MAAM,QAAQ,eAAe,OAAO,aAAc;AACnD,aAAO,QAAQ;AAAA,IACnB,OAAO;AACH;AAAA,IACJ;AAEA,QAAK,OAAO,eAAe,MAAO;AAC9B,aAAO,EAAE,QAAQ;AAAA,IACrB;AAEA,QAAK,MAAM,eAAe,KAAM;AAC5B,YAAM,EAAE,QAAQ;AAAA,IACpB;AAEA,YAAQ,MAAM,OAAO,OAAO;AAC5B,YAAQ,MAAM,MAAM,MAAM;AAAA,EAC9B;AAEA,WAAS,4BAA6B,SAAsB,WAA4B;AACpF,QAAK,WAAY;AACb,UAAK,QAAQ,MAAM,YAAY,SAAU;AACrC,gBAAQ,MAAM,UAAU;AAAA,MAC5B;AAAA,IAEJ,OAAO;AACH,UAAK,QAAQ,MAAM,YAAY,QAAS;AACpC,gBAAQ,MAAM,UAAU;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,cAAe,WAAwB,WAA0B;AACtE,UAAM,gBAA6B,cAAe,KAAM;AACxD,UAAM,QAAqB,cAAe,SAAS,UAAW;AAC9D,UAAM,QAA0B,cAAe,OAAQ;AAEvD,cAAU,YAAa,aAAc;AACrC,kBAAc,YAAa,KAAM;AACjC,UAAM,YAAa,KAAM;AAEzB,UAAM,OAAO;AAEb,UAAM,YAAyB,cAAe,QAAQ,YAAa;AACnE,UAAM,OAAoB,cAAe,QAAQ,MAAO;AAExD,SAAK,YAAY;AAEjB,UAAM,YAAa,SAAU;AAC7B,UAAM,YAAa,IAAK;AAExB,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAA0B,WAAwB,WAA2B;AAClF,QAAI,WAAsC,UAAU,uBAAwB,SAAU;AAEtF,WAAQ,SAAU,CAAE,GAAI;AACpB,eAAU,CAAE,EAAE,WAAW,YAAa,SAAU,CAAE,CAAE;AAAA,IACxD;AAAA,EACJ;AASA,WAAS,uBAAwB,oBAA8B,MAAsB;AACjF,QAAK,kBAAmB,eAAgB,GAAI;AACxC,sBAAgB,MAAO,MAAM,CAAC,EAAE,MAAM,KAAM,MAAM,CAAE,CAAE;AAAA,IAC1D;AAAA,EACJ;AASA,WAAS,0BAAoC;AACzC,QAAI,OAAgB;AAEpB,QAAK,eAAe,6BAA8B;AAC9C,YAAM,MAAc,OAAO,SAAS;AACpC,YAAM,eAAoB,uBAAwB,GAAI;AAEtD,UAAK,UAAW,aAAa,SAAU,GAAI;AACvC,cAAM,UAAkB,SAAU,aAAa,WAAW,EAAG;AAE7D,YAAK,CAAC,MAAO,OAAQ,KAAK,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AAC9E,kBAAS,eAAgB,EAAE,WAAW;AAAA,QAC1C;AAAA,MACJ;AAEA,UAAK,UAAW,aAAa,MAAO,GAAI;AACpC,eAAO,aAAa,WAAW;AAAA,MACnC;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAEA,WAAS,uBAAwB,KAAoB;AACjD,UAAM,eAAuB,CAAC;AAC9B,UAAM,eAAyB,IAAI,MAAO,GAAI;AAE9C,QAAK,aAAa,SAAS,GAAI;AAC3B,YAAM,aAAuB,aAAc,CAAE,EAAE,MAAO,GAAI;AAC1D,YAAM,mBAA2B,WAAW;AAE5C,eAAU,kBAA0B,GAAG,kBAAkB,kBAAkB,mBAAoB;AAC3F,cAAM,YAAsB,WAAY,eAAgB,EAAE,MAAO,GAAI;AAErE,qBAAc,UAAW,CAAE,CAAE,IAAI,UAAW,CAAE;AAAA,MAClD;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AASA,WAAS,UAAW,OAAuB;AACvC,WAAO,UAAU,QAAQ,UAAU,UAAa;AAAA,EACpD;AAEA,WAAS,gBAAiB,QAAwB;AAC9C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,iBAAkB,QAAwB;AAC/C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,gBAAiB,QAAwB;AAC9C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,kBAAmB,QAAwB;AAChD,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,gBAAiB,QAAwB;AAC9C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,eAAgB,QAAwB;AAC7C,WAAO,gBAAiB,MAAO,KAAK,kBAAkB;AAAA,EAC1D;AASA,WAAS,oBAAqB,OAAY,cAAgC;AACtE,WAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,EAC/C;AAEA,WAAS,iBAAkB,OAAY,cAAgC;AACnE,WAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAEA,WAAS,kBAAmB,OAAY,cAAkC;AACtE,WAAO,iBAAkB,KAAM,IAAI,QAAQ;AAAA,EAC/C;AAEA,WAAS,iBAAkB,OAAY,cAAgC;AACnE,WAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAEA,WAAS,mBAAoB,OAAY,cAA6B;AAClE,WAAO,kBAAmB,KAAM,IAAI,QAAQ;AAAA,EAChD;AAEA,WAAS,iBAAkB,OAAY,cAAgC;AACnE,WAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAEA,WAAS,gBAAiB,OAAY,cAA8B;AAChE,WAAO,eAAgB,KAAM,IAAI,QAAQ;AAAA,EAC7C;AAEA,WAAS,wBAAyB,OAAY,cAA8B;AACxE,QAAIA,UAAgB;AAEpB,QAAK,gBAAiB,KAAM,GAAI;AAC5B,YAAM,SAAmB,MAAM,SAAS,EAAE,qBAAkB;AAE5D,UAAK,OAAO,WAAW,GAAI;AACvB,gBAAQ;AAAA,MACZ,OAAO;AACH,QAAAA,UAAS;AAAA,MACb;AAAA,IAEJ,OAAO;AACH,MAAAA,UAAS,gBAAiB,OAAO,YAAa;AAAA,IAClD;AAEA,WAAOA;AAAA,EACX;AAEA,WAAS,oBAAqB,cAAmC;AAC7D,UAAM,SAAuB;AAAA,MACzB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAEA,QAAI;AACA,UAAK,gBAAiB,YAAa,GAAI;AACnC,eAAO,SAAS,KAAK,MAAO,YAAa;AAAA,MAC7C;AAAA,IAEJ,SAAU,IAAK;AACX,UAAI;AACA,eAAO,SAAS,KAAM,MAAM,eAAe,GAAI;AAE/C,YAAK,kBAAmB,OAAO,MAAO,GAAI;AACtC,iBAAO,SAAS,OAAO,OAAO;AAAA,QAClC;AAAA,MAEJ,SAAU,IAAK;AACX,YAAK,CAAC,eAAe,UAAW;AAC5B,kBAAQ,MAAO,eAAe,gBAAgB,QAAS,eAAgB,GAAG,OAAQ,EAAE,QAAS,eAAgB,GAAG,OAAQ,CAAE;AAC1H,iBAAO,SAAS;AAAA,QACpB;AAEA,eAAO,SAAS;AAAA,MACpB;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AASA,WAAS,sBAA6B;AAClC,QAAK,QAAQ,OAAO,GAAI;AACpB,oBAAe,KAAM;AAErB,cAAS,eAAgB,EAAE,WAAW;AAAA,IAC1C;AAAA,EACJ;AASA,WAAS,0BAA2B,mBAAkC,MAAc;AAChF,qBAAiB,iBAAkB,kBAAkB,CAAC,CAAmB;AACzE,mBAAe,WAAW,kBAAmB,eAAe,UAAU,IAAK;AAC3E,mBAAe,kBAAkB,wBAAyB,eAAe,iBAAiB,CAAE,GAAI,CAAE;AAClG,mBAAe,kBAAkB,kBAAmB,eAAe,iBAAiB,IAAK;AACzF,mBAAe,sBAAsB,kBAAmB,eAAe,qBAAqB,IAAK;AACjG,mBAAe,mBAAmB,kBAAmB,eAAe,kBAAkB,IAAK;AAC3F,mBAAe,8BAA8B,kBAAmB,eAAe,6BAA6B,IAAK;AACjH,mBAAe,yBAAyB,kBAAmB,eAAe,wBAAwB,KAAM;AACxG,mBAAe,cAAc,kBAAmB,eAAe,aAAa,IAAK;AACjF,mBAAe,qBAAqB,kBAAmB,eAAe,oBAAoB,KAAM;AAChG,mBAAe,eAAe,iBAAkB,eAAe,cAAc,GAAI;AACjF,mBAAe,0BAA0B,kBAAmB,eAAe,yBAAyB,IAAK;AACzG,mBAAe,uCAAuC,kBAAmB,eAAe,sCAAsC,KAAM;AACpI,mBAAe,kBAAkB,kBAAmB,eAAe,iBAAiB,KAAM;AAC1F,mBAAe,mBAAmB,kBAAmB,eAAe,kBAAkB,KAAM;AAC5F,mBAAe,sBAAsB,kBAAmB,eAAe,qBAAqB,KAAM;AAClG,mBAAe,sBAAsB,kBAAmB,eAAe,qBAAqB,KAAM;AAElG,qCAAiC;AACjC,4CAAwC;AAAA,EAC5C;AAEA,WAAS,mCAA0C;AAC/C,mBAAe,iBAAiB,oBAAqB,eAAe,gBAAgB,MAAO;AAC3F,mBAAe,iBAAiB,oBAAqB,eAAe,gBAAgB,MAAO;AAC3F,mBAAe,mBAAmB,oBAAqB,eAAe,kBAAkB,QAAS;AACjG,mBAAe,yBAAyB,oBAAqB,eAAe,wBAAwB,OAAQ;AAC5G,mBAAe,qBAAqB,oBAAqB,eAAe,oBAAoB,mBAAoB;AAChH,mBAAe,kBAAkB,oBAAqB,eAAe,iBAAiB,4CAA6C;AACnI,mBAAe,6BAA6B,oBAAqB,eAAe,4BAA4B,2DAA4D;AACxK,mBAAe,2BAA2B,oBAAqB,eAAe,0BAA0B,gEAAiE;AACzK,mBAAe,8BAA8B,oBAAqB,eAAe,6BAA6B,IAAK;AAAA,EACvH;AAEA,WAAS,0CAAiD;AACtD,mBAAe,yBAAyB,mBAAoB,eAAe,wBAAwB,IAAK;AAAA,EAC5G;AASA,QAAM,UAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOvB,OAAO,SAAW,QAAgB,MAAmB;AACjD,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAAA,IAEA,MAAM,SAAW,QAAgB,MAAmB;AAChD,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAAA,IAEA,MAAM,WAAwB;AAC1B,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAAA,IAEA,QAAQ,WAAsB;AAC1B,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAAA,IAEA,YAAY,WAAsB;AAC9B,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,kBAAkB,WAAwB;AACtC,kBAAY;AAEZ,aAAO;AAAA,IACX;AAAA,IAEA,SAAS,SAAW,SAAsB,SAAsC;AAC5E,UAAK,gBAAiB,OAAQ,KAAK,gBAAiB,OAAQ,GAAI;AAC5D,qBAAc,SAAS,sBAAuB,OAAQ,CAAE;AAExD,gBAAS,eAAgB,EAAE,KAAK,KAAK;AAErC,4BAAoB;AAAA,MACxB;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,SAAW,SAAmC;AACtD,UAAK,gBAAiB,OAAQ,GAAI;AAC9B,YAAI,UAAmB;AAEvB,iBAAU,SAAS,SAAU;AACzB,cAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,qBAAU,SAAS,QAAS,KAAM,EAAE,MAAO;AACvC,kBAAK,QAAS,KAAM,EAAE,KAAK,eAAgB,KAAM,GAAI;AACjD,sBAAM,iBAAiC,QAAS,KAAM,EAAE,KAAM,KAAM;AAEpE,oBAAK,eAAe,aAAa,YAAY,SAAU;AACnD,yCAAwB,eAAe,OAAO,cAAc,eAAe,aAAa,OAAQ;AAEhG,0BAAS,KAAM,EAAE,KAAK,OAAQ,QAAS,KAAM,EAAE,KAAK,QAAS,eAAe,KAAM,GAAG,CAAE;AAEvF,yBAAO,QAAS,KAAM,EAAE,KAAM,eAAe,KAAM;AAEnD,0BAAS,KAAM,EAAE,KAAK,KAAK;AAE3B,4BAAU;AACV;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAEA,YAAK,CAAC,SAAU;AACZ,mCAA0B,SAAS,iBAAkB;AAAA,QACzD,OAAO;AACH,8BAAoB;AAAA,QACxB;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,SAAW,QAAgB,MAAmB;AACtD,0BAAoB;AAEpB,eAAU,aAAa,SAAU;AAC7B,YAAK,QAAQ,eAAgB,SAAU,GAAI;AACvC,cAAK,CAAC,gBAAiB,KAAM,KAAK,UAAU,WAAY;AACpD,qBAAU,SAAS,QAAS,SAAU,EAAE,MAAO;AAC3C,kBAAK,QAAS,SAAU,EAAE,KAAK,eAAgB,KAAM,GAAI;AACrD,sBAAM,iBAAiC,QAAS,SAAU,EAAE,KAAM,KAAM;AAExE,uCAAwB,eAAe,OAAO,cAAc,eAAe,aAAa,OAAQ;AAAA,cACpG;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,UAAK,gBAAiB,KAAM,GAAI;AAC5B,YAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,iBAAO,QAAS,KAAM;AAAA,QAC1B;AAAA,MAEJ,OAAO;AACH,kBAAU,CAAC;AAAA,MACf;AAEA,UAAK,CAAC,gBAAiB,KAAM,KAAK,UAAU,iBAAkB;AAC1D,0BAAmB,OAAQ;AAAA,MAC/B;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,WAAwB;AAChC,+BAA0B,SAAS,MAAM,iBAAkB;AAE3D,aAAO;AAAA,IACX;AAAA,IAEA,kBAAkB,WAAwB;AACtC,cAAS,eAAgB,EAAE,KAAK,QAAQ;AAExC,0BAAoB;AAEpB,aAAO;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,kBAAkB,SAAW,kBAA8C;AACvE,UAAK,gBAAiB,gBAAiB,GAAI;AACvC,YAAI,0BAAmC;AAEvC,iBAAU,gBAAgB,kBAAmB;AACzC,cAAK,iBAAiB,eAAgB,YAAa,KAAK,eAAe,eAAgB,YAAa,KAAK,eAAgB,YAAa,MAAM,iBAAkB,YAAa,GAAI;AAC3K,2BAAgB,YAAa,IAAI,iBAAkB,YAAa;AAChE,sCAA0B;AAAA,UAC9B;AAAA,QACJ;AAEA,YAAK,yBAA0B;AAC3B,oCAA2B,cAAe;AAAA,QAC9C;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,YAAY,WAAoB;AAC5B,aAAO;AAAA,IACX;AAAA,EACJ;AASA,GAAE,MAAM;AACJ,8BAA0B;AAE1B,aAAS,iBAAkB,oBAAoB,WAAW;AACtD,wBAAkB;AAClB,+BAAyB;AACzB,mBAAa;AACb,oBAAc;AACd,kBAAY;AACZ,0BAAoB;AAEpB,UAAK,wBAAwB,GAAI;AAC7B,gBAAQ,KAAK;AAAA,MACjB;AAAA,IACJ,CAAE;AAEF,QAAK,CAAC,UAAW,OAAO,QAAS,GAAI;AACjC,aAAO,WAAW;AAAA,IACtB;AAAA,EACJ,GAAK;AACT,GAAK","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n show: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n hide: function () : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n isOpen: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n isComplete: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", function() {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 3cc7d50..5bcc878 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -1381,4 +1381,4 @@ type StringToJson = { window.$journey = _public; } } ) (); -} ); \ No newline at end of file +} ) (); \ No newline at end of file From 2dc63701f4ee23935414f6235bef36d60b11f023 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 14:54:21 +0100 Subject: [PATCH 20/44] Added missing API code. --- dist/journey.esm.js | 37 ++++++++++++++++++++++++++++--------- dist/journey.esm.js.map | 2 +- dist/journey.js | 29 ++++++++++++++++++++++++----- dist/journey.js.map | 2 +- src/journey.ts | 36 +++++++++++++++++++++++++++++++----- 5 files changed, 85 insertions(+), 21 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index 49da1c7..1531d82 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -655,11 +655,11 @@ var require_journey = __commonJS({ o.appendChild(n); n.appendChild(i); i.type = "checkbox"; - const l = createElement("span", "check-mark"); - const r = createElement("span", "text"); - r.innerHTML = t; - n.appendChild(l); + const r = createElement("span", "check-mark"); + const l = createElement("span", "text"); + l.innerHTML = t; n.appendChild(r); + n.appendChild(l); return { input: i, label: n @@ -830,19 +830,38 @@ var require_journey = __commonJS({ } const _public = { start: function(e = null) { - throw new Error("Function not implemented."); + if (!_public.isOpen()) { + _groups_Current = getDefaultString(e, _groups_Default); + if (_groups.hasOwnProperty(_groups_Current)) { + _groups[_groups_Current].position = 0; + showDialogAndSetPosition(); + } + } + return _public; }, show: function(e = null) { - throw new Error("Function not implemented."); + if (!_public.isOpen()) { + _groups_Current = getDefaultString(e, _groups_Current); + if (_groups.hasOwnProperty(_groups_Current)) { + if (_groups[_groups_Current].position === _groups[_groups_Current].keys.length - 1) { + _groups[_groups_Current].position = 0; + } + showDialogAndSetPosition(); + } + } + return _public; }, hide: function() { - throw new Error("Function not implemented."); + if (_public.isOpen()) { + onDialogClose(); + } + return _public; }, isOpen: function() { - throw new Error("Function not implemented."); + return isDefined(_element_Dialog) && _element_Dialog.style.display === "block"; }, isComplete: function() { - throw new Error("Function not implemented."); + return _groups[_groups_Current].position >= _groups[_groups_Current].keys.length - 1; }, addDocumentSteps: function() { getElements(); diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index d2bc762..c5cb511 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":";;;;;;;;;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAaiB;AAbjB;AAAA;AAaO,MAAUA,eAAV;AACI,MAAMA,WAAA,4BAA4B;AAAA,OAD5B;AAAA;AAAA;;;ACbjB;AAAA;AAmBA;AACA;AAUA,KAAE,MAAM;AAEJ,UAAI,iBAAgC,CAAC;AAGrC,UAAI,qCAA8C;AAGlD,YAAM,kBAA0B;AAChC,UAAI,kBAA0B;AAC9B,UAAI,UAAkB,CAAC;AAGvB,UAAI,uCAA+C;AAGnD,UAAI,+BAA4C;AAGhD,UAAI,kBAA+B;AACnC,UAAI,+BAA4C;AAChD,UAAI,wBAAqC;AACzC,UAAI,8BAA2C;AAC/C,UAAI,qCAAkD;AACtD,UAAI,iCAAmD;AACvD,UAAI,+BAA4C;AAChD,UAAI,8BAA2C;AAC/C,UAAI,yCAAsD;AAC1D,UAAI,8CAA2D;AAC/D,UAAI,0BAAuC;AAC3C,UAAI,sCAAwD;AAC5D,UAAI,sCAAwD;AAC5D,UAAI,yBAAkC;AAGtC,UAAI,kCAA0C;AAC9C,UAAI,kCAA0C;AAC9C,UAAI,gCAAyC;AAC7C,UAAI,yBAAiC;AACrC,UAAI,yBAAiC;AAGrC,UAAI,mBAAmB;AACvB,UAAI,yBAAiC;AASrC,eAAS,kBAAmB,SAAc,MAAc;AACpD,kBAAU,iBAAkB,QAAQ,CAAC,CAAE;AAEvC,gBAAS,eAAgB,IAAI;AAAA,UACzB,MAAM,CAAC;AAAA,UACP,MAAM,CAAC;AAAA,UACP,UAAU;AAAA,QACd;AAAA,MACJ;AAEA,eAAS,cAAe,OAAuB;AAC3C,YAAK,CAAC,QAAQ,eAAgB,KAAM,GAAI;AACpC,kBAAS,KAAM,IAAI;AAAA,YACf,MAAM,CAAC;AAAA,YACP,MAAM,CAAC;AAAA,YACP,UAAU;AAAA,UACd;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,yBAA0C;AAC/C,eAAO,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,QAAS,CAAE;AAAA,MACnH;AASA,eAAS,2BAAkC;AACvC,uCAA+B,cAAe,OAAO,gCAAiC;AAEtF,qCAA6B,UAAU,WAAW;AAC9C,cAAK,eAAe,sCAAuC;AACvD,0BAAc;AAAA,UAClB;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,yBAAgC;AACrC,gBAAS,SAAS,MAAM,4BAA6B;AAAA,MACzD;AAEA,eAAS,yBAAgC;AACrC,mBAAY,SAAS,MAAM,4BAA6B;AAAA,MAC5D;AASA,eAAS,eAAsB;AAC3B,0BAAkB,cAAe,OAAO,mBAAoB;AAC5D,wBAAgB,MAAM,UAAU;AAChC,iBAAS,KAAK,YAAa,eAAgB;AAE3C,uCAA+B,cAAe,UAAU,OAAQ;AAChE,wBAAgB,YAAa,4BAA6B;AAE1D,qCAA6B,UAAU,WAAW;AAC9C,wBAAc;AAAA,QAClB;AAEA,mBAAY,8BAA8B,eAAe,sBAAuB;AAEhF,gCAAwB,cAAe,OAAO,OAAQ;AACtD,wBAAgB,YAAa,qBAAsB;AAEnD,sCAA8B,cAAe,OAAO,aAAc;AAClE,wBAAgB,YAAa,2BAA4B;AAEzD,6CAAqC,cAAe,OAAO,oBAAqB;AAChF,wBAAgB,YAAa,kCAAmC;AAEhE,yCAAiC,cAAe,oCAAoC,eAAe,kBAAmB,EAAE;AAExH,uCAA+B,WAAW,WAAW;AACjD,cAAK,eAAe,oBAAqB;AACrC,mCAAwB,eAAe,wBAAwB,+BAA+B,OAAQ;AAAA,UAC1G;AAAA,QACJ;AAEA,uCAA+B,cAAe,OAAO,eAAgB;AACrE,wBAAgB,YAAa,4BAA6B;AAE1D,sCAA8B,cAAe,OAAO,cAAe;AACnE,wBAAgB,YAAa,2BAA4B;AAEzD,iDAAyC,cAAe,OAAO,yBAA0B;AACzF,oCAA4B,YAAa,sCAAuC;AAEhF,sDAA8C,cAAe,KAAK,8BAA+B;AACjG,+CAAuC,YAAa,2CAA4C;AAEhG,kCAA0B,cAAe,OAAO,SAAU;AAC1D,wBAAgB,YAAa,uBAAwB;AAErD,8CAAsC,cAAe,UAAU,MAAO;AACtE,4CAAoC,UAAU;AAC9C,gCAAwB,YAAa,mCAAoC;AAEzE,8CAAsC,cAAe,UAAU,MAAO;AACtE,4CAAoC,UAAU;AAC9C,gCAAwB,YAAa,mCAAoC;AAEzE,0BAAkB;AAAA,MACtB;AAEA,eAAS,cAAe,sBAA+B,MAAc;AACjE,YAAI,YAAqB;AAEzB,YAAK,gBAAiB,eAAe,2BAA4B,KAAK,qBAAsB;AACxF,sBAAY,QAAS,eAAe,2BAA4B;AAAA,QACpE,OAAO;AACH,sBAAY;AAAA,QAChB;AAEA,YAAK,WAAY;AACb,gBAAM,iBAAiC,uBAAuB;AAE9D,cAAK,UAAW,cAAe,KAAK,UAAW,eAAe,aAAa,OAAQ,GAAI;AACnF,mCAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,UAC/F;AAEA,0CAAiC,KAAM;AACvC,iCAAuB;AACvB,sBAAY;AAEZ,0BAAgB,MAAM,UAAU;AAAA,QACpC;AAAA,MACJ;AAEA,eAAS,eAAsB;AAC3B,YAAK,QAAS,eAAgB,EAAE,WAAW,GAAI;AAC3C,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE;AAE3B,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,eAAsB;AAC3B,YAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,gBAAM,iBAAiC,uBAAuB;AAE9D,wBAAe,KAAM;AACrB,iCAAwB,eAAe,OAAO,UAAU,eAAe,aAAa,OAAQ;AAAA,QAEhG,OAAO;AACH,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE;AAE3B,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,2BAAkC;AACvC,cAAM,iBAAiC,uBAAuB;AAE9D,YAAK,UAAW,cAAe,KAAK,UAAW,eAAe,aAAa,OAAQ,GAAI;AACnF,cAAK,eAAe,wBAAyB;AACzC,mCAAuB;AAAA,UAC3B,OAAO;AACH,mCAAuB;AAAA,UAC3B;AAEA,sBAAY;AAEZ,uCAA6B,MAAM,UAAU,eAAe,kBAAkB,UAAS;AACvF,+CAAqC;AAErC,yBAAe,aAAa,QAAQ,+BAA0B;AAE9D,cAAK,eAAe,kBAAmB;AACnC,2BAAe,aAAa,QAAQ,eAAe;AAAA,UACvD;AAEA,gBAAM,oBAA4B,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAEvG,cAAK,wCAAoC,kBAAkB,YAAY,MAAM,UAAW;AACpF,mDAAuC;AACvC,2BAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,UACzD;AAEA,sCAA6B,oCAAoC,eAAe,kBAAmB;AACnG,sCAA6B,8BAA8B,eAAe,oBAAoB,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AACzI,sCAA6B,6BAA6B,eAAe,mBAAmB,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AACvI,sCAA6B,6CAA6C,eAAe,mBAAoB;AAC7G,sCAA6B,yBAAyB,eAAe,WAAY;AAEjF,8CAAoC,YAAY,eAAe;AAC/D,8CAAoC,WAAW,QAAS,eAAgB,EAAE,aAAa;AAEvF,cAAK,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACrF,gDAAoC,YAAY,eAAe;AAAA,UACnE,OAAO;AACH,gDAAoC,YAAY,eAAe;AAAA,UACnE;AAEA,wBAAe,cAAe;AAC9B,4BAAmB,MAAM,cAAe;AACxC,2BAAiB;AACjB,iCAAuB;AACvB,iCAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAE3F,cAAK,eAAe,WAAY;AAC5B,2BAAe,aAAa,QAAQ,MAAM;AAAA,UAC9C;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,cAAe,gBAAwC;AAC5D,YAAK,gBAAiB,eAAe,KAAM,GAAI;AAC3C,gCAAsB,YAAY,eAAe;AAAA,QACrD,OAAO;AACH,gCAAsB;AAAA,QAC1B;AAEA,YAAK,gBAAiB,eAAe,WAAY,GAAI;AACjD,sCAA4B,YAAY,eAAe;AAAA,QAC3D,OAAO;AACH,sCAA4B;AAAA,QAChC;AAAA,MACJ;AAEA,eAAS,kBAAmB,GAAQ,gBAAwC;AACxE,YAAK,gBAAgB,MAAM,YAAY,SAAU;AAC7C,0BAAgB,MAAM,UAAU;AAEhC,iCAAwB,eAAe,OAAO,QAAQ,eAAe,aAAa,OAAQ;AAAA,QAC9F;AAEA,YAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,iCAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,QAC/F;AAEA,iCAAyB,eAAe,WAAW;AAEnD,YAAK,eAAe,UAAU,eAAe,QAAS;AAClD,cAAK,eAAe,UAAU,eAAe,0BAA2B;AACpE,uCAA4B,GAAG,eAAgB;AAAA,UAEnD,OAAO;AACH,kBAAM,SAAc,UAAW,eAAe,aAAa,OAAQ;AACnE,gBAAI,MAAgB,OAAO,MAAQ,eAAe,aAAa,QAAQ;AACvE,gBAAI,OAAiB,OAAO;AAE5B,gBAAK,OAAO,gBAAgB,cAAc,OAAO,cAAc,eAAe,YAAa;AACvF,sBAAS,gBAAgB;AACzB,sBAAQ,eAAe,aAAa,QAAQ;AAAA,YAChD;AAEA,gBAAK,MAAM,gBAAgB,eAAe,OAAO,eAAe,eAAe,UAAW;AACtF,qBAAS,gBAAgB,eAAe,eAAe,aAAa,QAAQ;AAAA,YAChF;AAEA,4BAAgB,MAAM,MAAM,MAAM;AAClC,4BAAgB,MAAM,OAAO,OAAO;AAAA,UACxC;AAAA,QAEJ,OAAO;AACH,gBAAM,iBAAsB,kBAAkB;AAC9C,gBAAM,aAAqB,KAAK,IAAK,IAAO,OAAO,aAAa,gBAAgB,eAAgB,IAAM,eAAe,IAAK;AAC1H,gBAAM,YAAoB,KAAK,IAAK,IAAO,OAAO,cAAc,gBAAgB,gBAAiB,IAAM,eAAe,GAAI;AAE1H,0BAAgB,MAAM,OAAO,aAAa;AAC1C,0BAAgB,MAAM,MAAM,YAAY;AAAA,QAC5C;AAAA,MACJ;AAEA,eAAS,gCAAiC,oBAA6B,MAAc;AACjF,cAAM,iBAAiC,uBAAuB;AAE9D,YAAK,UAAW,cAAe,KAAK,UAAW,eAAe,aAAa,OAAQ,GAAI;AACnF,yBAAe,aAAa,QAAQ,YAAY,eAAe,aAAa,QAAQ,UAAU,0BAAsB,0CAAuC;AAE3J,cAAK,UAAW,oCAAqC,GAAI;AACrD,2BAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,UACzD;AAEA,cAAK,mBAAoB;AACrB,mCAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,UAC/F;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,mBAA0B;AAC/B,qCAA6B;AAE7B,YAAK,eAAe,kBAAmB;AACnC,gBAAM,aAAqB,QAAS,eAAgB,EAAE,KAAK;AAE3D,mBAAU,WAAmB,GAAG,WAAW,YAAY,YAAa;AAChE,6BAAkB,UAAU,QAAS,eAAgB,EAAE,KAAM,QAAS,CAAE;AAAA,UAC5E;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,iBAAkB,UAAkB,OAAuB;AAChE,cAAM,iBAAiC,QAAS,eAAgB,EAAE,KAAM,KAAM;AAC9E,YAAI,MAAmB;AAEvB,YAAK,aAAa,QAAS,eAAgB,EAAE,UAAW;AACpD,gBAAM,cAAe,OAAO,YAAa;AAAA,QAC7C,OAAO;AAEH,gBAAM,cAAe,OAAO,KAAM;AAElC,cAAI,UAAU,WAAW;AACrB,4CAAgC;AAEhC,oBAAS,eAAgB,EAAE,WAAW;AAEtC,qCAAyB;AAAA,UAC7B;AAAA,QACJ;AAEA,qCAA6B,YAAa,GAAI;AAE9C,YAAK,eAAe,yBAA0B;AAC1C,cAAK,gBAAiB,eAAe,OAAQ,GAAI;AAC7C,uBAAY,KAAK,eAAe,OAAQ;AAAA,UAC5C,OAAO;AACH,uBAAY,KAAK,eAAe,KAAM;AAAA,UAC1C;AAAA,QACJ;AAEA,YAAK,eAAe,wBAAyB;AACzC,cAAI,aAAa;AACjB,cAAI,aAAc,WAAW,GAAI,SAAS;AAAA,QAC9C;AAAA,MACJ;AAEA,eAAS,yBAAgC;AACrC,YAAK,eAAe,iBAAkB;AAClC,gBAAM,iBAAyB,4BAA4B,cAAc,QAAS,eAAgB,EAAE,KAAK;AACzG,gBAAM,SAAkB,QAAS,eAAgB,EAAE,WAAW,KAAM;AACpE,gBAAM,qBAA6B,KAAK,MAAU,QAAS,eAAgB,EAAE,WAAW,KAAM,QAAS,eAAgB,EAAE,KAAK,SAAW,GAAI;AAE7I,iDAAuC,MAAM,QAAQ,QAAQ;AAC7D,sDAA4C,YAAY,qBAAqB;AAAA,QACjF;AAAA,MACJ;AASA,eAAS,oBAA2B;AAChC,8BAAsB,cAAc;AACpC,8BAAsB,YAAY;AAClC,8BAAsB,gBAAgB;AAEtC,iBAAS,KAAK,iBAAkB,aAAa,uBAAwB;AACrE,iBAAS,KAAK,iBAAkB,cAAc,wBAAyB;AAAA,MAC3E;AAEA,eAAS,wBAAyB,GAAuB;AACrD,YAAK,CAAC,iCAAiC,CAAC,0BAA0B,eAAe,qBAAsB;AACnG,0BAAgB,aAAa;AAC7B,0CAAgC;AAChC,mCAAyB,EAAE,QAAQ,gBAAgB;AACnD,mCAAyB,EAAE,QAAQ,gBAAgB;AACnD,4CAAkC,gBAAgB;AAClD,4CAAkC,gBAAgB;AAAA,QACtD;AAAA,MACJ;AAEA,eAAS,wBAA+B;AACpC,YAAK,+BAAgC;AACjC,0CAAgC;AAChC,4CAAkC;AAClC,4CAAkC;AAClC,0BAAgB,YAAY;AAAA,QAChC;AAAA,MACJ;AAEA,eAAS,wBAAyB,GAAuB;AACrD,YAAK,+BAAgC;AACjC,0BAAgB,MAAM,OAAS,EAAE,QAAQ,yBAA2B;AACpE,0BAAgB,MAAM,MAAQ,EAAE,QAAQ,yBAA2B;AAAA,QACvE;AAAA,MACJ;AAEA,eAAS,2BAAkC;AACvC,YAAK,+BAAgC;AACjC,0BAAgB,MAAM,OAAO,kCAAkC;AAC/D,0BAAgB,MAAM,MAAM,kCAAkC;AAE9D,0CAAgC;AAChC,4CAAkC;AAClC,4CAAkC;AAClC,0BAAgB,YAAY;AAAA,QAChC;AAAA,MACJ;AASA,eAAS,gBAAuB;AAC5B,YAAK,CAAC,UAAW,gBAAiB,GAAI;AAClC,6BAAmB,cAAe,OAAO,oBAAqB;AAC9D,2BAAiB,MAAM,UAAU;AAEjC,mBAAS,KAAK,YAAa,gBAAiB;AAE5C,mBAAS,KAAK,iBAAkB,aAAa,WAAW;AACpD,wBAAY;AAAA,UAChB,CAAE;AAEF,mBAAS,iBAAkB,UAAU,WAAW;AAC5C,wBAAY;AAAA,UAChB,CAAE;AAAA,QACN;AAAA,MACJ;AAEA,eAAS,WAAY,SAAsB,MAAsB;AAC7D,YAAK,YAAY,MAAO;AACpB,kBAAQ,cAAc,SAAU,GAAI;AAChC,wBAAa,GAAG,IAAK;AAAA,UACzB;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,YAAa,GAAQ,MAAsB;AAChD,qBAAc,CAAE;AAChB,oBAAY;AAEZ,iCAAyB,WAAY,WAAW;AAC5C,2BAAiB,YAAY;AAC7B,2BAAiB,MAAM,UAAU;AAEjC,qCAA4B,GAAG,gBAAiB;AAAA,QACpD,GAAG,eAAe,YAAa;AAAA,MACnC;AAEA,eAAS,cAAqB;AAC1B,YAAK,UAAW,gBAAiB,GAAI;AACjC,cAAK,2BAA2B,GAAI;AAChC,yBAAc,sBAAuB;AACrC,qCAAyB;AAAA,UAC7B;AAEA,cAAK,iBAAiB,MAAM,YAAY,SAAU;AAC9C,6BAAiB,MAAM,UAAU;AAAA,UACrC;AAAA,QACJ;AAAA,MACJ;AASA,eAAS,cAAqB;AAC1B,cAAM,WAAqB,eAAe;AAC1C,cAAM,iBAAyB,SAAS;AAExC,iBAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,gBAAM,cAAyC,SAAS,qBAAsB,SAAU,YAAa,CAAE;AACvG,gBAAM,WAA0B,CAAC,EAAE,MAAM,KAAM,WAAY;AAC3D,gBAAM,iBAAyB,SAAS;AAExC,mBAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,gBAAK,CAAC,WAAY,SAAU,YAAa,CAAE,GAAI;AAC3C;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAEA,gBAAS,eAAgB,EAAE,KAAK,KAAK;AAAA,MACzC;AAEA,eAAS,WAAY,SAAiC;AAClD,YAAIC,UAAkB;AAEtB,YAAK,UAAW,OAAQ,KAAK,QAAQ,aAAc,UAAU,yBAA0B,GAAI;AACvF,gBAAM,qBAA6B,QAAQ,aAAc,UAAU,yBAA0B;AAE7F,cAAK,gBAAiB,kBAAmB,GAAI;AACzC,kBAAM,iBAA+B,oBAAqB,kBAAmB;AAE7E,gBAAK,eAAe,UAAU,gBAAiB,eAAe,MAAO,GAAI;AACrE,2BAAc,SAAS,sBAAuB,eAAe,MAAO,CAAE;AAAA,YAE1E,OAAO;AACH,kBAAK,CAAC,eAAe,UAAW;AAC5B,wBAAQ,MAAO,eAAe,2BAA2B,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC9H,gBAAAA,UAAS;AAAA,cACb;AAAA,YACJ;AAAA,UAEJ,OAAO;AACH,gBAAK,CAAC,eAAe,UAAW;AAC5B,sBAAQ,MAAO,eAAe,yBAAyB,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC5H,cAAAA,UAAS;AAAA,YACb;AAAA,UACJ;AAAA,QACJ;AAEA,eAAOA;AAAA,MACX;AAEA,eAAS,aAAc,SAAsB,gBAAwC;AACjF,uBAAe,eAAe,CAAC;AAC/B,uBAAe,aAAa,UAAU;AAEtC,YAAK,gBAAiB,eAAe,KAAM,MAAO,gBAAiB,eAAe,KAAM,KAAK,gBAAiB,eAAe,WAAY,IAAM;AAC3I,kBAAQ,gBAAiB,UAAU,yBAA0B;AAE7D,cAAK,CAAC,eAAe,QAAS;AAC1B,0BAAe,eAAe,KAAM;AAEpC,oBAAS,eAAe,KAAM,EAAE,KAAM,eAAe,KAAM,IAAI;AAC/D,oBAAS,eAAe,KAAM,EAAE,KAAK,KAAM,eAAe,KAAM;AAEhE,mCAAwB,eAAe,OAAO,WAAW,OAAQ;AAAA,UAErE,OAAO;AACH,uBAAY,cAAe;AAAA,UAC/B;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,WAAY,gBAAwC;AACzD,cAAM,gBAAwB,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAEnG,YAAK,oCAAgC,cAAc,YAAY,MAAM,UAAW;AAC5E,yBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,QACzD;AAEA,cAAM,OAAoB,cAAe,OAAO,iBAAkB;AAClE,uBAAe,aAAa,QAAQ,YAAa,IAAK;AAEtD,aAAK,UAAU,SAAU,GAAI;AACzB,uBAAc,CAAE;AAEhB,6CAAmC,MAAM,UAAU;AACnD,uCAA6B,MAAM,UAAU;AAC7C,sCAA4B,MAAM,UAAU;AAC5C,kCAAwB,MAAM,UAAU;AACxC,+CAAqC;AAErC,wBAAe,cAAe;AAC9B,4BAAmB,GAAG,cAAe;AAErC,cAAK,eAAe,sBAAuB;AACvC,qCAA0B,eAAe,aAAa,SAAS,iBAAkB;AAAA,UACrF;AAAA,QACJ;AAAA,MACJ;AASA,eAAS,oBAAqB,YAAqB,MAAc;AAC7D,cAAM,eAAyB,YAAY,SAAS,mBAAmB,SAAS;AAChF,cAAM,aAAuB,YAAY,OAAO,mBAAmB,OAAO;AAE1E,YAAK,eAAe,qBAAsB;AACtC,uBAAc,WAAW,eAAgB;AAAA,QAC7C;AAEA,mBAAY,UAAU,cAAe;AAAA,MACzC;AAEA,eAAS,gBAAiB,GAA0B;AAChD,YAAK,QAAQ,OAAO,KAAK,eAAe,qBAAsB;AAC1D,cAAK,EAAE,6BAA6B;AAChC,cAAE,eAAe;AACjB,0BAAc;AAAA,UAClB,OAAO;AAEH,gBAAK,oCAAqC;AACtC,kBAAK,EAAE,2BAA2B;AAC9B,kBAAE,eAAe;AACjB,6BAAa;AAAA,cAEjB,WAAY,EAAE,4BAA4B;AACtC,kBAAE,eAAe;AACjB,6BAAa;AAAA,cAEjB,WAAY,EAAE,yBAAyB;AACnC,kBAAE,eAAe;AACjB,kCAAkB;AAAA,cAEtB,WAAY,EAAE,2BAA2B;AACrC,kBAAE,eAAe;AACjB,oCAAoB;AAAA,cACxB;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,iBAAwB;AAC7B,YAAK,QAAQ,OAAO,GAAI;AACpB,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,oBAA2B;AAChC,YAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE,WAAW;AAEtC,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,sBAA6B;AAClC,YAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS;AAE/E,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AASA,eAAS,sBAAuB,YAAkB;AAC9C,YAAI,UAA0B,CAAC,gBAAiB,UAAW,IAAI,CAAC,IAAsB;AACtF,gBAAQ,QAAQ,iBAAkB,QAAQ,OAAO,CAAE;AACnD,gBAAQ,SAAS,kBAAmB,QAAQ,QAAQ,IAAK;AACzD,gBAAQ,YAAY,kBAAmB,QAAQ,WAAW,KAAM;AAChE,gBAAQ,WAAW,kBAAmB,QAAQ,UAAU,KAAM;AAC9D,gBAAQ,aAAa,kBAAmB,QAAQ,YAAY,KAAM;AAClE,gBAAQ,SAAS,kBAAmB,QAAQ,QAAQ,KAAM;AAC1D,gBAAQ,2BAA2B,kBAAmB,QAAQ,0BAA0B,KAAM;AAC9F,gBAAQ,yBAAyB,kBAAmB,QAAQ,wBAAwB,IAAK;AACzF,gBAAQ,uBAAuB,kBAAmB,QAAQ,sBAAsB,KAAM;AACtF,gBAAQ,QAAQ,iBAAkB,QAAQ,OAAO,eAAgB;AAEjE,kBAAU,4BAA6B,OAAQ;AAE/C,eAAO,mCAAoC,OAAQ;AAAA,MACvD;AAEA,eAAS,4BAA6B,SAA2C;AAC7E,gBAAQ,QAAQ,iBAAkB,QAAQ,OAAO,IAAK;AACtD,gBAAQ,cAAc,iBAAkB,QAAQ,aAAa,IAAK;AAClE,gBAAQ,UAAU,iBAAkB,QAAQ,SAAS,IAAK;AAE1D,eAAO;AAAA,MACX;AAEA,eAAS,mCAAoC,SAA2C;AACpF,gBAAQ,SAAS,iBAAkB,QAAQ,QAAQ,CAAC,CAAY;AAChE,gBAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,gBAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,gBAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,gBAAQ,OAAO,WAAW,mBAAoB,QAAQ,OAAO,UAAU,IAAK;AAC5E,gBAAQ,OAAO,SAAS,mBAAoB,QAAQ,OAAO,QAAQ,IAAK;AACxE,gBAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,gBAAQ,OAAO,YAAY,mBAAoB,QAAQ,OAAO,WAAW,IAAK;AAC9E,gBAAQ,OAAO,eAAe,mBAAoB,QAAQ,OAAO,cAAc,IAAK;AAEpF,eAAO;AAAA,MACX;AASA,eAAS,cAAe,MAAc,4BAA+C;AACjF,cAAM,WAAmB,KAAK,YAAY;AAC1C,cAAM,SAAkB,aAAa;AAErC,YAAIA,UAAc,SAAS,SAAS,6BAA2B,IAAI,SAAS,cAAe,QAAS;AAEpG,YAAK,UAAW,SAAU,GAAI;AAC1B,UAAAA,QAAO,YAAY;AAAA,QACvB;AAEA,eAAOA;AAAA,MACX;AAEA,eAAS,UAAW,SAA6B;AAC7C,YAAI,OAAe;AACnB,YAAI,MAAc;AAElB,eAAQ,WAAW,CAAC,MAAO,QAAQ,UAAW,KAAK,CAAC,MAAO,QAAQ,SAAU,GAAI;AAC7E,kBAAQ,QAAQ,aAAa,QAAQ;AACrC,iBAAO,QAAQ,YAAY,QAAQ;AAEnC,oBAAU,QAAQ;AAAA,QACtB;AAEA,eAAO;AAAA,UACH;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,oBAA0B;AAC/B,cAAM,MAAmB,SAAS;AAClC,cAAM,QAAiB,OAAO,eAAe,IAAI,eAAkB,IAAI,cAAc;AACrF,cAAM,OAAgB,OAAO,eAAe,IAAI,cAAgB,IAAI,aAAa;AAEjF,eAAO;AAAA,UACH;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,oBAAqB,SAAc,mBAAkC;AAC1E,YAAI,QAAa;AAEjB,YAAK,SAAS,YAAY,kBAAmB;AACzC,kBAAQ,SAAS,YAAY,iBAAkB,SAAS,IAAK,EAAE,iBAAkB,iBAAkB;AAAA,QACvG,WAAY,QAAQ,cAAe;AAC/B,kBAAQ,QAAQ,aAAc,iBAAkB;AAAA,QACpD;AAEA,eAAO;AAAA,MACX;AAEA,eAAS,QAAS,QAAqB,MAA2B;AAC9D,YAAI;AACA,cAAK,CAAC,OAAO,SAAU,IAAK,GAAI;AAC5B,mBAAO,YAAa,IAAK;AAAA,UAC7B;AAAA,QACJ,SAAU,GAAI;AACV,kBAAQ,KAAM,EAAE,OAAQ;AAAA,QAC5B;AAAA,MACJ;AAEA,eAAS,WAAY,QAAqB,MAA2B;AACjE,YAAI;AACA,cAAK,OAAO,SAAU,IAAK,GAAI;AAC3B,mBAAO,YAAa,IAAK;AAAA,UAC7B;AAAA,QACJ,SAAU,GAAI;AACV,kBAAQ,KAAM,EAAE,OAAQ;AAAA,QAC5B;AAAA,MACJ;AAEA,eAAS,aAAc,GAAgB;AACnC,UAAE,eAAe;AACjB,UAAE,eAAe;AAAA,MACrB;AAEA,eAAS,2BAA4B,GAAe,SAA8B;AAC9E,YAAI,OAAe,EAAE;AACrB,YAAI,MAAc,EAAE;AACpB,cAAM,iBAAsB,kBAAkB;AAE9C,gBAAQ,MAAM,UAAU;AAExB,YAAK,OAAO,QAAQ,cAAc,OAAO,YAAa;AAClD,kBAAQ,QAAQ;AAAA,QACpB,OAAO;AACH;AAAA,QACJ;AAEA,YAAK,MAAM,QAAQ,eAAe,OAAO,aAAc;AACnD,iBAAO,QAAQ;AAAA,QACnB,OAAO;AACH;AAAA,QACJ;AAEA,YAAK,OAAO,eAAe,MAAO;AAC9B,iBAAO,EAAE,QAAQ;AAAA,QACrB;AAEA,YAAK,MAAM,eAAe,KAAM;AAC5B,gBAAM,EAAE,QAAQ;AAAA,QACpB;AAEA,gBAAQ,MAAM,OAAO,OAAO;AAC5B,gBAAQ,MAAM,MAAM,MAAM;AAAA,MAC9B;AAEA,eAAS,4BAA6B,SAAsB,WAA4B;AACpF,YAAK,WAAY;AACb,cAAK,QAAQ,MAAM,YAAY,SAAU;AACrC,oBAAQ,MAAM,UAAU;AAAA,UAC5B;AAAA,QAEJ,OAAO;AACH,cAAK,QAAQ,MAAM,YAAY,QAAS;AACpC,oBAAQ,MAAM,UAAU;AAAA,UAC5B;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,cAAe,WAAwB,WAA0B;AACtE,cAAM,gBAA6B,cAAe,KAAM;AACxD,cAAM,QAAqB,cAAe,SAAS,UAAW;AAC9D,cAAM,QAA0B,cAAe,OAAQ;AAEvD,kBAAU,YAAa,aAAc;AACrC,sBAAc,YAAa,KAAM;AACjC,cAAM,YAAa,KAAM;AAEzB,cAAM,OAAO;AAEb,cAAM,YAAyB,cAAe,QAAQ,YAAa;AACnE,cAAM,OAAoB,cAAe,QAAQ,MAAO;AAExD,aAAK,YAAY;AAEjB,cAAM,YAAa,SAAU;AAC7B,cAAM,YAAa,IAAK;AAExB,eAAO;AAAA,UACH;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,yBAA0B,WAAwB,WAA2B;AAClF,YAAI,WAAsC,UAAU,uBAAwB,SAAU;AAEtF,eAAQ,SAAU,CAAE,GAAI;AACpB,mBAAU,CAAE,EAAE,WAAW,YAAa,SAAU,CAAE,CAAE;AAAA,QACxD;AAAA,MACJ;AASA,eAAS,uBAAwB,oBAA8B,MAAsB;AACjF,YAAK,kBAAmB,eAAgB,GAAI;AACxC,0BAAgB,MAAO,MAAM,CAAC,EAAE,MAAM,KAAM,MAAM,CAAE,CAAE;AAAA,QAC1D;AAAA,MACJ;AASA,eAAS,0BAAoC;AACzC,YAAI,OAAgB;AAEpB,YAAK,eAAe,6BAA8B;AAC9C,gBAAM,MAAc,OAAO,SAAS;AACpC,gBAAM,eAAoB,uBAAwB,GAAI;AAEtD,cAAK,UAAW,aAAa,SAAU,GAAI;AACvC,kBAAM,UAAkB,SAAU,aAAa,WAAW,EAAG;AAE7D,gBAAK,CAAC,MAAO,OAAQ,KAAK,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AAC9E,sBAAS,eAAgB,EAAE,WAAW;AAAA,YAC1C;AAAA,UACJ;AAEA,cAAK,UAAW,aAAa,MAAO,GAAI;AACpC,mBAAO,aAAa,WAAW;AAAA,UACnC;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AAEA,eAAS,uBAAwB,KAAoB;AACjD,cAAM,eAAuB,CAAC;AAC9B,cAAM,eAAyB,IAAI,MAAO,GAAI;AAE9C,YAAK,aAAa,SAAS,GAAI;AAC3B,gBAAM,aAAuB,aAAc,CAAE,EAAE,MAAO,GAAI;AAC1D,gBAAM,mBAA2B,WAAW;AAE5C,mBAAU,kBAA0B,GAAG,kBAAkB,kBAAkB,mBAAoB;AAC3F,kBAAM,YAAsB,WAAY,eAAgB,EAAE,MAAO,GAAI;AAErE,yBAAc,UAAW,CAAE,CAAE,IAAI,UAAW,CAAE;AAAA,UAClD;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AASA,eAAS,UAAW,OAAuB;AACvC,eAAO,UAAU,QAAQ,UAAU,UAAa;AAAA,MACpD;AAEA,eAAS,gBAAiB,QAAwB;AAC9C,eAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,MACpD;AAEA,eAAS,iBAAkB,QAAwB;AAC/C,eAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,MACpD;AAEA,eAAS,gBAAiB,QAAwB;AAC9C,eAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,MACpD;AAEA,eAAS,kBAAmB,QAAwB;AAChD,eAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,MACpD;AAEA,eAAS,gBAAiB,QAAwB;AAC9C,eAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,MACpD;AAEA,eAAS,eAAgB,QAAwB;AAC7C,eAAO,gBAAiB,MAAO,KAAK,kBAAkB;AAAA,MAC1D;AASA,eAAS,oBAAqB,OAAY,cAAgC;AACtE,eAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,MAC/C;AAEA,eAAS,iBAAkB,OAAY,cAAgC;AACnE,eAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,MAC9C;AAEA,eAAS,kBAAmB,OAAY,cAAkC;AACtE,eAAO,iBAAkB,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAEA,eAAS,iBAAkB,OAAY,cAAgC;AACnE,eAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,MAC9C;AAEA,eAAS,mBAAoB,OAAY,cAA6B;AAClE,eAAO,kBAAmB,KAAM,IAAI,QAAQ;AAAA,MAChD;AAEA,eAAS,iBAAkB,OAAY,cAAgC;AACnE,eAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,MAC9C;AAEA,eAAS,gBAAiB,OAAY,cAA8B;AAChE,eAAO,eAAgB,KAAM,IAAI,QAAQ;AAAA,MAC7C;AAEA,eAAS,wBAAyB,OAAY,cAA8B;AACxE,YAAIA,UAAgB;AAEpB,YAAK,gBAAiB,KAAM,GAAI;AAC5B,gBAAM,SAAmB,MAAM,SAAS,EAAE,qBAAkB;AAE5D,cAAK,OAAO,WAAW,GAAI;AACvB,oBAAQ;AAAA,UACZ,OAAO;AACH,YAAAA,UAAS;AAAA,UACb;AAAA,QAEJ,OAAO;AACH,UAAAA,UAAS,gBAAiB,OAAO,YAAa;AAAA,QAClD;AAEA,eAAOA;AAAA,MACX;AAEA,eAAS,oBAAqB,cAAmC;AAC7D,cAAM,SAAuB;AAAA,UACzB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACZ;AAEA,YAAI;AACA,cAAK,gBAAiB,YAAa,GAAI;AACnC,mBAAO,SAAS,KAAK,MAAO,YAAa;AAAA,UAC7C;AAAA,QAEJ,SAAU,IAAK;AACX,cAAI;AACA,mBAAO,SAAS,KAAM,MAAM,eAAe,GAAI;AAE/C,gBAAK,kBAAmB,OAAO,MAAO,GAAI;AACtC,qBAAO,SAAS,OAAO,OAAO;AAAA,YAClC;AAAA,UAEJ,SAAU,IAAK;AACX,gBAAK,CAAC,eAAe,UAAW;AAC5B,sBAAQ,MAAO,eAAe,gBAAgB,QAAS,eAAgB,GAAG,OAAQ,EAAE,QAAS,eAAgB,GAAG,OAAQ,CAAE;AAC1H,qBAAO,SAAS;AAAA,YACpB;AAEA,mBAAO,SAAS;AAAA,UACpB;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AASA,eAAS,sBAA6B;AAClC,YAAK,QAAQ,OAAO,GAAI;AACpB,wBAAe,KAAM;AAErB,kBAAS,eAAgB,EAAE,WAAW;AAAA,QAC1C;AAAA,MACJ;AASA,eAAS,0BAA2B,mBAAkC,MAAc;AAChF,yBAAiB,iBAAkB,kBAAkB,CAAC,CAAmB;AACzE,uBAAe,WAAW,kBAAmB,eAAe,UAAU,IAAK;AAC3E,uBAAe,kBAAkB,wBAAyB,eAAe,iBAAiB,CAAE,GAAI,CAAE;AAClG,uBAAe,kBAAkB,kBAAmB,eAAe,iBAAiB,IAAK;AACzF,uBAAe,sBAAsB,kBAAmB,eAAe,qBAAqB,IAAK;AACjG,uBAAe,mBAAmB,kBAAmB,eAAe,kBAAkB,IAAK;AAC3F,uBAAe,8BAA8B,kBAAmB,eAAe,6BAA6B,IAAK;AACjH,uBAAe,yBAAyB,kBAAmB,eAAe,wBAAwB,KAAM;AACxG,uBAAe,cAAc,kBAAmB,eAAe,aAAa,IAAK;AACjF,uBAAe,qBAAqB,kBAAmB,eAAe,oBAAoB,KAAM;AAChG,uBAAe,eAAe,iBAAkB,eAAe,cAAc,GAAI;AACjF,uBAAe,0BAA0B,kBAAmB,eAAe,yBAAyB,IAAK;AACzG,uBAAe,uCAAuC,kBAAmB,eAAe,sCAAsC,KAAM;AACpI,uBAAe,kBAAkB,kBAAmB,eAAe,iBAAiB,KAAM;AAC1F,uBAAe,mBAAmB,kBAAmB,eAAe,kBAAkB,KAAM;AAC5F,uBAAe,sBAAsB,kBAAmB,eAAe,qBAAqB,KAAM;AAClG,uBAAe,sBAAsB,kBAAmB,eAAe,qBAAqB,KAAM;AAElG,yCAAiC;AACjC,gDAAwC;AAAA,MAC5C;AAEA,eAAS,mCAA0C;AAC/C,uBAAe,iBAAiB,oBAAqB,eAAe,gBAAgB,MAAO;AAC3F,uBAAe,iBAAiB,oBAAqB,eAAe,gBAAgB,MAAO;AAC3F,uBAAe,mBAAmB,oBAAqB,eAAe,kBAAkB,QAAS;AACjG,uBAAe,yBAAyB,oBAAqB,eAAe,wBAAwB,OAAQ;AAC5G,uBAAe,qBAAqB,oBAAqB,eAAe,oBAAoB,mBAAoB;AAChH,uBAAe,kBAAkB,oBAAqB,eAAe,iBAAiB,4CAA6C;AACnI,uBAAe,6BAA6B,oBAAqB,eAAe,4BAA4B,2DAA4D;AACxK,uBAAe,2BAA2B,oBAAqB,eAAe,0BAA0B,gEAAiE;AACzK,uBAAe,8BAA8B,oBAAqB,eAAe,6BAA6B,IAAK;AAAA,MACvH;AAEA,eAAS,0CAAiD;AACtD,uBAAe,yBAAyB,mBAAoB,eAAe,wBAAwB,IAAK;AAAA,MAC5G;AASA,YAAM,UAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOvB,OAAO,SAAW,QAAgB,MAAmB;AACjD,gBAAM,IAAI,MAAM,2BAA2B;AAAA,QAC/C;AAAA,QAEA,MAAM,SAAW,QAAgB,MAAmB;AAChD,gBAAM,IAAI,MAAM,2BAA2B;AAAA,QAC/C;AAAA,QAEA,MAAM,WAAwB;AAC1B,gBAAM,IAAI,MAAM,2BAA2B;AAAA,QAC/C;AAAA,QAEA,QAAQ,WAAsB;AAC1B,gBAAM,IAAI,MAAM,2BAA2B;AAAA,QAC/C;AAAA,QAEA,YAAY,WAAsB;AAC9B,gBAAM,IAAI,MAAM,2BAA2B;AAAA,QAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,kBAAkB,WAAwB;AACtC,sBAAY;AAEZ,iBAAO;AAAA,QACX;AAAA,QAEA,SAAS,SAAW,SAAsB,SAAsC;AAC5E,cAAK,gBAAiB,OAAQ,KAAK,gBAAiB,OAAQ,GAAI;AAC5D,yBAAc,SAAS,sBAAuB,OAAQ,CAAE;AAExD,oBAAS,eAAgB,EAAE,KAAK,KAAK;AAErC,gCAAoB;AAAA,UACxB;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,SAAW,SAAmC;AACtD,cAAK,gBAAiB,OAAQ,GAAI;AAC9B,gBAAI,UAAmB;AAEvB,qBAAU,SAAS,SAAU;AACzB,kBAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,yBAAU,SAAS,QAAS,KAAM,EAAE,MAAO;AACvC,sBAAK,QAAS,KAAM,EAAE,KAAK,eAAgB,KAAM,GAAI;AACjD,0BAAM,iBAAiC,QAAS,KAAM,EAAE,KAAM,KAAM;AAEpE,wBAAK,eAAe,aAAa,YAAY,SAAU;AACnD,6CAAwB,eAAe,OAAO,cAAc,eAAe,aAAa,OAAQ;AAEhG,8BAAS,KAAM,EAAE,KAAK,OAAQ,QAAS,KAAM,EAAE,KAAK,QAAS,eAAe,KAAM,GAAG,CAAE;AAEvF,6BAAO,QAAS,KAAM,EAAE,KAAM,eAAe,KAAM;AAEnD,8BAAS,KAAM,EAAE,KAAK,KAAK;AAE3B,gCAAU;AACV;AAAA,oBACJ;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAEA,gBAAK,CAAC,SAAU;AACZ,uCAA0B,SAAS,iBAAkB;AAAA,YACzD,OAAO;AACH,kCAAoB;AAAA,YACxB;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,SAAW,QAAgB,MAAmB;AACtD,8BAAoB;AAEpB,mBAAU,aAAa,SAAU;AAC7B,gBAAK,QAAQ,eAAgB,SAAU,GAAI;AACvC,kBAAK,CAAC,gBAAiB,KAAM,KAAK,UAAU,WAAY;AACpD,yBAAU,SAAS,QAAS,SAAU,EAAE,MAAO;AAC3C,sBAAK,QAAS,SAAU,EAAE,KAAK,eAAgB,KAAM,GAAI;AACrD,0BAAM,iBAAiC,QAAS,SAAU,EAAE,KAAM,KAAM;AAExE,2CAAwB,eAAe,OAAO,cAAc,eAAe,aAAa,OAAQ;AAAA,kBACpG;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAEA,cAAK,gBAAiB,KAAM,GAAI;AAC5B,gBAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,qBAAO,QAAS,KAAM;AAAA,YAC1B;AAAA,UAEJ,OAAO;AACH,sBAAU,CAAC;AAAA,UACf;AAEA,cAAK,CAAC,gBAAiB,KAAM,KAAK,UAAU,iBAAkB;AAC1D,8BAAmB,OAAQ;AAAA,UAC/B;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,WAAwB;AAChC,mCAA0B,SAAS,MAAM,iBAAkB;AAE3D,iBAAO;AAAA,QACX;AAAA,QAEA,kBAAkB,WAAwB;AACtC,kBAAS,eAAgB,EAAE,KAAK,QAAQ;AAExC,8BAAoB;AAEpB,iBAAO;AAAA,QACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,kBAAkB,SAAW,kBAA8C;AACvE,cAAK,gBAAiB,gBAAiB,GAAI;AACvC,gBAAI,0BAAmC;AAEvC,qBAAU,gBAAgB,kBAAmB;AACzC,kBAAK,iBAAiB,eAAgB,YAAa,KAAK,eAAe,eAAgB,YAAa,KAAK,eAAgB,YAAa,MAAM,iBAAkB,YAAa,GAAI;AAC3K,+BAAgB,YAAa,IAAI,iBAAkB,YAAa;AAChE,0CAA0B;AAAA,cAC9B;AAAA,YACJ;AAEA,gBAAK,yBAA0B;AAC3B,wCAA2B,cAAe;AAAA,YAC9C;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,YAAY,WAAoB;AAC5B,iBAAO;AAAA,QACX;AAAA,MACJ;AASA,OAAE,MAAM;AACJ,kCAA0B;AAE1B,iBAAS,iBAAkB,oBAAoB,WAAW;AACtD,4BAAkB;AAClB,mCAAyB;AACzB,uBAAa;AACb,wBAAc;AACd,sBAAY;AACZ,8BAAoB;AAEpB,cAAK,wBAAwB,GAAI;AAC7B,oBAAQ,KAAK;AAAA,UACjB;AAAA,QACJ,CAAE;AAEF,YAAK,CAAC,UAAW,OAAO,QAAS,GAAI;AACjC,iBAAO,WAAW;AAAA,QACtB;AAAA,MACJ,GAAK;AAAA,IACT,GAAK;AAAA;AAAA","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = 27,\n left = 37,\n up = 38,\n right = 39,\n down = 40,\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n show: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n hide: function () : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n isOpen: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n isComplete: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", function() {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = 27,\n left = 37,\n up = 38,\n right = 39,\n down = 40,\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", function() {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index 662f81a..1b77723 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -806,19 +806,38 @@ var Constants; } const _public = { start: function(e = null) { - throw new Error("Function not implemented."); + if (!_public.isOpen()) { + _groups_Current = getDefaultString(e, _groups_Default); + if (_groups.hasOwnProperty(_groups_Current)) { + _groups[_groups_Current].position = 0; + showDialogAndSetPosition(); + } + } + return _public; }, show: function(e = null) { - throw new Error("Function not implemented."); + if (!_public.isOpen()) { + _groups_Current = getDefaultString(e, _groups_Current); + if (_groups.hasOwnProperty(_groups_Current)) { + if (_groups[_groups_Current].position === _groups[_groups_Current].keys.length - 1) { + _groups[_groups_Current].position = 0; + } + showDialogAndSetPosition(); + } + } + return _public; }, hide: function() { - throw new Error("Function not implemented."); + if (_public.isOpen()) { + onDialogClose(); + } + return _public; }, isOpen: function() { - throw new Error("Function not implemented."); + return isDefined(_element_Dialog) && _element_Dialog.style.display === "block"; }, isComplete: function() { - throw new Error("Function not implemented."); + return _groups[_groups_Current].position >= _groups[_groups_Current].keys.length - 1; }, addDocumentSteps: function() { getElements(); diff --git a/dist/journey.js.map b/dist/journey.js.map index dc32d0d..b70ae33 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n show: function ( group: string = null ) : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n hide: function () : PublicApi {\n throw new Error(\"Function not implemented.\");\n },\n\n isOpen: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n isComplete: function () : boolean {\n throw new Error(\"Function not implemented.\");\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", function() {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", function() {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 5bcc878..08ace47 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -1188,23 +1188,49 @@ type StringToJson = { */ start: function ( group: string = null ) : PublicApi { - throw new Error("Function not implemented."); + if ( !_public.isOpen() ) { + _groups_Current = getDefaultString( group, _groups_Default ); + + if ( _groups.hasOwnProperty( _groups_Current ) ) { + _groups[ _groups_Current ].position = 0; + + showDialogAndSetPosition(); + } + } + + return _public; }, show: function ( group: string = null ) : PublicApi { - throw new Error("Function not implemented."); + if ( !_public.isOpen() ) { + _groups_Current = getDefaultString( group, _groups_Current ); + + if ( _groups.hasOwnProperty( _groups_Current ) ) { + if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) { + _groups[ _groups_Current ].position = 0; + } + + showDialogAndSetPosition(); + } + } + + return _public; }, hide: function () : PublicApi { - throw new Error("Function not implemented."); + if ( _public.isOpen() ) { + onDialogClose(); + } + + return _public; }, isOpen: function () : boolean { - throw new Error("Function not implemented."); + return isDefined( _element_Dialog ) && _element_Dialog.style.display === "block"; }, isComplete: function () : boolean { - throw new Error("Function not implemented."); + return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1; }, From fb084816af310f9d336ae1ed543e81489f8fca23 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 15:06:26 +0100 Subject: [PATCH 21/44] Moved to lambdas. --- dist/journey.esm.js | 20 ++++++++++---------- dist/journey.esm.js.map | 2 +- dist/journey.js | 20 ++++++++++---------- dist/journey.js.map | 2 +- src/journey.ts | 20 ++++++++++---------- 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index 1531d82..305029e 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -79,7 +79,7 @@ var require_journey = __commonJS({ } function renderDisabledBackground() { _element_Disabled_Background = createElement("div", "journey-js-disabled-background"); - _element_Disabled_Background.onclick = function() { + _element_Disabled_Background.onclick = () => { if (_configuration.closeDialogOnDisabledBackgroundClick) { onDialogClose(); } @@ -97,7 +97,7 @@ var require_journey = __commonJS({ document.body.appendChild(_element_Dialog); _element_Dialog_Close_Button = createElement("button", "close"); _element_Dialog.appendChild(_element_Dialog_Close_Button); - _element_Dialog_Close_Button.onclick = function() { + _element_Dialog_Close_Button.onclick = () => { onDialogClose(); }; addToolTip(_element_Dialog_Close_Button, _configuration.closeButtonToolTipText); @@ -108,7 +108,7 @@ var require_journey = __commonJS({ _element_Dialog_CheckBox_Container = createElement("div", "checkbox-container"); _element_Dialog.appendChild(_element_Dialog_CheckBox_Container); _element_Dialog_CheckBox_Input = buildCheckBox(_element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText).input; - _element_Dialog_CheckBox_Input.onchange = function() { + _element_Dialog_CheckBox_Input.onchange = () => { if (_configuration.showDoNotShowAgain) { fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked); } @@ -283,7 +283,7 @@ var require_journey = __commonJS({ n = createElement("div", "dot-active"); } else { n = createElement("div", "dot"); - n.onclick = function() { + n.onclick = () => { removeFocusClassFromLastElement(); _groups[_groups_Current].position = e; showDialogAndSetPosition(); @@ -357,17 +357,17 @@ var require_journey = __commonJS({ _element_ToolTip = createElement("div", "journey-js-tooltip"); _element_ToolTip.style.display = "none"; document.body.appendChild(_element_ToolTip); - document.body.addEventListener("mousemove", (function() { + document.body.addEventListener("mousemove", (() => { hideToolTip(); })); - document.addEventListener("scroll", (function() { + document.addEventListener("scroll", (() => { hideToolTip(); })); } } function addToolTip(e, t) { if (e !== null) { - e.onmousemove = function(e) { + e.onmousemove = e => { showToolTip(e, t); }; } @@ -375,7 +375,7 @@ var require_journey = __commonJS({ function showToolTip(e, t) { cancelBubble(e); hideToolTip(); - _element_ToolTip_Timer = setTimeout((function() { + _element_ToolTip_Timer = setTimeout((() => { _element_ToolTip.innerHTML = t; _element_ToolTip.style.display = "block"; showElementAtMousePosition(e, _element_ToolTip); @@ -452,7 +452,7 @@ var require_journey = __commonJS({ } const o = createElement("div", "journey-js-hint"); e._currentView.element.appendChild(o); - o.onclick = function(t) { + o.onclick = t => { cancelBubble(t); _element_Dialog_CheckBox_Container.style.display = "none"; _element_Dialog_ProgressDots.style.display = "none"; @@ -959,7 +959,7 @@ var require_journey = __commonJS({ }; (() => { buildDefaultConfiguration(); - document.addEventListener("DOMContentLoaded", (function() { + document.addEventListener("DOMContentLoaded", (() => { setupDefaultGroup(); renderDisabledBackground(); renderDialog(); diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index c5cb511..7ae10ce 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = 27,\n left = 37,\n up = 38,\n right = 39,\n down = 40,\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", function() {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = 27,\n left = 37,\n up = 38,\n right = 39,\n down = 40,\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index 1b77723..cd149e7 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -55,7 +55,7 @@ var Constants; } function renderDisabledBackground() { _element_Disabled_Background = createElement("div", "journey-js-disabled-background"); - _element_Disabled_Background.onclick = function() { + _element_Disabled_Background.onclick = () => { if (_configuration.closeDialogOnDisabledBackgroundClick) { onDialogClose(); } @@ -73,7 +73,7 @@ var Constants; document.body.appendChild(_element_Dialog); _element_Dialog_Close_Button = createElement("button", "close"); _element_Dialog.appendChild(_element_Dialog_Close_Button); - _element_Dialog_Close_Button.onclick = function() { + _element_Dialog_Close_Button.onclick = () => { onDialogClose(); }; addToolTip(_element_Dialog_Close_Button, _configuration.closeButtonToolTipText); @@ -84,7 +84,7 @@ var Constants; _element_Dialog_CheckBox_Container = createElement("div", "checkbox-container"); _element_Dialog.appendChild(_element_Dialog_CheckBox_Container); _element_Dialog_CheckBox_Input = buildCheckBox(_element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText).input; - _element_Dialog_CheckBox_Input.onchange = function() { + _element_Dialog_CheckBox_Input.onchange = () => { if (_configuration.showDoNotShowAgain) { fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked); } @@ -259,7 +259,7 @@ var Constants; n = createElement("div", "dot-active"); } else { n = createElement("div", "dot"); - n.onclick = function() { + n.onclick = () => { removeFocusClassFromLastElement(); _groups[_groups_Current].position = e; showDialogAndSetPosition(); @@ -333,17 +333,17 @@ var Constants; _element_ToolTip = createElement("div", "journey-js-tooltip"); _element_ToolTip.style.display = "none"; document.body.appendChild(_element_ToolTip); - document.body.addEventListener("mousemove", (function() { + document.body.addEventListener("mousemove", (() => { hideToolTip(); })); - document.addEventListener("scroll", (function() { + document.addEventListener("scroll", (() => { hideToolTip(); })); } } function addToolTip(e, t) { if (e !== null) { - e.onmousemove = function(e) { + e.onmousemove = e => { showToolTip(e, t); }; } @@ -351,7 +351,7 @@ var Constants; function showToolTip(e, t) { cancelBubble(e); hideToolTip(); - _element_ToolTip_Timer = setTimeout((function() { + _element_ToolTip_Timer = setTimeout((() => { _element_ToolTip.innerHTML = t; _element_ToolTip.style.display = "block"; showElementAtMousePosition(e, _element_ToolTip); @@ -428,7 +428,7 @@ var Constants; } const o = createElement("div", "journey-js-hint"); e._currentView.element.appendChild(o); - o.onclick = function(t) { + o.onclick = t => { cancelBubble(t); _element_Dialog_CheckBox_Container.style.display = "none"; _element_Dialog_ProgressDots.style.display = "none"; @@ -935,7 +935,7 @@ var Constants; }; (() => { buildDefaultConfiguration(); - document.addEventListener("DOMContentLoaded", (function() { + document.addEventListener("DOMContentLoaded", (() => { setupDefaultGroup(); renderDisabledBackground(); renderDialog(); diff --git a/dist/journey.js.map b/dist/journey.js.map index b70ae33..02babcc 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = function() {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = function() {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = function() {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = function() {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", function() {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", function() {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = function( e ) {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( function() {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = function( e ) {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", function() {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 08ace47..9c5b765 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -114,7 +114,7 @@ type StringToJson = { function renderDisabledBackground() : void { _element_Disabled_Background = createElement( "div", "journey-js-disabled-background" ); - _element_Disabled_Background.onclick = function() { + _element_Disabled_Background.onclick = () => { if ( _configuration.closeDialogOnDisabledBackgroundClick ) { onDialogClose(); } @@ -144,7 +144,7 @@ type StringToJson = { _element_Dialog_Close_Button = createElement( "button", "close" ); _element_Dialog.appendChild( _element_Dialog_Close_Button ); - _element_Dialog_Close_Button.onclick = function() { + _element_Dialog_Close_Button.onclick = () => { onDialogClose(); }; @@ -161,7 +161,7 @@ type StringToJson = { _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input; - _element_Dialog_CheckBox_Input.onchange = function() { + _element_Dialog_CheckBox_Input.onchange = () => { if ( _configuration.showDoNotShowAgain ) { fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked ); } @@ -395,7 +395,7 @@ type StringToJson = { dot = createElement( "div", "dot" ); - dot.onclick = function() { + dot.onclick = () => { removeFocusClassFromLastElement(); _groups[ _groups_Current ].position = keyIndex; @@ -500,11 +500,11 @@ type StringToJson = { document.body.appendChild( _element_ToolTip ); - document.body.addEventListener( "mousemove", function() { + document.body.addEventListener( "mousemove", () => { hideToolTip(); } ); - document.addEventListener( "scroll", function() { + document.addEventListener( "scroll", () => { hideToolTip(); } ); } @@ -512,7 +512,7 @@ type StringToJson = { function addToolTip( element: HTMLElement, text: string ) : void { if ( element !== null ) { - element.onmousemove = function( e ) { + element.onmousemove = ( e: MouseEvent ) => { showToolTip( e, text ); }; } @@ -522,7 +522,7 @@ type StringToJson = { cancelBubble( e ); hideToolTip(); - _element_ToolTip_Timer = setTimeout( function() { + _element_ToolTip_Timer = setTimeout( () => { _element_ToolTip.innerHTML = text; _element_ToolTip.style.display = "block"; @@ -630,7 +630,7 @@ type StringToJson = { const hint: HTMLElement = createElement( "div", "journey-js-hint" ); bindingOptions._currentView.element.appendChild( hint ); - hint.onclick = function( e ) { + hint.onclick = ( e: MouseEvent ) => { cancelBubble( e ); _element_Dialog_CheckBox_Container.style.display = "none"; @@ -1390,7 +1390,7 @@ type StringToJson = { ( () => { buildDefaultConfiguration(); - document.addEventListener( "DOMContentLoaded", function() { + document.addEventListener( "DOMContentLoaded", () => { setupDefaultGroup(); renderDisabledBackground(); renderDialog(); From 145549ea50e54166a75bca38a2181f8c793c50dd Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 15:09:16 +0100 Subject: [PATCH 22/44] Moved to the new code method. --- dist/journey.esm.js | 10 +++++----- dist/journey.esm.js.map | 2 +- dist/journey.js | 10 +++++----- dist/journey.js.map | 2 +- src/journey.ts | 10 +++++----- src/ts/enum.ts | 10 +++++----- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index 305029e..bed79be 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -476,21 +476,21 @@ var require_journey = __commonJS({ } function onWindowKeyDown(e) { if (_public.isOpen() && _configuration.shortcutKeysEnabled) { - if (e.keyCode === 27) { + if (e.code === "Escape") { e.preventDefault(); onDialogClose(); } else { if (_configuration_ShortcutKeysEnabled) { - if (e.keyCode === 37) { + if (e.code === "ArrowLeft") { e.preventDefault(); onDialogBack(); - } else if (e.keyCode === 39) { + } else if (e.code === "ArrowRight") { e.preventDefault(); onDialogNext(); - } else if (e.keyCode === 38) { + } else if (e.code === "ArrowUp") { e.preventDefault(); onWindowKeyCodeUp(); - } else if (e.keyCode === 40) { + } else if (e.code === "ArrowDown") { e.preventDefault(); onWindowKeyCodeDown(); } diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 7ae10ce..ae049cf 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = 27,\n left = 37,\n up = 38,\n right = 39,\n down = 40,\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index cd149e7..a6fb5dc 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -452,21 +452,21 @@ var Constants; } function onWindowKeyDown(e) { if (_public.isOpen() && _configuration.shortcutKeysEnabled) { - if (e.keyCode === 27) { + if (e.code === "Escape") { e.preventDefault(); onDialogClose(); } else { if (_configuration_ShortcutKeysEnabled) { - if (e.keyCode === 37) { + if (e.code === "ArrowLeft") { e.preventDefault(); onDialogBack(); - } else if (e.keyCode === 39) { + } else if (e.code === "ArrowRight") { e.preventDefault(); onDialogNext(); - } else if (e.keyCode === 38) { + } else if (e.code === "ArrowUp") { e.preventDefault(); onWindowKeyCodeUp(); - } else if (e.keyCode === 40) { + } else if (e.code === "ArrowDown") { e.preventDefault(); onWindowKeyCodeDown(); } diff --git a/dist/journey.js.map b/dist/journey.js.map index 02babcc..1dc7d54 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.keyCode === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.keyCode === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.keyCode === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.keyCode === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 9c5b765..810c9e0 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -668,25 +668,25 @@ type StringToJson = { function onWindowKeyDown( e: KeyboardEvent ) : void { if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) { - if ( e.keyCode === KeyCode.escape ) { + if ( e.code === KeyCode.escape ) { e.preventDefault(); onDialogClose(); } else { if ( _configuration_ShortcutKeysEnabled ) { - if ( e.keyCode === KeyCode.left ) { + if ( e.code === KeyCode.left ) { e.preventDefault(); onDialogBack(); - } else if ( e.keyCode === KeyCode.right ) { + } else if ( e.code === KeyCode.right ) { e.preventDefault(); onDialogNext(); - } else if ( e.keyCode === KeyCode.up ) { + } else if ( e.code === KeyCode.up ) { e.preventDefault(); onWindowKeyCodeUp(); - } else if ( e.keyCode === KeyCode.down ) { + } else if ( e.code === KeyCode.down ) { e.preventDefault(); onWindowKeyCodeDown(); } diff --git a/src/ts/enum.ts b/src/ts/enum.ts index c08b7b2..2f4d2c9 100644 --- a/src/ts/enum.ts +++ b/src/ts/enum.ts @@ -4,9 +4,9 @@ export const enum Char { } export const enum KeyCode { - escape = 27, - left = 37, - up = 38, - right = 39, - down = 40, + escape = "Escape", + left = "ArrowLeft", + up = "ArrowUp", + right = "ArrowRight", + down = "ArrowDown", } \ No newline at end of file From 12bd0290afa0a126a30e9bb0ec85c23dc3c95e92 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 15:13:54 +0100 Subject: [PATCH 23/44] Removed code that was needed, and added more types. --- dist/journey.esm.js | 31 +++++++++++-------------- dist/journey.esm.js.map | 2 +- dist/journey.js | 31 +++++++++++-------------- dist/journey.js.map | 2 +- src/journey.ts | 51 +++++++++++++++++++++-------------------- 5 files changed, 54 insertions(+), 63 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index bed79be..bd7aaa8 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -107,7 +107,7 @@ var require_journey = __commonJS({ _element_Dialog.appendChild(_element_Dialog_Description); _element_Dialog_CheckBox_Container = createElement("div", "checkbox-container"); _element_Dialog.appendChild(_element_Dialog_CheckBox_Container); - _element_Dialog_CheckBox_Input = buildCheckBox(_element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText).input; + _element_Dialog_CheckBox_Input = buildCheckBox(_element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText); _element_Dialog_CheckBox_Input.onchange = () => { if (_configuration.showDoNotShowAgain) { fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked); @@ -560,26 +560,24 @@ var require_journey = __commonJS({ return i; } function getOffset(e) { - let t = 0; - let o = 0; + const t = { + left: 0, + top: 0 + }; while (e && !isNaN(e.offsetLeft) && !isNaN(e.offsetTop)) { - t += e.offsetLeft - e.scrollLeft; - o += e.offsetTop - e.scrollTop; + t.left += e.offsetLeft - e.scrollLeft; + t.top += e.offsetTop - e.scrollTop; e = e.offsetParent; } - return { - left: t, - top: o - }; + return t; } function getScrollPosition() { const e = document.documentElement; - const t = (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0); - const o = (window.pageYOffset || e.scrollTop) - (e.clientTop || 0); - return { - left: t, - top: o + const t = { + left: (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0), + top: (window.pageYOffset || e.scrollTop) - (e.clientTop || 0) }; + return t; } function getStyleValueByName(e, t) { let o = null; @@ -660,10 +658,7 @@ var require_journey = __commonJS({ l.innerHTML = t; n.appendChild(r); n.appendChild(l); - return { - input: i, - label: n - }; + return i; } function clearElementsByClassName(e, t) { let o = e.getElementsByClassName(t); diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index ae049cf..e98a0f2 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Position = {\n left: number;\n top: number;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index a6fb5dc..eb494c2 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -83,7 +83,7 @@ var Constants; _element_Dialog.appendChild(_element_Dialog_Description); _element_Dialog_CheckBox_Container = createElement("div", "checkbox-container"); _element_Dialog.appendChild(_element_Dialog_CheckBox_Container); - _element_Dialog_CheckBox_Input = buildCheckBox(_element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText).input; + _element_Dialog_CheckBox_Input = buildCheckBox(_element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText); _element_Dialog_CheckBox_Input.onchange = () => { if (_configuration.showDoNotShowAgain) { fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked); @@ -536,26 +536,24 @@ var Constants; return i; } function getOffset(e) { - let t = 0; - let o = 0; + const t = { + left: 0, + top: 0 + }; while (e && !isNaN(e.offsetLeft) && !isNaN(e.offsetTop)) { - t += e.offsetLeft - e.scrollLeft; - o += e.offsetTop - e.scrollTop; + t.left += e.offsetLeft - e.scrollLeft; + t.top += e.offsetTop - e.scrollTop; e = e.offsetParent; } - return { - left: t, - top: o - }; + return t; } function getScrollPosition() { const e = document.documentElement; - const t = (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0); - const o = (window.pageYOffset || e.scrollTop) - (e.clientTop || 0); - return { - left: t, - top: o + const t = { + left: (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0), + top: (window.pageYOffset || e.scrollTop) - (e.clientTop || 0) }; + return t; } function getStyleValueByName(e, t) { let o = null; @@ -636,10 +634,7 @@ var Constants; r.innerHTML = t; n.appendChild(l); n.appendChild(r); - return { - input: i, - label: n - }; + return i; } function clearElementsByClassName(e, t) { let o = e.getElementsByClassName(t); diff --git a/dist/journey.js.map b/dist/journey.js.map index 1dc7d54..c9b83b2 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":";AAaO,IAAU;AAAA,CAAV,CAAUA,eAAV;AACI,EAAMA,WAAA,4BAA4B;AAAA,GAD5B;;;CCiBf,MAAM;AAEJ,MAAI,iBAAgC,CAAC;AAGrC,MAAI,qCAA8C;AAGlD,QAAM,kBAA0B;AAChC,MAAI,kBAA0B;AAC9B,MAAI,UAAkB,CAAC;AAGvB,MAAI,uCAA+C;AAGnD,MAAI,+BAA4C;AAGhD,MAAI,kBAA+B;AACnC,MAAI,+BAA4C;AAChD,MAAI,wBAAqC;AACzC,MAAI,8BAA2C;AAC/C,MAAI,qCAAkD;AACtD,MAAI,iCAAmD;AACvD,MAAI,+BAA4C;AAChD,MAAI,8BAA2C;AAC/C,MAAI,yCAAsD;AAC1D,MAAI,8CAA2D;AAC/D,MAAI,0BAAuC;AAC3C,MAAI,sCAAwD;AAC5D,MAAI,sCAAwD;AAC5D,MAAI,yBAAkC;AAGtC,MAAI,kCAA0C;AAC9C,MAAI,kCAA0C;AAC9C,MAAI,gCAAyC;AAC7C,MAAI,yBAAiC;AACrC,MAAI,yBAAiC;AAGrC,MAAI,mBAAmB;AACvB,MAAI,yBAAiC;AASrC,WAAS,kBAAmB,SAAc,MAAc;AACpD,cAAU,iBAAkB,QAAQ,CAAC,CAAE;AAEvC,YAAS,eAAgB,IAAI;AAAA,MACzB,MAAM,CAAC;AAAA,MACP,MAAM,CAAC;AAAA,MACP,UAAU;AAAA,IACd;AAAA,EACJ;AAEA,WAAS,cAAe,OAAuB;AAC3C,QAAK,CAAC,QAAQ,eAAgB,KAAM,GAAI;AACpC,cAAS,KAAM,IAAI;AAAA,QACf,MAAM,CAAC;AAAA,QACP,MAAM,CAAC;AAAA,QACP,UAAU;AAAA,MACd;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAA0C;AAC/C,WAAO,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,QAAS,CAAE;AAAA,EACnH;AASA,WAAS,2BAAkC;AACvC,mCAA+B,cAAe,OAAO,gCAAiC;AAEtF,iCAA6B,UAAU,MAAM;AACzC,UAAK,eAAe,sCAAuC;AACvD,sBAAc;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAAgC;AACrC,YAAS,SAAS,MAAM,4BAA6B;AAAA,EACzD;AAEA,WAAS,yBAAgC;AACrC,eAAY,SAAS,MAAM,4BAA6B;AAAA,EAC5D;AASA,WAAS,eAAsB;AAC3B,sBAAkB,cAAe,OAAO,mBAAoB;AAC5D,oBAAgB,MAAM,UAAU;AAChC,aAAS,KAAK,YAAa,eAAgB;AAE3C,mCAA+B,cAAe,UAAU,OAAQ;AAChE,oBAAgB,YAAa,4BAA6B;AAE1D,iCAA6B,UAAU,MAAM;AACzC,oBAAc;AAAA,IAClB;AAEA,eAAY,8BAA8B,eAAe,sBAAuB;AAEhF,4BAAwB,cAAe,OAAO,OAAQ;AACtD,oBAAgB,YAAa,qBAAsB;AAEnD,kCAA8B,cAAe,OAAO,aAAc;AAClE,oBAAgB,YAAa,2BAA4B;AAEzD,yCAAqC,cAAe,OAAO,oBAAqB;AAChF,oBAAgB,YAAa,kCAAmC;AAEhE,qCAAiC,cAAe,oCAAoC,eAAe,kBAAmB,EAAE;AAExH,mCAA+B,WAAW,MAAM;AAC5C,UAAK,eAAe,oBAAqB;AACrC,+BAAwB,eAAe,wBAAwB,+BAA+B,OAAQ;AAAA,MAC1G;AAAA,IACJ;AAEA,mCAA+B,cAAe,OAAO,eAAgB;AACrE,oBAAgB,YAAa,4BAA6B;AAE1D,kCAA8B,cAAe,OAAO,cAAe;AACnE,oBAAgB,YAAa,2BAA4B;AAEzD,6CAAyC,cAAe,OAAO,yBAA0B;AACzF,gCAA4B,YAAa,sCAAuC;AAEhF,kDAA8C,cAAe,KAAK,8BAA+B;AACjG,2CAAuC,YAAa,2CAA4C;AAEhG,8BAA0B,cAAe,OAAO,SAAU;AAC1D,oBAAgB,YAAa,uBAAwB;AAErD,0CAAsC,cAAe,UAAU,MAAO;AACtE,wCAAoC,UAAU;AAC9C,4BAAwB,YAAa,mCAAoC;AAEzE,0CAAsC,cAAe,UAAU,MAAO;AACtE,wCAAoC,UAAU;AAC9C,4BAAwB,YAAa,mCAAoC;AAEzE,sBAAkB;AAAA,EACtB;AAEA,WAAS,cAAe,sBAA+B,MAAc;AACjE,QAAI,YAAqB;AAEzB,QAAK,gBAAiB,eAAe,2BAA4B,KAAK,qBAAsB;AACxF,kBAAY,QAAS,eAAe,2BAA4B;AAAA,IACpE,OAAO;AACH,kBAAY;AAAA,IAChB;AAEA,QAAK,WAAY;AACb,YAAM,iBAAiC,uBAAuB;AAE9D,UAAK,UAAW,cAAe,KAAK,UAAW,eAAe,aAAa,OAAQ,GAAI;AACnF,+BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,MAC/F;AAEA,sCAAiC,KAAM;AACvC,6BAAuB;AACvB,kBAAY;AAEZ,sBAAgB,MAAM,UAAU;AAAA,IACpC;AAAA,EACJ;AAEA,WAAS,eAAsB;AAC3B,QAAK,QAAS,eAAgB,EAAE,WAAW,GAAI;AAC3C,sCAAgC;AAEhC,cAAS,eAAgB,EAAE;AAE3B,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,eAAsB;AAC3B,QAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,YAAM,iBAAiC,uBAAuB;AAE9D,oBAAe,KAAM;AACrB,6BAAwB,eAAe,OAAO,UAAU,eAAe,aAAa,OAAQ;AAAA,IAEhG,OAAO;AACH,sCAAgC;AAEhC,cAAS,eAAgB,EAAE;AAE3B,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,2BAAkC;AACvC,UAAM,iBAAiC,uBAAuB;AAE9D,QAAK,UAAW,cAAe,KAAK,UAAW,eAAe,aAAa,OAAQ,GAAI;AACnF,UAAK,eAAe,wBAAyB;AACzC,+BAAuB;AAAA,MAC3B,OAAO;AACH,+BAAuB;AAAA,MAC3B;AAEA,kBAAY;AAEZ,mCAA6B,MAAM,UAAU,eAAe,kBAAkB,UAAS;AACvF,2CAAqC;AAErC,qBAAe,aAAa,QAAQ,+BAA0B;AAE9D,UAAK,eAAe,kBAAmB;AACnC,uBAAe,aAAa,QAAQ,eAAe;AAAA,MACvD;AAEA,YAAM,oBAA4B,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAEvG,UAAK,wCAAoC,kBAAkB,YAAY,MAAM,UAAW;AACpF,+CAAuC;AACvC,uBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,MACzD;AAEA,kCAA6B,oCAAoC,eAAe,kBAAmB;AACnG,kCAA6B,8BAA8B,eAAe,oBAAoB,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AACzI,kCAA6B,6BAA6B,eAAe,mBAAmB,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AACvI,kCAA6B,6CAA6C,eAAe,mBAAoB;AAC7G,kCAA6B,yBAAyB,eAAe,WAAY;AAEjF,0CAAoC,YAAY,eAAe;AAC/D,0CAAoC,WAAW,QAAS,eAAgB,EAAE,aAAa;AAEvF,UAAK,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACrF,4CAAoC,YAAY,eAAe;AAAA,MACnE,OAAO;AACH,4CAAoC,YAAY,eAAe;AAAA,MACnE;AAEA,oBAAe,cAAe;AAC9B,wBAAmB,MAAM,cAAe;AACxC,uBAAiB;AACjB,6BAAuB;AACvB,6BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAE3F,UAAK,eAAe,WAAY;AAC5B,uBAAe,aAAa,QAAQ,MAAM;AAAA,MAC9C;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,cAAe,gBAAwC;AAC5D,QAAK,gBAAiB,eAAe,KAAM,GAAI;AAC3C,4BAAsB,YAAY,eAAe;AAAA,IACrD,OAAO;AACH,4BAAsB;AAAA,IAC1B;AAEA,QAAK,gBAAiB,eAAe,WAAY,GAAI;AACjD,kCAA4B,YAAY,eAAe;AAAA,IAC3D,OAAO;AACH,kCAA4B;AAAA,IAChC;AAAA,EACJ;AAEA,WAAS,kBAAmB,GAAQ,gBAAwC;AACxE,QAAK,gBAAgB,MAAM,YAAY,SAAU;AAC7C,sBAAgB,MAAM,UAAU;AAEhC,6BAAwB,eAAe,OAAO,QAAQ,eAAe,aAAa,OAAQ;AAAA,IAC9F;AAEA,QAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,6BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,IAC/F;AAEA,6BAAyB,eAAe,WAAW;AAEnD,QAAK,eAAe,UAAU,eAAe,QAAS;AAClD,UAAK,eAAe,UAAU,eAAe,0BAA2B;AACpE,mCAA4B,GAAG,eAAgB;AAAA,MAEnD,OAAO;AACH,cAAM,SAAc,UAAW,eAAe,aAAa,OAAQ;AACnE,YAAI,MAAgB,OAAO,MAAQ,eAAe,aAAa,QAAQ;AACvE,YAAI,OAAiB,OAAO;AAE5B,YAAK,OAAO,gBAAgB,cAAc,OAAO,cAAc,eAAe,YAAa;AACvF,kBAAS,gBAAgB;AACzB,kBAAQ,eAAe,aAAa,QAAQ;AAAA,QAChD;AAEA,YAAK,MAAM,gBAAgB,eAAe,OAAO,eAAe,eAAe,UAAW;AACtF,iBAAS,gBAAgB,eAAe,eAAe,aAAa,QAAQ;AAAA,QAChF;AAEA,wBAAgB,MAAM,MAAM,MAAM;AAClC,wBAAgB,MAAM,OAAO,OAAO;AAAA,MACxC;AAAA,IAEJ,OAAO;AACH,YAAM,iBAAsB,kBAAkB;AAC9C,YAAM,aAAqB,KAAK,IAAK,IAAO,OAAO,aAAa,gBAAgB,eAAgB,IAAM,eAAe,IAAK;AAC1H,YAAM,YAAoB,KAAK,IAAK,IAAO,OAAO,cAAc,gBAAgB,gBAAiB,IAAM,eAAe,GAAI;AAE1H,sBAAgB,MAAM,OAAO,aAAa;AAC1C,sBAAgB,MAAM,MAAM,YAAY;AAAA,IAC5C;AAAA,EACJ;AAEA,WAAS,gCAAiC,oBAA6B,MAAc;AACjF,UAAM,iBAAiC,uBAAuB;AAE9D,QAAK,UAAW,cAAe,KAAK,UAAW,eAAe,aAAa,OAAQ,GAAI;AACnF,qBAAe,aAAa,QAAQ,YAAY,eAAe,aAAa,QAAQ,UAAU,0BAAsB,0CAAuC;AAE3J,UAAK,UAAW,oCAAqC,GAAI;AACrD,uBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,MACzD;AAEA,UAAK,mBAAoB;AACrB,+BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,MAC/F;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,mBAA0B;AAC/B,iCAA6B;AAE7B,QAAK,eAAe,kBAAmB;AACnC,YAAM,aAAqB,QAAS,eAAgB,EAAE,KAAK;AAE3D,eAAU,WAAmB,GAAG,WAAW,YAAY,YAAa;AAChE,yBAAkB,UAAU,QAAS,eAAgB,EAAE,KAAM,QAAS,CAAE;AAAA,MAC5E;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,iBAAkB,UAAkB,OAAuB;AAChE,UAAM,iBAAiC,QAAS,eAAgB,EAAE,KAAM,KAAM;AAC9E,QAAI,MAAmB;AAEvB,QAAK,aAAa,QAAS,eAAgB,EAAE,UAAW;AACpD,YAAM,cAAe,OAAO,YAAa;AAAA,IAC7C,OAAO;AAEH,YAAM,cAAe,OAAO,KAAM;AAElC,UAAI,UAAU,MAAM;AAChB,wCAAgC;AAEhC,gBAAS,eAAgB,EAAE,WAAW;AAEtC,iCAAyB;AAAA,MAC7B;AAAA,IACJ;AAEA,iCAA6B,YAAa,GAAI;AAE9C,QAAK,eAAe,yBAA0B;AAC1C,UAAK,gBAAiB,eAAe,OAAQ,GAAI;AAC7C,mBAAY,KAAK,eAAe,OAAQ;AAAA,MAC5C,OAAO;AACH,mBAAY,KAAK,eAAe,KAAM;AAAA,MAC1C;AAAA,IACJ;AAEA,QAAK,eAAe,wBAAyB;AACzC,UAAI,aAAa;AACjB,UAAI,aAAc,WAAW,GAAI,SAAS;AAAA,IAC9C;AAAA,EACJ;AAEA,WAAS,yBAAgC;AACrC,QAAK,eAAe,iBAAkB;AAClC,YAAM,iBAAyB,4BAA4B,cAAc,QAAS,eAAgB,EAAE,KAAK;AACzG,YAAM,SAAkB,QAAS,eAAgB,EAAE,WAAW,KAAM;AACpE,YAAM,qBAA6B,KAAK,MAAU,QAAS,eAAgB,EAAE,WAAW,KAAM,QAAS,eAAgB,EAAE,KAAK,SAAW,GAAI;AAE7I,6CAAuC,MAAM,QAAQ,QAAQ;AAC7D,kDAA4C,YAAY,qBAAqB;AAAA,IACjF;AAAA,EACJ;AASA,WAAS,oBAA2B;AAChC,0BAAsB,cAAc;AACpC,0BAAsB,YAAY;AAClC,0BAAsB,gBAAgB;AAEtC,aAAS,KAAK,iBAAkB,aAAa,uBAAwB;AACrE,aAAS,KAAK,iBAAkB,cAAc,wBAAyB;AAAA,EAC3E;AAEA,WAAS,wBAAyB,GAAuB;AACrD,QAAK,CAAC,iCAAiC,CAAC,0BAA0B,eAAe,qBAAsB;AACnG,sBAAgB,aAAa;AAC7B,sCAAgC;AAChC,+BAAyB,EAAE,QAAQ,gBAAgB;AACnD,+BAAyB,EAAE,QAAQ,gBAAgB;AACnD,wCAAkC,gBAAgB;AAClD,wCAAkC,gBAAgB;AAAA,IACtD;AAAA,EACJ;AAEA,WAAS,wBAA+B;AACpC,QAAK,+BAAgC;AACjC,sCAAgC;AAChC,wCAAkC;AAClC,wCAAkC;AAClC,sBAAgB,YAAY;AAAA,IAChC;AAAA,EACJ;AAEA,WAAS,wBAAyB,GAAuB;AACrD,QAAK,+BAAgC;AACjC,sBAAgB,MAAM,OAAS,EAAE,QAAQ,yBAA2B;AACpE,sBAAgB,MAAM,MAAQ,EAAE,QAAQ,yBAA2B;AAAA,IACvE;AAAA,EACJ;AAEA,WAAS,2BAAkC;AACvC,QAAK,+BAAgC;AACjC,sBAAgB,MAAM,OAAO,kCAAkC;AAC/D,sBAAgB,MAAM,MAAM,kCAAkC;AAE9D,sCAAgC;AAChC,wCAAkC;AAClC,wCAAkC;AAClC,sBAAgB,YAAY;AAAA,IAChC;AAAA,EACJ;AASA,WAAS,gBAAuB;AAC5B,QAAK,CAAC,UAAW,gBAAiB,GAAI;AAClC,yBAAmB,cAAe,OAAO,oBAAqB;AAC9D,uBAAiB,MAAM,UAAU;AAEjC,eAAS,KAAK,YAAa,gBAAiB;AAE5C,eAAS,KAAK,iBAAkB,aAAa,MAAM;AAC/C,oBAAY;AAAA,MAChB,CAAE;AAEF,eAAS,iBAAkB,UAAU,MAAM;AACvC,oBAAY;AAAA,MAChB,CAAE;AAAA,IACN;AAAA,EACJ;AAEA,WAAS,WAAY,SAAsB,MAAsB;AAC7D,QAAK,YAAY,MAAO;AACpB,cAAQ,cAAc,CAAE,MAAmB;AACvC,oBAAa,GAAG,IAAK;AAAA,MACzB;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,YAAa,GAAQ,MAAsB;AAChD,iBAAc,CAAE;AAChB,gBAAY;AAEZ,6BAAyB,WAAY,MAAM;AACvC,uBAAiB,YAAY;AAC7B,uBAAiB,MAAM,UAAU;AAEjC,iCAA4B,GAAG,gBAAiB;AAAA,IACpD,GAAG,eAAe,YAAa;AAAA,EACnC;AAEA,WAAS,cAAqB;AAC1B,QAAK,UAAW,gBAAiB,GAAI;AACjC,UAAK,2BAA2B,GAAI;AAChC,qBAAc,sBAAuB;AACrC,iCAAyB;AAAA,MAC7B;AAEA,UAAK,iBAAiB,MAAM,YAAY,SAAU;AAC9C,yBAAiB,MAAM,UAAU;AAAA,MACrC;AAAA,IACJ;AAAA,EACJ;AASA,WAAS,cAAqB;AAC1B,UAAM,WAAqB,eAAe;AAC1C,UAAM,iBAAyB,SAAS;AAExC,aAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,YAAM,cAAyC,SAAS,qBAAsB,SAAU,YAAa,CAAE;AACvG,YAAM,WAA0B,CAAC,EAAE,MAAM,KAAM,WAAY;AAC3D,YAAM,iBAAyB,SAAS;AAExC,eAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,YAAK,CAAC,WAAY,SAAU,YAAa,CAAE,GAAI;AAC3C;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,YAAS,eAAgB,EAAE,KAAK,KAAK;AAAA,EACzC;AAEA,WAAS,WAAY,SAAiC;AAClD,QAAIC,UAAkB;AAEtB,QAAK,UAAW,OAAQ,KAAK,QAAQ,aAAc,UAAU,yBAA0B,GAAI;AACvF,YAAM,qBAA6B,QAAQ,aAAc,UAAU,yBAA0B;AAE7F,UAAK,gBAAiB,kBAAmB,GAAI;AACzC,cAAM,iBAA+B,oBAAqB,kBAAmB;AAE7E,YAAK,eAAe,UAAU,gBAAiB,eAAe,MAAO,GAAI;AACrE,uBAAc,SAAS,sBAAuB,eAAe,MAAO,CAAE;AAAA,QAE1E,OAAO;AACH,cAAK,CAAC,eAAe,UAAW;AAC5B,oBAAQ,MAAO,eAAe,2BAA2B,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC9H,YAAAA,UAAS;AAAA,UACb;AAAA,QACJ;AAAA,MAEJ,OAAO;AACH,YAAK,CAAC,eAAe,UAAW;AAC5B,kBAAQ,MAAO,eAAe,yBAAyB,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC5H,UAAAA,UAAS;AAAA,QACb;AAAA,MACJ;AAAA,IACJ;AAEA,WAAOA;AAAA,EACX;AAEA,WAAS,aAAc,SAAsB,gBAAwC;AACjF,mBAAe,eAAe,CAAC;AAC/B,mBAAe,aAAa,UAAU;AAEtC,QAAK,gBAAiB,eAAe,KAAM,MAAO,gBAAiB,eAAe,KAAM,KAAK,gBAAiB,eAAe,WAAY,IAAM;AAC3I,cAAQ,gBAAiB,UAAU,yBAA0B;AAE7D,UAAK,CAAC,eAAe,QAAS;AAC1B,sBAAe,eAAe,KAAM;AAEpC,gBAAS,eAAe,KAAM,EAAE,KAAM,eAAe,KAAM,IAAI;AAC/D,gBAAS,eAAe,KAAM,EAAE,KAAK,KAAM,eAAe,KAAM;AAEhE,+BAAwB,eAAe,OAAO,WAAW,OAAQ;AAAA,MAErE,OAAO;AACH,mBAAY,cAAe;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,WAAY,gBAAwC;AACzD,UAAM,gBAAwB,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAEnG,QAAK,oCAAgC,cAAc,YAAY,MAAM,UAAW;AAC5E,qBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,IACzD;AAEA,UAAM,OAAoB,cAAe,OAAO,iBAAkB;AAClE,mBAAe,aAAa,QAAQ,YAAa,IAAK;AAEtD,SAAK,UAAU,CAAE,MAAmB;AAChC,mBAAc,CAAE;AAEhB,yCAAmC,MAAM,UAAU;AACnD,mCAA6B,MAAM,UAAU;AAC7C,kCAA4B,MAAM,UAAU;AAC5C,8BAAwB,MAAM,UAAU;AACxC,2CAAqC;AAErC,oBAAe,cAAe;AAC9B,wBAAmB,GAAG,cAAe;AAErC,UAAK,eAAe,sBAAuB;AACvC,iCAA0B,eAAe,aAAa,SAAS,iBAAkB;AAAA,MACrF;AAAA,IACJ;AAAA,EACJ;AASA,WAAS,oBAAqB,YAAqB,MAAc;AAC7D,UAAM,eAAyB,YAAY,SAAS,mBAAmB,SAAS;AAChF,UAAM,aAAuB,YAAY,OAAO,mBAAmB,OAAO;AAE1E,QAAK,eAAe,qBAAsB;AACtC,mBAAc,WAAW,eAAgB;AAAA,IAC7C;AAEA,eAAY,UAAU,cAAe;AAAA,EACzC;AAEA,WAAS,gBAAiB,GAA0B;AAChD,QAAK,QAAQ,OAAO,KAAK,eAAe,qBAAsB;AAC1D,UAAK,EAAE,gCAA0B;AAC7B,UAAE,eAAe;AACjB,sBAAc;AAAA,MAClB,OAAO;AAEH,YAAK,oCAAqC;AACtC,cAAK,EAAE,iCAAwB;AAC3B,cAAE,eAAe;AACjB,yBAAa;AAAA,UAEjB,WAAY,EAAE,mCAAyB;AACnC,cAAE,eAAe;AACjB,yBAAa;AAAA,UAEjB,WAAY,EAAE,6BAAsB;AAChC,cAAE,eAAe;AACjB,8BAAkB;AAAA,UAEtB,WAAY,EAAE,iCAAwB;AAClC,cAAE,eAAe;AACjB,gCAAoB;AAAA,UACxB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,iBAAwB;AAC7B,QAAK,QAAQ,OAAO,GAAI;AACpB,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,oBAA2B;AAChC,QAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,sCAAgC;AAEhC,cAAS,eAAgB,EAAE,WAAW;AAEtC,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,sBAA6B;AAClC,QAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,sCAAgC;AAEhC,cAAS,eAAgB,EAAE,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS;AAE/E,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AASA,WAAS,sBAAuB,YAAkB;AAC9C,QAAI,UAA0B,CAAC,gBAAiB,UAAW,IAAI,CAAC,IAAsB;AACtF,YAAQ,QAAQ,iBAAkB,QAAQ,OAAO,CAAE;AACnD,YAAQ,SAAS,kBAAmB,QAAQ,QAAQ,IAAK;AACzD,YAAQ,YAAY,kBAAmB,QAAQ,WAAW,KAAM;AAChE,YAAQ,WAAW,kBAAmB,QAAQ,UAAU,KAAM;AAC9D,YAAQ,aAAa,kBAAmB,QAAQ,YAAY,KAAM;AAClE,YAAQ,SAAS,kBAAmB,QAAQ,QAAQ,KAAM;AAC1D,YAAQ,2BAA2B,kBAAmB,QAAQ,0BAA0B,KAAM;AAC9F,YAAQ,yBAAyB,kBAAmB,QAAQ,wBAAwB,IAAK;AACzF,YAAQ,uBAAuB,kBAAmB,QAAQ,sBAAsB,KAAM;AACtF,YAAQ,QAAQ,iBAAkB,QAAQ,OAAO,eAAgB;AAEjE,cAAU,4BAA6B,OAAQ;AAE/C,WAAO,mCAAoC,OAAQ;AAAA,EACvD;AAEA,WAAS,4BAA6B,SAA2C;AAC7E,YAAQ,QAAQ,iBAAkB,QAAQ,OAAO,IAAK;AACtD,YAAQ,cAAc,iBAAkB,QAAQ,aAAa,IAAK;AAClE,YAAQ,UAAU,iBAAkB,QAAQ,SAAS,IAAK;AAE1D,WAAO;AAAA,EACX;AAEA,WAAS,mCAAoC,SAA2C;AACpF,YAAQ,SAAS,iBAAkB,QAAQ,QAAQ,CAAC,CAAY;AAChE,YAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,YAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,YAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,YAAQ,OAAO,WAAW,mBAAoB,QAAQ,OAAO,UAAU,IAAK;AAC5E,YAAQ,OAAO,SAAS,mBAAoB,QAAQ,OAAO,QAAQ,IAAK;AACxE,YAAQ,OAAO,UAAU,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC1E,YAAQ,OAAO,YAAY,mBAAoB,QAAQ,OAAO,WAAW,IAAK;AAC9E,YAAQ,OAAO,eAAe,mBAAoB,QAAQ,OAAO,cAAc,IAAK;AAEpF,WAAO;AAAA,EACX;AASA,WAAS,cAAe,MAAc,4BAA+C;AACjF,UAAM,WAAmB,KAAK,YAAY;AAC1C,UAAM,SAAkB,aAAa;AAErC,QAAIA,UAAc,SAAS,SAAS,6BAA2B,IAAI,SAAS,cAAe,QAAS;AAEpG,QAAK,UAAW,SAAU,GAAI;AAC1B,MAAAA,QAAO,YAAY;AAAA,IACvB;AAEA,WAAOA;AAAA,EACX;AAEA,WAAS,UAAW,SAA6B;AAC7C,QAAI,OAAe;AACnB,QAAI,MAAc;AAElB,WAAQ,WAAW,CAAC,MAAO,QAAQ,UAAW,KAAK,CAAC,MAAO,QAAQ,SAAU,GAAI;AAC7E,cAAQ,QAAQ,aAAa,QAAQ;AACrC,aAAO,QAAQ,YAAY,QAAQ;AAEnC,gBAAU,QAAQ;AAAA,IACtB;AAEA,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,oBAA0B;AAC/B,UAAM,MAAmB,SAAS;AAClC,UAAM,QAAiB,OAAO,eAAe,IAAI,eAAkB,IAAI,cAAc;AACrF,UAAM,OAAgB,OAAO,eAAe,IAAI,cAAgB,IAAI,aAAa;AAEjF,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,oBAAqB,SAAc,mBAAkC;AAC1E,QAAI,QAAa;AAEjB,QAAK,SAAS,YAAY,kBAAmB;AACzC,cAAQ,SAAS,YAAY,iBAAkB,SAAS,IAAK,EAAE,iBAAkB,iBAAkB;AAAA,IACvG,WAAY,QAAQ,cAAe;AAC/B,cAAQ,QAAQ,aAAc,iBAAkB;AAAA,IACpD;AAEA,WAAO;AAAA,EACX;AAEA,WAAS,QAAS,QAAqB,MAA2B;AAC9D,QAAI;AACA,UAAK,CAAC,OAAO,SAAU,IAAK,GAAI;AAC5B,eAAO,YAAa,IAAK;AAAA,MAC7B;AAAA,IACJ,SAAU,GAAI;AACV,cAAQ,KAAM,EAAE,OAAQ;AAAA,IAC5B;AAAA,EACJ;AAEA,WAAS,WAAY,QAAqB,MAA2B;AACjE,QAAI;AACA,UAAK,OAAO,SAAU,IAAK,GAAI;AAC3B,eAAO,YAAa,IAAK;AAAA,MAC7B;AAAA,IACJ,SAAU,GAAI;AACV,cAAQ,KAAM,EAAE,OAAQ;AAAA,IAC5B;AAAA,EACJ;AAEA,WAAS,aAAc,GAAgB;AACnC,MAAE,eAAe;AACjB,MAAE,eAAe;AAAA,EACrB;AAEA,WAAS,2BAA4B,GAAe,SAA8B;AAC9E,QAAI,OAAe,EAAE;AACrB,QAAI,MAAc,EAAE;AACpB,UAAM,iBAAsB,kBAAkB;AAE9C,YAAQ,MAAM,UAAU;AAExB,QAAK,OAAO,QAAQ,cAAc,OAAO,YAAa;AAClD,cAAQ,QAAQ;AAAA,IACpB,OAAO;AACH;AAAA,IACJ;AAEA,QAAK,MAAM,QAAQ,eAAe,OAAO,aAAc;AACnD,aAAO,QAAQ;AAAA,IACnB,OAAO;AACH;AAAA,IACJ;AAEA,QAAK,OAAO,eAAe,MAAO;AAC9B,aAAO,EAAE,QAAQ;AAAA,IACrB;AAEA,QAAK,MAAM,eAAe,KAAM;AAC5B,YAAM,EAAE,QAAQ;AAAA,IACpB;AAEA,YAAQ,MAAM,OAAO,OAAO;AAC5B,YAAQ,MAAM,MAAM,MAAM;AAAA,EAC9B;AAEA,WAAS,4BAA6B,SAAsB,WAA4B;AACpF,QAAK,WAAY;AACb,UAAK,QAAQ,MAAM,YAAY,SAAU;AACrC,gBAAQ,MAAM,UAAU;AAAA,MAC5B;AAAA,IAEJ,OAAO;AACH,UAAK,QAAQ,MAAM,YAAY,QAAS;AACpC,gBAAQ,MAAM,UAAU;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,cAAe,WAAwB,WAA0B;AACtE,UAAM,gBAA6B,cAAe,KAAM;AACxD,UAAM,QAAqB,cAAe,SAAS,UAAW;AAC9D,UAAM,QAA0B,cAAe,OAAQ;AAEvD,cAAU,YAAa,aAAc;AACrC,kBAAc,YAAa,KAAM;AACjC,UAAM,YAAa,KAAM;AAEzB,UAAM,OAAO;AAEb,UAAM,YAAyB,cAAe,QAAQ,YAAa;AACnE,UAAM,OAAoB,cAAe,QAAQ,MAAO;AAExD,SAAK,YAAY;AAEjB,UAAM,YAAa,SAAU;AAC7B,UAAM,YAAa,IAAK;AAExB,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAA0B,WAAwB,WAA2B;AAClF,QAAI,WAAsC,UAAU,uBAAwB,SAAU;AAEtF,WAAQ,SAAU,CAAE,GAAI;AACpB,eAAU,CAAE,EAAE,WAAW,YAAa,SAAU,CAAE,CAAE;AAAA,IACxD;AAAA,EACJ;AASA,WAAS,uBAAwB,oBAA8B,MAAsB;AACjF,QAAK,kBAAmB,eAAgB,GAAI;AACxC,sBAAgB,MAAO,MAAM,CAAC,EAAE,MAAM,KAAM,MAAM,CAAE,CAAE;AAAA,IAC1D;AAAA,EACJ;AASA,WAAS,0BAAoC;AACzC,QAAI,OAAgB;AAEpB,QAAK,eAAe,6BAA8B;AAC9C,YAAM,MAAc,OAAO,SAAS;AACpC,YAAM,eAAoB,uBAAwB,GAAI;AAEtD,UAAK,UAAW,aAAa,SAAU,GAAI;AACvC,cAAM,UAAkB,SAAU,aAAa,WAAW,EAAG;AAE7D,YAAK,CAAC,MAAO,OAAQ,KAAK,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AAC9E,kBAAS,eAAgB,EAAE,WAAW;AAAA,QAC1C;AAAA,MACJ;AAEA,UAAK,UAAW,aAAa,MAAO,GAAI;AACpC,eAAO,aAAa,WAAW;AAAA,MACnC;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAEA,WAAS,uBAAwB,KAAoB;AACjD,UAAM,eAAuB,CAAC;AAC9B,UAAM,eAAyB,IAAI,MAAO,GAAI;AAE9C,QAAK,aAAa,SAAS,GAAI;AAC3B,YAAM,aAAuB,aAAc,CAAE,EAAE,MAAO,GAAI;AAC1D,YAAM,mBAA2B,WAAW;AAE5C,eAAU,kBAA0B,GAAG,kBAAkB,kBAAkB,mBAAoB;AAC3F,cAAM,YAAsB,WAAY,eAAgB,EAAE,MAAO,GAAI;AAErE,qBAAc,UAAW,CAAE,CAAE,IAAI,UAAW,CAAE;AAAA,MAClD;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AASA,WAAS,UAAW,OAAuB;AACvC,WAAO,UAAU,QAAQ,UAAU,UAAa;AAAA,EACpD;AAEA,WAAS,gBAAiB,QAAwB;AAC9C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,iBAAkB,QAAwB;AAC/C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,gBAAiB,QAAwB;AAC9C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,kBAAmB,QAAwB;AAChD,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,gBAAiB,QAAwB;AAC9C,WAAO,UAAW,MAAO,KAAK,OAAO,WAAW;AAAA,EACpD;AAEA,WAAS,eAAgB,QAAwB;AAC7C,WAAO,gBAAiB,MAAO,KAAK,kBAAkB;AAAA,EAC1D;AASA,WAAS,oBAAqB,OAAY,cAAgC;AACtE,WAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,EAC/C;AAEA,WAAS,iBAAkB,OAAY,cAAgC;AACnE,WAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAEA,WAAS,kBAAmB,OAAY,cAAkC;AACtE,WAAO,iBAAkB,KAAM,IAAI,QAAQ;AAAA,EAC/C;AAEA,WAAS,iBAAkB,OAAY,cAAgC;AACnE,WAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAEA,WAAS,mBAAoB,OAAY,cAA6B;AAClE,WAAO,kBAAmB,KAAM,IAAI,QAAQ;AAAA,EAChD;AAEA,WAAS,iBAAkB,OAAY,cAAgC;AACnE,WAAO,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAEA,WAAS,gBAAiB,OAAY,cAA8B;AAChE,WAAO,eAAgB,KAAM,IAAI,QAAQ;AAAA,EAC7C;AAEA,WAAS,wBAAyB,OAAY,cAA8B;AACxE,QAAIA,UAAgB;AAEpB,QAAK,gBAAiB,KAAM,GAAI;AAC5B,YAAM,SAAmB,MAAM,SAAS,EAAE,qBAAkB;AAE5D,UAAK,OAAO,WAAW,GAAI;AACvB,gBAAQ;AAAA,MACZ,OAAO;AACH,QAAAA,UAAS;AAAA,MACb;AAAA,IAEJ,OAAO;AACH,MAAAA,UAAS,gBAAiB,OAAO,YAAa;AAAA,IAClD;AAEA,WAAOA;AAAA,EACX;AAEA,WAAS,oBAAqB,cAAmC;AAC7D,UAAM,SAAuB;AAAA,MACzB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAEA,QAAI;AACA,UAAK,gBAAiB,YAAa,GAAI;AACnC,eAAO,SAAS,KAAK,MAAO,YAAa;AAAA,MAC7C;AAAA,IAEJ,SAAU,IAAK;AACX,UAAI;AACA,eAAO,SAAS,KAAM,MAAM,eAAe,GAAI;AAE/C,YAAK,kBAAmB,OAAO,MAAO,GAAI;AACtC,iBAAO,SAAS,OAAO,OAAO;AAAA,QAClC;AAAA,MAEJ,SAAU,IAAK;AACX,YAAK,CAAC,eAAe,UAAW;AAC5B,kBAAQ,MAAO,eAAe,gBAAgB,QAAS,eAAgB,GAAG,OAAQ,EAAE,QAAS,eAAgB,GAAG,OAAQ,CAAE;AAC1H,iBAAO,SAAS;AAAA,QACpB;AAEA,eAAO,SAAS;AAAA,MACpB;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AASA,WAAS,sBAA6B;AAClC,QAAK,QAAQ,OAAO,GAAI;AACpB,oBAAe,KAAM;AAErB,cAAS,eAAgB,EAAE,WAAW;AAAA,IAC1C;AAAA,EACJ;AASA,WAAS,0BAA2B,mBAAkC,MAAc;AAChF,qBAAiB,iBAAkB,kBAAkB,CAAC,CAAmB;AACzE,mBAAe,WAAW,kBAAmB,eAAe,UAAU,IAAK;AAC3E,mBAAe,kBAAkB,wBAAyB,eAAe,iBAAiB,CAAE,GAAI,CAAE;AAClG,mBAAe,kBAAkB,kBAAmB,eAAe,iBAAiB,IAAK;AACzF,mBAAe,sBAAsB,kBAAmB,eAAe,qBAAqB,IAAK;AACjG,mBAAe,mBAAmB,kBAAmB,eAAe,kBAAkB,IAAK;AAC3F,mBAAe,8BAA8B,kBAAmB,eAAe,6BAA6B,IAAK;AACjH,mBAAe,yBAAyB,kBAAmB,eAAe,wBAAwB,KAAM;AACxG,mBAAe,cAAc,kBAAmB,eAAe,aAAa,IAAK;AACjF,mBAAe,qBAAqB,kBAAmB,eAAe,oBAAoB,KAAM;AAChG,mBAAe,eAAe,iBAAkB,eAAe,cAAc,GAAI;AACjF,mBAAe,0BAA0B,kBAAmB,eAAe,yBAAyB,IAAK;AACzG,mBAAe,uCAAuC,kBAAmB,eAAe,sCAAsC,KAAM;AACpI,mBAAe,kBAAkB,kBAAmB,eAAe,iBAAiB,KAAM;AAC1F,mBAAe,mBAAmB,kBAAmB,eAAe,kBAAkB,KAAM;AAC5F,mBAAe,sBAAsB,kBAAmB,eAAe,qBAAqB,KAAM;AAClG,mBAAe,sBAAsB,kBAAmB,eAAe,qBAAqB,KAAM;AAElG,qCAAiC;AACjC,4CAAwC;AAAA,EAC5C;AAEA,WAAS,mCAA0C;AAC/C,mBAAe,iBAAiB,oBAAqB,eAAe,gBAAgB,MAAO;AAC3F,mBAAe,iBAAiB,oBAAqB,eAAe,gBAAgB,MAAO;AAC3F,mBAAe,mBAAmB,oBAAqB,eAAe,kBAAkB,QAAS;AACjG,mBAAe,yBAAyB,oBAAqB,eAAe,wBAAwB,OAAQ;AAC5G,mBAAe,qBAAqB,oBAAqB,eAAe,oBAAoB,mBAAoB;AAChH,mBAAe,kBAAkB,oBAAqB,eAAe,iBAAiB,4CAA6C;AACnI,mBAAe,6BAA6B,oBAAqB,eAAe,4BAA4B,2DAA4D;AACxK,mBAAe,2BAA2B,oBAAqB,eAAe,0BAA0B,gEAAiE;AACzK,mBAAe,8BAA8B,oBAAqB,eAAe,6BAA6B,IAAK;AAAA,EACvH;AAEA,WAAS,0CAAiD;AACtD,mBAAe,yBAAyB,mBAAoB,eAAe,wBAAwB,IAAK;AAAA,EAC5G;AASA,QAAM,UAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOvB,OAAO,SAAW,QAAgB,MAAmB;AACjD,UAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,0BAAkB,iBAAkB,OAAO,eAAgB;AAE3D,YAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,kBAAS,eAAgB,EAAE,WAAW;AAEtC,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,MAAM,SAAW,QAAgB,MAAmB;AAChD,UAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,0BAAkB,iBAAkB,OAAO,eAAgB;AAE3D,YAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,cAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,oBAAS,eAAgB,EAAE,WAAW;AAAA,UAC1C;AAEA,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,MAAM,WAAwB;AAC1B,UAAK,QAAQ,OAAO,GAAI;AACpB,sBAAc;AAAA,MAClB;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,QAAQ,WAAsB;AAC1B,aAAO,UAAW,eAAgB,KAAK,gBAAgB,MAAM,YAAY;AAAA,IAC7E;AAAA,IAEA,YAAY,WAAsB;AAC9B,aAAO,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS;AAAA,IAC3F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,kBAAkB,WAAwB;AACtC,kBAAY;AAEZ,aAAO;AAAA,IACX;AAAA,IAEA,SAAS,SAAW,SAAsB,SAAsC;AAC5E,UAAK,gBAAiB,OAAQ,KAAK,gBAAiB,OAAQ,GAAI;AAC5D,qBAAc,SAAS,sBAAuB,OAAQ,CAAE;AAExD,gBAAS,eAAgB,EAAE,KAAK,KAAK;AAErC,4BAAoB;AAAA,MACxB;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,SAAW,SAAmC;AACtD,UAAK,gBAAiB,OAAQ,GAAI;AAC9B,YAAI,UAAmB;AAEvB,iBAAU,SAAS,SAAU;AACzB,cAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,qBAAU,SAAS,QAAS,KAAM,EAAE,MAAO;AACvC,kBAAK,QAAS,KAAM,EAAE,KAAK,eAAgB,KAAM,GAAI;AACjD,sBAAM,iBAAiC,QAAS,KAAM,EAAE,KAAM,KAAM;AAEpE,oBAAK,eAAe,aAAa,YAAY,SAAU;AACnD,yCAAwB,eAAe,OAAO,cAAc,eAAe,aAAa,OAAQ;AAEhG,0BAAS,KAAM,EAAE,KAAK,OAAQ,QAAS,KAAM,EAAE,KAAK,QAAS,eAAe,KAAM,GAAG,CAAE;AAEvF,yBAAO,QAAS,KAAM,EAAE,KAAM,eAAe,KAAM;AAEnD,0BAAS,KAAM,EAAE,KAAK,KAAK;AAE3B,4BAAU;AACV;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAEA,YAAK,CAAC,SAAU;AACZ,mCAA0B,SAAS,iBAAkB;AAAA,QACzD,OAAO;AACH,8BAAoB;AAAA,QACxB;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,SAAW,QAAgB,MAAmB;AACtD,0BAAoB;AAEpB,eAAU,aAAa,SAAU;AAC7B,YAAK,QAAQ,eAAgB,SAAU,GAAI;AACvC,cAAK,CAAC,gBAAiB,KAAM,KAAK,UAAU,WAAY;AACpD,qBAAU,SAAS,QAAS,SAAU,EAAE,MAAO;AAC3C,kBAAK,QAAS,SAAU,EAAE,KAAK,eAAgB,KAAM,GAAI;AACrD,sBAAM,iBAAiC,QAAS,SAAU,EAAE,KAAM,KAAM;AAExE,uCAAwB,eAAe,OAAO,cAAc,eAAe,aAAa,OAAQ;AAAA,cACpG;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,UAAK,gBAAiB,KAAM,GAAI;AAC5B,YAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,iBAAO,QAAS,KAAM;AAAA,QAC1B;AAAA,MAEJ,OAAO;AACH,kBAAU,CAAC;AAAA,MACf;AAEA,UAAK,CAAC,gBAAiB,KAAM,KAAK,UAAU,iBAAkB;AAC1D,0BAAmB,OAAQ;AAAA,MAC/B;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,WAAwB;AAChC,+BAA0B,SAAS,MAAM,iBAAkB;AAE3D,aAAO;AAAA,IACX;AAAA,IAEA,kBAAkB,WAAwB;AACtC,cAAS,eAAgB,EAAE,KAAK,QAAQ;AAExC,0BAAoB;AAEpB,aAAO;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,kBAAkB,SAAW,kBAA8C;AACvE,UAAK,gBAAiB,gBAAiB,GAAI;AACvC,YAAI,0BAAmC;AAEvC,iBAAU,gBAAgB,kBAAmB;AACzC,cAAK,iBAAiB,eAAgB,YAAa,KAAK,eAAe,eAAgB,YAAa,KAAK,eAAgB,YAAa,MAAM,iBAAkB,YAAa,GAAI;AAC3K,2BAAgB,YAAa,IAAI,iBAAkB,YAAa;AAChE,sCAA0B;AAAA,UAC9B;AAAA,QACJ;AAEA,YAAK,yBAA0B;AAC3B,oCAA2B,cAAe;AAAA,QAC9C;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,YAAY,WAAoB;AAC5B,aAAO;AAAA,IACX;AAAA,EACJ;AASA,GAAE,MAAM;AACJ,8BAA0B;AAE1B,aAAS,iBAAkB,oBAAoB,MAAM;AACjD,wBAAkB;AAClB,+BAAyB;AACzB,mBAAa;AACb,oBAAc;AACd,kBAAY;AACZ,0BAAoB;AAEpB,UAAK,wBAAwB,GAAI;AAC7B,gBAAQ,KAAK;AAAA,MACjB;AAAA,IACJ,CAAE;AAEF,QAAK,CAAC,UAAW,OAAO,QAAS,GAAI;AACjC,aAAO,WAAW;AAAA,IACtB;AAAA,EACJ,GAAK;AACT,GAAK","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input;\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: any = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: any = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : any {\n let left: number = 0;\n let top: number = 0;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n left += element.offsetLeft - element.scrollLeft;\n top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return {\n left: left,\n top: top\n };\n }\n\n function getScrollPosition() : any {\n const doc: HTMLElement = document.documentElement;\n const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 );\n const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 );\n\n return {\n left: left,\n top: top\n };\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: any = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : any {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return {\n input: input,\n label: label\n };\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Position = {\n left: number;\n top: number;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 810c9e0..17e50bb 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -27,6 +27,11 @@ type StringToJson = { object: any; }; +type Position = { + left: number; + top: number; +}; + ( () => { // Variables: Configuration @@ -159,7 +164,7 @@ type StringToJson = { _element_Dialog_CheckBox_Container = createElement( "div", "checkbox-container" ); _element_Dialog.appendChild( _element_Dialog_CheckBox_Container ); - _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input; + _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ); _element_Dialog_CheckBox_Input.onchange = () => { if ( _configuration.showDoNotShowAgain ) { @@ -330,7 +335,7 @@ type StringToJson = { showElementAtMousePosition( e, _element_Dialog ); } else { - const offset: any = getOffset( bindingOptions._currentView.element ); + const offset: Position = getOffset( bindingOptions._currentView.element ); let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight; let left: number = ( offset.left ); @@ -348,7 +353,7 @@ type StringToJson = { } } else { - const scrollPosition: any = getScrollPosition(); + const scrollPosition: Position = getScrollPosition(); const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left ); const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top ); @@ -788,32 +793,31 @@ type StringToJson = { return result; } - function getOffset( element: HTMLElement ) : any { - let left: number = 0; - let top: number = 0; + function getOffset( element: HTMLElement ) : Position { + const result: Position = { + left: 0, + top: 0 + } as Position; while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) { - left += element.offsetLeft - element.scrollLeft; - top += element.offsetTop - element.scrollTop; + result.left += element.offsetLeft - element.scrollLeft; + result.top += element.offsetTop - element.scrollTop; element = element.offsetParent as HTMLElement; } - return { - left: left, - top: top - }; + return result; } - function getScrollPosition() : any { + function getScrollPosition() : Position { const doc: HTMLElement = document.documentElement; - const left: number = ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ); - const top: number = ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 ); - return { - left: left, - top: top - }; + const result: Position = { + left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ), + top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 ) + } as Position; + + return result; } function getStyleValueByName( element: any, stylePropertyName: string ) : any { @@ -856,7 +860,7 @@ type StringToJson = { function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void { let left: number = e.pageX; let top: number = e.pageY; - const scrollPosition: any = getScrollPosition(); + const scrollPosition: Position = getScrollPosition(); element.style.display = "block"; @@ -897,7 +901,7 @@ type StringToJson = { } } - function buildCheckBox( container: HTMLElement, labelText: string ) : any { + function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement { const lineContainer: HTMLElement = createElement( "div" ); const label: HTMLElement = createElement( "label", "checkbox" ); const input: HTMLInputElement = createElement( "input" ) as HTMLInputElement; @@ -916,10 +920,7 @@ type StringToJson = { label.appendChild( checkMark ); label.appendChild( text ); - return { - input: input, - label: label - }; + return input; } function clearElementsByClassName( container: HTMLElement, className: string ) : void { From 87c27056c431896e87ddc7b5c4ce4a52de26f083 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 15:17:32 +0100 Subject: [PATCH 24/44] Removed dead file. --- src/old/journey.js | 1556 -------------------------------------------- 1 file changed, 1556 deletions(-) delete mode 100644 src/old/journey.js diff --git a/src/old/journey.js b/src/old/journey.js deleted file mode 100644 index b1c845b..0000000 --- a/src/old/journey.js +++ /dev/null @@ -1,1556 +0,0 @@ -/** - * Journey.js - * - * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps! - * - * @file journey.js - * @version v2.0.0 - * @author Bunoon - * @license MIT License - * @copyright Bunoon 2024 - */ - - -( function() { - "use strict"; - - var // Variables: Constructor Parameters - _parameter_Document = null, - _parameter_Window = null, - _parameter_Math = null, - _parameter_Json = null, - - // Variables: Public Scope - _public = {}, - - // Variables: Configuration - _configuration = {}, - - // Variables: Configuration (overrides) - _configuration_ShortcutKeysEnabled = true, - - // Variables: Enums - _enum_KeyCodes = { - escape: 27, - left: 37, - up: 38, - right: 39, - down: 40 - }, - - // Variables: Strings - _string = { - empty: "", - space: " " - }, - - // Variables: Elements - _elements_Type = {}, - - // Variables: Groups - _groups_Default = "default", - _groups_Current = _groups_Default, - _groups = {}, - - // Variables: Focus Element - _element_Focus_Element_PositionStyle = null, - - // Variables: Disabled Background - _element_Disabled_Background = null, - - // Variables: Dialog - _element_Dialog = null, - _element_Dialog_Close_Button = null, - _element_Dialog_Title = null, - _element_Dialog_Description = null, - _element_Dialog_CheckBox_Container = null, - _element_Dialog_CheckBox_Input = null, - _element_Dialog_ProgressDots = null, - _element_Dialog_ProgressBar = null, - _element_Dialog_ProgressBar_Percentage = null, - _element_Dialog_ProgressBar_Percentage_Text = null, - _element_Dialog_Buttons = null, - _element_Dialog_Buttons_Back_Button = null, - _element_Dialog_Buttons_Next_Button = null, - _element_Dialog_IsHint = false, - - // Variables: Dialog - Move - _element_Dialog_Move_Original_X = 0, - _element_Dialog_Move_Original_Y = 0, - _element_Dialog_Move_IsMoving = false, - _element_Dialog_Move_X = 0, - _element_Dialog_Move_Y = 0, - - // Variables: Dialog - _element_ToolTip = null, - _element_ToolTip_Timer = null, - - // Variables: Attribute Names - _attribute_Name_Options = "data-journey-js"; - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Groups - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function setupDefaultGroup( groups ) { - _groups = getDefaultObject( groups, {} ); - - _groups[ _groups_Default ] = { - json: {}, - keys: [], - position: 0 - }; - } - - function setupNewGroup( group ) { - if ( !_groups.hasOwnProperty( group ) ) { - _groups[ group ] = { - json: {}, - keys: [], - position: 0 - }; - } - } - - function getGroupBindingOptions() { - return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ]; - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Disabled Background - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function renderDisabledBackground() { - _element_Disabled_Background = createElement( "div", "journey-js-disabled-background" ); - - _element_Disabled_Background.onclick = function() { - if ( _configuration.closeDialogOnDisabledBackgroundClick ) { - onDialogClose(); - } - }; - } - - function showDisabledBackground() { - addNode( _parameter_Document.body, _element_Disabled_Background ); - } - - function hideDisabledBackground() { - removeNode( _parameter_Document.body, _element_Disabled_Background ); - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Render: Dialog - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function renderDialog() { - _element_Dialog = createElement( "div", "journey-js-dialog" ); - _element_Dialog.style.display = "none"; - _parameter_Document.body.appendChild( _element_Dialog ); - - _element_Dialog_Close_Button = createElement( "button", "close" ); - _element_Dialog.appendChild( _element_Dialog_Close_Button ); - - _element_Dialog_Close_Button.onclick = function() { - onDialogClose(); - }; - - addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText ); - - _element_Dialog_Title = createElement( "div", "title" ); - _element_Dialog.appendChild( _element_Dialog_Title ); - - _element_Dialog_Description = createElement( "div", "description" ); - _element_Dialog.appendChild( _element_Dialog_Description ); - - _element_Dialog_CheckBox_Container = createElement( "div", "checkbox-container" ); - _element_Dialog.appendChild( _element_Dialog_CheckBox_Container ); - - _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ).input; - - _element_Dialog_CheckBox_Input.onchange = function() { - if ( _configuration.showDoNotShowAgain ) { - fireCustomTrigger( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked ); - } - }; - - _element_Dialog_ProgressDots = createElement( "div", "progress-dots" ); - _element_Dialog.appendChild( _element_Dialog_ProgressDots ); - - _element_Dialog_ProgressBar = createElement( "div", "progress-bar" ); - _element_Dialog.appendChild( _element_Dialog_ProgressBar ); - - _element_Dialog_ProgressBar_Percentage = createElement( "div", "progress-bar-percentage" ); - _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage ); - - _element_Dialog_ProgressBar_Percentage_Text = createElement( "p", "progress-bar-percentage-text" ); - _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text ); - - _element_Dialog_Buttons = createElement( "div", "buttons" ); - _element_Dialog.appendChild( _element_Dialog_Buttons ); - - _element_Dialog_Buttons_Back_Button = createElement( "button", "back" ); - _element_Dialog_Buttons_Back_Button.onclick = onDialogBack; - _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button ); - - _element_Dialog_Buttons_Next_Button = createElement( "button", "next" ); - _element_Dialog_Buttons_Next_Button.onclick = onDialogNext; - _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button ); - - makeDialogMovable(); - } - - function onDialogClose( showConfirmationBox ) { - var confirmed = false; - - showConfirmationBox = getDefaultBoolean( showConfirmationBox, true ); - - if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) { - confirmed = confirm( _configuration.closeDialogConfirmationText ); - } else { - confirmed = true; - } - - if ( confirmed ) { - var bindingOptions = getGroupBindingOptions(); - - if ( isDefined( bindingOptions ) && isDefined( bindingOptions.currentView.element ) ) { - fireCustomTrigger( bindingOptions.events.onClose, bindingOptions.currentView.element ); - } - - removeFocusClassFromLastElement( false ); - hideDisabledBackground(); - hideToolTip(); - - _element_Dialog.style.display = "none"; - } - } - - function onDialogBack() { - if ( _groups[ _groups_Current ].position > 0 ) { - removeFocusClassFromLastElement(); - - _groups[ _groups_Current ].position--; - - showDialogAndSetPosition(); - } - } - - function onDialogNext() { - if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) { - var bindingOptions = getGroupBindingOptions(); - - onDialogClose( false ); - fireCustomTrigger( bindingOptions.events.onFinish, bindingOptions.currentView.element ); - - } else { - removeFocusClassFromLastElement(); - - _groups[ _groups_Current ].position++; - - showDialogAndSetPosition(); - } - } - - function showDialogAndSetPosition() { - var bindingOptions = getGroupBindingOptions(); - - if ( isDefined( bindingOptions ) && isDefined( bindingOptions.currentView.element ) ) { - if ( bindingOptions.showDisabledBackground ) { - showDisabledBackground(); - } else { - hideDisabledBackground(); - } - - hideToolTip(); - - _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? "block": "none"; - _configuration_ShortcutKeysEnabled = true; - - bindingOptions.currentView.element.className += _string.space + "journey-js-element-focus"; - - if ( _configuration.scrollToElements ) { - bindingOptions.currentView.element.scrollIntoView(); - } - - var lastPositionStyle = getStyleValueByName( bindingOptions.currentView.element, "position" ); - - if ( lastPositionStyle !== _string.empty && lastPositionStyle.toLowerCase() === "static" ) { - _element_Focus_Element_PositionStyle = lastPositionStyle; - bindingOptions.currentView.element.style.position = "relative"; - } - - showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain ); - showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 ); - showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 ); - showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText ); - showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons ); - - _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText; - _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0; - - if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) { - _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText; - } else { - _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText; - } - - setDialogText( bindingOptions ); - setDialogPosition( null, bindingOptions ); - buildProcessDots(); - setProgressBarPosition(); - fireCustomTrigger( bindingOptions.events.onEnter, bindingOptions.currentView.element ); - - if ( bindingOptions.sendClick ) { - bindingOptions.currentView.element.click(); - } - } - } - - function setDialogText( bindingOptions ) { - if ( isDefinedString( bindingOptions.title ) ) { - _element_Dialog_Title.innerHTML = bindingOptions.title; - } else { - _element_Dialog_Title.innerHTML = _string.empty; - } - - if ( isDefinedString( bindingOptions.description ) ) { - _element_Dialog_Description.innerHTML = bindingOptions.description; - } else { - _element_Dialog_Description.innerHTML = _string.empty; - } - } - - function setDialogPosition( e, bindingOptions ) { - if ( _element_Dialog.style.display !== "block" ) { - _element_Dialog.style.display = "block"; - - fireCustomTrigger( bindingOptions.events.onOpen, bindingOptions.currentView.element ); - } - - if ( _groups[ _groups_Current ].position === 0 ) { - fireCustomTrigger( bindingOptions.events.onStart, bindingOptions.currentView.element ); - } - - _element_Dialog_IsHint = bindingOptions.isHint === true; - - if ( bindingOptions.attach || bindingOptions.isHint ) { - if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) { - showElementAtMousePosition( e, _element_Dialog ); - - } else { - var offset = getOffset( bindingOptions.currentView.element ), - top = ( offset.top ) + bindingOptions.currentView.element.offsetHeight, - left = ( offset.left ); - - if ( left + _element_Dialog.offsetWidth > _parameter_Window.innerWidth || bindingOptions.alignRight ) { - left -= _element_Dialog.offsetWidth; - left += bindingOptions.currentView.element.offsetWidth; - } - - if ( top + _element_Dialog.offsetHeight > _parameter_Window.innerHeight || bindingOptions.alignTop ) { - top -= ( _element_Dialog.offsetHeight + bindingOptions.currentView.element.offsetHeight ); - } - - _element_Dialog.style.top = top + "px"; - _element_Dialog.style.left = left + "px"; - } - - } else { - var scrollPosition = getScrollPosition(), - centerLeft = _parameter_Math.max( 0, ( ( _parameter_Window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left ), - centerTop = _parameter_Math.max( 0, ( ( _parameter_Window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top ); - - _element_Dialog.style.left = centerLeft + "px"; - _element_Dialog.style.top = centerTop + "px"; - } - } - - function removeFocusClassFromLastElement( callCustomTrigger ) { - callCustomTrigger = isDefined( callCustomTrigger ) ? callCustomTrigger : true; - - var bindingOptions = getGroupBindingOptions(); - - if ( isDefined( bindingOptions ) && isDefined( bindingOptions.currentView.element ) ) { - bindingOptions.currentView.element.className = bindingOptions.currentView.element.className.replace( _string.space + "journey-js-element-focus", _string.empty ); - - if ( isDefined( _element_Focus_Element_PositionStyle ) ) { - bindingOptions.currentView.element.style.position = _element_Focus_Element_PositionStyle; - } - - if ( callCustomTrigger ) { - fireCustomTrigger( bindingOptions.events.onLeave, bindingOptions.currentView.element ); - } - } - } - - function buildProcessDots() { - _element_Dialog_ProgressDots.innerHTML = _string.empty; - - if ( _configuration.showProgressDots ) { - var keysLength = _groups[ _groups_Current ].keys.length; - - for ( var keyIndex = 0; keyIndex < keysLength; keyIndex++ ) { - buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] ); - } - } - } - - function buildProgressDot( keyIndex, order ) { - var bindingOptions = _groups[ _groups_Current ].json[ order ], - dot = null; - - if ( keyIndex === _groups[ _groups_Current ].position ) { - dot = createElement( "div", "dot-active" ); - } else { - - dot = createElement( "div", "dot" ); - - dot.onclick = function() { - removeFocusClassFromLastElement(); - - _groups[ _groups_Current ].position = keyIndex; - - showDialogAndSetPosition(); - }; - } - - _element_Dialog_ProgressDots.appendChild( dot ); - - if ( _configuration.showProgressDotToolTips ) { - if ( isDefinedString( bindingOptions.tooltip ) ) { - addToolTip( dot, bindingOptions.tooltip ); - } else { - addToolTip( dot, bindingOptions.title ); - } - } - - if ( _configuration.showProgressDotNumbers ) { - dot.className += " dot-number"; - dot.innerHTML = ( keyIndex + 1 ).toString(); - } - } - - function setProgressBarPosition() { - if ( _configuration.showProgressBar ) { - var pixelsPerStage = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length, - width = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage, - percentageComplete = _parameter_Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 ); - - _element_Dialog_ProgressBar_Percentage.style.width = width + "px"; - _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + "%"; - } - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Render: Dialog - Move - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function makeDialogMovable() { - _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown; - _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp; - _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp; - - _parameter_Document.body.addEventListener( "mousemove", onMoveDocumentMouseMove ); - _parameter_Document.body.addEventListener( "mouseleave", onMoveDocumentMouseLeave ); - } - - function onMoveTitleBarMouseDown( e ) { - if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) { - _element_Dialog.className += " journey-js-dialog-moving"; - _element_Dialog_Move_IsMoving = true; - _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft; - _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop; - _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft; - _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop; - } - } - - function onMoveTitleBarMouseUp() { - if ( _element_Dialog_Move_IsMoving ) { - _element_Dialog_Move_IsMoving = false; - _element_Dialog_Move_Original_X = 0; - _element_Dialog_Move_Original_Y = 0; - _element_Dialog.className = "journey-js-dialog"; - } - } - - function onMoveDocumentMouseMove( e ) { - if ( _element_Dialog_Move_IsMoving ) { - _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + "px"; - _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + "px"; - } - } - - function onMoveDocumentMouseLeave() { - if ( _element_Dialog_Move_IsMoving ) { - _element_Dialog.style.left = _element_Dialog_Move_Original_X + "px"; - _element_Dialog.style.top = _element_Dialog_Move_Original_Y + "px"; - - _element_Dialog_Move_IsMoving = false; - _element_Dialog_Move_Original_X = 0; - _element_Dialog_Move_Original_Y = 0; - _element_Dialog.className = "journey-js-dialog"; - } - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Render: ToolTip - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function renderToolTip() { - if ( !isDefined( _element_ToolTip ) ) { - _element_ToolTip = createElement( "div", "journey-js-tooltip" ); - _element_ToolTip.style.display = "none"; - - _parameter_Document.body.appendChild( _element_ToolTip ); - - _parameter_Document.body.addEventListener( "mousemove", function() { - hideToolTip(); - } ); - - _parameter_Document.addEventListener( "scroll", function() { - hideToolTip(); - } ); - } - } - - function addToolTip( element, text ) { - if ( element !== null ) { - element.onmousemove = function( e ) { - showToolTip( e, text ); - }; - } - } - - function showToolTip( e, text ) { - cancelBubble( e ); - hideToolTip(); - - _element_ToolTip_Timer = setTimeout( function() { - _element_ToolTip.innerHTML = text; - _element_ToolTip.style.display = "block"; - - showElementAtMousePosition( e, _element_ToolTip ); - }, _configuration.tooltipDelay ); - } - - function hideToolTip() { - if ( isDefined( _element_ToolTip ) ) { - if ( isDefined( _element_ToolTip_Timer ) ) { - clearTimeout( _element_ToolTip_Timer ); - _element_ToolTip_Timer = null; - } - - if ( _element_ToolTip.style.display === "block" ) { - _element_ToolTip.style.display = "none"; - } - } - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Rendering - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function getElements() { - var tagTypes = _configuration.domElementTypes, - tagTypesLength = tagTypes.length; - - for ( var tagTypeIndex = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) { - var domElements = _parameter_Document.getElementsByTagName( tagTypes[ tagTypeIndex ] ), - elements = [].slice.call( domElements ), - elementsLength = elements.length; - - for ( var elementIndex = 0; elementIndex < elementsLength; elementIndex++ ) { - if ( !getElement( elements[ elementIndex ] ) ) { - break; - } - } - } - - _groups[ _groups_Current ].keys.sort(); - } - - function getElement( element ) { - var result = true; - - if ( isDefined( element ) && element.hasAttribute( _attribute_Name_Options ) ) { - var bindingOptionsData = element.getAttribute( _attribute_Name_Options ); - - if ( isDefinedString( bindingOptionsData ) ) { - var bindingOptions = getObjectFromString( bindingOptionsData ); - - if ( bindingOptions.parsed && isDefinedObject( bindingOptions.result ) ) { - setupElement( element, buildAttributeOptions( bindingOptions.result ) ); - - } else { - if ( !_configuration.safeMode ) { - console.error( _configuration.attributeNotValidErrorText.replace( "{{attribute_name}}", _attribute_Name_Options ) ); - result = false; - } - } - - } else { - if ( !_configuration.safeMode ) { - console.error( _configuration.attributeNotSetErrorText.replace( "{{attribute_name}}", _attribute_Name_Options ) ); - result = false; - } - } - } - - return result; - } - - function setupElement( element, bindingOptions ) { - bindingOptions.currentView = {}; - bindingOptions.currentView.element = element; - - if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) { - element.removeAttribute( _attribute_Name_Options ); - - if ( !bindingOptions.isHint ) { - setupNewGroup( bindingOptions.group ); - - _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions; - _groups[ bindingOptions.group ].keys.push( bindingOptions.order ); - - fireCustomTrigger( bindingOptions.events.onAddStep, element ); - - } else { - renderHint( bindingOptions ); - } - } - } - - function renderHint( bindingOptions ) { - var positionStyle = getStyleValueByName( bindingOptions.currentView.element, "position" ); - - if ( positionStyle !== _string.empty && positionStyle.toLowerCase() === "static" ) { - bindingOptions.currentView.element.style.position = "relative"; - } - - var hint = createElement( "div", "journey-js-hint" ); - bindingOptions.currentView.element.appendChild( hint ); - - hint.onclick = function( e ) { - cancelBubble( e ); - - _element_Dialog_CheckBox_Container.style.display = "none"; - _element_Dialog_ProgressDots.style.display = "none"; - _element_Dialog_ProgressBar.style.display = "none"; - _element_Dialog_Buttons.style.display = "none"; - _configuration_ShortcutKeysEnabled = false; - - setDialogText( bindingOptions ); - setDialogPosition( e, bindingOptions ); - - if ( bindingOptions.removeHintWhenViewed ) { - clearElementsByClassName( bindingOptions.currentView.element, "journey-js-hint" ); - } - }; - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Document Events - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function buildDocumentEvents( addEvents ) { - addEvents = isDefined( addEvents ) ? addEvents : true; - - var documentFunc = addEvents ? _parameter_Document.addEventListener : _parameter_Document.removeEventListener, - windowFunc = addEvents ? _parameter_Window.addEventListener : _parameter_Window.removeEventListener; - - if ( _configuration.shortcutKeysEnabled ) { - documentFunc( "keydown", onWindowKeyDown ); - } - - windowFunc( "resize", onWindowResize ); - } - - function onWindowKeyDown( e ) { - if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) { - if ( e.keyCode === _enum_KeyCodes.escape ) { - e.preventDefault(); - onDialogClose(); - } else { - - if ( _configuration_ShortcutKeysEnabled ) { - if ( e.keyCode === _enum_KeyCodes.left ) { - e.preventDefault(); - onDialogBack(); - - } else if ( e.keyCode === _enum_KeyCodes.right ) { - e.preventDefault(); - onDialogNext(); - - } else if ( e.keyCode === _enum_KeyCodes.up ) { - e.preventDefault(); - onWindowKeyCodeUp(); - - } else if ( e.keyCode === _enum_KeyCodes.down ) { - e.preventDefault(); - onWindowKeyCodeDown(); - } - } - } - } - } - - function onWindowResize() { - if ( _public.isOpen() ) { - showDialogAndSetPosition(); - } - } - - function onWindowKeyCodeUp() { - if ( _groups[ _groups_Current ].position !== 0 ) { - removeFocusClassFromLastElement(); - - _groups[ _groups_Current ].position = 0; - - showDialogAndSetPosition(); - } - } - - function onWindowKeyCodeDown() { - if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) { - removeFocusClassFromLastElement(); - - _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1; - - showDialogAndSetPosition(); - } - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Options - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function buildAttributeOptions( newOptions ) { - var options = !isDefinedObject( newOptions ) ? {} : newOptions; - options.order = getDefaultNumber( options.order, 0 ); - options.attach = getDefaultBoolean( options.attach, true ); - options.sendClick = getDefaultBoolean( options.sendClick, false ); - options.alignTop = getDefaultBoolean( options.alignTop, false ); - options.alignRight = getDefaultBoolean( options.alignRight, false ); - options.isHint = getDefaultBoolean( options.isHint, false ); - options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false ); - options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true ); - options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false ); - options.group = getDefaultString( options.group, _groups_Default ); - - options = buildAttributeOptionStrings( options ); - - return buildAttributeOptionCustomTriggers( options ); - } - - function buildAttributeOptionStrings( options ) { - options.title = getDefaultString( options.title, null ); - options.description = getDefaultString( options.description, null ); - options.tooltip = getDefaultString( options.tooltip, null ); - - return options; - } - - function buildAttributeOptionCustomTriggers( options ) { - options.events = getDefaultObject( options.events, {} ); - options.events.onEnter = getDefaultFunction( options.events.onEnter, null ); - options.events.onLeave = getDefaultFunction( options.events.onLeave, null ); - options.events.onClose = getDefaultFunction( options.events.onClose, null ); - options.events.onFinish = getDefaultFunction( options.events.onFinish, null ); - options.events.onOpen = getDefaultFunction( options.events.onOpen, null ); - options.events.onStart = getDefaultFunction( options.events.onStart, null ); - options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null ); - options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null ); - - return options; - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Browser URL Parameters - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function getBrowserUrlParameters() { - var show = false; - - if ( _configuration.browserUrlParametersEnabled ) { - var url = _parameter_Window.location.href, - urlArguments = getBrowserUrlArguments( url ); - - if ( isDefined( urlArguments.sjOrderId ) ) { - var orderId = parseInt( urlArguments.sjOrderId, 10 ); - - if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) { - _groups[ _groups_Current ].position = orderId; - } - } - - if ( isDefined( urlArguments.sjShow ) ) { - show = urlArguments.sjShow === "true"; - } - } - - return show; - } - - function getBrowserUrlArguments( url ) { - var urlArguments = {}, - urlDataParts = url.split( "?" ); - - if ( urlDataParts.length > 1 ) { - var parsedArgs = urlDataParts[ 1 ].split( "&" ), - parsedArgsLength = parsedArgs.length; - - for ( var parsedArgsIndex = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) { - var parsedArg = parsedArgs[ parsedArgsIndex ].split( "=" ); - - urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ]; - } - } - - return urlArguments; - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Validation - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function isDefined( value ) { - return value !== null && value !== undefined && value !== _string.empty; - } - - function isDefinedObject( object ) { - return isDefined( object ) && typeof object === "object"; - } - - function isDefinedBoolean( object ) { - return isDefined( object ) && typeof object === "boolean"; - } - - function isDefinedString( object ) { - return isDefined( object ) && typeof object === "string"; - } - - function isDefinedFunction( object ) { - return isDefined( object ) && typeof object === "function"; - } - - function isDefinedNumber( object ) { - return isDefined( object ) && typeof object === "number"; - } - - function isDefinedArray( object ) { - return isDefinedObject( object ) && object instanceof Array; - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Element Handling - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function createElement( type, className ) { - var result = null, - nodeType = type.toLowerCase(), - isText = nodeType === "text"; - - if ( !_elements_Type.hasOwnProperty( nodeType ) ) { - _elements_Type[ nodeType ] = isText ? _parameter_Document.createTextNode( _string.empty ) : _parameter_Document.createElement( nodeType ); - } - - result = _elements_Type[ nodeType ].cloneNode( false ); - - if ( isDefined( className ) ) { - result.className = className; - } - - return result; - } - - function getOffset( element ) { - var left = 0, - top = 0; - - while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) { - left += element.offsetLeft - element.scrollLeft; - top += element.offsetTop - element.scrollTop; - - element = element.offsetParent; - } - - return { - left: left, - top: top - }; - } - - function getScrollPosition() { - var doc = _parameter_Document.documentElement, - left = ( _parameter_Window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ), - top = ( _parameter_Window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 ); - - return { - left: left, - top: top - }; - } - - function getStyleValueByName( element, stylePropertyName ) { - var value = null; - - if ( _parameter_Window.getComputedStyle ) { - value = _parameter_Document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); - } - else if ( element.currentStyle ) { - value = element.currentStyle[ stylePropertyName ]; - } - - return value; - } - - function addNode( parent, node ) { - try { - if ( !parent.contains( node ) ) { - parent.appendChild( node ); - } - } catch ( e ) { - console.warn( e.message ); - } - } - - function removeNode( parent, node ) { - try { - if ( parent.contains( node ) ) { - parent.removeChild( node ); - } - } catch ( e ) { - console.warn( e.message ); - } - } - - function cancelBubble( e ) { - e.preventDefault(); - e.cancelBubble = true; - } - - function showElementAtMousePosition( e, element ) { - var left = e.pageX, - top = e.pageY, - scrollPosition = getScrollPosition(); - - element.style.display = "block"; - - if ( left + element.offsetWidth > _parameter_Window.innerWidth ) { - left -= element.offsetWidth; - } else { - left++; - } - - if ( top + element.offsetHeight > _parameter_Window.innerHeight ) { - top -= element.offsetHeight; - } else { - top++; - } - - if ( left < scrollPosition.left ) { - left = e.pageX + 1; - } - - if ( top < scrollPosition.top ) { - top = e.pageY + 1; - } - - element.style.left = left + "px"; - element.style.top = top + "px"; - } - - function showElementBasedOnCondition( element, condition ) { - if ( condition ) { - if ( element.style.display !== "block" ) { - element.style.display = "block"; - } - - } else { - if ( element.style.display !== "none" ) { - element.style.display = "none"; - } - } - } - - function buildCheckBox( container, labelText ) { - var lineContainer = createElement( "div" ), - label = createElement( "label", "checkbox" ), - input = createElement( "input" ); - - container.appendChild( lineContainer ); - lineContainer.appendChild( label ); - label.appendChild( input ); - - input.type = "checkbox"; - - var checkMark = createElement( "span", "check-mark" ), - text = createElement( "span", "text" ); - - text.innerHTML = labelText; - - label.appendChild( checkMark ); - label.appendChild( text ); - - return { - input: input, - label: label - }; - } - - function clearElementsByClassName( container, className ) { - var elements = container.getElementsByClassName( className ); - - while ( elements[ 0 ] ) { - elements[ 0 ].parentNode.removeChild( elements[ 0 ] ); - } - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Triggering Custom Events - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function fireCustomTrigger( triggerFunction ) { - if ( isDefinedFunction( triggerFunction ) ) { - triggerFunction.apply( null, [].slice.call( arguments, 1 ) ); - } - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Default Parameter/Option Handling - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function getDefaultAnyString( value, defaultValue ) { - return typeof value === "string" ? value : defaultValue; - } - - function getDefaultString( value, defaultValue ) { - return isDefinedString( value ) ? value : defaultValue; - } - - function getDefaultBoolean( value, defaultValue ) { - return isDefinedBoolean( value ) ? value : defaultValue; - } - - function getDefaultNumber( value, defaultValue ) { - return isDefinedNumber( value ) ? value : defaultValue; - } - - function getDefaultFunction( value, defaultValue ) { - return isDefinedFunction( value ) ? value : defaultValue; - } - - function getDefaultObject( value, defaultValue ) { - return isDefinedObject( value ) ? value : defaultValue; - } - - function getDefaultArray( value, defaultValue ) { - return isDefinedArray( value ) ? value : defaultValue; - } - - function getDefaultStringOrArray( value, defaultValue ) { - if ( isDefinedString( value ) ) { - value = value.split( _string.space ); - - if ( value.length === 0 ) { - value = defaultValue; - } - - } else { - value = getDefaultArray( value, defaultValue ); - } - - return value; - } - - function getObjectFromString( objectString ) { - var parsed = true, - result = null; - - try { - if ( isDefinedString( objectString ) ) { - result = _parameter_Json.parse( objectString ); - } - - } catch ( e1 ) { - - try { - result = eval( "(" + objectString + ")" ); - - if ( isDefinedFunction( result ) ) { - result = result(); - } - - } catch ( e2 ) { - if ( !_configuration.safeMode ) { - console.error( _configuration.objectErrorText.replace( "{{error_1}}", e1.message ).replace( "{{error_2}}", e2.message ) ); - parsed = false; - } - - result = null; - } - } - - return { - parsed: parsed, - result: result - }; - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Public Functions: Show/Hide - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - /** - * start(). - * - * Starts the Journey from the beginning. - * - * @public - * @fires onStart - * - * @param {string} [group] States the group of steps you want to start the journey for (defaults to "default"). - * - * @returns {Object} The Journey.js class instance. - */ - _public.start = function( group ) { - if ( !_public.isOpen() ) { - _groups_Current = getDefaultString( group, _groups_Default ); - - if ( _groups.hasOwnProperty( _groups_Current ) ) { - _groups[ _groups_Current ].position = 0; - - showDialogAndSetPosition(); - } - } - - return _public; - }; - - /** - * show(). - * - * Shows the Journey.js dialog for the element in the last known position (defaults to the start). - * - * @public - * @fires onOpen - * - * @param {string} [group] States the group of steps you want to show the dialog for (defaults to the last group used). - * - * @returns {Object} The Journey.js class instance. - */ - _public.show = function( group ) { - if ( !_public.isOpen() ) { - _groups_Current = getDefaultString( group, _groups_Current ); - - if ( _groups.hasOwnProperty( _groups_Current ) ) { - if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) { - _groups[ _groups_Current ].position = 0; - } - - showDialogAndSetPosition(); - } - } - - return _public; - }; - - /** - * hide(). - * - * Hides the Journey.js dialog. - * - * @public - * @fires onClose - * - * @returns {Object} The Journey.js class instance. - */ - _public.hide = function() { - if ( _public.isOpen() ) { - onDialogClose(); - } - - return _public; - }; - - /** - * isOpen(). - * - * Returns a flag that states if the dialog is opened. - * - * @public - * - * @returns {boolean} The flag that states if the dialog is open. - */ - _public.isOpen = function() { - return isDefined( _element_Dialog ) && _element_Dialog.style.display === "block"; - }; - - /** - * isComplete(). - * - * Returns a flag that states if the full journey has been completed. - * - * @public - * - * @returns {boolean} The flag that states if the full journey has been completed. - */ - _public.isComplete = function() { - return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1; - }; - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Public Functions: Managing Steps - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - /** - * addDocumentSteps(). - * - * Finds all new elements that contain the binding attribute and adds them as new steps. - * - * @public - * @fires onAddStep - * - * @returns {Object} The Journey.js class instance. - */ - _public.addDocumentSteps = function() { - getElements(); - - return _public; - }; - - /** - * addStep(). - * - * Adds a new step to the journey for a specific element. - * - * @public - * @fires onAddStep - * - * @param {Object} element The element that should be added to the journey. - * @param {Object} options The options to use for this step in the journey (refer to "Binding Options" documentation for properties). - * - * @returns {Object} The Journey.js class instance. - */ - _public.addStep = function( element, options ) { - if ( isDefinedObject( element ) && isDefinedObject( options ) ) { - setupElement( element, buildAttributeOptions( options ) ); - - _groups[ _groups_Current ].keys.sort(); - - resetDialogPosition(); - } - - return _public; - }; - - /** - * removeStep(). - * - * Removes a step from the journey, or a hint. - * - * @public - * @fires onRemoveStep - * - * @param {Object} element The element that should be removed. - * - * @returns {Object} The Journey.js class instance. - */ - _public.removeStep = function( element ) { - if ( isDefinedObject( element ) ) { - var removed = false; - - for ( var group in _groups ) { - if ( _groups.hasOwnProperty( group ) ) { - for ( var order in _groups[ group ].json ) { - if ( _groups[ group ].json.hasOwnProperty( order ) ) { - var bindingOptions = _groups[ group ].json[ order ]; - - if ( bindingOptions.currentView.element === element ) { - fireCustomTrigger( bindingOptions.events.onRemoveStep, bindingOptions.currentView.element ); - - _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 ); - - delete _groups[ group ].json[ bindingOptions.order ]; - - _groups[ group ].keys.sort(); - - removed = true; - break; - } - } - } - } - } - - if ( !removed ) { - clearElementsByClassName( element, "journey-js-hint" ); - } else { - resetDialogPosition(); - } - } - - return _public; - }; - - /** - * clearSteps(). - * - * Removes all the steps from the journey. - * - * @public - * @fires onRemoveStep - * - * @param {string} [group] States the group of steps you want to remove (defaults to all groups). - * - * @returns {Object} The Journey.js class instance. - */ - _public.clearSteps = function( group ) { - resetDialogPosition(); - - for ( var groupName in _groups ) { - if ( _groups.hasOwnProperty( groupName ) ) { - if ( !isDefinedString( group ) || group === groupName ) { - for ( var order in _groups[ groupName ].json ) { - if ( _groups[ groupName ].json.hasOwnProperty( order ) ) { - var bindingOptions = _groups[ groupName ].json[ order ]; - - fireCustomTrigger( bindingOptions.events.onRemoveStep, bindingOptions.currentView.element ); - } - } - } - } - } - - if ( isDefinedString( group ) ) { - if ( _groups.hasOwnProperty( group ) ) { - delete _groups[ group ]; - } - - } else { - _groups = {}; - } - - if ( !isDefinedString( group ) || group === _groups_Default ) { - setupDefaultGroup( _groups ); - } - - return _public; - }; - - /** - * clearHints(). - * - * Removes all the hints. - * - * @public - * - * @returns {Object} The Journey.js class instance. - */ - _public.clearHints = function() { - clearElementsByClassName( _parameter_Document.body, "journey-js-hint" ); - - return _public; - }; - - /** - * reverseStepOrder(). - * - * Reverses the order the steps in the journey should in. - * - * @public - * - * @returns {Object} The Journey.js class instance. - */ - _public.reverseStepOrder = function() { - _groups[ _groups_Current ].keys.reverse(); - - resetDialogPosition(); - - return _public; - }; - - function resetDialogPosition() { - if ( _public.isOpen() ) { - onDialogClose( false ); - - _groups[ _groups_Current ].position = 0; - } - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Public Functions: Configuration - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - /** - * setConfiguration(). - * - * Sets the specific configuration options that should be used. - * - * @public - * - * @param {Object} newConfiguration All the configuration options that should be set (refer to "Configuration Options" documentation for properties). - * - * @returns {Object} The Journey.js class instance. - */ - _public.setConfiguration = function( newConfiguration ) { - if ( isDefinedObject( newConfiguration ) ) { - var configurationHasChanged = false; - - for ( var propertyName in newConfiguration ) { - if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) { - _configuration[ propertyName ] = newConfiguration[ propertyName ]; - configurationHasChanged = true; - } - } - - if ( configurationHasChanged ) { - buildDefaultConfiguration( _configuration ); - } - } - - return _public; - }; - - function buildDefaultConfiguration( newConfiguration ) { - _configuration = getDefaultObject( newConfiguration, {} ); - _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true ); - _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ "*" ] ); - _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true ); - _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true ); - _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true ); - _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true ); - _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false ); - _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true ); - _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false ); - _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 ); - _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true ); - _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false ); - _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false ); - _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false ); - _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false ); - _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false ); - - buildDefaultConfigurationStrings(); - buildDefaultConfigurationCustomTriggers(); - } - - function buildDefaultConfigurationStrings() { - _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, "Back" ); - _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, "Next" ); - _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, "Finish" ); - _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, "Close" ); - _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, "Do not show again" ); - _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, "Errors in object: {{error_1}}, {{error_2}}" ); - _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, "The attribute '{{attribute_name}}' is not a valid object." ); - _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, "The attribute '{{attribute_name}}' has not been set correctly." ); - _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null ); - } - - function buildDefaultConfigurationCustomTriggers() { - _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null ); - } - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Public Functions: Additional Data - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - /** - * getVersion(). - * - * Returns the version of Journey.js. - * - * @public - * - * @returns {string} The version number. - */ - _public.getVersion = function() { - return "2.0.0"; - }; - - - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Initialize Journey.js - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - ( function ( documentObject, windowObject, mathObject, jsonObject ) { - _parameter_Document = documentObject; - _parameter_Window = windowObject; - _parameter_Math = mathObject; - _parameter_Json = jsonObject; - - buildDefaultConfiguration(); - - _parameter_Document.addEventListener( "DOMContentLoaded", function() { - setupDefaultGroup(); - renderDisabledBackground(); - renderDialog(); - renderToolTip(); - getElements(); - buildDocumentEvents(); - - if ( getBrowserUrlParameters() ) { - _public.show(); - } - } ); - - if ( !isDefined( _parameter_Window.$journey ) ) { - _parameter_Window.$journey = _public; - } - - } ) ( document, window, Math, JSON ); -} )(); \ No newline at end of file From 75a7e917559a856d2a2494dc1f6719a350376089 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 15:21:56 +0100 Subject: [PATCH 25/44] Validation functions are now in their own file. --- dist/journey.esm.js | 132 +++++++++++++++++++++++----------------- dist/journey.esm.js.map | 2 +- dist/journey.js | 126 +++++++++++++++++++++----------------- dist/journey.js.map | 2 +- src/journey.ts | 108 +++++++++++--------------------- src/ts/is.ts | 32 ++++++++++ 6 files changed, 215 insertions(+), 187 deletions(-) create mode 100644 src/ts/is.ts diff --git a/dist/journey.esm.js b/dist/journey.esm.js index bd7aaa8..d925c59 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -24,10 +24,49 @@ var init_constant = __esm({ } }); +var Is; + +var init_is = __esm({ + "src/ts/is.ts"() { + init_enum(); + (e => { + function t(e) { + return e !== null && e !== void 0 && e !== ""; + } + e.defined = t; + function o(e) { + return t(e) && typeof e === "object"; + } + e.definedObject = o; + function n(e) { + return t(e) && typeof e === "boolean"; + } + e.definedBoolean = n; + function i(e) { + return t(e) && typeof e === "string"; + } + e.definedString = i; + function r(e) { + return t(e) && typeof e === "function"; + } + e.definedFunction = r; + function l(e) { + return t(e) && typeof e === "number"; + } + e.definedNumber = l; + function s(e) { + return o(e) && e instanceof Array; + } + e.definedArray = s; + })(Is || (Is = {})); + } +}); + var require_journey = __commonJS({ "src/journey.ts"(exports, module) { init_enum(); init_constant(); + init_is(); (() => { let _configuration = {}; let _configuration_ShortcutKeysEnabled = true; @@ -133,14 +172,14 @@ var require_journey = __commonJS({ } function onDialogClose(e = true) { let t = false; - if (isDefinedString(_configuration.closeDialogConfirmationText) && e) { + if (Is.definedString(_configuration.closeDialogConfirmationText) && e) { t = confirm(_configuration.closeDialogConfirmationText); } else { t = true; } if (t) { const e = getGroupBindingOptions(); - if (isDefined(e) && isDefined(e._currentView.element)) { + if (Is.defined(e) && Is.defined(e._currentView.element)) { fireCustomTriggerEvent(e.events.onClose, e._currentView.element); } removeFocusClassFromLastElement(false); @@ -169,7 +208,7 @@ var require_journey = __commonJS({ } function showDialogAndSetPosition() { const e = getGroupBindingOptions(); - if (isDefined(e) && isDefined(e._currentView.element)) { + if (Is.defined(e) && Is.defined(e._currentView.element)) { if (e.showDisabledBackground) { showDisabledBackground(); } else { @@ -210,12 +249,12 @@ var require_journey = __commonJS({ } } function setDialogText(e) { - if (isDefinedString(e.title)) { + if (Is.definedString(e.title)) { _element_Dialog_Title.innerHTML = e.title; } else { _element_Dialog_Title.innerHTML = ""; } - if (isDefinedString(e.description)) { + if (Is.definedString(e.description)) { _element_Dialog_Description.innerHTML = e.description; } else { _element_Dialog_Description.innerHTML = ""; @@ -257,9 +296,9 @@ var require_journey = __commonJS({ } function removeFocusClassFromLastElement(e = true) { const t = getGroupBindingOptions(); - if (isDefined(t) && isDefined(t._currentView.element)) { + if (Is.defined(t) && Is.defined(t._currentView.element)) { t._currentView.element.className = t._currentView.element.className.replace(" " + "journey-js-element-focus", ""); - if (isDefined(_element_Focus_Element_PositionStyle)) { + if (Is.defined(_element_Focus_Element_PositionStyle)) { t._currentView.element.style.position = _element_Focus_Element_PositionStyle; } if (e) { @@ -291,7 +330,7 @@ var require_journey = __commonJS({ } _element_Dialog_ProgressDots.appendChild(n); if (_configuration.showProgressDotToolTips) { - if (isDefinedString(o.tooltip)) { + if (Is.definedString(o.tooltip)) { addToolTip(n, o.tooltip); } else { addToolTip(n, o.title); @@ -353,7 +392,7 @@ var require_journey = __commonJS({ } } function renderToolTip() { - if (!isDefined(_element_ToolTip)) { + if (!Is.defined(_element_ToolTip)) { _element_ToolTip = createElement("div", "journey-js-tooltip"); _element_ToolTip.style.display = "none"; document.body.appendChild(_element_ToolTip); @@ -382,7 +421,7 @@ var require_journey = __commonJS({ }), _configuration.tooltipDelay); } function hideToolTip() { - if (isDefined(_element_ToolTip)) { + if (Is.defined(_element_ToolTip)) { if (_element_ToolTip_Timer !== 0) { clearTimeout(_element_ToolTip_Timer); _element_ToolTip_Timer = 0; @@ -409,11 +448,11 @@ var require_journey = __commonJS({ } function getElement(e) { let t = true; - if (isDefined(e) && e.hasAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME)) { + if (Is.defined(e) && e.hasAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME)) { const o = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); - if (isDefinedString(o)) { + if (Is.definedString(o)) { const n = getObjectFromString(o); - if (n.parsed && isDefinedObject(n.object)) { + if (n.parsed && Is.definedObject(n.object)) { setupElement(e, buildAttributeOptions(n.object)); } else { if (!_configuration.safeMode) { @@ -433,7 +472,7 @@ var require_journey = __commonJS({ function setupElement(e, t) { t._currentView = {}; t._currentView.element = e; - if (isDefinedNumber(t.order) && (isDefinedString(t.title) || isDefinedString(t.description))) { + if (Is.definedNumber(t.order) && (Is.definedString(t.title) || Is.definedString(t.description))) { e.removeAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); if (!t.isHint) { setupNewGroup(t.group); @@ -518,7 +557,7 @@ var require_journey = __commonJS({ } } function buildAttributeOptions(e) { - let t = !isDefinedObject(e) ? {} : e; + let t = !Is.definedObject(e) ? {} : e; t.order = getDefaultNumber(t.order, 0); t.attach = getDefaultBoolean(t.attach, true); t.sendClick = getDefaultBoolean(t.sendClick, false); @@ -554,7 +593,7 @@ var require_journey = __commonJS({ const o = e.toLowerCase(); const n = o === "text"; let i = n ? document.createTextNode("") : document.createElement(o); - if (isDefined(t)) { + if (Is.defined(t)) { i.className = t; } return i; @@ -667,7 +706,7 @@ var require_journey = __commonJS({ } } function fireCustomTriggerEvent(e, ...t) { - if (isDefinedFunction(e)) { + if (Is.definedFunction(e)) { e.apply(null, [].slice.call(t, 0)); } } @@ -676,13 +715,13 @@ var require_journey = __commonJS({ if (_configuration.browserUrlParametersEnabled) { const t = window.location.href; const o = getBrowserUrlArguments(t); - if (isDefined(o.sjOrderId)) { + if (Is.defined(o.sjOrderId)) { const e = parseInt(o.sjOrderId, 10); if (!isNaN(e) && e <= _groups[_groups_Current].keys.length - 1) { _groups[_groups_Current].position = e; } } - if (isDefined(o.sjShow)) { + if (Is.defined(o.sjShow)) { e = o.sjShow === "true"; } } @@ -701,51 +740,30 @@ var require_journey = __commonJS({ } return t; } - function isDefined(e) { - return e !== null && e !== void 0 && e !== ""; - } - function isDefinedObject(e) { - return isDefined(e) && typeof e === "object"; - } - function isDefinedBoolean(e) { - return isDefined(e) && typeof e === "boolean"; - } - function isDefinedString(e) { - return isDefined(e) && typeof e === "string"; - } - function isDefinedFunction(e) { - return isDefined(e) && typeof e === "function"; - } - function isDefinedNumber(e) { - return isDefined(e) && typeof e === "number"; - } - function isDefinedArray(e) { - return isDefinedObject(e) && e instanceof Array; - } function getDefaultAnyString(e, t) { return typeof e === "string" ? e : t; } function getDefaultString(e, t) { - return isDefinedString(e) ? e : t; + return Is.definedString(e) ? e : t; } function getDefaultBoolean(e, t) { - return isDefinedBoolean(e) ? e : t; + return Is.definedBoolean(e) ? e : t; } function getDefaultNumber(e, t) { - return isDefinedNumber(e) ? e : t; + return Is.definedNumber(e) ? e : t; } function getDefaultFunction(e, t) { - return isDefinedFunction(e) ? e : t; + return Is.definedFunction(e) ? e : t; } function getDefaultObject(e, t) { - return isDefinedObject(e) ? e : t; + return Is.definedObject(e) ? e : t; } function getDefaultArray(e, t) { - return isDefinedArray(e) ? e : t; + return Is.definedArray(e) ? e : t; } function getDefaultStringOrArray(e, t) { let o = t; - if (isDefinedString(e)) { + if (Is.definedString(e)) { const n = e.toString().split(" "); if (n.length === 0) { e = t; @@ -763,13 +781,13 @@ var require_journey = __commonJS({ object: null }; try { - if (isDefinedString(objectString)) { + if (Is.definedString(objectString)) { result.object = JSON.parse(objectString); } } catch (e1) { try { result.object = eval("(" + objectString + ")"); - if (isDefinedFunction(result.object)) { + if (Is.definedFunction(result.object)) { result.object = result.object(); } } catch (e) { @@ -853,7 +871,7 @@ var require_journey = __commonJS({ return _public; }, isOpen: function() { - return isDefined(_element_Dialog) && _element_Dialog.style.display === "block"; + return Is.defined(_element_Dialog) && _element_Dialog.style.display === "block"; }, isComplete: function() { return _groups[_groups_Current].position >= _groups[_groups_Current].keys.length - 1; @@ -863,7 +881,7 @@ var require_journey = __commonJS({ return _public; }, addStep: function(e, t) { - if (isDefinedObject(e) && isDefinedObject(t)) { + if (Is.definedObject(e) && Is.definedObject(t)) { setupElement(e, buildAttributeOptions(t)); _groups[_groups_Current].keys.sort(); resetDialogPosition(); @@ -871,7 +889,7 @@ var require_journey = __commonJS({ return _public; }, removeStep: function(e) { - if (isDefinedObject(e)) { + if (Is.definedObject(e)) { let t = false; for (let o in _groups) { if (_groups.hasOwnProperty(o)) { @@ -902,7 +920,7 @@ var require_journey = __commonJS({ resetDialogPosition(); for (let t in _groups) { if (_groups.hasOwnProperty(t)) { - if (!isDefinedString(e) || e === t) { + if (!Is.definedString(e) || e === t) { for (let e in _groups[t].json) { if (_groups[t].json.hasOwnProperty(e)) { const o = _groups[t].json[e]; @@ -912,14 +930,14 @@ var require_journey = __commonJS({ } } } - if (isDefinedString(e)) { + if (Is.definedString(e)) { if (_groups.hasOwnProperty(e)) { delete _groups[e]; } } else { _groups = {}; } - if (!isDefinedString(e) || e === _groups_Default) { + if (!Is.definedString(e) || e === _groups_Default) { setupDefaultGroup(_groups); } return _public; @@ -934,7 +952,7 @@ var require_journey = __commonJS({ return _public; }, setConfiguration: function(e) { - if (isDefinedObject(e)) { + if (Is.definedObject(e)) { let t = false; for (let o in e) { if (e.hasOwnProperty(o) && _configuration.hasOwnProperty(o) && _configuration[o] !== e[o]) { @@ -965,7 +983,7 @@ var require_journey = __commonJS({ _public.show(); } })); - if (!isDefined(window.$journey)) { + if (!Is.defined(window.$journey)) { window.$journey = _public; } })(); diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index e98a0f2..b65b575 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Position = {\n left: number;\n top: number;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/journey.ts"],"names":["Constants","Is","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Position = {\n left: number;\n top: number;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index eb494c2..a94c124 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -4,6 +4,39 @@ var Constants; e.JOURNEY_JS_ATTRIBUTE_NAME = "data-journey-js"; })(Constants || (Constants = {})); +var Is; + +(e => { + function t(e) { + return e !== null && e !== void 0 && e !== ""; + } + e.defined = t; + function o(e) { + return t(e) && typeof e === "object"; + } + e.definedObject = o; + function n(e) { + return t(e) && typeof e === "boolean"; + } + e.definedBoolean = n; + function i(e) { + return t(e) && typeof e === "string"; + } + e.definedString = i; + function l(e) { + return t(e) && typeof e === "function"; + } + e.definedFunction = l; + function r(e) { + return t(e) && typeof e === "number"; + } + e.definedNumber = r; + function s(e) { + return o(e) && e instanceof Array; + } + e.definedArray = s; +})(Is || (Is = {})); + (() => { let _configuration = {}; let _configuration_ShortcutKeysEnabled = true; @@ -109,14 +142,14 @@ var Constants; } function onDialogClose(e = true) { let t = false; - if (isDefinedString(_configuration.closeDialogConfirmationText) && e) { + if (Is.definedString(_configuration.closeDialogConfirmationText) && e) { t = confirm(_configuration.closeDialogConfirmationText); } else { t = true; } if (t) { const e = getGroupBindingOptions(); - if (isDefined(e) && isDefined(e._currentView.element)) { + if (Is.defined(e) && Is.defined(e._currentView.element)) { fireCustomTriggerEvent(e.events.onClose, e._currentView.element); } removeFocusClassFromLastElement(false); @@ -145,7 +178,7 @@ var Constants; } function showDialogAndSetPosition() { const e = getGroupBindingOptions(); - if (isDefined(e) && isDefined(e._currentView.element)) { + if (Is.defined(e) && Is.defined(e._currentView.element)) { if (e.showDisabledBackground) { showDisabledBackground(); } else { @@ -186,12 +219,12 @@ var Constants; } } function setDialogText(e) { - if (isDefinedString(e.title)) { + if (Is.definedString(e.title)) { _element_Dialog_Title.innerHTML = e.title; } else { _element_Dialog_Title.innerHTML = ""; } - if (isDefinedString(e.description)) { + if (Is.definedString(e.description)) { _element_Dialog_Description.innerHTML = e.description; } else { _element_Dialog_Description.innerHTML = ""; @@ -233,9 +266,9 @@ var Constants; } function removeFocusClassFromLastElement(e = true) { const t = getGroupBindingOptions(); - if (isDefined(t) && isDefined(t._currentView.element)) { + if (Is.defined(t) && Is.defined(t._currentView.element)) { t._currentView.element.className = t._currentView.element.className.replace(" " + "journey-js-element-focus", ""); - if (isDefined(_element_Focus_Element_PositionStyle)) { + if (Is.defined(_element_Focus_Element_PositionStyle)) { t._currentView.element.style.position = _element_Focus_Element_PositionStyle; } if (e) { @@ -267,7 +300,7 @@ var Constants; } _element_Dialog_ProgressDots.appendChild(n); if (_configuration.showProgressDotToolTips) { - if (isDefinedString(o.tooltip)) { + if (Is.definedString(o.tooltip)) { addToolTip(n, o.tooltip); } else { addToolTip(n, o.title); @@ -329,7 +362,7 @@ var Constants; } } function renderToolTip() { - if (!isDefined(_element_ToolTip)) { + if (!Is.defined(_element_ToolTip)) { _element_ToolTip = createElement("div", "journey-js-tooltip"); _element_ToolTip.style.display = "none"; document.body.appendChild(_element_ToolTip); @@ -358,7 +391,7 @@ var Constants; }), _configuration.tooltipDelay); } function hideToolTip() { - if (isDefined(_element_ToolTip)) { + if (Is.defined(_element_ToolTip)) { if (_element_ToolTip_Timer !== 0) { clearTimeout(_element_ToolTip_Timer); _element_ToolTip_Timer = 0; @@ -385,11 +418,11 @@ var Constants; } function getElement(e) { let t = true; - if (isDefined(e) && e.hasAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME)) { + if (Is.defined(e) && e.hasAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME)) { const o = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); - if (isDefinedString(o)) { + if (Is.definedString(o)) { const n = getObjectFromString(o); - if (n.parsed && isDefinedObject(n.object)) { + if (n.parsed && Is.definedObject(n.object)) { setupElement(e, buildAttributeOptions(n.object)); } else { if (!_configuration.safeMode) { @@ -409,7 +442,7 @@ var Constants; function setupElement(e, t) { t._currentView = {}; t._currentView.element = e; - if (isDefinedNumber(t.order) && (isDefinedString(t.title) || isDefinedString(t.description))) { + if (Is.definedNumber(t.order) && (Is.definedString(t.title) || Is.definedString(t.description))) { e.removeAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); if (!t.isHint) { setupNewGroup(t.group); @@ -494,7 +527,7 @@ var Constants; } } function buildAttributeOptions(e) { - let t = !isDefinedObject(e) ? {} : e; + let t = !Is.definedObject(e) ? {} : e; t.order = getDefaultNumber(t.order, 0); t.attach = getDefaultBoolean(t.attach, true); t.sendClick = getDefaultBoolean(t.sendClick, false); @@ -530,7 +563,7 @@ var Constants; const o = e.toLowerCase(); const n = o === "text"; let i = n ? document.createTextNode("") : document.createElement(o); - if (isDefined(t)) { + if (Is.defined(t)) { i.className = t; } return i; @@ -643,7 +676,7 @@ var Constants; } } function fireCustomTriggerEvent(e, ...t) { - if (isDefinedFunction(e)) { + if (Is.definedFunction(e)) { e.apply(null, [].slice.call(t, 0)); } } @@ -652,13 +685,13 @@ var Constants; if (_configuration.browserUrlParametersEnabled) { const t = window.location.href; const o = getBrowserUrlArguments(t); - if (isDefined(o.sjOrderId)) { + if (Is.defined(o.sjOrderId)) { const e = parseInt(o.sjOrderId, 10); if (!isNaN(e) && e <= _groups[_groups_Current].keys.length - 1) { _groups[_groups_Current].position = e; } } - if (isDefined(o.sjShow)) { + if (Is.defined(o.sjShow)) { e = o.sjShow === "true"; } } @@ -677,51 +710,30 @@ var Constants; } return t; } - function isDefined(e) { - return e !== null && e !== void 0 && e !== ""; - } - function isDefinedObject(e) { - return isDefined(e) && typeof e === "object"; - } - function isDefinedBoolean(e) { - return isDefined(e) && typeof e === "boolean"; - } - function isDefinedString(e) { - return isDefined(e) && typeof e === "string"; - } - function isDefinedFunction(e) { - return isDefined(e) && typeof e === "function"; - } - function isDefinedNumber(e) { - return isDefined(e) && typeof e === "number"; - } - function isDefinedArray(e) { - return isDefinedObject(e) && e instanceof Array; - } function getDefaultAnyString(e, t) { return typeof e === "string" ? e : t; } function getDefaultString(e, t) { - return isDefinedString(e) ? e : t; + return Is.definedString(e) ? e : t; } function getDefaultBoolean(e, t) { - return isDefinedBoolean(e) ? e : t; + return Is.definedBoolean(e) ? e : t; } function getDefaultNumber(e, t) { - return isDefinedNumber(e) ? e : t; + return Is.definedNumber(e) ? e : t; } function getDefaultFunction(e, t) { - return isDefinedFunction(e) ? e : t; + return Is.definedFunction(e) ? e : t; } function getDefaultObject(e, t) { - return isDefinedObject(e) ? e : t; + return Is.definedObject(e) ? e : t; } function getDefaultArray(e, t) { - return isDefinedArray(e) ? e : t; + return Is.definedArray(e) ? e : t; } function getDefaultStringOrArray(e, t) { let o = t; - if (isDefinedString(e)) { + if (Is.definedString(e)) { const n = e.toString().split(" "); if (n.length === 0) { e = t; @@ -739,13 +751,13 @@ var Constants; object: null }; try { - if (isDefinedString(objectString)) { + if (Is.definedString(objectString)) { result.object = JSON.parse(objectString); } } catch (e1) { try { result.object = eval("(" + objectString + ")"); - if (isDefinedFunction(result.object)) { + if (Is.definedFunction(result.object)) { result.object = result.object(); } } catch (e) { @@ -829,7 +841,7 @@ var Constants; return _public; }, isOpen: function() { - return isDefined(_element_Dialog) && _element_Dialog.style.display === "block"; + return Is.defined(_element_Dialog) && _element_Dialog.style.display === "block"; }, isComplete: function() { return _groups[_groups_Current].position >= _groups[_groups_Current].keys.length - 1; @@ -839,7 +851,7 @@ var Constants; return _public; }, addStep: function(e, t) { - if (isDefinedObject(e) && isDefinedObject(t)) { + if (Is.definedObject(e) && Is.definedObject(t)) { setupElement(e, buildAttributeOptions(t)); _groups[_groups_Current].keys.sort(); resetDialogPosition(); @@ -847,7 +859,7 @@ var Constants; return _public; }, removeStep: function(e) { - if (isDefinedObject(e)) { + if (Is.definedObject(e)) { let t = false; for (let o in _groups) { if (_groups.hasOwnProperty(o)) { @@ -878,7 +890,7 @@ var Constants; resetDialogPosition(); for (let t in _groups) { if (_groups.hasOwnProperty(t)) { - if (!isDefinedString(e) || e === t) { + if (!Is.definedString(e) || e === t) { for (let e in _groups[t].json) { if (_groups[t].json.hasOwnProperty(e)) { const o = _groups[t].json[e]; @@ -888,14 +900,14 @@ var Constants; } } } - if (isDefinedString(e)) { + if (Is.definedString(e)) { if (_groups.hasOwnProperty(e)) { delete _groups[e]; } } else { _groups = {}; } - if (!isDefinedString(e) || e === _groups_Default) { + if (!Is.definedString(e) || e === _groups_Default) { setupDefaultGroup(_groups); } return _public; @@ -910,7 +922,7 @@ var Constants; return _public; }, setConfiguration: function(e) { - if (isDefinedObject(e)) { + if (Is.definedObject(e)) { let t = false; for (let o in e) { if (e.hasOwnProperty(o) && _configuration.hasOwnProperty(o) && _configuration[o] !== e[o]) { @@ -941,7 +953,7 @@ var Constants; _public.show(); } })); - if (!isDefined(window.$journey)) { + if (!Is.defined(window.$journey)) { window.$journey = _public; } })(); diff --git a/dist/journey.js.map b/dist/journey.js.map index c9b83b2..65998dd 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/journey.ts"],"names":["Constants","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Position = {\n left: number;\n top: number;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( isDefinedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( isDefinedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( isDefined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( isDefinedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !isDefined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( isDefined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( isDefinedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( isDefined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( isDefinedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( isDefined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( isDefined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Validation\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function isDefined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n function isDefinedObject( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"object\";\n }\n\n function isDefinedBoolean( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"boolean\";\n }\n\n function isDefinedString( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"string\";\n }\n\n function isDefinedFunction( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"function\";\n }\n\n function isDefinedNumber( object: any ) : boolean {\n return isDefined( object ) && typeof object === \"number\";\n }\n\n function isDefinedArray( object: any ) : boolean {\n return isDefinedObject( object ) && object instanceof Array;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return isDefinedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return isDefinedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return isDefinedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return isDefinedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return isDefinedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return isDefinedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( isDefinedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( isDefinedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( isDefinedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return isDefined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( isDefinedObject( element ) && isDefinedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( isDefinedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !isDefinedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( isDefinedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !isDefinedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( isDefinedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !isDefined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/journey.ts"],"names":["Constants","Is","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Position = {\n left: number;\n top: number;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 17e50bb..da07b29 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -20,6 +20,7 @@ import { import { Char, KeyCode } from "./ts/enum"; import { Constants } from "./ts/constant"; import { PublicApi } from "./ts/api"; +import { Is } from "./ts/is"; type StringToJson = { @@ -201,7 +202,7 @@ type Position = { function onDialogClose( showConfirmationBox: boolean = true ) : void { let confirmed: boolean = false; - if ( isDefinedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) { + if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) { confirmed = confirm( _configuration.closeDialogConfirmationText ); } else { confirmed = true; @@ -210,7 +211,7 @@ type Position = { if ( confirmed ) { const bindingOptions: BindingOptions = getGroupBindingOptions(); - if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) { + if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) { fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element ); } @@ -251,7 +252,7 @@ type Position = { function showDialogAndSetPosition() : void { const bindingOptions: BindingOptions = getGroupBindingOptions(); - if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) { + if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) { if ( bindingOptions.showDisabledBackground ) { showDisabledBackground(); } else { @@ -304,13 +305,13 @@ type Position = { } function setDialogText( bindingOptions: BindingOptions ) : void { - if ( isDefinedString( bindingOptions.title ) ) { + if ( Is.definedString( bindingOptions.title ) ) { _element_Dialog_Title.innerHTML = bindingOptions.title; } else { _element_Dialog_Title.innerHTML = Char.empty; } - if ( isDefinedString( bindingOptions.description ) ) { + if ( Is.definedString( bindingOptions.description ) ) { _element_Dialog_Description.innerHTML = bindingOptions.description; } else { _element_Dialog_Description.innerHTML = Char.empty; @@ -365,10 +366,10 @@ type Position = { function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void { const bindingOptions: BindingOptions = getGroupBindingOptions(); - if ( isDefined( bindingOptions ) && isDefined( bindingOptions._currentView.element ) ) { + if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) { bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + "journey-js-element-focus", Char.empty ); - if ( isDefined( _element_Focus_Element_PositionStyle ) ) { + if ( Is.defined( _element_Focus_Element_PositionStyle ) ) { bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle; } @@ -412,7 +413,7 @@ type Position = { _element_Dialog_ProgressDots.appendChild( dot ); if ( _configuration.showProgressDotToolTips ) { - if ( isDefinedString( bindingOptions.tooltip ) ) { + if ( Is.definedString( bindingOptions.tooltip ) ) { addToolTip( dot, bindingOptions.tooltip ); } else { addToolTip( dot, bindingOptions.title ); @@ -499,7 +500,7 @@ type Position = { */ function renderToolTip() : void { - if ( !isDefined( _element_ToolTip ) ) { + if ( !Is.defined( _element_ToolTip ) ) { _element_ToolTip = createElement( "div", "journey-js-tooltip" ); _element_ToolTip.style.display = "none"; @@ -536,7 +537,7 @@ type Position = { } function hideToolTip() : void { - if ( isDefined( _element_ToolTip ) ) { + if ( Is.defined( _element_ToolTip ) ) { if ( _element_ToolTip_Timer !== 0 ) { clearTimeout( _element_ToolTip_Timer ); _element_ToolTip_Timer = 0; @@ -577,13 +578,13 @@ type Position = { function getElement( element: HTMLElement ) : boolean { let result: boolean = true; - if ( isDefined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) { + if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) { const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ); - if ( isDefinedString( bindingOptionsData ) ) { + if ( Is.definedString( bindingOptionsData ) ) { const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData ); - if ( bindingOptions.parsed && isDefinedObject( bindingOptions.object ) ) { + if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) { setupElement( element, buildAttributeOptions( bindingOptions.object ) ); } else { @@ -608,7 +609,7 @@ type Position = { bindingOptions._currentView = {} as CurrentView; bindingOptions._currentView.element = element; - if ( isDefinedNumber( bindingOptions.order ) && ( isDefinedString( bindingOptions.title ) || isDefinedString( bindingOptions.description ) ) ) { + if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) { element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ); if ( !bindingOptions.isHint ) { @@ -734,7 +735,7 @@ type Position = { */ function buildAttributeOptions( newOptions: any ) { - let options: BindingOptions = !isDefinedObject( newOptions ) ? {} as BindingOptions : newOptions; + let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions; options.order = getDefaultNumber( options.order, 0 ); options.attach = getDefaultBoolean( options.attach, true ); options.sendClick = getDefaultBoolean( options.sendClick, false ); @@ -786,7 +787,7 @@ type Position = { let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType ); - if ( isDefined( className ) ) { + if ( Is.defined( className ) ) { result.className = className; } @@ -939,7 +940,7 @@ type Position = { */ function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void { - if ( isDefinedFunction( triggerFunction ) ) { + if ( Is.definedFunction( triggerFunction ) ) { triggerFunction.apply( null, [].slice.call( args, 0 ) ); } } @@ -958,7 +959,7 @@ type Position = { const url: string = window.location.href; const urlArguments: any = getBrowserUrlArguments( url ); - if ( isDefined( urlArguments.sjOrderId ) ) { + if ( Is.defined( urlArguments.sjOrderId ) ) { const orderId: number = parseInt( urlArguments.sjOrderId, 10 ); if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) { @@ -966,7 +967,7 @@ type Position = { } } - if ( isDefined( urlArguments.sjShow ) ) { + if ( Is.defined( urlArguments.sjShow ) ) { show = urlArguments.sjShow === "true"; } } @@ -993,41 +994,6 @@ type Position = { } - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Validation - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function isDefined( value: any ) : boolean { - return value !== null && value !== undefined && value !== Char.empty; - } - - function isDefinedObject( object: any ) : boolean { - return isDefined( object ) && typeof object === "object"; - } - - function isDefinedBoolean( object: any ) : boolean { - return isDefined( object ) && typeof object === "boolean"; - } - - function isDefinedString( object: any ) : boolean { - return isDefined( object ) && typeof object === "string"; - } - - function isDefinedFunction( object: any ) : boolean { - return isDefined( object ) && typeof object === "function"; - } - - function isDefinedNumber( object: any ) : boolean { - return isDefined( object ) && typeof object === "number"; - } - - function isDefinedArray( object: any ) : boolean { - return isDefinedObject( object ) && object instanceof Array; - } - - /* * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * Default Parameter/Option Handling @@ -1039,33 +1005,33 @@ type Position = { } function getDefaultString( value: any, defaultValue: string ) : string { - return isDefinedString( value ) ? value : defaultValue; + return Is.definedString( value ) ? value : defaultValue; } function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean { - return isDefinedBoolean( value ) ? value : defaultValue; + return Is.definedBoolean( value ) ? value : defaultValue; } function getDefaultNumber( value: any, defaultValue: number ) : number { - return isDefinedNumber( value ) ? value : defaultValue; + return Is.definedNumber( value ) ? value : defaultValue; } function getDefaultFunction( value: any, defaultValue: object ) : any { - return isDefinedFunction( value ) ? value : defaultValue; + return Is.definedFunction( value ) ? value : defaultValue; } function getDefaultObject( value: any, defaultValue: object ) : object { - return isDefinedObject( value ) ? value : defaultValue; + return Is.definedObject( value ) ? value : defaultValue; } function getDefaultArray( value: any, defaultValue: any[] ) : any[] { - return isDefinedArray( value ) ? value : defaultValue; + return Is.definedArray( value ) ? value : defaultValue; } function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] { let result: any[] = defaultValue; - if ( isDefinedString( value ) ) { + if ( Is.definedString( value ) ) { const values: string[] = value.toString().split( Char.space ); if ( values.length === 0 ) { @@ -1088,7 +1054,7 @@ type Position = { } as StringToJson; try { - if ( isDefinedString( objectString ) ) { + if ( Is.definedString( objectString ) ) { result.object = JSON.parse( objectString ); } @@ -1096,7 +1062,7 @@ type Position = { try { result.object = eval( "(" + objectString + ")" ); - if ( isDefinedFunction( result.object ) ) { + if ( Is.definedFunction( result.object ) ) { result.object = result.object(); } @@ -1227,7 +1193,7 @@ type Position = { }, isOpen: function () : boolean { - return isDefined( _element_Dialog ) && _element_Dialog.style.display === "block"; + return Is.defined( _element_Dialog ) && _element_Dialog.style.display === "block"; }, isComplete: function () : boolean { @@ -1248,7 +1214,7 @@ type Position = { }, addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi { - if ( isDefinedObject( element ) && isDefinedObject( options ) ) { + if ( Is.definedObject( element ) && Is.definedObject( options ) ) { setupElement( element, buildAttributeOptions( options ) ); _groups[ _groups_Current ].keys.sort(); @@ -1260,7 +1226,7 @@ type Position = { }, removeStep: function ( element: HTMLElement ) : PublicApi { - if ( isDefinedObject( element ) ) { + if ( Is.definedObject( element ) ) { let removed: boolean = false; for ( let group in _groups ) { @@ -1301,7 +1267,7 @@ type Position = { for ( let groupName in _groups ) { if ( _groups.hasOwnProperty( groupName ) ) { - if ( !isDefinedString( group ) || group === groupName ) { + if ( !Is.definedString( group ) || group === groupName ) { for ( let order in _groups[ groupName ].json ) { if ( _groups[ groupName ].json.hasOwnProperty( order ) ) { const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ]; @@ -1313,7 +1279,7 @@ type Position = { } } - if ( isDefinedString( group ) ) { + if ( Is.definedString( group ) ) { if ( _groups.hasOwnProperty( group ) ) { delete _groups[ group ]; } @@ -1322,7 +1288,7 @@ type Position = { _groups = {}; } - if ( !isDefinedString( group ) || group === _groups_Default ) { + if ( !Is.definedString( group ) || group === _groups_Default ) { setupDefaultGroup( _groups ); } @@ -1351,7 +1317,7 @@ type Position = { */ setConfiguration: function ( newConfiguration: Configuration ) : PublicApi { - if ( isDefinedObject( newConfiguration ) ) { + if ( Is.definedObject( newConfiguration ) ) { let configurationHasChanged: boolean = false; for ( let propertyName in newConfiguration ) { @@ -1404,7 +1370,7 @@ type Position = { } } ); - if ( !isDefined( window.$journey ) ) { + if ( !Is.defined( window.$journey ) ) { window.$journey = _public; } } ) (); diff --git a/src/ts/is.ts b/src/ts/is.ts new file mode 100644 index 0000000..3c57fac --- /dev/null +++ b/src/ts/is.ts @@ -0,0 +1,32 @@ +import { Char } from "./enum"; + + +export namespace Is { + export function defined( value: any ) : boolean { + return value !== null && value !== undefined && value !== Char.empty; + } + + export function definedObject( object: any ) : boolean { + return defined( object ) && typeof object === "object"; + } + + export function definedBoolean( object: any ) : boolean { + return defined( object ) && typeof object === "boolean"; + } + + export function definedString( object: any ) : boolean { + return defined( object ) && typeof object === "string"; + } + + export function definedFunction( object: any ) : boolean { + return defined( object ) && typeof object === "function"; + } + + export function definedNumber( object: any ) : boolean { + return defined( object ) && typeof object === "number"; + } + + export function definedArray( object: any ) : boolean { + return definedObject( object ) && object instanceof Array; + } +} \ No newline at end of file From 848d15d2e0ac76ddc073980d6dfcb9ed3a74e069 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 15:25:40 +0100 Subject: [PATCH 26/44] Data functions moved into their own file. --- dist/journey.esm.js | 194 ++++++++++++++++++++++------------------ dist/journey.esm.js.map | 2 +- dist/journey.js | 187 ++++++++++++++++++++------------------ dist/journey.js.map | 2 +- src/journey.ts | 154 +++++++++++-------------------- src/ts/data.ts | 52 +++++++++++ 6 files changed, 315 insertions(+), 276 deletions(-) create mode 100644 src/ts/data.ts diff --git a/dist/journey.esm.js b/dist/journey.esm.js index d925c59..d452871 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -62,11 +62,66 @@ var init_is = __esm({ } }); +var Data; + +var init_data = __esm({ + "src/ts/data.ts"() { + init_enum(); + init_is(); + (e => { + function t(e, t) { + return typeof e === "string" ? e : t; + } + e.getDefaultAnyString = t; + function o(e, t) { + return Is.definedString(e) ? e : t; + } + e.getDefaultString = o; + function n(e, t) { + return Is.definedBoolean(e) ? e : t; + } + e.getDefaultBoolean = n; + function i(e, t) { + return Is.definedNumber(e) ? e : t; + } + e.getDefaultNumber = i; + function r(e, t) { + return Is.definedFunction(e) ? e : t; + } + e.getDefaultFunction = r; + function l(e, t) { + return Is.definedObject(e) ? e : t; + } + e.getDefaultObject = l; + function s(e, t) { + return Is.definedArray(e) ? e : t; + } + e.getDefaultArray = s; + function a(e, t) { + let o = t; + if (Is.definedString(e)) { + const n = e.toString().split(" "); + if (n.length === 0) { + e = t; + } else { + o = n; + } + } else { + o = s(e, t); + } + return o; + } + e.getDefaultStringOrArray = a; + })(Data || (Data = {})); + } +}); + var require_journey = __commonJS({ "src/journey.ts"(exports, module) { init_enum(); init_constant(); init_is(); + init_data(); (() => { let _configuration = {}; let _configuration_ShortcutKeysEnabled = true; @@ -97,7 +152,7 @@ var require_journey = __commonJS({ let _element_ToolTip = null; let _element_ToolTip_Timer = 0; function setupDefaultGroup(e = null) { - _groups = getDefaultObject(e, {}); + _groups = Data.getDefaultObject(e, {}); _groups[_groups_Default] = { json: {}, keys: [], @@ -558,35 +613,35 @@ var require_journey = __commonJS({ } function buildAttributeOptions(e) { let t = !Is.definedObject(e) ? {} : e; - t.order = getDefaultNumber(t.order, 0); - t.attach = getDefaultBoolean(t.attach, true); - t.sendClick = getDefaultBoolean(t.sendClick, false); - t.alignTop = getDefaultBoolean(t.alignTop, false); - t.alignRight = getDefaultBoolean(t.alignRight, false); - t.isHint = getDefaultBoolean(t.isHint, false); - t.alignHintToClickPosition = getDefaultBoolean(t.alignHintToClickPosition, false); - t.showDisabledBackground = getDefaultBoolean(t.showDisabledBackground, true); - t.removeHintWhenViewed = getDefaultBoolean(t.removeHintWhenViewed, false); - t.group = getDefaultString(t.group, _groups_Default); + t.order = Data.getDefaultNumber(t.order, 0); + t.attach = Data.getDefaultBoolean(t.attach, true); + t.sendClick = Data.getDefaultBoolean(t.sendClick, false); + t.alignTop = Data.getDefaultBoolean(t.alignTop, false); + t.alignRight = Data.getDefaultBoolean(t.alignRight, false); + t.isHint = Data.getDefaultBoolean(t.isHint, false); + t.alignHintToClickPosition = Data.getDefaultBoolean(t.alignHintToClickPosition, false); + t.showDisabledBackground = Data.getDefaultBoolean(t.showDisabledBackground, true); + t.removeHintWhenViewed = Data.getDefaultBoolean(t.removeHintWhenViewed, false); + t.group = Data.getDefaultString(t.group, _groups_Default); t = buildAttributeOptionStrings(t); return buildAttributeOptionCustomTriggers(t); } function buildAttributeOptionStrings(e) { - e.title = getDefaultString(e.title, null); - e.description = getDefaultString(e.description, null); - e.tooltip = getDefaultString(e.tooltip, null); + e.title = Data.getDefaultString(e.title, null); + e.description = Data.getDefaultString(e.description, null); + e.tooltip = Data.getDefaultString(e.tooltip, null); return e; } function buildAttributeOptionCustomTriggers(e) { - e.events = getDefaultObject(e.events, {}); - e.events.onEnter = getDefaultFunction(e.events.onEnter, null); - e.events.onLeave = getDefaultFunction(e.events.onLeave, null); - e.events.onClose = getDefaultFunction(e.events.onClose, null); - e.events.onFinish = getDefaultFunction(e.events.onFinish, null); - e.events.onOpen = getDefaultFunction(e.events.onOpen, null); - e.events.onStart = getDefaultFunction(e.events.onStart, null); - e.events.onAddStep = getDefaultFunction(e.events.onAddStep, null); - e.events.onRemoveStep = getDefaultFunction(e.events.onRemoveStep, null); + e.events = Data.getDefaultObject(e.events, {}); + e.events.onEnter = Data.getDefaultFunction(e.events.onEnter, null); + e.events.onLeave = Data.getDefaultFunction(e.events.onLeave, null); + e.events.onClose = Data.getDefaultFunction(e.events.onClose, null); + e.events.onFinish = Data.getDefaultFunction(e.events.onFinish, null); + e.events.onOpen = Data.getDefaultFunction(e.events.onOpen, null); + e.events.onStart = Data.getDefaultFunction(e.events.onStart, null); + e.events.onAddStep = Data.getDefaultFunction(e.events.onAddStep, null); + e.events.onRemoveStep = Data.getDefaultFunction(e.events.onRemoveStep, null); return e; } function createElement(e, t = "") { @@ -740,41 +795,6 @@ var require_journey = __commonJS({ } return t; } - function getDefaultAnyString(e, t) { - return typeof e === "string" ? e : t; - } - function getDefaultString(e, t) { - return Is.definedString(e) ? e : t; - } - function getDefaultBoolean(e, t) { - return Is.definedBoolean(e) ? e : t; - } - function getDefaultNumber(e, t) { - return Is.definedNumber(e) ? e : t; - } - function getDefaultFunction(e, t) { - return Is.definedFunction(e) ? e : t; - } - function getDefaultObject(e, t) { - return Is.definedObject(e) ? e : t; - } - function getDefaultArray(e, t) { - return Is.definedArray(e) ? e : t; - } - function getDefaultStringOrArray(e, t) { - let o = t; - if (Is.definedString(e)) { - const n = e.toString().split(" "); - if (n.length === 0) { - e = t; - } else { - o = n; - } - } else { - o = getDefaultArray(e, t); - } - return o; - } function getObjectFromString(objectString) { const result = { parsed: true, @@ -807,44 +827,44 @@ var require_journey = __commonJS({ } } function buildDefaultConfiguration(e = null) { - _configuration = getDefaultObject(e, {}); - _configuration.safeMode = getDefaultBoolean(_configuration.safeMode, true); - _configuration.domElementTypes = getDefaultStringOrArray(_configuration.domElementTypes, [ "*" ]); - _configuration.showCloseButton = getDefaultBoolean(_configuration.showCloseButton, true); - _configuration.shortcutKeysEnabled = getDefaultBoolean(_configuration.shortcutKeysEnabled, true); - _configuration.showProgressDots = getDefaultBoolean(_configuration.showProgressDots, true); - _configuration.browserUrlParametersEnabled = getDefaultBoolean(_configuration.browserUrlParametersEnabled, true); - _configuration.showProgressDotNumbers = getDefaultBoolean(_configuration.showProgressDotNumbers, false); - _configuration.showButtons = getDefaultBoolean(_configuration.showButtons, true); - _configuration.showDoNotShowAgain = getDefaultBoolean(_configuration.showDoNotShowAgain, false); - _configuration.tooltipDelay = getDefaultNumber(_configuration.tooltipDelay, 750); - _configuration.showProgressDotToolTips = getDefaultBoolean(_configuration.showProgressDotToolTips, true); - _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean(_configuration.closeDialogOnDisabledBackgroundClick, false); - _configuration.showProgressBar = getDefaultBoolean(_configuration.showProgressBar, false); - _configuration.scrollToElements = getDefaultBoolean(_configuration.scrollToElements, false); - _configuration.dialogMovingEnabled = getDefaultBoolean(_configuration.dialogMovingEnabled, false); - _configuration.showProgressBarText = getDefaultBoolean(_configuration.showProgressBarText, false); + _configuration = Data.getDefaultObject(e, {}); + _configuration.safeMode = Data.getDefaultBoolean(_configuration.safeMode, true); + _configuration.domElementTypes = Data.getDefaultStringOrArray(_configuration.domElementTypes, [ "*" ]); + _configuration.showCloseButton = Data.getDefaultBoolean(_configuration.showCloseButton, true); + _configuration.shortcutKeysEnabled = Data.getDefaultBoolean(_configuration.shortcutKeysEnabled, true); + _configuration.showProgressDots = Data.getDefaultBoolean(_configuration.showProgressDots, true); + _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean(_configuration.browserUrlParametersEnabled, true); + _configuration.showProgressDotNumbers = Data.getDefaultBoolean(_configuration.showProgressDotNumbers, false); + _configuration.showButtons = Data.getDefaultBoolean(_configuration.showButtons, true); + _configuration.showDoNotShowAgain = Data.getDefaultBoolean(_configuration.showDoNotShowAgain, false); + _configuration.tooltipDelay = Data.getDefaultNumber(_configuration.tooltipDelay, 750); + _configuration.showProgressDotToolTips = Data.getDefaultBoolean(_configuration.showProgressDotToolTips, true); + _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean(_configuration.closeDialogOnDisabledBackgroundClick, false); + _configuration.showProgressBar = Data.getDefaultBoolean(_configuration.showProgressBar, false); + _configuration.scrollToElements = Data.getDefaultBoolean(_configuration.scrollToElements, false); + _configuration.dialogMovingEnabled = Data.getDefaultBoolean(_configuration.dialogMovingEnabled, false); + _configuration.showProgressBarText = Data.getDefaultBoolean(_configuration.showProgressBarText, false); buildDefaultConfigurationStrings(); buildDefaultConfigurationCustomTriggers(); } function buildDefaultConfigurationStrings() { - _configuration.backButtonText = getDefaultAnyString(_configuration.backButtonText, "Back"); - _configuration.nextButtonText = getDefaultAnyString(_configuration.nextButtonText, "Next"); - _configuration.finishButtonText = getDefaultAnyString(_configuration.finishButtonText, "Finish"); - _configuration.closeButtonToolTipText = getDefaultAnyString(_configuration.closeButtonToolTipText, "Close"); - _configuration.doNotShowAgainText = getDefaultAnyString(_configuration.doNotShowAgainText, "Do not show again"); - _configuration.objectErrorText = getDefaultAnyString(_configuration.objectErrorText, "Errors in object: {{error_1}}, {{error_2}}"); - _configuration.attributeNotValidErrorText = getDefaultAnyString(_configuration.attributeNotValidErrorText, "The attribute '{{attribute_name}}' is not a valid object."); - _configuration.attributeNotSetErrorText = getDefaultAnyString(_configuration.attributeNotSetErrorText, "The attribute '{{attribute_name}}' has not been set correctly."); - _configuration.closeDialogConfirmationText = getDefaultAnyString(_configuration.closeDialogConfirmationText, null); + _configuration.backButtonText = Data.getDefaultAnyString(_configuration.backButtonText, "Back"); + _configuration.nextButtonText = Data.getDefaultAnyString(_configuration.nextButtonText, "Next"); + _configuration.finishButtonText = Data.getDefaultAnyString(_configuration.finishButtonText, "Finish"); + _configuration.closeButtonToolTipText = Data.getDefaultAnyString(_configuration.closeButtonToolTipText, "Close"); + _configuration.doNotShowAgainText = Data.getDefaultAnyString(_configuration.doNotShowAgainText, "Do not show again"); + _configuration.objectErrorText = Data.getDefaultAnyString(_configuration.objectErrorText, "Errors in object: {{error_1}}, {{error_2}}"); + _configuration.attributeNotValidErrorText = Data.getDefaultAnyString(_configuration.attributeNotValidErrorText, "The attribute '{{attribute_name}}' is not a valid object."); + _configuration.attributeNotSetErrorText = Data.getDefaultAnyString(_configuration.attributeNotSetErrorText, "The attribute '{{attribute_name}}' has not been set correctly."); + _configuration.closeDialogConfirmationText = Data.getDefaultAnyString(_configuration.closeDialogConfirmationText, null); } function buildDefaultConfigurationCustomTriggers() { - _configuration.onDoNotShowAgainChange = getDefaultFunction(_configuration.onDoNotShowAgainChange, null); + _configuration.onDoNotShowAgainChange = Data.getDefaultFunction(_configuration.onDoNotShowAgainChange, null); } const _public = { start: function(e = null) { if (!_public.isOpen()) { - _groups_Current = getDefaultString(e, _groups_Default); + _groups_Current = Data.getDefaultString(e, _groups_Default); if (_groups.hasOwnProperty(_groups_Current)) { _groups[_groups_Current].position = 0; showDialogAndSetPosition(); @@ -854,7 +874,7 @@ var require_journey = __commonJS({ }, show: function(e = null) { if (!_public.isOpen()) { - _groups_Current = getDefaultString(e, _groups_Current); + _groups_Current = Data.getDefaultString(e, _groups_Current); if (_groups.hasOwnProperty(_groups_Current)) { if (_groups[_groups_Current].position === _groups[_groups_Current].keys.length - 1) { _groups[_groups_Current].position = 0; diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index b65b575..036a716 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/journey.ts"],"names":["Constants","Is","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Position = {\n left: number;\n top: number;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/journey.ts"],"names":["Constants","Is","Data","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : object {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView } from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Position = {\n left: number;\n top: number;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index a94c124..5ba8cf0 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -37,6 +37,54 @@ var Is; e.definedArray = s; })(Is || (Is = {})); +var Data; + +(e => { + function t(e, t) { + return typeof e === "string" ? e : t; + } + e.getDefaultAnyString = t; + function o(e, t) { + return Is.definedString(e) ? e : t; + } + e.getDefaultString = o; + function n(e, t) { + return Is.definedBoolean(e) ? e : t; + } + e.getDefaultBoolean = n; + function i(e, t) { + return Is.definedNumber(e) ? e : t; + } + e.getDefaultNumber = i; + function l(e, t) { + return Is.definedFunction(e) ? e : t; + } + e.getDefaultFunction = l; + function r(e, t) { + return Is.definedObject(e) ? e : t; + } + e.getDefaultObject = r; + function s(e, t) { + return Is.definedArray(e) ? e : t; + } + e.getDefaultArray = s; + function a(e, t) { + let o = t; + if (Is.definedString(e)) { + const n = e.toString().split(" "); + if (n.length === 0) { + e = t; + } else { + o = n; + } + } else { + o = s(e, t); + } + return o; + } + e.getDefaultStringOrArray = a; +})(Data || (Data = {})); + (() => { let _configuration = {}; let _configuration_ShortcutKeysEnabled = true; @@ -67,7 +115,7 @@ var Is; let _element_ToolTip = null; let _element_ToolTip_Timer = 0; function setupDefaultGroup(e = null) { - _groups = getDefaultObject(e, {}); + _groups = Data.getDefaultObject(e, {}); _groups[_groups_Default] = { json: {}, keys: [], @@ -528,35 +576,35 @@ var Is; } function buildAttributeOptions(e) { let t = !Is.definedObject(e) ? {} : e; - t.order = getDefaultNumber(t.order, 0); - t.attach = getDefaultBoolean(t.attach, true); - t.sendClick = getDefaultBoolean(t.sendClick, false); - t.alignTop = getDefaultBoolean(t.alignTop, false); - t.alignRight = getDefaultBoolean(t.alignRight, false); - t.isHint = getDefaultBoolean(t.isHint, false); - t.alignHintToClickPosition = getDefaultBoolean(t.alignHintToClickPosition, false); - t.showDisabledBackground = getDefaultBoolean(t.showDisabledBackground, true); - t.removeHintWhenViewed = getDefaultBoolean(t.removeHintWhenViewed, false); - t.group = getDefaultString(t.group, _groups_Default); + t.order = Data.getDefaultNumber(t.order, 0); + t.attach = Data.getDefaultBoolean(t.attach, true); + t.sendClick = Data.getDefaultBoolean(t.sendClick, false); + t.alignTop = Data.getDefaultBoolean(t.alignTop, false); + t.alignRight = Data.getDefaultBoolean(t.alignRight, false); + t.isHint = Data.getDefaultBoolean(t.isHint, false); + t.alignHintToClickPosition = Data.getDefaultBoolean(t.alignHintToClickPosition, false); + t.showDisabledBackground = Data.getDefaultBoolean(t.showDisabledBackground, true); + t.removeHintWhenViewed = Data.getDefaultBoolean(t.removeHintWhenViewed, false); + t.group = Data.getDefaultString(t.group, _groups_Default); t = buildAttributeOptionStrings(t); return buildAttributeOptionCustomTriggers(t); } function buildAttributeOptionStrings(e) { - e.title = getDefaultString(e.title, null); - e.description = getDefaultString(e.description, null); - e.tooltip = getDefaultString(e.tooltip, null); + e.title = Data.getDefaultString(e.title, null); + e.description = Data.getDefaultString(e.description, null); + e.tooltip = Data.getDefaultString(e.tooltip, null); return e; } function buildAttributeOptionCustomTriggers(e) { - e.events = getDefaultObject(e.events, {}); - e.events.onEnter = getDefaultFunction(e.events.onEnter, null); - e.events.onLeave = getDefaultFunction(e.events.onLeave, null); - e.events.onClose = getDefaultFunction(e.events.onClose, null); - e.events.onFinish = getDefaultFunction(e.events.onFinish, null); - e.events.onOpen = getDefaultFunction(e.events.onOpen, null); - e.events.onStart = getDefaultFunction(e.events.onStart, null); - e.events.onAddStep = getDefaultFunction(e.events.onAddStep, null); - e.events.onRemoveStep = getDefaultFunction(e.events.onRemoveStep, null); + e.events = Data.getDefaultObject(e.events, {}); + e.events.onEnter = Data.getDefaultFunction(e.events.onEnter, null); + e.events.onLeave = Data.getDefaultFunction(e.events.onLeave, null); + e.events.onClose = Data.getDefaultFunction(e.events.onClose, null); + e.events.onFinish = Data.getDefaultFunction(e.events.onFinish, null); + e.events.onOpen = Data.getDefaultFunction(e.events.onOpen, null); + e.events.onStart = Data.getDefaultFunction(e.events.onStart, null); + e.events.onAddStep = Data.getDefaultFunction(e.events.onAddStep, null); + e.events.onRemoveStep = Data.getDefaultFunction(e.events.onRemoveStep, null); return e; } function createElement(e, t = "") { @@ -710,41 +758,6 @@ var Is; } return t; } - function getDefaultAnyString(e, t) { - return typeof e === "string" ? e : t; - } - function getDefaultString(e, t) { - return Is.definedString(e) ? e : t; - } - function getDefaultBoolean(e, t) { - return Is.definedBoolean(e) ? e : t; - } - function getDefaultNumber(e, t) { - return Is.definedNumber(e) ? e : t; - } - function getDefaultFunction(e, t) { - return Is.definedFunction(e) ? e : t; - } - function getDefaultObject(e, t) { - return Is.definedObject(e) ? e : t; - } - function getDefaultArray(e, t) { - return Is.definedArray(e) ? e : t; - } - function getDefaultStringOrArray(e, t) { - let o = t; - if (Is.definedString(e)) { - const n = e.toString().split(" "); - if (n.length === 0) { - e = t; - } else { - o = n; - } - } else { - o = getDefaultArray(e, t); - } - return o; - } function getObjectFromString(objectString) { const result = { parsed: true, @@ -777,44 +790,44 @@ var Is; } } function buildDefaultConfiguration(e = null) { - _configuration = getDefaultObject(e, {}); - _configuration.safeMode = getDefaultBoolean(_configuration.safeMode, true); - _configuration.domElementTypes = getDefaultStringOrArray(_configuration.domElementTypes, [ "*" ]); - _configuration.showCloseButton = getDefaultBoolean(_configuration.showCloseButton, true); - _configuration.shortcutKeysEnabled = getDefaultBoolean(_configuration.shortcutKeysEnabled, true); - _configuration.showProgressDots = getDefaultBoolean(_configuration.showProgressDots, true); - _configuration.browserUrlParametersEnabled = getDefaultBoolean(_configuration.browserUrlParametersEnabled, true); - _configuration.showProgressDotNumbers = getDefaultBoolean(_configuration.showProgressDotNumbers, false); - _configuration.showButtons = getDefaultBoolean(_configuration.showButtons, true); - _configuration.showDoNotShowAgain = getDefaultBoolean(_configuration.showDoNotShowAgain, false); - _configuration.tooltipDelay = getDefaultNumber(_configuration.tooltipDelay, 750); - _configuration.showProgressDotToolTips = getDefaultBoolean(_configuration.showProgressDotToolTips, true); - _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean(_configuration.closeDialogOnDisabledBackgroundClick, false); - _configuration.showProgressBar = getDefaultBoolean(_configuration.showProgressBar, false); - _configuration.scrollToElements = getDefaultBoolean(_configuration.scrollToElements, false); - _configuration.dialogMovingEnabled = getDefaultBoolean(_configuration.dialogMovingEnabled, false); - _configuration.showProgressBarText = getDefaultBoolean(_configuration.showProgressBarText, false); + _configuration = Data.getDefaultObject(e, {}); + _configuration.safeMode = Data.getDefaultBoolean(_configuration.safeMode, true); + _configuration.domElementTypes = Data.getDefaultStringOrArray(_configuration.domElementTypes, [ "*" ]); + _configuration.showCloseButton = Data.getDefaultBoolean(_configuration.showCloseButton, true); + _configuration.shortcutKeysEnabled = Data.getDefaultBoolean(_configuration.shortcutKeysEnabled, true); + _configuration.showProgressDots = Data.getDefaultBoolean(_configuration.showProgressDots, true); + _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean(_configuration.browserUrlParametersEnabled, true); + _configuration.showProgressDotNumbers = Data.getDefaultBoolean(_configuration.showProgressDotNumbers, false); + _configuration.showButtons = Data.getDefaultBoolean(_configuration.showButtons, true); + _configuration.showDoNotShowAgain = Data.getDefaultBoolean(_configuration.showDoNotShowAgain, false); + _configuration.tooltipDelay = Data.getDefaultNumber(_configuration.tooltipDelay, 750); + _configuration.showProgressDotToolTips = Data.getDefaultBoolean(_configuration.showProgressDotToolTips, true); + _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean(_configuration.closeDialogOnDisabledBackgroundClick, false); + _configuration.showProgressBar = Data.getDefaultBoolean(_configuration.showProgressBar, false); + _configuration.scrollToElements = Data.getDefaultBoolean(_configuration.scrollToElements, false); + _configuration.dialogMovingEnabled = Data.getDefaultBoolean(_configuration.dialogMovingEnabled, false); + _configuration.showProgressBarText = Data.getDefaultBoolean(_configuration.showProgressBarText, false); buildDefaultConfigurationStrings(); buildDefaultConfigurationCustomTriggers(); } function buildDefaultConfigurationStrings() { - _configuration.backButtonText = getDefaultAnyString(_configuration.backButtonText, "Back"); - _configuration.nextButtonText = getDefaultAnyString(_configuration.nextButtonText, "Next"); - _configuration.finishButtonText = getDefaultAnyString(_configuration.finishButtonText, "Finish"); - _configuration.closeButtonToolTipText = getDefaultAnyString(_configuration.closeButtonToolTipText, "Close"); - _configuration.doNotShowAgainText = getDefaultAnyString(_configuration.doNotShowAgainText, "Do not show again"); - _configuration.objectErrorText = getDefaultAnyString(_configuration.objectErrorText, "Errors in object: {{error_1}}, {{error_2}}"); - _configuration.attributeNotValidErrorText = getDefaultAnyString(_configuration.attributeNotValidErrorText, "The attribute '{{attribute_name}}' is not a valid object."); - _configuration.attributeNotSetErrorText = getDefaultAnyString(_configuration.attributeNotSetErrorText, "The attribute '{{attribute_name}}' has not been set correctly."); - _configuration.closeDialogConfirmationText = getDefaultAnyString(_configuration.closeDialogConfirmationText, null); + _configuration.backButtonText = Data.getDefaultAnyString(_configuration.backButtonText, "Back"); + _configuration.nextButtonText = Data.getDefaultAnyString(_configuration.nextButtonText, "Next"); + _configuration.finishButtonText = Data.getDefaultAnyString(_configuration.finishButtonText, "Finish"); + _configuration.closeButtonToolTipText = Data.getDefaultAnyString(_configuration.closeButtonToolTipText, "Close"); + _configuration.doNotShowAgainText = Data.getDefaultAnyString(_configuration.doNotShowAgainText, "Do not show again"); + _configuration.objectErrorText = Data.getDefaultAnyString(_configuration.objectErrorText, "Errors in object: {{error_1}}, {{error_2}}"); + _configuration.attributeNotValidErrorText = Data.getDefaultAnyString(_configuration.attributeNotValidErrorText, "The attribute '{{attribute_name}}' is not a valid object."); + _configuration.attributeNotSetErrorText = Data.getDefaultAnyString(_configuration.attributeNotSetErrorText, "The attribute '{{attribute_name}}' has not been set correctly."); + _configuration.closeDialogConfirmationText = Data.getDefaultAnyString(_configuration.closeDialogConfirmationText, null); } function buildDefaultConfigurationCustomTriggers() { - _configuration.onDoNotShowAgainChange = getDefaultFunction(_configuration.onDoNotShowAgainChange, null); + _configuration.onDoNotShowAgainChange = Data.getDefaultFunction(_configuration.onDoNotShowAgainChange, null); } const _public = { start: function(e = null) { if (!_public.isOpen()) { - _groups_Current = getDefaultString(e, _groups_Default); + _groups_Current = Data.getDefaultString(e, _groups_Default); if (_groups.hasOwnProperty(_groups_Current)) { _groups[_groups_Current].position = 0; showDialogAndSetPosition(); @@ -824,7 +837,7 @@ var Is; }, show: function(e = null) { if (!_public.isOpen()) { - _groups_Current = getDefaultString(e, _groups_Current); + _groups_Current = Data.getDefaultString(e, _groups_Current); if (_groups.hasOwnProperty(_groups_Current)) { if (_groups[_groups_Current].position === _groups[_groups_Current].keys.length - 1) { _groups[_groups_Current].position = 0; diff --git a/dist/journey.js.map b/dist/journey.js.map index 65998dd..d575d64 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/journey.ts"],"names":["Constants","Is","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n CurrentView} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Position = {\n left: number;\n top: number;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = getDefaultNumber( options.order, 0 );\n options.attach = getDefaultBoolean( options.attach, true );\n options.sendClick = getDefaultBoolean( options.sendClick, false );\n options.alignTop = getDefaultBoolean( options.alignTop, false );\n options.alignRight = getDefaultBoolean( options.alignRight, false );\n options.isHint = getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = getDefaultString( options.title, null );\n options.description = getDefaultString( options.description, null );\n options.tooltip = getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = getDefaultObject( options.events, {} as Events );\n options.events.onEnter = getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n function getDefaultObject( value: any, defaultValue: object ) : object {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/journey.ts"],"names":["Constants","Is","Data","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : object {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView } from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Position = {\n left: number;\n top: number;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index da07b29..0ed61d1 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -15,12 +15,13 @@ import { type Configuration, type BindingOptions, type Events, - CurrentView} from "./ts/type"; + type CurrentView } from "./ts/type"; import { Char, KeyCode } from "./ts/enum"; import { Constants } from "./ts/constant"; import { PublicApi } from "./ts/api"; import { Is } from "./ts/is"; +import { Data } from "./ts/data"; type StringToJson = { @@ -87,7 +88,7 @@ type Position = { */ function setupDefaultGroup( groups: any = null ) : void { - _groups = getDefaultObject( groups, {} ); + _groups = Data.getDefaultObject( groups, {} ); _groups[ _groups_Default ] = { json: {}, @@ -736,16 +737,16 @@ type Position = { function buildAttributeOptions( newOptions: any ) { let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions; - options.order = getDefaultNumber( options.order, 0 ); - options.attach = getDefaultBoolean( options.attach, true ); - options.sendClick = getDefaultBoolean( options.sendClick, false ); - options.alignTop = getDefaultBoolean( options.alignTop, false ); - options.alignRight = getDefaultBoolean( options.alignRight, false ); - options.isHint = getDefaultBoolean( options.isHint, false ); - options.alignHintToClickPosition = getDefaultBoolean( options.alignHintToClickPosition, false ); - options.showDisabledBackground = getDefaultBoolean( options.showDisabledBackground, true ); - options.removeHintWhenViewed = getDefaultBoolean( options.removeHintWhenViewed, false ); - options.group = getDefaultString( options.group, _groups_Default ); + options.order = Data.getDefaultNumber( options.order, 0 ); + options.attach = Data.getDefaultBoolean( options.attach, true ); + options.sendClick = Data.getDefaultBoolean( options.sendClick, false ); + options.alignTop = Data.getDefaultBoolean( options.alignTop, false ); + options.alignRight = Data.getDefaultBoolean( options.alignRight, false ); + options.isHint = Data.getDefaultBoolean( options.isHint, false ); + options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false ); + options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true ); + options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false ); + options.group = Data.getDefaultString( options.group, _groups_Default ); options = buildAttributeOptionStrings( options ); @@ -753,23 +754,23 @@ type Position = { } function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions { - options.title = getDefaultString( options.title, null ); - options.description = getDefaultString( options.description, null ); - options.tooltip = getDefaultString( options.tooltip, null ); + options.title = Data.getDefaultString( options.title, null ); + options.description = Data.getDefaultString( options.description, null ); + options.tooltip = Data.getDefaultString( options.tooltip, null ); return options; } function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions { - options.events = getDefaultObject( options.events, {} as Events ); - options.events.onEnter = getDefaultFunction( options.events.onEnter, null ); - options.events.onLeave = getDefaultFunction( options.events.onLeave, null ); - options.events.onClose = getDefaultFunction( options.events.onClose, null ); - options.events.onFinish = getDefaultFunction( options.events.onFinish, null ); - options.events.onOpen = getDefaultFunction( options.events.onOpen, null ); - options.events.onStart = getDefaultFunction( options.events.onStart, null ); - options.events.onAddStep = getDefaultFunction( options.events.onAddStep, null ); - options.events.onRemoveStep = getDefaultFunction( options.events.onRemoveStep, null ); + options.events = Data.getDefaultObject( options.events, {} as Events ); + options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null ); + options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null ); + options.events.onClose = Data.getDefaultFunction( options.events.onClose, null ); + options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null ); + options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null ); + options.events.onStart = Data.getDefaultFunction( options.events.onStart, null ); + options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null ); + options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null ); return options; } @@ -1000,53 +1001,6 @@ type Position = { * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ - function getDefaultAnyString( value: any, defaultValue: string ) : string { - return typeof value === "string" ? value : defaultValue; - } - - function getDefaultString( value: any, defaultValue: string ) : string { - return Is.definedString( value ) ? value : defaultValue; - } - - function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean { - return Is.definedBoolean( value ) ? value : defaultValue; - } - - function getDefaultNumber( value: any, defaultValue: number ) : number { - return Is.definedNumber( value ) ? value : defaultValue; - } - - function getDefaultFunction( value: any, defaultValue: object ) : any { - return Is.definedFunction( value ) ? value : defaultValue; - } - - function getDefaultObject( value: any, defaultValue: object ) : object { - return Is.definedObject( value ) ? value : defaultValue; - } - - function getDefaultArray( value: any, defaultValue: any[] ) : any[] { - return Is.definedArray( value ) ? value : defaultValue; - } - - function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] { - let result: any[] = defaultValue; - - if ( Is.definedString( value ) ) { - const values: string[] = value.toString().split( Char.space ); - - if ( values.length === 0 ) { - value = defaultValue; - } else { - result = values; - } - - } else { - result = getDefaultArray( value, defaultValue ); - } - - return result; - } - function getObjectFromString( objectString: any ) : StringToJson { const result: StringToJson = { parsed: true, @@ -1102,42 +1056,42 @@ type Position = { */ function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void { - _configuration = getDefaultObject( newConfiguration, {} as Configuration ); - _configuration.safeMode = getDefaultBoolean( _configuration.safeMode, true ); - _configuration.domElementTypes = getDefaultStringOrArray( _configuration.domElementTypes, [ "*" ] ); - _configuration.showCloseButton = getDefaultBoolean( _configuration.showCloseButton, true ); - _configuration.shortcutKeysEnabled = getDefaultBoolean( _configuration.shortcutKeysEnabled, true ); - _configuration.showProgressDots = getDefaultBoolean( _configuration.showProgressDots, true ); - _configuration.browserUrlParametersEnabled = getDefaultBoolean( _configuration.browserUrlParametersEnabled, true ); - _configuration.showProgressDotNumbers = getDefaultBoolean( _configuration.showProgressDotNumbers, false ); - _configuration.showButtons = getDefaultBoolean( _configuration.showButtons, true ); - _configuration.showDoNotShowAgain = getDefaultBoolean( _configuration.showDoNotShowAgain, false ); - _configuration.tooltipDelay = getDefaultNumber( _configuration.tooltipDelay, 750 ); - _configuration.showProgressDotToolTips = getDefaultBoolean( _configuration.showProgressDotToolTips, true ); - _configuration.closeDialogOnDisabledBackgroundClick = getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false ); - _configuration.showProgressBar = getDefaultBoolean( _configuration.showProgressBar, false ); - _configuration.scrollToElements = getDefaultBoolean( _configuration.scrollToElements, false ); - _configuration.dialogMovingEnabled = getDefaultBoolean( _configuration.dialogMovingEnabled, false ); - _configuration.showProgressBarText = getDefaultBoolean( _configuration.showProgressBarText, false ); + _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration ); + _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true ); + _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ "*" ] ); + _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true ); + _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true ); + _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true ); + _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true ); + _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false ); + _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true ); + _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false ); + _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 ); + _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true ); + _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false ); + _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false ); + _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false ); + _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false ); + _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false ); buildDefaultConfigurationStrings(); buildDefaultConfigurationCustomTriggers(); } function buildDefaultConfigurationStrings() : void { - _configuration.backButtonText = getDefaultAnyString( _configuration.backButtonText, "Back" ); - _configuration.nextButtonText = getDefaultAnyString( _configuration.nextButtonText, "Next" ); - _configuration.finishButtonText = getDefaultAnyString( _configuration.finishButtonText, "Finish" ); - _configuration.closeButtonToolTipText = getDefaultAnyString( _configuration.closeButtonToolTipText, "Close" ); - _configuration.doNotShowAgainText = getDefaultAnyString( _configuration.doNotShowAgainText, "Do not show again" ); - _configuration.objectErrorText = getDefaultAnyString( _configuration.objectErrorText, "Errors in object: {{error_1}}, {{error_2}}" ); - _configuration.attributeNotValidErrorText = getDefaultAnyString( _configuration.attributeNotValidErrorText, "The attribute '{{attribute_name}}' is not a valid object." ); - _configuration.attributeNotSetErrorText = getDefaultAnyString( _configuration.attributeNotSetErrorText, "The attribute '{{attribute_name}}' has not been set correctly." ); - _configuration.closeDialogConfirmationText = getDefaultAnyString( _configuration.closeDialogConfirmationText, null ); + _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, "Back" ); + _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, "Next" ); + _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, "Finish" ); + _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, "Close" ); + _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, "Do not show again" ); + _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, "Errors in object: {{error_1}}, {{error_2}}" ); + _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, "The attribute '{{attribute_name}}' is not a valid object." ); + _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, "The attribute '{{attribute_name}}' has not been set correctly." ); + _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null ); } function buildDefaultConfigurationCustomTriggers() : void { - _configuration.onDoNotShowAgainChange = getDefaultFunction( _configuration.onDoNotShowAgainChange, null ); + _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null ); } @@ -1156,7 +1110,7 @@ type Position = { start: function ( group: string = null ) : PublicApi { if ( !_public.isOpen() ) { - _groups_Current = getDefaultString( group, _groups_Default ); + _groups_Current = Data.getDefaultString( group, _groups_Default ); if ( _groups.hasOwnProperty( _groups_Current ) ) { _groups[ _groups_Current ].position = 0; @@ -1170,7 +1124,7 @@ type Position = { show: function ( group: string = null ) : PublicApi { if ( !_public.isOpen() ) { - _groups_Current = getDefaultString( group, _groups_Current ); + _groups_Current = Data.getDefaultString( group, _groups_Current ); if ( _groups.hasOwnProperty( _groups_Current ) ) { if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) { diff --git a/src/ts/data.ts b/src/ts/data.ts new file mode 100644 index 0000000..b9526b7 --- /dev/null +++ b/src/ts/data.ts @@ -0,0 +1,52 @@ +import { Char } from "./enum"; +import { Is } from "./is"; + + +export namespace Data { + export function getDefaultAnyString( value: any, defaultValue: string ) : string { + return typeof value === "string" ? value : defaultValue; + } + + export function getDefaultString( value: any, defaultValue: string ) : string { + return Is.definedString( value ) ? value : defaultValue; + } + + export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean { + return Is.definedBoolean( value ) ? value : defaultValue; + } + + export function getDefaultNumber( value: any, defaultValue: number ) : number { + return Is.definedNumber( value ) ? value : defaultValue; + } + + export function getDefaultFunction( value: any, defaultValue: object ) : any { + return Is.definedFunction( value ) ? value : defaultValue; + } + + export function getDefaultObject( value: any, defaultValue: object ) : object { + return Is.definedObject( value ) ? value : defaultValue; + } + + export function getDefaultArray( value: any, defaultValue: any[] ) : any[] { + return Is.definedArray( value ) ? value : defaultValue; + } + + export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] { + let result: any[] = defaultValue; + + if ( Is.definedString( value ) ) { + const values: string[] = value.toString().split( Char.space ); + + if ( values.length === 0 ) { + value = defaultValue; + } else { + result = values; + } + + } else { + result = getDefaultArray( value, defaultValue ); + } + + return result; + } +} \ No newline at end of file From 532bc0f89c51155494cc9679eeaff14084eeca60 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 15:30:23 +0100 Subject: [PATCH 27/44] Moved dom element handling functions into their own file. --- dist/journey.esm.js | 327 +++++++++++++++++++++------------------- dist/journey.esm.js.map | 2 +- dist/journey.js | 320 ++++++++++++++++++++------------------- dist/journey.js.map | 2 +- src/journey.ts | 239 +++++------------------------ src/ts/dom.ts | 157 +++++++++++++++++++ src/ts/type.ts | 5 + 7 files changed, 546 insertions(+), 506 deletions(-) create mode 100644 src/ts/dom.ts diff --git a/dist/journey.esm.js b/dist/journey.esm.js index d452871..6b218e4 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -116,12 +116,151 @@ var init_data = __esm({ } }); +var DomElement; + +var init_dom = __esm({ + "src/ts/dom.ts"() { + init_enum(); + init_is(); + (e => { + function t(e, t = "") { + const o = e.toLowerCase(); + const n = o === "text"; + let i = n ? document.createTextNode("") : document.createElement(o); + if (Is.defined(t)) { + i.className = t; + } + return i; + } + e.create = t; + function o(e) { + const t = { + left: 0, + top: 0 + }; + while (e && !isNaN(e.offsetLeft) && !isNaN(e.offsetTop)) { + t.left += e.offsetLeft - e.scrollLeft; + t.top += e.offsetTop - e.scrollTop; + e = e.offsetParent; + } + return t; + } + e.getOffset = o; + function n() { + const e = document.documentElement; + const t = { + left: (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0), + top: (window.pageYOffset || e.scrollTop) - (e.clientTop || 0) + }; + return t; + } + e.getScrollPosition = n; + function i(e, t) { + let o = null; + if (document.defaultView.getComputedStyle) { + o = document.defaultView.getComputedStyle(e, null).getPropertyValue(t); + } else if (e.currentStyle) { + o = e.currentStyle[t]; + } + return o; + } + e.getStyleValueByName = i; + function r(e, t) { + try { + if (!e.contains(t)) { + e.appendChild(t); + } + } catch (e) { + console.warn(e.message); + } + } + e.addNode = r; + function l(e, t) { + try { + if (e.contains(t)) { + e.removeChild(t); + } + } catch (e) { + console.warn(e.message); + } + } + e.removeNode = l; + function s(e) { + e.preventDefault(); + e.cancelBubble = true; + } + e.cancelBubble = s; + function a(e, t) { + let o = e.pageX; + let i = e.pageY; + const r = n(); + t.style.display = "block"; + if (o + t.offsetWidth > window.innerWidth) { + o -= t.offsetWidth; + } else { + o++; + } + if (i + t.offsetHeight > window.innerHeight) { + i -= t.offsetHeight; + } else { + i++; + } + if (o < r.left) { + o = e.pageX + 1; + } + if (i < r.top) { + i = e.pageY + 1; + } + t.style.left = o + "px"; + t.style.top = i + "px"; + } + e.showElementAtMousePosition = a; + function _(e, t) { + if (t) { + if (e.style.display !== "block") { + e.style.display = "block"; + } + } else { + if (e.style.display !== "none") { + e.style.display = "none"; + } + } + } + e.showElementBasedOnCondition = _; + function u(e, o) { + const n = t("div"); + const i = t("label", "checkbox"); + const r = t("input"); + e.appendChild(n); + n.appendChild(i); + i.appendChild(r); + r.type = "checkbox"; + const l = t("span", "check-mark"); + const s = t("span", "text"); + s.innerHTML = o; + i.appendChild(l); + i.appendChild(s); + return r; + } + e.createCheckBox = u; + function g(e, t) { + let o = e.getElementsByClassName(t); + while (o[0]) { + o[0].parentNode.removeChild(o[0]); + } + } + e.clearElementsByClassName = g; + })(DomElement || (DomElement = {})); + } +}); + var require_journey = __commonJS({ "src/journey.ts"(exports, module) { init_enum(); init_constant(); init_is(); init_data(); + init_dom(); (() => { let _configuration = {}; let _configuration_ShortcutKeysEnabled = true; @@ -172,7 +311,7 @@ var require_journey = __commonJS({ return _groups[_groups_Current].json[_groups[_groups_Current].keys[_groups[_groups_Current].position]]; } function renderDisabledBackground() { - _element_Disabled_Background = createElement("div", "journey-js-disabled-background"); + _element_Disabled_Background = DomElement.create("div", "journey-js-disabled-background"); _element_Disabled_Background.onclick = () => { if (_configuration.closeDialogOnDisabledBackgroundClick) { onDialogClose(); @@ -180,47 +319,47 @@ var require_journey = __commonJS({ }; } function showDisabledBackground() { - addNode(document.body, _element_Disabled_Background); + DomElement.addNode(document.body, _element_Disabled_Background); } function hideDisabledBackground() { - removeNode(document.body, _element_Disabled_Background); + DomElement.removeNode(document.body, _element_Disabled_Background); } function renderDialog() { - _element_Dialog = createElement("div", "journey-js-dialog"); + _element_Dialog = DomElement.create("div", "journey-js-dialog"); _element_Dialog.style.display = "none"; document.body.appendChild(_element_Dialog); - _element_Dialog_Close_Button = createElement("button", "close"); + _element_Dialog_Close_Button = DomElement.create("button", "close"); _element_Dialog.appendChild(_element_Dialog_Close_Button); _element_Dialog_Close_Button.onclick = () => { onDialogClose(); }; addToolTip(_element_Dialog_Close_Button, _configuration.closeButtonToolTipText); - _element_Dialog_Title = createElement("div", "title"); + _element_Dialog_Title = DomElement.create("div", "title"); _element_Dialog.appendChild(_element_Dialog_Title); - _element_Dialog_Description = createElement("div", "description"); + _element_Dialog_Description = DomElement.create("div", "description"); _element_Dialog.appendChild(_element_Dialog_Description); - _element_Dialog_CheckBox_Container = createElement("div", "checkbox-container"); + _element_Dialog_CheckBox_Container = DomElement.create("div", "checkbox-container"); _element_Dialog.appendChild(_element_Dialog_CheckBox_Container); - _element_Dialog_CheckBox_Input = buildCheckBox(_element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText); + _element_Dialog_CheckBox_Input = DomElement.createCheckBox(_element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText); _element_Dialog_CheckBox_Input.onchange = () => { if (_configuration.showDoNotShowAgain) { fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked); } }; - _element_Dialog_ProgressDots = createElement("div", "progress-dots"); + _element_Dialog_ProgressDots = DomElement.create("div", "progress-dots"); _element_Dialog.appendChild(_element_Dialog_ProgressDots); - _element_Dialog_ProgressBar = createElement("div", "progress-bar"); + _element_Dialog_ProgressBar = DomElement.create("div", "progress-bar"); _element_Dialog.appendChild(_element_Dialog_ProgressBar); - _element_Dialog_ProgressBar_Percentage = createElement("div", "progress-bar-percentage"); + _element_Dialog_ProgressBar_Percentage = DomElement.create("div", "progress-bar-percentage"); _element_Dialog_ProgressBar.appendChild(_element_Dialog_ProgressBar_Percentage); - _element_Dialog_ProgressBar_Percentage_Text = createElement("p", "progress-bar-percentage-text"); + _element_Dialog_ProgressBar_Percentage_Text = DomElement.create("p", "progress-bar-percentage-text"); _element_Dialog_ProgressBar_Percentage.appendChild(_element_Dialog_ProgressBar_Percentage_Text); - _element_Dialog_Buttons = createElement("div", "buttons"); + _element_Dialog_Buttons = DomElement.create("div", "buttons"); _element_Dialog.appendChild(_element_Dialog_Buttons); - _element_Dialog_Buttons_Back_Button = createElement("button", "back"); + _element_Dialog_Buttons_Back_Button = DomElement.create("button", "back"); _element_Dialog_Buttons_Back_Button.onclick = onDialogBack; _element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Back_Button); - _element_Dialog_Buttons_Next_Button = createElement("button", "next"); + _element_Dialog_Buttons_Next_Button = DomElement.create("button", "next"); _element_Dialog_Buttons_Next_Button.onclick = onDialogNext; _element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Next_Button); makeDialogMovable(); @@ -276,16 +415,16 @@ var require_journey = __commonJS({ if (_configuration.scrollToElements) { e._currentView.element.scrollIntoView(); } - const t = getStyleValueByName(e._currentView.element, "position"); + const t = DomElement.getStyleValueByName(e._currentView.element, "position"); if (t !== "" && t.toLowerCase() === "static") { _element_Focus_Element_PositionStyle = t; e._currentView.element.style.position = "relative"; } - showElementBasedOnCondition(_element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain); - showElementBasedOnCondition(_element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[_groups_Current].keys.length > 1); - showElementBasedOnCondition(_element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[_groups_Current].keys.length > 1); - showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText); - showElementBasedOnCondition(_element_Dialog_Buttons, _configuration.showButtons); + DomElement.showElementBasedOnCondition(_element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain); + DomElement.showElementBasedOnCondition(_element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[_groups_Current].keys.length > 1); + DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[_groups_Current].keys.length > 1); + DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText); + DomElement.showElementBasedOnCondition(_element_Dialog_Buttons, _configuration.showButtons); _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText; _element_Dialog_Buttons_Back_Button.disabled = _groups[_groups_Current].position === 0; if (_groups[_groups_Current].position >= _groups[_groups_Current].keys.length - 1) { @@ -326,9 +465,9 @@ var require_journey = __commonJS({ _element_Dialog_IsHint = t.isHint === true; if (t.attach || t.isHint) { if (t.isHint && t.alignHintToClickPosition) { - showElementAtMousePosition(e, _element_Dialog); + DomElement.showElementAtMousePosition(e, _element_Dialog); } else { - const e = getOffset(t._currentView.element); + const e = DomElement.getOffset(t._currentView.element); let o = e.top + t._currentView.element.offsetHeight; let n = e.left; if (n + _element_Dialog.offsetWidth > window.innerWidth || t.alignRight) { @@ -342,7 +481,7 @@ var require_journey = __commonJS({ _element_Dialog.style.left = n + "px"; } } else { - const e = getScrollPosition(); + const e = DomElement.getScrollPosition(); const t = Math.max(0, (window.innerWidth - _element_Dialog.offsetWidth) / 2 + e.left); const o = Math.max(0, (window.innerHeight - _element_Dialog.offsetHeight) / 2 + e.top); _element_Dialog.style.left = t + "px"; @@ -374,9 +513,9 @@ var require_journey = __commonJS({ const o = _groups[_groups_Current].json[t]; let n = null; if (e === _groups[_groups_Current].position) { - n = createElement("div", "dot-active"); + n = DomElement.create("div", "dot-active"); } else { - n = createElement("div", "dot"); + n = DomElement.create("div", "dot"); n.onclick = () => { removeFocusClassFromLastElement(); _groups[_groups_Current].position = e; @@ -448,7 +587,7 @@ var require_journey = __commonJS({ } function renderToolTip() { if (!Is.defined(_element_ToolTip)) { - _element_ToolTip = createElement("div", "journey-js-tooltip"); + _element_ToolTip = DomElement.create("div", "journey-js-tooltip"); _element_ToolTip.style.display = "none"; document.body.appendChild(_element_ToolTip); document.body.addEventListener("mousemove", (() => { @@ -467,12 +606,12 @@ var require_journey = __commonJS({ } } function showToolTip(e, t) { - cancelBubble(e); + DomElement.cancelBubble(e); hideToolTip(); _element_ToolTip_Timer = setTimeout((() => { _element_ToolTip.innerHTML = t; _element_ToolTip.style.display = "block"; - showElementAtMousePosition(e, _element_ToolTip); + DomElement.showElementAtMousePosition(e, _element_ToolTip); }), _configuration.tooltipDelay); } function hideToolTip() { @@ -540,14 +679,14 @@ var require_journey = __commonJS({ } } function renderHint(e) { - const t = getStyleValueByName(e._currentView.element, "position"); + const t = DomElement.getStyleValueByName(e._currentView.element, "position"); if (t !== "" && t.toLowerCase() === "static") { e._currentView.element.style.position = "relative"; } - const o = createElement("div", "journey-js-hint"); + const o = DomElement.create("div", "journey-js-hint"); e._currentView.element.appendChild(o); o.onclick = t => { - cancelBubble(t); + DomElement.cancelBubble(t); _element_Dialog_CheckBox_Container.style.display = "none"; _element_Dialog_ProgressDots.style.display = "none"; _element_Dialog_ProgressBar.style.display = "none"; @@ -556,7 +695,7 @@ var require_journey = __commonJS({ setDialogText(e); setDialogPosition(t, e); if (e.removeHintWhenViewed) { - clearElementsByClassName(e._currentView.element, "journey-js-hint"); + DomElement.clearElementsByClassName(e._currentView.element, "journey-js-hint"); } }; } @@ -644,122 +783,6 @@ var require_journey = __commonJS({ e.events.onRemoveStep = Data.getDefaultFunction(e.events.onRemoveStep, null); return e; } - function createElement(e, t = "") { - const o = e.toLowerCase(); - const n = o === "text"; - let i = n ? document.createTextNode("") : document.createElement(o); - if (Is.defined(t)) { - i.className = t; - } - return i; - } - function getOffset(e) { - const t = { - left: 0, - top: 0 - }; - while (e && !isNaN(e.offsetLeft) && !isNaN(e.offsetTop)) { - t.left += e.offsetLeft - e.scrollLeft; - t.top += e.offsetTop - e.scrollTop; - e = e.offsetParent; - } - return t; - } - function getScrollPosition() { - const e = document.documentElement; - const t = { - left: (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0), - top: (window.pageYOffset || e.scrollTop) - (e.clientTop || 0) - }; - return t; - } - function getStyleValueByName(e, t) { - let o = null; - if (document.defaultView.getComputedStyle) { - o = document.defaultView.getComputedStyle(e, null).getPropertyValue(t); - } else if (e.currentStyle) { - o = e.currentStyle[t]; - } - return o; - } - function addNode(e, t) { - try { - if (!e.contains(t)) { - e.appendChild(t); - } - } catch (e) { - console.warn(e.message); - } - } - function removeNode(e, t) { - try { - if (e.contains(t)) { - e.removeChild(t); - } - } catch (e) { - console.warn(e.message); - } - } - function cancelBubble(e) { - e.preventDefault(); - e.cancelBubble = true; - } - function showElementAtMousePosition(e, t) { - let o = e.pageX; - let n = e.pageY; - const i = getScrollPosition(); - t.style.display = "block"; - if (o + t.offsetWidth > window.innerWidth) { - o -= t.offsetWidth; - } else { - o++; - } - if (n + t.offsetHeight > window.innerHeight) { - n -= t.offsetHeight; - } else { - n++; - } - if (o < i.left) { - o = e.pageX + 1; - } - if (n < i.top) { - n = e.pageY + 1; - } - t.style.left = o + "px"; - t.style.top = n + "px"; - } - function showElementBasedOnCondition(e, t) { - if (t) { - if (e.style.display !== "block") { - e.style.display = "block"; - } - } else { - if (e.style.display !== "none") { - e.style.display = "none"; - } - } - } - function buildCheckBox(e, t) { - const o = createElement("div"); - const n = createElement("label", "checkbox"); - const i = createElement("input"); - e.appendChild(o); - o.appendChild(n); - n.appendChild(i); - i.type = "checkbox"; - const r = createElement("span", "check-mark"); - const l = createElement("span", "text"); - l.innerHTML = t; - n.appendChild(r); - n.appendChild(l); - return i; - } - function clearElementsByClassName(e, t) { - let o = e.getElementsByClassName(t); - while (o[0]) { - o[0].parentNode.removeChild(o[0]); - } - } function fireCustomTriggerEvent(e, ...t) { if (Is.definedFunction(e)) { e.apply(null, [].slice.call(t, 0)); @@ -929,7 +952,7 @@ var require_journey = __commonJS({ } } if (!t) { - clearElementsByClassName(e, "journey-js-hint"); + DomElement.clearElementsByClassName(e, "journey-js-hint"); } else { resetDialogPosition(); } @@ -963,7 +986,7 @@ var require_journey = __commonJS({ return _public; }, clearHints: function() { - clearElementsByClassName(document.body, "journey-js-hint"); + DomElement.clearElementsByClassName(document.body, "journey-js-hint"); return _public; }, reverseStepOrder: function() { diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 036a716..16a2177 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/journey.ts"],"names":["Constants","Is","Data","result"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : object {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView } from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Position = {\n left: number;\n top: number;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : object {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index 5ba8cf0..9973831 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -85,6 +85,138 @@ var Data; e.getDefaultStringOrArray = a; })(Data || (Data = {})); +var DomElement; + +(e => { + function t(e, t = "") { + const o = e.toLowerCase(); + const n = o === "text"; + let i = n ? document.createTextNode("") : document.createElement(o); + if (Is.defined(t)) { + i.className = t; + } + return i; + } + e.create = t; + function o(e) { + const t = { + left: 0, + top: 0 + }; + while (e && !isNaN(e.offsetLeft) && !isNaN(e.offsetTop)) { + t.left += e.offsetLeft - e.scrollLeft; + t.top += e.offsetTop - e.scrollTop; + e = e.offsetParent; + } + return t; + } + e.getOffset = o; + function n() { + const e = document.documentElement; + const t = { + left: (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0), + top: (window.pageYOffset || e.scrollTop) - (e.clientTop || 0) + }; + return t; + } + e.getScrollPosition = n; + function i(e, t) { + let o = null; + if (document.defaultView.getComputedStyle) { + o = document.defaultView.getComputedStyle(e, null).getPropertyValue(t); + } else if (e.currentStyle) { + o = e.currentStyle[t]; + } + return o; + } + e.getStyleValueByName = i; + function l(e, t) { + try { + if (!e.contains(t)) { + e.appendChild(t); + } + } catch (e) { + console.warn(e.message); + } + } + e.addNode = l; + function r(e, t) { + try { + if (e.contains(t)) { + e.removeChild(t); + } + } catch (e) { + console.warn(e.message); + } + } + e.removeNode = r; + function s(e) { + e.preventDefault(); + e.cancelBubble = true; + } + e.cancelBubble = s; + function a(e, t) { + let o = e.pageX; + let i = e.pageY; + const l = n(); + t.style.display = "block"; + if (o + t.offsetWidth > window.innerWidth) { + o -= t.offsetWidth; + } else { + o++; + } + if (i + t.offsetHeight > window.innerHeight) { + i -= t.offsetHeight; + } else { + i++; + } + if (o < l.left) { + o = e.pageX + 1; + } + if (i < l.top) { + i = e.pageY + 1; + } + t.style.left = o + "px"; + t.style.top = i + "px"; + } + e.showElementAtMousePosition = a; + function u(e, t) { + if (t) { + if (e.style.display !== "block") { + e.style.display = "block"; + } + } else { + if (e.style.display !== "none") { + e.style.display = "none"; + } + } + } + e.showElementBasedOnCondition = u; + function _(e, o) { + const n = t("div"); + const i = t("label", "checkbox"); + const l = t("input"); + e.appendChild(n); + n.appendChild(i); + i.appendChild(l); + l.type = "checkbox"; + const r = t("span", "check-mark"); + const s = t("span", "text"); + s.innerHTML = o; + i.appendChild(r); + i.appendChild(s); + return l; + } + e.createCheckBox = _; + function g(e, t) { + let o = e.getElementsByClassName(t); + while (o[0]) { + o[0].parentNode.removeChild(o[0]); + } + } + e.clearElementsByClassName = g; +})(DomElement || (DomElement = {})); + (() => { let _configuration = {}; let _configuration_ShortcutKeysEnabled = true; @@ -135,7 +267,7 @@ var Data; return _groups[_groups_Current].json[_groups[_groups_Current].keys[_groups[_groups_Current].position]]; } function renderDisabledBackground() { - _element_Disabled_Background = createElement("div", "journey-js-disabled-background"); + _element_Disabled_Background = DomElement.create("div", "journey-js-disabled-background"); _element_Disabled_Background.onclick = () => { if (_configuration.closeDialogOnDisabledBackgroundClick) { onDialogClose(); @@ -143,47 +275,47 @@ var Data; }; } function showDisabledBackground() { - addNode(document.body, _element_Disabled_Background); + DomElement.addNode(document.body, _element_Disabled_Background); } function hideDisabledBackground() { - removeNode(document.body, _element_Disabled_Background); + DomElement.removeNode(document.body, _element_Disabled_Background); } function renderDialog() { - _element_Dialog = createElement("div", "journey-js-dialog"); + _element_Dialog = DomElement.create("div", "journey-js-dialog"); _element_Dialog.style.display = "none"; document.body.appendChild(_element_Dialog); - _element_Dialog_Close_Button = createElement("button", "close"); + _element_Dialog_Close_Button = DomElement.create("button", "close"); _element_Dialog.appendChild(_element_Dialog_Close_Button); _element_Dialog_Close_Button.onclick = () => { onDialogClose(); }; addToolTip(_element_Dialog_Close_Button, _configuration.closeButtonToolTipText); - _element_Dialog_Title = createElement("div", "title"); + _element_Dialog_Title = DomElement.create("div", "title"); _element_Dialog.appendChild(_element_Dialog_Title); - _element_Dialog_Description = createElement("div", "description"); + _element_Dialog_Description = DomElement.create("div", "description"); _element_Dialog.appendChild(_element_Dialog_Description); - _element_Dialog_CheckBox_Container = createElement("div", "checkbox-container"); + _element_Dialog_CheckBox_Container = DomElement.create("div", "checkbox-container"); _element_Dialog.appendChild(_element_Dialog_CheckBox_Container); - _element_Dialog_CheckBox_Input = buildCheckBox(_element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText); + _element_Dialog_CheckBox_Input = DomElement.createCheckBox(_element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText); _element_Dialog_CheckBox_Input.onchange = () => { if (_configuration.showDoNotShowAgain) { fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked); } }; - _element_Dialog_ProgressDots = createElement("div", "progress-dots"); + _element_Dialog_ProgressDots = DomElement.create("div", "progress-dots"); _element_Dialog.appendChild(_element_Dialog_ProgressDots); - _element_Dialog_ProgressBar = createElement("div", "progress-bar"); + _element_Dialog_ProgressBar = DomElement.create("div", "progress-bar"); _element_Dialog.appendChild(_element_Dialog_ProgressBar); - _element_Dialog_ProgressBar_Percentage = createElement("div", "progress-bar-percentage"); + _element_Dialog_ProgressBar_Percentage = DomElement.create("div", "progress-bar-percentage"); _element_Dialog_ProgressBar.appendChild(_element_Dialog_ProgressBar_Percentage); - _element_Dialog_ProgressBar_Percentage_Text = createElement("p", "progress-bar-percentage-text"); + _element_Dialog_ProgressBar_Percentage_Text = DomElement.create("p", "progress-bar-percentage-text"); _element_Dialog_ProgressBar_Percentage.appendChild(_element_Dialog_ProgressBar_Percentage_Text); - _element_Dialog_Buttons = createElement("div", "buttons"); + _element_Dialog_Buttons = DomElement.create("div", "buttons"); _element_Dialog.appendChild(_element_Dialog_Buttons); - _element_Dialog_Buttons_Back_Button = createElement("button", "back"); + _element_Dialog_Buttons_Back_Button = DomElement.create("button", "back"); _element_Dialog_Buttons_Back_Button.onclick = onDialogBack; _element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Back_Button); - _element_Dialog_Buttons_Next_Button = createElement("button", "next"); + _element_Dialog_Buttons_Next_Button = DomElement.create("button", "next"); _element_Dialog_Buttons_Next_Button.onclick = onDialogNext; _element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Next_Button); makeDialogMovable(); @@ -239,16 +371,16 @@ var Data; if (_configuration.scrollToElements) { e._currentView.element.scrollIntoView(); } - const t = getStyleValueByName(e._currentView.element, "position"); + const t = DomElement.getStyleValueByName(e._currentView.element, "position"); if (t !== "" && t.toLowerCase() === "static") { _element_Focus_Element_PositionStyle = t; e._currentView.element.style.position = "relative"; } - showElementBasedOnCondition(_element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain); - showElementBasedOnCondition(_element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[_groups_Current].keys.length > 1); - showElementBasedOnCondition(_element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[_groups_Current].keys.length > 1); - showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText); - showElementBasedOnCondition(_element_Dialog_Buttons, _configuration.showButtons); + DomElement.showElementBasedOnCondition(_element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain); + DomElement.showElementBasedOnCondition(_element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[_groups_Current].keys.length > 1); + DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[_groups_Current].keys.length > 1); + DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText); + DomElement.showElementBasedOnCondition(_element_Dialog_Buttons, _configuration.showButtons); _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText; _element_Dialog_Buttons_Back_Button.disabled = _groups[_groups_Current].position === 0; if (_groups[_groups_Current].position >= _groups[_groups_Current].keys.length - 1) { @@ -289,9 +421,9 @@ var Data; _element_Dialog_IsHint = t.isHint === true; if (t.attach || t.isHint) { if (t.isHint && t.alignHintToClickPosition) { - showElementAtMousePosition(e, _element_Dialog); + DomElement.showElementAtMousePosition(e, _element_Dialog); } else { - const e = getOffset(t._currentView.element); + const e = DomElement.getOffset(t._currentView.element); let o = e.top + t._currentView.element.offsetHeight; let n = e.left; if (n + _element_Dialog.offsetWidth > window.innerWidth || t.alignRight) { @@ -305,7 +437,7 @@ var Data; _element_Dialog.style.left = n + "px"; } } else { - const e = getScrollPosition(); + const e = DomElement.getScrollPosition(); const t = Math.max(0, (window.innerWidth - _element_Dialog.offsetWidth) / 2 + e.left); const o = Math.max(0, (window.innerHeight - _element_Dialog.offsetHeight) / 2 + e.top); _element_Dialog.style.left = t + "px"; @@ -337,9 +469,9 @@ var Data; const o = _groups[_groups_Current].json[t]; let n = null; if (e === _groups[_groups_Current].position) { - n = createElement("div", "dot-active"); + n = DomElement.create("div", "dot-active"); } else { - n = createElement("div", "dot"); + n = DomElement.create("div", "dot"); n.onclick = () => { removeFocusClassFromLastElement(); _groups[_groups_Current].position = e; @@ -411,7 +543,7 @@ var Data; } function renderToolTip() { if (!Is.defined(_element_ToolTip)) { - _element_ToolTip = createElement("div", "journey-js-tooltip"); + _element_ToolTip = DomElement.create("div", "journey-js-tooltip"); _element_ToolTip.style.display = "none"; document.body.appendChild(_element_ToolTip); document.body.addEventListener("mousemove", (() => { @@ -430,12 +562,12 @@ var Data; } } function showToolTip(e, t) { - cancelBubble(e); + DomElement.cancelBubble(e); hideToolTip(); _element_ToolTip_Timer = setTimeout((() => { _element_ToolTip.innerHTML = t; _element_ToolTip.style.display = "block"; - showElementAtMousePosition(e, _element_ToolTip); + DomElement.showElementAtMousePosition(e, _element_ToolTip); }), _configuration.tooltipDelay); } function hideToolTip() { @@ -503,14 +635,14 @@ var Data; } } function renderHint(e) { - const t = getStyleValueByName(e._currentView.element, "position"); + const t = DomElement.getStyleValueByName(e._currentView.element, "position"); if (t !== "" && t.toLowerCase() === "static") { e._currentView.element.style.position = "relative"; } - const o = createElement("div", "journey-js-hint"); + const o = DomElement.create("div", "journey-js-hint"); e._currentView.element.appendChild(o); o.onclick = t => { - cancelBubble(t); + DomElement.cancelBubble(t); _element_Dialog_CheckBox_Container.style.display = "none"; _element_Dialog_ProgressDots.style.display = "none"; _element_Dialog_ProgressBar.style.display = "none"; @@ -519,7 +651,7 @@ var Data; setDialogText(e); setDialogPosition(t, e); if (e.removeHintWhenViewed) { - clearElementsByClassName(e._currentView.element, "journey-js-hint"); + DomElement.clearElementsByClassName(e._currentView.element, "journey-js-hint"); } }; } @@ -607,122 +739,6 @@ var Data; e.events.onRemoveStep = Data.getDefaultFunction(e.events.onRemoveStep, null); return e; } - function createElement(e, t = "") { - const o = e.toLowerCase(); - const n = o === "text"; - let i = n ? document.createTextNode("") : document.createElement(o); - if (Is.defined(t)) { - i.className = t; - } - return i; - } - function getOffset(e) { - const t = { - left: 0, - top: 0 - }; - while (e && !isNaN(e.offsetLeft) && !isNaN(e.offsetTop)) { - t.left += e.offsetLeft - e.scrollLeft; - t.top += e.offsetTop - e.scrollTop; - e = e.offsetParent; - } - return t; - } - function getScrollPosition() { - const e = document.documentElement; - const t = { - left: (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0), - top: (window.pageYOffset || e.scrollTop) - (e.clientTop || 0) - }; - return t; - } - function getStyleValueByName(e, t) { - let o = null; - if (document.defaultView.getComputedStyle) { - o = document.defaultView.getComputedStyle(e, null).getPropertyValue(t); - } else if (e.currentStyle) { - o = e.currentStyle[t]; - } - return o; - } - function addNode(e, t) { - try { - if (!e.contains(t)) { - e.appendChild(t); - } - } catch (e) { - console.warn(e.message); - } - } - function removeNode(e, t) { - try { - if (e.contains(t)) { - e.removeChild(t); - } - } catch (e) { - console.warn(e.message); - } - } - function cancelBubble(e) { - e.preventDefault(); - e.cancelBubble = true; - } - function showElementAtMousePosition(e, t) { - let o = e.pageX; - let n = e.pageY; - const i = getScrollPosition(); - t.style.display = "block"; - if (o + t.offsetWidth > window.innerWidth) { - o -= t.offsetWidth; - } else { - o++; - } - if (n + t.offsetHeight > window.innerHeight) { - n -= t.offsetHeight; - } else { - n++; - } - if (o < i.left) { - o = e.pageX + 1; - } - if (n < i.top) { - n = e.pageY + 1; - } - t.style.left = o + "px"; - t.style.top = n + "px"; - } - function showElementBasedOnCondition(e, t) { - if (t) { - if (e.style.display !== "block") { - e.style.display = "block"; - } - } else { - if (e.style.display !== "none") { - e.style.display = "none"; - } - } - } - function buildCheckBox(e, t) { - const o = createElement("div"); - const n = createElement("label", "checkbox"); - const i = createElement("input"); - e.appendChild(o); - o.appendChild(n); - n.appendChild(i); - i.type = "checkbox"; - const l = createElement("span", "check-mark"); - const r = createElement("span", "text"); - r.innerHTML = t; - n.appendChild(l); - n.appendChild(r); - return i; - } - function clearElementsByClassName(e, t) { - let o = e.getElementsByClassName(t); - while (o[0]) { - o[0].parentNode.removeChild(o[0]); - } - } function fireCustomTriggerEvent(e, ...t) { if (Is.definedFunction(e)) { e.apply(null, [].slice.call(t, 0)); @@ -892,7 +908,7 @@ var Data; } } if (!t) { - clearElementsByClassName(e, "journey-js-hint"); + DomElement.clearElementsByClassName(e, "journey-js-hint"); } else { resetDialogPosition(); } @@ -926,7 +942,7 @@ var Data; return _public; }, clearHints: function() { - clearElementsByClassName(document.body, "journey-js-hint"); + DomElement.clearElementsByClassName(document.body, "journey-js-hint"); return _public; }, reverseStepOrder: function() { diff --git a/dist/journey.js.map b/dist/journey.js.map index d575d64..e587744 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/journey.ts"],"names":["Constants","Is","Data","result"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : object {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView } from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Position = {\n left: number;\n top: number;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = createElement( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = createElement( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = createElement( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = createElement( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = createElement( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = createElement( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = createElement( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = createElement( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = createElement( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = createElement( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = createElement( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = createElement( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = createElement( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = createElement( \"div\", \"dot-active\" );\n } else {\n \n dot = createElement( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = createElement( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = createElement( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Element Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function createElement( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = createElement( \"div\" );\n const label: HTMLElement = createElement( \"label\", \"checkbox\" );\n const input: HTMLInputElement = createElement( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = createElement( \"span\", \"check-mark\" );\n const text: HTMLElement = createElement( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : object {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 0ed61d1..40cc4e4 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -15,13 +15,15 @@ import { type Configuration, type BindingOptions, type Events, - type CurrentView } from "./ts/type"; + type CurrentView, + type Position} from "./ts/type"; import { Char, KeyCode } from "./ts/enum"; import { Constants } from "./ts/constant"; import { PublicApi } from "./ts/api"; import { Is } from "./ts/is"; import { Data } from "./ts/data"; +import { DomElement } from "./ts/dom"; type StringToJson = { @@ -29,11 +31,6 @@ type StringToJson = { object: any; }; -type Position = { - left: number; - top: number; -}; - ( () => { // Variables: Configuration @@ -119,7 +116,7 @@ type Position = { */ function renderDisabledBackground() : void { - _element_Disabled_Background = createElement( "div", "journey-js-disabled-background" ); + _element_Disabled_Background = DomElement.create( "div", "journey-js-disabled-background" ); _element_Disabled_Background.onclick = () => { if ( _configuration.closeDialogOnDisabledBackgroundClick ) { @@ -129,11 +126,11 @@ type Position = { } function showDisabledBackground() : void { - addNode( document.body, _element_Disabled_Background ); + DomElement.addNode( document.body, _element_Disabled_Background ); } function hideDisabledBackground() : void { - removeNode( document.body, _element_Disabled_Background ); + DomElement.removeNode( document.body, _element_Disabled_Background ); } @@ -144,11 +141,11 @@ type Position = { */ function renderDialog() : void { - _element_Dialog = createElement( "div", "journey-js-dialog" ); + _element_Dialog = DomElement.create( "div", "journey-js-dialog" ); _element_Dialog.style.display = "none"; document.body.appendChild( _element_Dialog ); - _element_Dialog_Close_Button = createElement( "button", "close" ); + _element_Dialog_Close_Button = DomElement.create( "button", "close" ); _element_Dialog.appendChild( _element_Dialog_Close_Button ); _element_Dialog_Close_Button.onclick = () => { @@ -157,16 +154,16 @@ type Position = { addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText ); - _element_Dialog_Title = createElement( "div", "title" ); + _element_Dialog_Title = DomElement.create( "div", "title" ); _element_Dialog.appendChild( _element_Dialog_Title ); - _element_Dialog_Description = createElement( "div", "description" ); + _element_Dialog_Description = DomElement.create( "div", "description" ); _element_Dialog.appendChild( _element_Dialog_Description ); - _element_Dialog_CheckBox_Container = createElement( "div", "checkbox-container" ); + _element_Dialog_CheckBox_Container = DomElement.create( "div", "checkbox-container" ); _element_Dialog.appendChild( _element_Dialog_CheckBox_Container ); - _element_Dialog_CheckBox_Input = buildCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ); + _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText ); _element_Dialog_CheckBox_Input.onchange = () => { if ( _configuration.showDoNotShowAgain ) { @@ -174,26 +171,26 @@ type Position = { } }; - _element_Dialog_ProgressDots = createElement( "div", "progress-dots" ); + _element_Dialog_ProgressDots = DomElement.create( "div", "progress-dots" ); _element_Dialog.appendChild( _element_Dialog_ProgressDots ); - _element_Dialog_ProgressBar = createElement( "div", "progress-bar" ); + _element_Dialog_ProgressBar = DomElement.create( "div", "progress-bar" ); _element_Dialog.appendChild( _element_Dialog_ProgressBar ); - _element_Dialog_ProgressBar_Percentage = createElement( "div", "progress-bar-percentage" ); + _element_Dialog_ProgressBar_Percentage = DomElement.create( "div", "progress-bar-percentage" ); _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage ); - _element_Dialog_ProgressBar_Percentage_Text = createElement( "p", "progress-bar-percentage-text" ); + _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( "p", "progress-bar-percentage-text" ); _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text ); - _element_Dialog_Buttons = createElement( "div", "buttons" ); + _element_Dialog_Buttons = DomElement.create( "div", "buttons" ); _element_Dialog.appendChild( _element_Dialog_Buttons ); - _element_Dialog_Buttons_Back_Button = createElement( "button", "back" ) as HTMLInputElement; + _element_Dialog_Buttons_Back_Button = DomElement.create( "button", "back" ) as HTMLInputElement; _element_Dialog_Buttons_Back_Button.onclick = onDialogBack; _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button ); - _element_Dialog_Buttons_Next_Button = createElement( "button", "next" ) as HTMLInputElement; + _element_Dialog_Buttons_Next_Button = DomElement.create( "button", "next" ) as HTMLInputElement; _element_Dialog_Buttons_Next_Button.onclick = onDialogNext; _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button ); @@ -271,18 +268,18 @@ type Position = { bindingOptions._currentView.element.scrollIntoView(); } - const lastPositionStyle: string = getStyleValueByName( bindingOptions._currentView.element, "position" ); + const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, "position" ); if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === "static" ) { _element_Focus_Element_PositionStyle = lastPositionStyle; bindingOptions._currentView.element.style.position = "relative"; } - showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain ); - showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 ); - showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 ); - showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText ); - showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons ); + DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain ); + DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 ); + DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 ); + DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText ); + DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons ); _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText; _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0; @@ -334,10 +331,10 @@ type Position = { if ( bindingOptions.attach || bindingOptions.isHint ) { if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) { - showElementAtMousePosition( e, _element_Dialog ); + DomElement.showElementAtMousePosition( e, _element_Dialog ); } else { - const offset: Position = getOffset( bindingOptions._currentView.element ); + const offset: Position = DomElement.getOffset( bindingOptions._currentView.element ); let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight; let left: number = ( offset.left ); @@ -355,7 +352,7 @@ type Position = { } } else { - const scrollPosition: Position = getScrollPosition(); + const scrollPosition: Position = DomElement.getScrollPosition(); const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left ); const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top ); @@ -397,10 +394,10 @@ type Position = { let dot: HTMLElement = null; if ( keyIndex === _groups[ _groups_Current ].position ) { - dot = createElement( "div", "dot-active" ); + dot = DomElement.create( "div", "dot-active" ); } else { - dot = createElement( "div", "dot" ); + dot = DomElement.create( "div", "dot" ); dot.onclick = () => { removeFocusClassFromLastElement(); @@ -502,7 +499,7 @@ type Position = { function renderToolTip() : void { if ( !Is.defined( _element_ToolTip ) ) { - _element_ToolTip = createElement( "div", "journey-js-tooltip" ); + _element_ToolTip = DomElement.create( "div", "journey-js-tooltip" ); _element_ToolTip.style.display = "none"; document.body.appendChild( _element_ToolTip ); @@ -526,14 +523,14 @@ type Position = { } function showToolTip( e: any, text: string ) : void { - cancelBubble( e ); + DomElement.cancelBubble( e ); hideToolTip(); _element_ToolTip_Timer = setTimeout( () => { _element_ToolTip.innerHTML = text; _element_ToolTip.style.display = "block"; - showElementAtMousePosition( e, _element_ToolTip ); + DomElement.showElementAtMousePosition( e, _element_ToolTip ); }, _configuration.tooltipDelay ); } @@ -628,17 +625,17 @@ type Position = { } function renderHint( bindingOptions: BindingOptions ) : void { - const positionStyle: string = getStyleValueByName( bindingOptions._currentView.element, "position" ); + const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, "position" ); if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === "static" ) { bindingOptions._currentView.element.style.position = "relative"; } - const hint: HTMLElement = createElement( "div", "journey-js-hint" ); + const hint: HTMLElement = DomElement.create( "div", "journey-js-hint" ); bindingOptions._currentView.element.appendChild( hint ); hint.onclick = ( e: MouseEvent ) => { - cancelBubble( e ); + DomElement.cancelBubble( e ); _element_Dialog_CheckBox_Container.style.display = "none"; _element_Dialog_ProgressDots.style.display = "none"; @@ -650,7 +647,7 @@ type Position = { setDialogPosition( e, bindingOptions ); if ( bindingOptions.removeHintWhenViewed ) { - clearElementsByClassName( bindingOptions._currentView.element, "journey-js-hint" ); + DomElement.clearElementsByClassName( bindingOptions._currentView.element, "journey-js-hint" ); } }; } @@ -776,164 +773,6 @@ type Position = { } - /* - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - * Element Handling - * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - */ - - function createElement( type: string, className: string = Char.empty ) : HTMLElement { - const nodeType: string = type.toLowerCase(); - const isText: boolean = nodeType === "text"; - - let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType ); - - if ( Is.defined( className ) ) { - result.className = className; - } - - return result; - } - - function getOffset( element: HTMLElement ) : Position { - const result: Position = { - left: 0, - top: 0 - } as Position; - - while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) { - result.left += element.offsetLeft - element.scrollLeft; - result.top += element.offsetTop - element.scrollTop; - - element = element.offsetParent as HTMLElement; - } - - return result; - } - - function getScrollPosition() : Position { - const doc: HTMLElement = document.documentElement; - - const result: Position = { - left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ), - top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 ) - } as Position; - - return result; - } - - function getStyleValueByName( element: any, stylePropertyName: string ) : any { - let value: any = null; - - if ( document.defaultView.getComputedStyle ) { - value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); - } else if ( element.currentStyle ) { - value = element.currentStyle[ stylePropertyName ]; - } - - return value; - } - - function addNode( parent: HTMLElement, node: HTMLElement ) : void { - try { - if ( !parent.contains( node ) ) { - parent.appendChild( node ); - } - } catch ( e ) { - console.warn( e.message ); - } - } - - function removeNode( parent: HTMLElement, node: HTMLElement ) : void { - try { - if ( parent.contains( node ) ) { - parent.removeChild( node ); - } - } catch ( e ) { - console.warn( e.message ); - } - } - - function cancelBubble( e: any ) : void { - e.preventDefault(); - e.cancelBubble = true; - } - - function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void { - let left: number = e.pageX; - let top: number = e.pageY; - const scrollPosition: Position = getScrollPosition(); - - element.style.display = "block"; - - if ( left + element.offsetWidth > window.innerWidth ) { - left -= element.offsetWidth; - } else { - left++; - } - - if ( top + element.offsetHeight > window.innerHeight ) { - top -= element.offsetHeight; - } else { - top++; - } - - if ( left < scrollPosition.left ) { - left = e.pageX + 1; - } - - if ( top < scrollPosition.top ) { - top = e.pageY + 1; - } - - element.style.left = left + "px"; - element.style.top = top + "px"; - } - - function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void { - if ( condition ) { - if ( element.style.display !== "block" ) { - element.style.display = "block"; - } - - } else { - if ( element.style.display !== "none" ) { - element.style.display = "none"; - } - } - } - - function buildCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement { - const lineContainer: HTMLElement = createElement( "div" ); - const label: HTMLElement = createElement( "label", "checkbox" ); - const input: HTMLInputElement = createElement( "input" ) as HTMLInputElement; - - container.appendChild( lineContainer ); - lineContainer.appendChild( label ); - label.appendChild( input ); - - input.type = "checkbox"; - - const checkMark: HTMLElement = createElement( "span", "check-mark" ); - const text: HTMLElement = createElement( "span", "text" ); - - text.innerHTML = labelText; - - label.appendChild( checkMark ); - label.appendChild( text ); - - return input; - } - - function clearElementsByClassName( container: HTMLElement, className: string ) : void { - let elements: HTMLCollectionOf = container.getElementsByClassName( className ); - - while ( elements[ 0 ] ) { - elements[ 0 ].parentNode.removeChild( elements[ 0 ] ); - } - } - - /* * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * Triggering Custom Events @@ -1207,7 +1046,7 @@ type Position = { } if ( !removed ) { - clearElementsByClassName( element, "journey-js-hint" ); + DomElement.clearElementsByClassName( element, "journey-js-hint" ); } else { resetDialogPosition(); } @@ -1250,7 +1089,7 @@ type Position = { }, clearHints: function () : PublicApi { - clearElementsByClassName( document.body, "journey-js-hint" ); + DomElement.clearElementsByClassName( document.body, "journey-js-hint" ); return _public; }, diff --git a/src/ts/dom.ts b/src/ts/dom.ts new file mode 100644 index 0000000..2b7c85a --- /dev/null +++ b/src/ts/dom.ts @@ -0,0 +1,157 @@ +import { Char } from "./enum"; +import { Is } from "./is"; +import { type Position } from "./type"; + + +export namespace DomElement { + export function create( type: string, className: string = Char.empty ) : HTMLElement { + const nodeType: string = type.toLowerCase(); + const isText: boolean = nodeType === "text"; + + let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType ); + + if ( Is.defined( className ) ) { + result.className = className; + } + + return result; + } + + export function getOffset( element: HTMLElement ) : Position { + const result: Position = { + left: 0, + top: 0 + } as Position; + + while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) { + result.left += element.offsetLeft - element.scrollLeft; + result.top += element.offsetTop - element.scrollTop; + + element = element.offsetParent as HTMLElement; + } + + return result; + } + + export function getScrollPosition() : Position { + const doc: HTMLElement = document.documentElement; + + const result: Position = { + left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ), + top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 ) + } as Position; + + return result; + } + + export function getStyleValueByName( element: any, stylePropertyName: string ) : any { + let value: any = null; + + if ( document.defaultView.getComputedStyle ) { + value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); + } else if ( element.currentStyle ) { + value = element.currentStyle[ stylePropertyName ]; + } + + return value; + } + + export function addNode( parent: HTMLElement, node: HTMLElement ) : void { + try { + if ( !parent.contains( node ) ) { + parent.appendChild( node ); + } + } catch ( e ) { + console.warn( e.message ); + } + } + + export function removeNode( parent: HTMLElement, node: HTMLElement ) : void { + try { + if ( parent.contains( node ) ) { + parent.removeChild( node ); + } + } catch ( e ) { + console.warn( e.message ); + } + } + + export function cancelBubble( e: any ) : void { + e.preventDefault(); + e.cancelBubble = true; + } + + export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void { + let left: number = e.pageX; + let top: number = e.pageY; + const scrollPosition: Position = getScrollPosition(); + + element.style.display = "block"; + + if ( left + element.offsetWidth > window.innerWidth ) { + left -= element.offsetWidth; + } else { + left++; + } + + if ( top + element.offsetHeight > window.innerHeight ) { + top -= element.offsetHeight; + } else { + top++; + } + + if ( left < scrollPosition.left ) { + left = e.pageX + 1; + } + + if ( top < scrollPosition.top ) { + top = e.pageY + 1; + } + + element.style.left = left + "px"; + element.style.top = top + "px"; + } + + export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void { + if ( condition ) { + if ( element.style.display !== "block" ) { + element.style.display = "block"; + } + + } else { + if ( element.style.display !== "none" ) { + element.style.display = "none"; + } + } + } + + export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement { + const lineContainer: HTMLElement = create( "div" ); + const label: HTMLElement = create( "label", "checkbox" ); + const input: HTMLInputElement = create( "input" ) as HTMLInputElement; + + container.appendChild( lineContainer ); + lineContainer.appendChild( label ); + label.appendChild( input ); + + input.type = "checkbox"; + + const checkMark: HTMLElement = create( "span", "check-mark" ); + const text: HTMLElement = create( "span", "text" ); + + text.innerHTML = labelText; + + label.appendChild( checkMark ); + label.appendChild( text ); + + return input; + } + + export function clearElementsByClassName( container: HTMLElement, className: string ) : void { + let elements: HTMLCollectionOf = container.getElementsByClassName( className ); + + while ( elements[ 0 ] ) { + elements[ 0 ].parentNode.removeChild( elements[ 0 ] ); + } + } +} \ No newline at end of file diff --git a/src/ts/type.ts b/src/ts/type.ts index 27626e6..708ed6b 100644 --- a/src/ts/type.ts +++ b/src/ts/type.ts @@ -1,3 +1,8 @@ +export type Position = { + left: number; + top: number; +}; + export type Configuration = { safeMode?: boolean; domElementTypes?: string[] | string; From 517848dca066433131381e808283b99a21a30170 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 15:40:43 +0100 Subject: [PATCH 28/44] More types. --- dist/journey.esm.js.map | 2 +- dist/journey.js.map | 2 +- src/journey.ts | 16 +++++++++++----- src/ts/data.ts | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 16a2177..9933d8b 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : object {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js.map b/dist/journey.js.map index e587744..ca25172 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : object {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: object = {};\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} );\n\n _groups[ _groups_Default ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {},\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {};\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":";AAaO,IAAU;AAAA,CAAV,CAAUA,eAAV;AACI,EAAMA,WAAA,4BAA4B;AAAA,GAD5B;;;ACVV,IAAU;AAAA,CAAV,CAAUC,QAAV;AACI,WAAS,QAAS,OAAuB;AAC5C,WAAO,UAAU,QAAQ,UAAU,UAAa;AAAA,EACpD;AAFO,EAAAA,IAAS;AAIT,WAAS,cAAe,QAAwB;AACnD,WAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,EAClD;AAFO,EAAAA,IAAS;AAIT,WAAS,eAAgB,QAAwB;AACpD,WAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,EAClD;AAFO,EAAAA,IAAS;AAIT,WAAS,cAAe,QAAwB;AACnD,WAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,EAClD;AAFO,EAAAA,IAAS;AAIT,WAAS,gBAAiB,QAAwB;AACrD,WAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,EAClD;AAFO,EAAAA,IAAS;AAIT,WAAS,cAAe,QAAwB;AACnD,WAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,EAClD;AAFO,EAAAA,IAAS;AAIT,WAAS,aAAc,QAAwB;AAClD,WAAO,cAAe,MAAO,KAAK,kBAAkB;AAAA,EACxD;AAFO,EAAAA,IAAS;AAAA,GAzBH;;;ACCV,IAAU;AAAA,CAAV,CAAUC,UAAV;AACI,WAAS,oBAAqB,OAAY,cAAgC;AAC7E,WAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,EAC/C;AAFO,EAAAA,MAAS;AAIT,WAAS,iBAAkB,OAAY,cAAgC;AAC1E,WAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,EAC/C;AAFO,EAAAA,MAAS;AAIT,WAAS,kBAAmB,OAAY,cAAkC;AAC7E,WAAO,GAAG,eAAgB,KAAM,IAAI,QAAQ;AAAA,EAChD;AAFO,EAAAA,MAAS;AAIT,WAAS,iBAAkB,OAAY,cAAgC;AAC1E,WAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,EAC/C;AAFO,EAAAA,MAAS;AAIT,WAAS,mBAAoB,OAAY,cAA6B;AACzE,WAAO,GAAG,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EACjD;AAFO,EAAAA,MAAS;AAIT,WAAS,iBAAkB,OAAY,cAA6B;AACvE,WAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,EAC/C;AAFO,EAAAA,MAAS;AAIT,WAAS,gBAAiB,OAAY,cAA8B;AACvE,WAAO,GAAG,aAAc,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAFO,EAAAA,MAAS;AAIT,WAAS,wBAAyB,OAAY,cAA8B;AAC/E,QAAIC,UAAgB;AAEpB,QAAK,GAAG,cAAe,KAAM,GAAI;AAC7B,YAAM,SAAmB,MAAM,SAAS,EAAE,qBAAkB;AAE5D,UAAK,OAAO,WAAW,GAAI;AACvB,gBAAQ;AAAA,MACZ,OAAO;AACH,QAAAA,UAAS;AAAA,MACb;AAAA,IAEJ,OAAO;AACH,MAAAA,UAAS,gBAAiB,OAAO,YAAa;AAAA,IAClD;AAEA,WAAOA;AAAA,EACX;AAjBO,EAAAD,MAAS;AAAA,GA7BH;;;ACCV,IAAU;AAAA,CAAV,CAAUE,gBAAV;AACI,WAAS,OAAQ,MAAc,4BAA+C;AACjF,UAAM,WAAmB,KAAK,YAAY;AAC1C,UAAM,SAAkB,aAAa;AAErC,QAAID,UAAc,SAAS,SAAS,6BAA2B,IAAI,SAAS,cAAe,QAAS;AAEpG,QAAK,GAAG,QAAS,SAAU,GAAI;AAC3B,MAAAA,QAAO,YAAY;AAAA,IACvB;AAEA,WAAOA;AAAA,EACX;AAXO,EAAAC,YAAS;AAaT,WAAS,UAAW,SAAkC;AACzD,UAAMD,UAAmB;AAAA,MACrB,MAAM;AAAA,MACN,KAAK;AAAA,IACT;AAEA,WAAQ,WAAW,CAAC,MAAO,QAAQ,UAAW,KAAK,CAAC,MAAO,QAAQ,SAAU,GAAI;AAC7E,MAAAA,QAAO,QAAQ,QAAQ,aAAa,QAAQ;AAC5C,MAAAA,QAAO,OAAO,QAAQ,YAAY,QAAQ;AAE1C,gBAAU,QAAQ;AAAA,IACtB;AAEA,WAAOA;AAAA,EACX;AAdO,EAAAC,YAAS;AAgBT,WAAS,oBAA+B;AAC3C,UAAM,MAAmB,SAAS;AAElC,UAAMD,UAAmB;AAAA,MACrB,OAAQ,OAAO,eAAe,IAAI,eAAkB,IAAI,cAAc;AAAA,MACtE,MAAO,OAAO,eAAe,IAAI,cAAgB,IAAI,aAAa;AAAA,IACtE;AAEA,WAAOA;AAAA,EACX;AATO,EAAAC,YAAS;AAWT,WAAS,oBAAqB,SAAc,mBAAkC;AACjF,QAAI,QAAa;AAEjB,QAAK,SAAS,YAAY,kBAAmB;AACzC,cAAQ,SAAS,YAAY,iBAAkB,SAAS,IAAK,EAAE,iBAAkB,iBAAkB;AAAA,IACvG,WAAY,QAAQ,cAAe;AAC/B,cAAQ,QAAQ,aAAc,iBAAkB;AAAA,IACpD;AAEA,WAAO;AAAA,EACX;AAVO,EAAAA,YAAS;AAYT,WAAS,QAAS,QAAqB,MAA2B;AACrE,QAAI;AACA,UAAK,CAAC,OAAO,SAAU,IAAK,GAAI;AAC5B,eAAO,YAAa,IAAK;AAAA,MAC7B;AAAA,IACJ,SAAU,GAAI;AACV,cAAQ,KAAM,EAAE,OAAQ;AAAA,IAC5B;AAAA,EACJ;AARO,EAAAA,YAAS;AAUT,WAAS,WAAY,QAAqB,MAA2B;AACxE,QAAI;AACA,UAAK,OAAO,SAAU,IAAK,GAAI;AAC3B,eAAO,YAAa,IAAK;AAAA,MAC7B;AAAA,IACJ,SAAU,GAAI;AACV,cAAQ,KAAM,EAAE,OAAQ;AAAA,IAC5B;AAAA,EACJ;AARO,EAAAA,YAAS;AAUT,WAAS,aAAc,GAAgB;AAC1C,MAAE,eAAe;AACjB,MAAE,eAAe;AAAA,EACrB;AAHO,EAAAA,YAAS;AAKT,WAAS,2BAA4B,GAAe,SAA8B;AACrF,QAAI,OAAe,EAAE;AACrB,QAAI,MAAc,EAAE;AACpB,UAAM,iBAA2B,kBAAkB;AAEnD,YAAQ,MAAM,UAAU;AAExB,QAAK,OAAO,QAAQ,cAAc,OAAO,YAAa;AAClD,cAAQ,QAAQ;AAAA,IACpB,OAAO;AACH;AAAA,IACJ;AAEA,QAAK,MAAM,QAAQ,eAAe,OAAO,aAAc;AACnD,aAAO,QAAQ;AAAA,IACnB,OAAO;AACH;AAAA,IACJ;AAEA,QAAK,OAAO,eAAe,MAAO;AAC9B,aAAO,EAAE,QAAQ;AAAA,IACrB;AAEA,QAAK,MAAM,eAAe,KAAM;AAC5B,YAAM,EAAE,QAAQ;AAAA,IACpB;AAEA,YAAQ,MAAM,OAAO,OAAO;AAC5B,YAAQ,MAAM,MAAM,MAAM;AAAA,EAC9B;AA7BO,EAAAA,YAAS;AA+BT,WAAS,4BAA6B,SAAsB,WAA4B;AAC3F,QAAK,WAAY;AACb,UAAK,QAAQ,MAAM,YAAY,SAAU;AACrC,gBAAQ,MAAM,UAAU;AAAA,MAC5B;AAAA,IAEJ,OAAO;AACH,UAAK,QAAQ,MAAM,YAAY,QAAS;AACpC,gBAAQ,MAAM,UAAU;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAXO,EAAAA,YAAS;AAaT,WAAS,eAAgB,WAAwB,WAAuC;AAC3F,UAAM,gBAA6B,OAAQ,KAAM;AACjD,UAAM,QAAqB,OAAQ,SAAS,UAAW;AACvD,UAAM,QAA0B,OAAQ,OAAQ;AAEhD,cAAU,YAAa,aAAc;AACrC,kBAAc,YAAa,KAAM;AACjC,UAAM,YAAa,KAAM;AAEzB,UAAM,OAAO;AAEb,UAAM,YAAyB,OAAQ,QAAQ,YAAa;AAC5D,UAAM,OAAoB,OAAQ,QAAQ,MAAO;AAEjD,SAAK,YAAY;AAEjB,UAAM,YAAa,SAAU;AAC7B,UAAM,YAAa,IAAK;AAExB,WAAO;AAAA,EACX;AApBO,EAAAA,YAAS;AAsBT,WAAS,yBAA0B,WAAwB,WAA2B;AACzF,QAAI,WAAsC,UAAU,uBAAwB,SAAU;AAEtF,WAAQ,SAAU,CAAE,GAAI;AACpB,eAAU,CAAE,EAAE,WAAW,YAAa,SAAU,CAAE,CAAE;AAAA,IACxD;AAAA,EACJ;AANO,EAAAA,YAAS;AAAA,GAhJH;;;CCmCf,MAAM;AAEJ,MAAI,iBAAgC,CAAC;AAGrC,MAAI,qCAA8C;AAGlD,QAAM,kBAA0B;AAChC,MAAI,kBAA0B;AAC9B,MAAI,UAAkB,CAAC;AAGvB,MAAI,uCAA+C;AAGnD,MAAI,+BAA4C;AAGhD,MAAI,kBAA+B;AACnC,MAAI,+BAA4C;AAChD,MAAI,wBAAqC;AACzC,MAAI,8BAA2C;AAC/C,MAAI,qCAAkD;AACtD,MAAI,iCAAmD;AACvD,MAAI,+BAA4C;AAChD,MAAI,8BAA2C;AAC/C,MAAI,yCAAsD;AAC1D,MAAI,8CAA2D;AAC/D,MAAI,0BAAuC;AAC3C,MAAI,sCAAwD;AAC5D,MAAI,sCAAwD;AAC5D,MAAI,yBAAkC;AAGtC,MAAI,kCAA0C;AAC9C,MAAI,kCAA0C;AAC9C,MAAI,gCAAyC;AAC7C,MAAI,yBAAiC;AACrC,MAAI,yBAAiC;AAGrC,MAAI,mBAAmB;AACvB,MAAI,yBAAiC;AASrC,WAAS,kBAAmB,SAAc,MAAc;AACpD,cAAU,KAAK,iBAAkB,QAAQ,CAAC,CAAY;AAEtD,YAAS,eAAgB,IAAI;AAAA,MACzB,MAAM,CAAC;AAAA,MACP,MAAM,CAAC;AAAA,MACP,UAAU;AAAA,IACd;AAAA,EACJ;AAEA,WAAS,cAAe,OAAuB;AAC3C,QAAK,CAAC,QAAQ,eAAgB,KAAM,GAAI;AACpC,cAAS,KAAM,IAAI;AAAA,QACf,MAAM,CAAC;AAAA,QACP,MAAM,CAAC;AAAA,QACP,UAAU;AAAA,MACd;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAA0C;AAC/C,WAAO,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,QAAS,CAAE;AAAA,EACnH;AASA,WAAS,2BAAkC;AACvC,mCAA+B,WAAW,OAAQ,OAAO,gCAAiC;AAE1F,iCAA6B,UAAU,MAAM;AACzC,UAAK,eAAe,sCAAuC;AACvD,sBAAc;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAAgC;AACrC,eAAW,QAAS,SAAS,MAAM,4BAA6B;AAAA,EACpE;AAEA,WAAS,yBAAgC;AACrC,eAAW,WAAY,SAAS,MAAM,4BAA6B;AAAA,EACvE;AASA,WAAS,eAAsB;AAC3B,sBAAkB,WAAW,OAAQ,OAAO,mBAAoB;AAChE,oBAAgB,MAAM,UAAU;AAChC,aAAS,KAAK,YAAa,eAAgB;AAE3C,mCAA+B,WAAW,OAAQ,UAAU,OAAQ;AACpE,oBAAgB,YAAa,4BAA6B;AAE1D,iCAA6B,UAAU,MAAM;AACzC,oBAAc;AAAA,IAClB;AAEA,eAAY,8BAA8B,eAAe,sBAAuB;AAEhF,4BAAwB,WAAW,OAAQ,OAAO,OAAQ;AAC1D,oBAAgB,YAAa,qBAAsB;AAEnD,kCAA8B,WAAW,OAAQ,OAAO,aAAc;AACtE,oBAAgB,YAAa,2BAA4B;AAEzD,yCAAqC,WAAW,OAAQ,OAAO,oBAAqB;AACpF,oBAAgB,YAAa,kCAAmC;AAEhE,qCAAiC,WAAW,eAAgB,oCAAoC,eAAe,kBAAmB;AAElI,mCAA+B,WAAW,MAAM;AAC5C,UAAK,eAAe,oBAAqB;AACrC,+BAAwB,eAAe,wBAAwB,+BAA+B,OAAQ;AAAA,MAC1G;AAAA,IACJ;AAEA,mCAA+B,WAAW,OAAQ,OAAO,eAAgB;AACzE,oBAAgB,YAAa,4BAA6B;AAE1D,kCAA8B,WAAW,OAAQ,OAAO,cAAe;AACvE,oBAAgB,YAAa,2BAA4B;AAEzD,6CAAyC,WAAW,OAAQ,OAAO,yBAA0B;AAC7F,gCAA4B,YAAa,sCAAuC;AAEhF,kDAA8C,WAAW,OAAQ,KAAK,8BAA+B;AACrG,2CAAuC,YAAa,2CAA4C;AAEhG,8BAA0B,WAAW,OAAQ,OAAO,SAAU;AAC9D,oBAAgB,YAAa,uBAAwB;AAErD,0CAAsC,WAAW,OAAQ,UAAU,MAAO;AAC1E,wCAAoC,UAAU;AAC9C,4BAAwB,YAAa,mCAAoC;AAEzE,0CAAsC,WAAW,OAAQ,UAAU,MAAO;AAC1E,wCAAoC,UAAU;AAC9C,4BAAwB,YAAa,mCAAoC;AAEzE,sBAAkB;AAAA,EACtB;AAEA,WAAS,cAAe,sBAA+B,MAAc;AACjE,QAAI,YAAqB;AAEzB,QAAK,GAAG,cAAe,eAAe,2BAA4B,KAAK,qBAAsB;AACzF,kBAAY,QAAS,eAAe,2BAA4B;AAAA,IACpE,OAAO;AACH,kBAAY;AAAA,IAChB;AAEA,QAAK,WAAY;AACb,YAAM,iBAAiC,uBAAuB;AAE9D,UAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,+BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,MAC/F;AAEA,sCAAiC,KAAM;AACvC,6BAAuB;AACvB,kBAAY;AAEZ,sBAAgB,MAAM,UAAU;AAAA,IACpC;AAAA,EACJ;AAEA,WAAS,eAAsB;AAC3B,QAAK,QAAS,eAAgB,EAAE,WAAW,GAAI;AAC3C,sCAAgC;AAEhC,cAAS,eAAgB,EAAE;AAE3B,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,eAAsB;AAC3B,QAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,YAAM,iBAAiC,uBAAuB;AAE9D,oBAAe,KAAM;AACrB,6BAAwB,eAAe,OAAO,UAAU,eAAe,aAAa,OAAQ;AAAA,IAEhG,OAAO;AACH,sCAAgC;AAEhC,cAAS,eAAgB,EAAE;AAE3B,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,2BAAkC;AACvC,UAAM,iBAAiC,uBAAuB;AAE9D,QAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,UAAK,eAAe,wBAAyB;AACzC,+BAAuB;AAAA,MAC3B,OAAO;AACH,+BAAuB;AAAA,MAC3B;AAEA,kBAAY;AAEZ,mCAA6B,MAAM,UAAU,eAAe,kBAAkB,UAAS;AACvF,2CAAqC;AAErC,qBAAe,aAAa,QAAQ,+BAA0B;AAE9D,UAAK,eAAe,kBAAmB;AACnC,uBAAe,aAAa,QAAQ,eAAe;AAAA,MACvD;AAEA,YAAM,oBAA4B,WAAW,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAElH,UAAK,wCAAoC,kBAAkB,YAAY,MAAM,UAAW;AACpF,+CAAuC;AACvC,uBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,MACzD;AAEA,iBAAW,4BAA6B,oCAAoC,eAAe,kBAAmB;AAC9G,iBAAW,4BAA6B,8BAA8B,eAAe,oBAAoB,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AACpJ,iBAAW,4BAA6B,6BAA6B,eAAe,mBAAmB,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AAClJ,iBAAW,4BAA6B,6CAA6C,eAAe,mBAAoB;AACxH,iBAAW,4BAA6B,yBAAyB,eAAe,WAAY;AAE5F,0CAAoC,YAAY,eAAe;AAC/D,0CAAoC,WAAW,QAAS,eAAgB,EAAE,aAAa;AAEvF,UAAK,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACrF,4CAAoC,YAAY,eAAe;AAAA,MACnE,OAAO;AACH,4CAAoC,YAAY,eAAe;AAAA,MACnE;AAEA,oBAAe,cAAe;AAC9B,wBAAmB,MAAM,cAAe;AACxC,uBAAiB;AACjB,6BAAuB;AACvB,6BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAE3F,UAAK,eAAe,WAAY;AAC5B,uBAAe,aAAa,QAAQ,MAAM;AAAA,MAC9C;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,cAAe,gBAAwC;AAC5D,QAAK,GAAG,cAAe,eAAe,KAAM,GAAI;AAC5C,4BAAsB,YAAY,eAAe;AAAA,IACrD,OAAO;AACH,4BAAsB;AAAA,IAC1B;AAEA,QAAK,GAAG,cAAe,eAAe,WAAY,GAAI;AAClD,kCAA4B,YAAY,eAAe;AAAA,IAC3D,OAAO;AACH,kCAA4B;AAAA,IAChC;AAAA,EACJ;AAEA,WAAS,kBAAmB,GAAQ,gBAAwC;AACxE,QAAK,gBAAgB,MAAM,YAAY,SAAU;AAC7C,sBAAgB,MAAM,UAAU;AAEhC,6BAAwB,eAAe,OAAO,QAAQ,eAAe,aAAa,OAAQ;AAAA,IAC9F;AAEA,QAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,6BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,IAC/F;AAEA,6BAAyB,eAAe,WAAW;AAEnD,QAAK,eAAe,UAAU,eAAe,QAAS;AAClD,UAAK,eAAe,UAAU,eAAe,0BAA2B;AACpE,mBAAW,2BAA4B,GAAG,eAAgB;AAAA,MAE9D,OAAO;AACH,cAAM,SAAmB,WAAW,UAAW,eAAe,aAAa,OAAQ;AACnF,YAAI,MAAgB,OAAO,MAAQ,eAAe,aAAa,QAAQ;AACvE,YAAI,OAAiB,OAAO;AAE5B,YAAK,OAAO,gBAAgB,cAAc,OAAO,cAAc,eAAe,YAAa;AACvF,kBAAS,gBAAgB;AACzB,kBAAQ,eAAe,aAAa,QAAQ;AAAA,QAChD;AAEA,YAAK,MAAM,gBAAgB,eAAe,OAAO,eAAe,eAAe,UAAW;AACtF,iBAAS,gBAAgB,eAAe,eAAe,aAAa,QAAQ;AAAA,QAChF;AAEA,wBAAgB,MAAM,MAAM,MAAM;AAClC,wBAAgB,MAAM,OAAO,OAAO;AAAA,MACxC;AAAA,IAEJ,OAAO;AACH,YAAM,iBAA2B,WAAW,kBAAkB;AAC9D,YAAM,aAAqB,KAAK,IAAK,IAAO,OAAO,aAAa,gBAAgB,eAAgB,IAAM,eAAe,IAAK;AAC1H,YAAM,YAAoB,KAAK,IAAK,IAAO,OAAO,cAAc,gBAAgB,gBAAiB,IAAM,eAAe,GAAI;AAE1H,sBAAgB,MAAM,OAAO,aAAa;AAC1C,sBAAgB,MAAM,MAAM,YAAY;AAAA,IAC5C;AAAA,EACJ;AAEA,WAAS,gCAAiC,oBAA6B,MAAc;AACjF,UAAM,iBAAiC,uBAAuB;AAE9D,QAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,qBAAe,aAAa,QAAQ,YAAY,eAAe,aAAa,QAAQ,UAAU,0BAAsB,0CAAuC;AAE3J,UAAK,GAAG,QAAS,oCAAqC,GAAI;AACtD,uBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,MACzD;AAEA,UAAK,mBAAoB;AACrB,+BAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,MAC/F;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,mBAA0B;AAC/B,iCAA6B;AAE7B,QAAK,eAAe,kBAAmB;AACnC,YAAM,aAAqB,QAAS,eAAgB,EAAE,KAAK;AAE3D,eAAU,WAAmB,GAAG,WAAW,YAAY,YAAa;AAChE,yBAAkB,UAAU,QAAS,eAAgB,EAAE,KAAM,QAAS,CAAE;AAAA,MAC5E;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,iBAAkB,UAAkB,OAAuB;AAChE,UAAM,iBAAiC,QAAS,eAAgB,EAAE,KAAM,KAAM;AAC9E,QAAI,MAAmB;AAEvB,QAAK,aAAa,QAAS,eAAgB,EAAE,UAAW;AACpD,YAAM,WAAW,OAAQ,OAAO,YAAa;AAAA,IACjD,OAAO;AAEH,YAAM,WAAW,OAAQ,OAAO,KAAM;AAEtC,UAAI,UAAU,MAAM;AAChB,wCAAgC;AAEhC,gBAAS,eAAgB,EAAE,WAAW;AAEtC,iCAAyB;AAAA,MAC7B;AAAA,IACJ;AAEA,iCAA6B,YAAa,GAAI;AAE9C,QAAK,eAAe,yBAA0B;AAC1C,UAAK,GAAG,cAAe,eAAe,OAAQ,GAAI;AAC9C,mBAAY,KAAK,eAAe,OAAQ;AAAA,MAC5C,OAAO;AACH,mBAAY,KAAK,eAAe,KAAM;AAAA,MAC1C;AAAA,IACJ;AAEA,QAAK,eAAe,wBAAyB;AACzC,UAAI,aAAa;AACjB,UAAI,aAAc,WAAW,GAAI,SAAS;AAAA,IAC9C;AAAA,EACJ;AAEA,WAAS,yBAAgC;AACrC,QAAK,eAAe,iBAAkB;AAClC,YAAM,iBAAyB,4BAA4B,cAAc,QAAS,eAAgB,EAAE,KAAK;AACzG,YAAM,SAAkB,QAAS,eAAgB,EAAE,WAAW,KAAM;AACpE,YAAM,qBAA6B,KAAK,MAAU,QAAS,eAAgB,EAAE,WAAW,KAAM,QAAS,eAAgB,EAAE,KAAK,SAAW,GAAI;AAE7I,6CAAuC,MAAM,QAAQ,QAAQ;AAC7D,kDAA4C,YAAY,qBAAqB;AAAA,IACjF;AAAA,EACJ;AASA,WAAS,oBAA2B;AAChC,0BAAsB,cAAc;AACpC,0BAAsB,YAAY;AAClC,0BAAsB,gBAAgB;AAEtC,aAAS,KAAK,iBAAkB,aAAa,uBAAwB;AACrE,aAAS,KAAK,iBAAkB,cAAc,wBAAyB;AAAA,EAC3E;AAEA,WAAS,wBAAyB,GAAuB;AACrD,QAAK,CAAC,iCAAiC,CAAC,0BAA0B,eAAe,qBAAsB;AACnG,sBAAgB,aAAa;AAC7B,sCAAgC;AAChC,+BAAyB,EAAE,QAAQ,gBAAgB;AACnD,+BAAyB,EAAE,QAAQ,gBAAgB;AACnD,wCAAkC,gBAAgB;AAClD,wCAAkC,gBAAgB;AAAA,IACtD;AAAA,EACJ;AAEA,WAAS,wBAA+B;AACpC,QAAK,+BAAgC;AACjC,sCAAgC;AAChC,wCAAkC;AAClC,wCAAkC;AAClC,sBAAgB,YAAY;AAAA,IAChC;AAAA,EACJ;AAEA,WAAS,wBAAyB,GAAuB;AACrD,QAAK,+BAAgC;AACjC,sBAAgB,MAAM,OAAS,EAAE,QAAQ,yBAA2B;AACpE,sBAAgB,MAAM,MAAQ,EAAE,QAAQ,yBAA2B;AAAA,IACvE;AAAA,EACJ;AAEA,WAAS,2BAAkC;AACvC,QAAK,+BAAgC;AACjC,sBAAgB,MAAM,OAAO,kCAAkC;AAC/D,sBAAgB,MAAM,MAAM,kCAAkC;AAE9D,sCAAgC;AAChC,wCAAkC;AAClC,wCAAkC;AAClC,sBAAgB,YAAY;AAAA,IAChC;AAAA,EACJ;AASA,WAAS,gBAAuB;AAC5B,QAAK,CAAC,GAAG,QAAS,gBAAiB,GAAI;AACnC,yBAAmB,WAAW,OAAQ,OAAO,oBAAqB;AAClE,uBAAiB,MAAM,UAAU;AAEjC,eAAS,KAAK,YAAa,gBAAiB;AAE5C,eAAS,KAAK,iBAAkB,aAAa,MAAM;AAC/C,oBAAY;AAAA,MAChB,CAAE;AAEF,eAAS,iBAAkB,UAAU,MAAM;AACvC,oBAAY;AAAA,MAChB,CAAE;AAAA,IACN;AAAA,EACJ;AAEA,WAAS,WAAY,SAAsB,MAAsB;AAC7D,QAAK,YAAY,MAAO;AACpB,cAAQ,cAAc,CAAE,MAAmB;AACvC,oBAAa,GAAG,IAAK;AAAA,MACzB;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,YAAa,GAAQ,MAAsB;AAChD,eAAW,aAAc,CAAE;AAC3B,gBAAY;AAEZ,6BAAyB,WAAY,MAAM;AACvC,uBAAiB,YAAY;AAC7B,uBAAiB,MAAM,UAAU;AAEjC,iBAAW,2BAA4B,GAAG,gBAAiB;AAAA,IAC/D,GAAG,eAAe,YAAa;AAAA,EACnC;AAEA,WAAS,cAAqB;AAC1B,QAAK,GAAG,QAAS,gBAAiB,GAAI;AAClC,UAAK,2BAA2B,GAAI;AAChC,qBAAc,sBAAuB;AACrC,iCAAyB;AAAA,MAC7B;AAEA,UAAK,iBAAiB,MAAM,YAAY,SAAU;AAC9C,yBAAiB,MAAM,UAAU;AAAA,MACrC;AAAA,IACJ;AAAA,EACJ;AASA,WAAS,cAAqB;AAC1B,UAAM,WAAqB,eAAe;AAC1C,UAAM,iBAAyB,SAAS;AAExC,aAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,YAAM,cAAyC,SAAS,qBAAsB,SAAU,YAAa,CAAE;AACvG,YAAM,WAA0B,CAAC,EAAE,MAAM,KAAM,WAAY;AAC3D,YAAM,iBAAyB,SAAS;AAExC,eAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,YAAK,CAAC,WAAY,SAAU,YAAa,CAAE,GAAI;AAC3C;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,YAAS,eAAgB,EAAE,KAAK,KAAK;AAAA,EACzC;AAEA,WAAS,WAAY,SAAiC;AAClD,QAAID,UAAkB;AAEtB,QAAK,GAAG,QAAS,OAAQ,KAAK,QAAQ,aAAc,UAAU,yBAA0B,GAAI;AACxF,YAAM,qBAA6B,QAAQ,aAAc,UAAU,yBAA0B;AAE7F,UAAK,GAAG,cAAe,kBAAmB,GAAI;AAC1C,cAAM,iBAA+B,oBAAqB,kBAAmB;AAE7E,YAAK,eAAe,UAAU,GAAG,cAAe,eAAe,MAAO,GAAI;AACtE,uBAAc,SAAS,sBAAuB,eAAe,MAAO,CAAE;AAAA,QAE1E,OAAO;AACH,cAAK,CAAC,eAAe,UAAW;AAC5B,oBAAQ,MAAO,eAAe,2BAA2B,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC9H,YAAAA,UAAS;AAAA,UACb;AAAA,QACJ;AAAA,MAEJ,OAAO;AACH,YAAK,CAAC,eAAe,UAAW;AAC5B,kBAAQ,MAAO,eAAe,yBAAyB,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC5H,UAAAA,UAAS;AAAA,QACb;AAAA,MACJ;AAAA,IACJ;AAEA,WAAOA;AAAA,EACX;AAEA,WAAS,aAAc,SAAsB,gBAAwC;AACjF,mBAAe,eAAe,CAAC;AAC/B,mBAAe,aAAa,UAAU;AAEtC,QAAK,GAAG,cAAe,eAAe,KAAM,MAAO,GAAG,cAAe,eAAe,KAAM,KAAK,GAAG,cAAe,eAAe,WAAY,IAAM;AAC9I,cAAQ,gBAAiB,UAAU,yBAA0B;AAE7D,UAAK,CAAC,eAAe,QAAS;AAC1B,sBAAe,eAAe,KAAM;AAEpC,gBAAS,eAAe,KAAM,EAAE,KAAM,eAAe,KAAM,IAAI;AAC/D,gBAAS,eAAe,KAAM,EAAE,KAAK,KAAM,eAAe,KAAM;AAEhE,+BAAwB,eAAe,OAAO,WAAW,OAAQ;AAAA,MAErE,OAAO;AACH,mBAAY,cAAe;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,WAAY,gBAAwC;AACzD,UAAM,gBAAwB,WAAW,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAE9G,QAAK,oCAAgC,cAAc,YAAY,MAAM,UAAW;AAC5E,qBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,IACzD;AAEA,UAAM,OAAoB,WAAW,OAAQ,OAAO,iBAAkB;AACtE,mBAAe,aAAa,QAAQ,YAAa,IAAK;AAEtD,SAAK,UAAU,CAAE,MAAmB;AAChC,iBAAW,aAAc,CAAE;AAE3B,yCAAmC,MAAM,UAAU;AACnD,mCAA6B,MAAM,UAAU;AAC7C,kCAA4B,MAAM,UAAU;AAC5C,8BAAwB,MAAM,UAAU;AACxC,2CAAqC;AAErC,oBAAe,cAAe;AAC9B,wBAAmB,GAAG,cAAe;AAErC,UAAK,eAAe,sBAAuB;AACvC,mBAAW,yBAA0B,eAAe,aAAa,SAAS,iBAAkB;AAAA,MAChG;AAAA,IACJ;AAAA,EACJ;AASA,WAAS,oBAAqB,YAAqB,MAAc;AAC7D,UAAM,eAAyB,YAAY,SAAS,mBAAmB,SAAS;AAChF,UAAM,aAAuB,YAAY,OAAO,mBAAmB,OAAO;AAE1E,QAAK,eAAe,qBAAsB;AACtC,mBAAc,WAAW,eAAgB;AAAA,IAC7C;AAEA,eAAY,UAAU,cAAe;AAAA,EACzC;AAEA,WAAS,gBAAiB,GAA0B;AAChD,QAAK,QAAQ,OAAO,KAAK,eAAe,qBAAsB;AAC1D,UAAK,EAAE,gCAA0B;AAC7B,UAAE,eAAe;AACjB,sBAAc;AAAA,MAClB,OAAO;AAEH,YAAK,oCAAqC;AACtC,cAAK,EAAE,iCAAwB;AAC3B,cAAE,eAAe;AACjB,yBAAa;AAAA,UAEjB,WAAY,EAAE,mCAAyB;AACnC,cAAE,eAAe;AACjB,yBAAa;AAAA,UAEjB,WAAY,EAAE,6BAAsB;AAChC,cAAE,eAAe;AACjB,8BAAkB;AAAA,UAEtB,WAAY,EAAE,iCAAwB;AAClC,cAAE,eAAe;AACjB,gCAAoB;AAAA,UACxB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,iBAAwB;AAC7B,QAAK,QAAQ,OAAO,GAAI;AACpB,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,oBAA2B;AAChC,QAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,sCAAgC;AAEhC,cAAS,eAAgB,EAAE,WAAW;AAEtC,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,sBAA6B;AAClC,QAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,sCAAgC;AAEhC,cAAS,eAAgB,EAAE,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS;AAE/E,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AASA,WAAS,sBAAuB,YAAkB;AAC9C,QAAI,UAA0B,CAAC,GAAG,cAAe,UAAW,IAAI,CAAC,IAAsB;AACvF,YAAQ,QAAQ,KAAK,iBAAkB,QAAQ,OAAO,CAAE;AACxD,YAAQ,SAAS,KAAK,kBAAmB,QAAQ,QAAQ,IAAK;AAC9D,YAAQ,YAAY,KAAK,kBAAmB,QAAQ,WAAW,KAAM;AACrE,YAAQ,WAAW,KAAK,kBAAmB,QAAQ,UAAU,KAAM;AACnE,YAAQ,aAAa,KAAK,kBAAmB,QAAQ,YAAY,KAAM;AACvE,YAAQ,SAAS,KAAK,kBAAmB,QAAQ,QAAQ,KAAM;AAC/D,YAAQ,2BAA2B,KAAK,kBAAmB,QAAQ,0BAA0B,KAAM;AACnG,YAAQ,yBAAyB,KAAK,kBAAmB,QAAQ,wBAAwB,IAAK;AAC9F,YAAQ,uBAAuB,KAAK,kBAAmB,QAAQ,sBAAsB,KAAM;AAC3F,YAAQ,QAAQ,KAAK,iBAAkB,QAAQ,OAAO,eAAgB;AAEtE,cAAU,4BAA6B,OAAQ;AAE/C,WAAO,mCAAoC,OAAQ;AAAA,EACvD;AAEA,WAAS,4BAA6B,SAA2C;AAC7E,YAAQ,QAAQ,KAAK,iBAAkB,QAAQ,OAAO,IAAK;AAC3D,YAAQ,cAAc,KAAK,iBAAkB,QAAQ,aAAa,IAAK;AACvE,YAAQ,UAAU,KAAK,iBAAkB,QAAQ,SAAS,IAAK;AAE/D,WAAO;AAAA,EACX;AAEA,WAAS,mCAAoC,SAA2C;AACpF,YAAQ,SAAS,KAAK,iBAAkB,QAAQ,QAAQ,CAAC,CAAY;AACrE,YAAQ,OAAO,UAAU,KAAK,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC/E,YAAQ,OAAO,UAAU,KAAK,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC/E,YAAQ,OAAO,UAAU,KAAK,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC/E,YAAQ,OAAO,WAAW,KAAK,mBAAoB,QAAQ,OAAO,UAAU,IAAK;AACjF,YAAQ,OAAO,SAAS,KAAK,mBAAoB,QAAQ,OAAO,QAAQ,IAAK;AAC7E,YAAQ,OAAO,UAAU,KAAK,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC/E,YAAQ,OAAO,YAAY,KAAK,mBAAoB,QAAQ,OAAO,WAAW,IAAK;AACnF,YAAQ,OAAO,eAAe,KAAK,mBAAoB,QAAQ,OAAO,cAAc,IAAK;AAEzF,WAAO;AAAA,EACX;AASA,WAAS,uBAAwB,oBAA8B,MAAsB;AACjF,QAAK,GAAG,gBAAiB,eAAgB,GAAI;AACzC,sBAAgB,MAAO,MAAM,CAAC,EAAE,MAAM,KAAM,MAAM,CAAE,CAAE;AAAA,IAC1D;AAAA,EACJ;AASA,WAAS,0BAAoC;AACzC,QAAI,OAAgB;AAEpB,QAAK,eAAe,6BAA8B;AAC9C,YAAM,MAAc,OAAO,SAAS;AACpC,YAAM,eAAoB,uBAAwB,GAAI;AAEtD,UAAK,GAAG,QAAS,aAAa,SAAU,GAAI;AACxC,cAAM,UAAkB,SAAU,aAAa,WAAW,EAAG;AAE7D,YAAK,CAAC,MAAO,OAAQ,KAAK,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AAC9E,kBAAS,eAAgB,EAAE,WAAW;AAAA,QAC1C;AAAA,MACJ;AAEA,UAAK,GAAG,QAAS,aAAa,MAAO,GAAI;AACrC,eAAO,aAAa,WAAW;AAAA,MACnC;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAEA,WAAS,uBAAwB,KAAoB;AACjD,UAAM,eAAuB,CAAC;AAC9B,UAAM,eAAyB,IAAI,MAAO,GAAI;AAE9C,QAAK,aAAa,SAAS,GAAI;AAC3B,YAAM,aAAuB,aAAc,CAAE,EAAE,MAAO,GAAI;AAC1D,YAAM,mBAA2B,WAAW;AAE5C,eAAU,kBAA0B,GAAG,kBAAkB,kBAAkB,mBAAoB;AAC3F,cAAM,YAAsB,WAAY,eAAgB,EAAE,MAAO,GAAI;AAErE,qBAAc,UAAW,CAAE,CAAE,IAAI,UAAW,CAAE;AAAA,MAClD;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AASA,WAAS,oBAAqB,cAAmC;AAC7D,UAAM,SAAuB;AAAA,MACzB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAEA,QAAI;AACA,UAAK,GAAG,cAAe,YAAa,GAAI;AACpC,eAAO,SAAS,KAAK,MAAO,YAAa;AAAA,MAC7C;AAAA,IAEJ,SAAU,IAAK;AACX,UAAI;AACA,eAAO,SAAS,KAAM,MAAM,eAAe,GAAI;AAE/C,YAAK,GAAG,gBAAiB,OAAO,MAAO,GAAI;AACvC,iBAAO,SAAS,OAAO,OAAO;AAAA,QAClC;AAAA,MAEJ,SAAU,IAAK;AACX,YAAK,CAAC,eAAe,UAAW;AAC5B,kBAAQ,MAAO,eAAe,gBAAgB,QAAS,eAAgB,GAAG,OAAQ,EAAE,QAAS,eAAgB,GAAG,OAAQ,CAAE;AAC1H,iBAAO,SAAS;AAAA,QACpB;AAEA,eAAO,SAAS;AAAA,MACpB;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AASA,WAAS,sBAA6B;AAClC,QAAK,QAAQ,OAAO,GAAI;AACpB,oBAAe,KAAM;AAErB,cAAS,eAAgB,EAAE,WAAW;AAAA,IAC1C;AAAA,EACJ;AASA,WAAS,0BAA2B,mBAAkC,MAAc;AAChF,qBAAiB,KAAK,iBAAkB,kBAAkB,CAAC,CAAmB;AAC9E,mBAAe,WAAW,KAAK,kBAAmB,eAAe,UAAU,IAAK;AAChF,mBAAe,kBAAkB,KAAK,wBAAyB,eAAe,iBAAiB,CAAE,GAAI,CAAE;AACvG,mBAAe,kBAAkB,KAAK,kBAAmB,eAAe,iBAAiB,IAAK;AAC9F,mBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,IAAK;AACtG,mBAAe,mBAAmB,KAAK,kBAAmB,eAAe,kBAAkB,IAAK;AAChG,mBAAe,8BAA8B,KAAK,kBAAmB,eAAe,6BAA6B,IAAK;AACtH,mBAAe,yBAAyB,KAAK,kBAAmB,eAAe,wBAAwB,KAAM;AAC7G,mBAAe,cAAc,KAAK,kBAAmB,eAAe,aAAa,IAAK;AACtF,mBAAe,qBAAqB,KAAK,kBAAmB,eAAe,oBAAoB,KAAM;AACrG,mBAAe,eAAe,KAAK,iBAAkB,eAAe,cAAc,GAAI;AACtF,mBAAe,0BAA0B,KAAK,kBAAmB,eAAe,yBAAyB,IAAK;AAC9G,mBAAe,uCAAuC,KAAK,kBAAmB,eAAe,sCAAsC,KAAM;AACzI,mBAAe,kBAAkB,KAAK,kBAAmB,eAAe,iBAAiB,KAAM;AAC/F,mBAAe,mBAAmB,KAAK,kBAAmB,eAAe,kBAAkB,KAAM;AACjG,mBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,KAAM;AACvG,mBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,KAAM;AAEvG,qCAAiC;AACjC,4CAAwC;AAAA,EAC5C;AAEA,WAAS,mCAA0C;AAC/C,mBAAe,iBAAiB,KAAK,oBAAqB,eAAe,gBAAgB,MAAO;AAChG,mBAAe,iBAAiB,KAAK,oBAAqB,eAAe,gBAAgB,MAAO;AAChG,mBAAe,mBAAmB,KAAK,oBAAqB,eAAe,kBAAkB,QAAS;AACtG,mBAAe,yBAAyB,KAAK,oBAAqB,eAAe,wBAAwB,OAAQ;AACjH,mBAAe,qBAAqB,KAAK,oBAAqB,eAAe,oBAAoB,mBAAoB;AACrH,mBAAe,kBAAkB,KAAK,oBAAqB,eAAe,iBAAiB,4CAA6C;AACxI,mBAAe,6BAA6B,KAAK,oBAAqB,eAAe,4BAA4B,2DAA4D;AAC7K,mBAAe,2BAA2B,KAAK,oBAAqB,eAAe,0BAA0B,gEAAiE;AAC9K,mBAAe,8BAA8B,KAAK,oBAAqB,eAAe,6BAA6B,IAAK;AAAA,EAC5H;AAEA,WAAS,0CAAiD;AACtD,mBAAe,yBAAyB,KAAK,mBAAoB,eAAe,wBAAwB,IAAK;AAAA,EACjH;AASA,QAAM,UAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOvB,OAAO,SAAW,QAAgB,MAAmB;AACjD,UAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,0BAAkB,KAAK,iBAAkB,OAAO,eAAgB;AAEhE,YAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,kBAAS,eAAgB,EAAE,WAAW;AAEtC,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,MAAM,SAAW,QAAgB,MAAmB;AAChD,UAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,0BAAkB,KAAK,iBAAkB,OAAO,eAAgB;AAEhE,YAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,cAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,oBAAS,eAAgB,EAAE,WAAW;AAAA,UAC1C;AAEA,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,MAAM,WAAwB;AAC1B,UAAK,QAAQ,OAAO,GAAI;AACpB,sBAAc;AAAA,MAClB;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,QAAQ,WAAsB;AAC1B,aAAO,GAAG,QAAS,eAAgB,KAAK,gBAAgB,MAAM,YAAY;AAAA,IAC9E;AAAA,IAEA,YAAY,WAAsB;AAC9B,aAAO,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS;AAAA,IAC3F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,kBAAkB,WAAwB;AACtC,kBAAY;AAEZ,aAAO;AAAA,IACX;AAAA,IAEA,SAAS,SAAW,SAAsB,SAAsC;AAC5E,UAAK,GAAG,cAAe,OAAQ,KAAK,GAAG,cAAe,OAAQ,GAAI;AAC9D,qBAAc,SAAS,sBAAuB,OAAQ,CAAE;AAExD,gBAAS,eAAgB,EAAE,KAAK,KAAK;AAErC,4BAAoB;AAAA,MACxB;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,SAAW,SAAmC;AACtD,UAAK,GAAG,cAAe,OAAQ,GAAI;AAC/B,YAAI,UAAmB;AAEvB,iBAAU,SAAS,SAAU;AACzB,cAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,qBAAU,SAAS,QAAS,KAAM,EAAE,MAAO;AACvC,kBAAK,QAAS,KAAM,EAAE,KAAK,eAAgB,KAAM,GAAI;AACjD,sBAAM,iBAAiC,QAAS,KAAM,EAAE,KAAM,KAAM;AAEpE,oBAAK,eAAe,aAAa,YAAY,SAAU;AACnD,yCAAwB,eAAe,OAAO,cAAc,eAAe,aAAa,OAAQ;AAEhG,0BAAS,KAAM,EAAE,KAAK,OAAQ,QAAS,KAAM,EAAE,KAAK,QAAS,eAAe,KAAM,GAAG,CAAE;AAEvF,yBAAO,QAAS,KAAM,EAAE,KAAM,eAAe,KAAM;AAEnD,0BAAS,KAAM,EAAE,KAAK,KAAK;AAE3B,4BAAU;AACV;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAEA,YAAK,CAAC,SAAU;AACZ,qBAAW,yBAA0B,SAAS,iBAAkB;AAAA,QACpE,OAAO;AACH,8BAAoB;AAAA,QACxB;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,SAAW,QAAgB,MAAmB;AACtD,0BAAoB;AAEpB,eAAU,aAAa,SAAU;AAC7B,YAAK,QAAQ,eAAgB,SAAU,GAAI;AACvC,cAAK,CAAC,GAAG,cAAe,KAAM,KAAK,UAAU,WAAY;AACrD,qBAAU,SAAS,QAAS,SAAU,EAAE,MAAO;AAC3C,kBAAK,QAAS,SAAU,EAAE,KAAK,eAAgB,KAAM,GAAI;AACrD,sBAAM,iBAAiC,QAAS,SAAU,EAAE,KAAM,KAAM;AAExE,uCAAwB,eAAe,OAAO,cAAc,eAAe,aAAa,OAAQ;AAAA,cACpG;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,UAAK,GAAG,cAAe,KAAM,GAAI;AAC7B,YAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,iBAAO,QAAS,KAAM;AAAA,QAC1B;AAAA,MAEJ,OAAO;AACH,kBAAU,CAAC;AAAA,MACf;AAEA,UAAK,CAAC,GAAG,cAAe,KAAM,KAAK,UAAU,iBAAkB;AAC3D,0BAAmB,OAAQ;AAAA,MAC/B;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,WAAwB;AAChC,iBAAW,yBAA0B,SAAS,MAAM,iBAAkB;AAEtE,aAAO;AAAA,IACX;AAAA,IAEA,kBAAkB,WAAwB;AACtC,cAAS,eAAgB,EAAE,KAAK,QAAQ;AAExC,0BAAoB;AAEpB,aAAO;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,kBAAkB,SAAW,kBAA8C;AACvE,UAAK,GAAG,cAAe,gBAAiB,GAAI;AACxC,YAAI,0BAAmC;AAEvC,iBAAU,gBAAgB,kBAAmB;AACzC,cAAK,iBAAiB,eAAgB,YAAa,KAAK,eAAe,eAAgB,YAAa,KAAK,eAAgB,YAAa,MAAM,iBAAkB,YAAa,GAAI;AAC3K,2BAAgB,YAAa,IAAI,iBAAkB,YAAa;AAChE,sCAA0B;AAAA,UAC9B;AAAA,QACJ;AAEA,YAAK,yBAA0B;AAC3B,oCAA2B,cAAe;AAAA,QAC9C;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,YAAY,WAAoB;AAC5B,aAAO;AAAA,IACX;AAAA,EACJ;AASA,GAAE,MAAM;AACJ,8BAA0B;AAE1B,aAAS,iBAAkB,oBAAoB,MAAM;AACjD,wBAAkB;AAClB,+BAAyB;AACzB,mBAAa;AACb,oBAAc;AACd,kBAAY;AACZ,0BAAoB;AAEpB,UAAK,wBAAwB,GAAI;AAC7B,gBAAQ,KAAK;AAAA,MACjB;AAAA,IACJ,CAAE;AAEF,QAAK,CAAC,GAAG,QAAS,OAAO,QAAS,GAAI;AAClC,aAAO,WAAW;AAAA,IACtB;AAAA,EACJ,GAAK;AACT,GAAK","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 40cc4e4..617a2ad 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -31,6 +31,12 @@ type StringToJson = { object: any; }; +type Groups = Record; + ( () => { // Variables: Configuration @@ -42,7 +48,7 @@ type StringToJson = { // Variables: Groups const _groups_Default: string = "default"; let _groups_Current: string = _groups_Default; - let _groups: object = {}; + let _groups: Groups = {} as Groups; // Variables: Focus Element let _element_Focus_Element_PositionStyle: string = null; @@ -85,10 +91,10 @@ type StringToJson = { */ function setupDefaultGroup( groups: any = null ) : void { - _groups = Data.getDefaultObject( groups, {} ); + _groups = Data.getDefaultObject( groups, {} as Groups ); _groups[ _groups_Default ] = { - json: {}, + json: {} as BindingOptions, keys: [], position: 0 }; @@ -97,7 +103,7 @@ type StringToJson = { function setupNewGroup( group: string ) : void { if ( !_groups.hasOwnProperty( group ) ) { _groups[ group ] = { - json: {}, + json: {} as BindingOptions, keys: [], position: 0 }; @@ -1078,7 +1084,7 @@ type StringToJson = { } } else { - _groups = {}; + _groups = {} as Groups; } if ( !Is.definedString( group ) || group === _groups_Default ) { diff --git a/src/ts/data.ts b/src/ts/data.ts index b9526b7..8f0bf26 100644 --- a/src/ts/data.ts +++ b/src/ts/data.ts @@ -23,7 +23,7 @@ export namespace Data { return Is.definedFunction( value ) ? value : defaultValue; } - export function getDefaultObject( value: any, defaultValue: object ) : object { + export function getDefaultObject( value: any, defaultValue: object ) : any { return Is.definedObject( value ) ? value : defaultValue; } From b8730baad980ecb0b6a7644f9145c51e0883d87c Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 15:45:34 +0100 Subject: [PATCH 29/44] Strict clean ups. --- dist/journey.esm.js | 8 ++++---- dist/journey.esm.js.map | 2 +- dist/journey.js | 8 ++++---- dist/journey.js.map | 2 +- src/journey.ts | 10 +++++----- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index 6b218e4..77f7bec 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -267,7 +267,7 @@ var require_journey = __commonJS({ const _groups_Default = "default"; let _groups_Current = _groups_Default; let _groups = {}; - let _element_Focus_Element_PositionStyle = null; + let _element_Focus_Element_PositionStyle = ""; let _element_Disabled_Background = null; let _element_Dialog = null; let _element_Dialog_Close_Button = null; @@ -885,7 +885,7 @@ var require_journey = __commonJS({ _configuration.onDoNotShowAgainChange = Data.getDefaultFunction(_configuration.onDoNotShowAgainChange, null); } const _public = { - start: function(e = null) { + start: function(e = "") { if (!_public.isOpen()) { _groups_Current = Data.getDefaultString(e, _groups_Default); if (_groups.hasOwnProperty(_groups_Current)) { @@ -895,7 +895,7 @@ var require_journey = __commonJS({ } return _public; }, - show: function(e = null) { + show: function(e = "") { if (!_public.isOpen()) { _groups_Current = Data.getDefaultString(e, _groups_Current); if (_groups.hasOwnProperty(_groups_Current)) { @@ -959,7 +959,7 @@ var require_journey = __commonJS({ } return _public; }, - clearSteps: function(e = null) { + clearSteps: function(e = "") { resetDialogPosition(); for (let t in _groups) { if (_groups.hasOwnProperty(t)) { diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 9933d8b..0b1a8a4 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index 9973831..a0d258e 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -223,7 +223,7 @@ var DomElement; const _groups_Default = "default"; let _groups_Current = _groups_Default; let _groups = {}; - let _element_Focus_Element_PositionStyle = null; + let _element_Focus_Element_PositionStyle = ""; let _element_Disabled_Background = null; let _element_Dialog = null; let _element_Dialog_Close_Button = null; @@ -841,7 +841,7 @@ var DomElement; _configuration.onDoNotShowAgainChange = Data.getDefaultFunction(_configuration.onDoNotShowAgainChange, null); } const _public = { - start: function(e = null) { + start: function(e = "") { if (!_public.isOpen()) { _groups_Current = Data.getDefaultString(e, _groups_Default); if (_groups.hasOwnProperty(_groups_Current)) { @@ -851,7 +851,7 @@ var DomElement; } return _public; }, - show: function(e = null) { + show: function(e = "") { if (!_public.isOpen()) { _groups_Current = Data.getDefaultString(e, _groups_Current); if (_groups.hasOwnProperty(_groups_Current)) { @@ -915,7 +915,7 @@ var DomElement; } return _public; }, - clearSteps: function(e = null) { + clearSteps: function(e = "") { resetDialogPosition(); for (let t in _groups) { if (_groups.hasOwnProperty(t)) { diff --git a/dist/journey.js.map b/dist/journey.js.map index ca25172..92a25ff 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = null;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = null ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = null ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 617a2ad..c080982 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -51,7 +51,7 @@ type Groups = Record Date: Thu, 4 Jul 2024 15:59:15 +0100 Subject: [PATCH 30/44] Strict clean ups. --- dist/journey.esm.js | 191 +++++++++++++++++++++------------------- dist/journey.esm.js.map | 2 +- dist/journey.js | 191 +++++++++++++++++++++------------------- dist/journey.js.map | 2 +- src/journey.ts | 126 +++++++++++++------------- src/ts/data.ts | 4 +- 6 files changed, 269 insertions(+), 247 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index 77f7bec..097e90d 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -268,27 +268,27 @@ var require_journey = __commonJS({ let _groups_Current = _groups_Default; let _groups = {}; let _element_Focus_Element_PositionStyle = ""; - let _element_Disabled_Background = null; - let _element_Dialog = null; - let _element_Dialog_Close_Button = null; - let _element_Dialog_Title = null; - let _element_Dialog_Description = null; - let _element_Dialog_CheckBox_Container = null; - let _element_Dialog_CheckBox_Input = null; - let _element_Dialog_ProgressDots = null; - let _element_Dialog_ProgressBar = null; - let _element_Dialog_ProgressBar_Percentage = null; - let _element_Dialog_ProgressBar_Percentage_Text = null; - let _element_Dialog_Buttons = null; - let _element_Dialog_Buttons_Back_Button = null; - let _element_Dialog_Buttons_Next_Button = null; + let _element_Disabled_Background; + let _element_Dialog; + let _element_Dialog_Close_Button; + let _element_Dialog_Title; + let _element_Dialog_Description; + let _element_Dialog_CheckBox_Container; + let _element_Dialog_CheckBox_Input; + let _element_Dialog_ProgressDots; + let _element_Dialog_ProgressBar; + let _element_Dialog_ProgressBar_Percentage; + let _element_Dialog_ProgressBar_Percentage_Text; + let _element_Dialog_Buttons; + let _element_Dialog_Buttons_Back_Button; + let _element_Dialog_Buttons_Next_Button; let _element_Dialog_IsHint = false; let _element_Dialog_Move_Original_X = 0; let _element_Dialog_Move_Original_Y = 0; let _element_Dialog_Move_IsMoving = false; let _element_Dialog_Move_X = 0; let _element_Dialog_Move_Y = 0; - let _element_ToolTip = null; + let _element_ToolTip; let _element_ToolTip_Timer = 0; function setupDefaultGroup(e = null) { _groups = Data.getDefaultObject(e, {}); @@ -365,16 +365,17 @@ var require_journey = __commonJS({ makeDialogMovable(); } function onDialogClose(e = true) { - let t = false; + var t; + let o = false; if (Is.definedString(_configuration.closeDialogConfirmationText) && e) { - t = confirm(_configuration.closeDialogConfirmationText); + o = confirm(_configuration.closeDialogConfirmationText); } else { - t = true; + o = true; } - if (t) { + if (o) { const e = getGroupBindingOptions(); if (Is.defined(e) && Is.defined(e._currentView.element)) { - fireCustomTriggerEvent(e.events.onClose, e._currentView.element); + fireCustomTriggerEvent((t = e.events) == null ? void 0 : t.onClose, e._currentView.element); } removeFocusClassFromLastElement(false); hideDisabledBackground(); @@ -390,10 +391,11 @@ var require_journey = __commonJS({ } } function onDialogNext() { + var e; if (_groups[_groups_Current].position === _groups[_groups_Current].keys.length - 1) { - const e = getGroupBindingOptions(); + const t = getGroupBindingOptions(); onDialogClose(false); - fireCustomTriggerEvent(e.events.onFinish, e._currentView.element); + fireCustomTriggerEvent((e = t.events) == null ? void 0 : e.onFinish, t._currentView.element); } else { removeFocusClassFromLastElement(); _groups[_groups_Current].position++; @@ -401,9 +403,10 @@ var require_journey = __commonJS({ } } function showDialogAndSetPosition() { - const e = getGroupBindingOptions(); - if (Is.defined(e) && Is.defined(e._currentView.element)) { - if (e.showDisabledBackground) { + var e; + const t = getGroupBindingOptions(); + if (Is.defined(t) && Is.defined(t._currentView.element)) { + if (t.showDisabledBackground) { showDisabledBackground(); } else { hideDisabledBackground(); @@ -411,14 +414,14 @@ var require_journey = __commonJS({ hideToolTip(); _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? "block" : "none"; _configuration_ShortcutKeysEnabled = true; - e._currentView.element.className += " " + "journey-js-element-focus"; + t._currentView.element.className += " " + "journey-js-element-focus"; if (_configuration.scrollToElements) { - e._currentView.element.scrollIntoView(); + t._currentView.element.scrollIntoView(); } - const t = DomElement.getStyleValueByName(e._currentView.element, "position"); - if (t !== "" && t.toLowerCase() === "static") { - _element_Focus_Element_PositionStyle = t; - e._currentView.element.style.position = "relative"; + const o = DomElement.getStyleValueByName(t._currentView.element, "position"); + if (o !== "" && o.toLowerCase() === "static") { + _element_Focus_Element_PositionStyle = o; + t._currentView.element.style.position = "relative"; } DomElement.showElementBasedOnCondition(_element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain); DomElement.showElementBasedOnCondition(_element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[_groups_Current].keys.length > 1); @@ -432,13 +435,13 @@ var require_journey = __commonJS({ } else { _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText; } - setDialogText(e); - setDialogPosition(null, e); + setDialogText(t); + setDialogPosition(null, t); buildProcessDots(); setProgressBarPosition(); - fireCustomTriggerEvent(e.events.onEnter, e._currentView.element); - if (e.sendClick) { - e._currentView.element.click(); + fireCustomTriggerEvent((e = t.events) == null ? void 0 : e.onEnter, t._currentView.element); + if (t.sendClick) { + t._currentView.element.click(); } } } @@ -455,12 +458,13 @@ var require_journey = __commonJS({ } } function setDialogPosition(e, t) { + var o, n; if (_element_Dialog.style.display !== "block") { _element_Dialog.style.display = "block"; - fireCustomTriggerEvent(t.events.onOpen, t._currentView.element); + fireCustomTriggerEvent((o = t.events) == null ? void 0 : o.onOpen, t._currentView.element); } if (_groups[_groups_Current].position === 0) { - fireCustomTriggerEvent(t.events.onStart, t._currentView.element); + fireCustomTriggerEvent((n = t.events) == null ? void 0 : n.onStart, t._currentView.element); } _element_Dialog_IsHint = t.isHint === true; if (t.attach || t.isHint) { @@ -489,14 +493,15 @@ var require_journey = __commonJS({ } } function removeFocusClassFromLastElement(e = true) { - const t = getGroupBindingOptions(); - if (Is.defined(t) && Is.defined(t._currentView.element)) { - t._currentView.element.className = t._currentView.element.className.replace(" " + "journey-js-element-focus", ""); + var t; + const o = getGroupBindingOptions(); + if (Is.defined(o) && Is.defined(o._currentView.element)) { + o._currentView.element.className = o._currentView.element.className.replace(" " + "journey-js-element-focus", ""); if (Is.defined(_element_Focus_Element_PositionStyle)) { - t._currentView.element.style.position = _element_Focus_Element_PositionStyle; + o._currentView.element.style.position = _element_Focus_Element_PositionStyle; } if (e) { - fireCustomTriggerEvent(t.events.onLeave, t._currentView.element); + fireCustomTriggerEvent((t = o.events) == null ? void 0 : t.onLeave, o._currentView.element); } } } @@ -511,7 +516,7 @@ var require_journey = __commonJS({ } function buildProgressDot(e, t) { const o = _groups[_groups_Current].json[t]; - let n = null; + let n; if (e === _groups[_groups_Current].position) { n = DomElement.create("div", "dot-active"); } else { @@ -641,29 +646,31 @@ var require_journey = __commonJS({ _groups[_groups_Current].keys.sort(); } function getElement(e) { - let t = true; + var t, o; + let n = true; if (Is.defined(e) && e.hasAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME)) { - const o = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); - if (Is.definedString(o)) { - const n = getObjectFromString(o); - if (n.parsed && Is.definedObject(n.object)) { - setupElement(e, buildAttributeOptions(n.object)); + const i = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); + if (Is.definedString(i)) { + const o = getObjectFromString(i); + if (o.parsed && Is.definedObject(o.object)) { + setupElement(e, buildAttributeOptions(o.object)); } else { if (!_configuration.safeMode) { - console.error(_configuration.attributeNotValidErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); - t = false; + console.error((t = _configuration.attributeNotValidErrorText) == null ? void 0 : t.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); + n = false; } } } else { if (!_configuration.safeMode) { - console.error(_configuration.attributeNotSetErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); - t = false; + console.error((o = _configuration.attributeNotSetErrorText) == null ? void 0 : o.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); + n = false; } } } - return t; + return n; } function setupElement(e, t) { + var o; t._currentView = {}; t._currentView.element = e; if (Is.definedNumber(t.order) && (Is.definedString(t.title) || Is.definedString(t.description))) { @@ -672,7 +679,7 @@ var require_journey = __commonJS({ setupNewGroup(t.group); _groups[t.group].json[t.order] = t; _groups[t.group].keys.push(t.order); - fireCustomTriggerEvent(t.events.onAddStep, e); + fireCustomTriggerEvent((o = t.events) == null ? void 0 : o.onAddStep, e); } else { renderHint(t); } @@ -766,21 +773,22 @@ var require_journey = __commonJS({ return buildAttributeOptionCustomTriggers(t); } function buildAttributeOptionStrings(e) { - e.title = Data.getDefaultString(e.title, null); - e.description = Data.getDefaultString(e.description, null); - e.tooltip = Data.getDefaultString(e.tooltip, null); + e.title = Data.getDefaultString(e.title, ""); + e.description = Data.getDefaultString(e.description, ""); + e.tooltip = Data.getDefaultString(e.tooltip, ""); return e; } function buildAttributeOptionCustomTriggers(e) { + var t, o, n, i, r, l, s, a; e.events = Data.getDefaultObject(e.events, {}); - e.events.onEnter = Data.getDefaultFunction(e.events.onEnter, null); - e.events.onLeave = Data.getDefaultFunction(e.events.onLeave, null); - e.events.onClose = Data.getDefaultFunction(e.events.onClose, null); - e.events.onFinish = Data.getDefaultFunction(e.events.onFinish, null); - e.events.onOpen = Data.getDefaultFunction(e.events.onOpen, null); - e.events.onStart = Data.getDefaultFunction(e.events.onStart, null); - e.events.onAddStep = Data.getDefaultFunction(e.events.onAddStep, null); - e.events.onRemoveStep = Data.getDefaultFunction(e.events.onRemoveStep, null); + e.events.onEnter = Data.getDefaultFunction((t = e.events) == null ? void 0 : t.onEnter, null); + e.events.onLeave = Data.getDefaultFunction((o = e.events) == null ? void 0 : o.onLeave, null); + e.events.onClose = Data.getDefaultFunction((n = e.events) == null ? void 0 : n.onClose, null); + e.events.onFinish = Data.getDefaultFunction((i = e.events) == null ? void 0 : i.onFinish, null); + e.events.onOpen = Data.getDefaultFunction((r = e.events) == null ? void 0 : r.onOpen, null); + e.events.onStart = Data.getDefaultFunction((l = e.events) == null ? void 0 : l.onStart, null); + e.events.onAddStep = Data.getDefaultFunction((s = e.events) == null ? void 0 : s.onAddStep, null); + e.events.onRemoveStep = Data.getDefaultFunction((a = e.events) == null ? void 0 : a.onRemoveStep, null); return e; } function fireCustomTriggerEvent(e, ...t) { @@ -819,6 +827,7 @@ var require_journey = __commonJS({ return t; } function getObjectFromString(objectString) { + var _a; const result = { parsed: true, object: null @@ -835,7 +844,7 @@ var require_journey = __commonJS({ } } catch (e) { if (!_configuration.safeMode) { - console.error(_configuration.objectErrorText.replace("{{error_1}}", e1.message).replace("{{error_2}}", e.message)); + console.error((_a = _configuration.objectErrorText) == null ? void 0 : _a.replace("{{error_1}}", e1.message).replace("{{error_2}}", e.message)); result.parsed = false; } result.object = null; @@ -849,7 +858,7 @@ var require_journey = __commonJS({ _groups[_groups_Current].position = 0; } } - function buildDefaultConfiguration(e = null) { + function buildDefaultConfiguration(e = {}) { _configuration = Data.getDefaultObject(e, {}); _configuration.safeMode = Data.getDefaultBoolean(_configuration.safeMode, true); _configuration.domElementTypes = Data.getDefaultStringOrArray(_configuration.domElementTypes, [ "*" ]); @@ -879,7 +888,7 @@ var require_journey = __commonJS({ _configuration.objectErrorText = Data.getDefaultAnyString(_configuration.objectErrorText, "Errors in object: {{error_1}}, {{error_2}}"); _configuration.attributeNotValidErrorText = Data.getDefaultAnyString(_configuration.attributeNotValidErrorText, "The attribute '{{attribute_name}}' is not a valid object."); _configuration.attributeNotSetErrorText = Data.getDefaultAnyString(_configuration.attributeNotSetErrorText, "The attribute '{{attribute_name}}' has not been set correctly."); - _configuration.closeDialogConfirmationText = Data.getDefaultAnyString(_configuration.closeDialogConfirmationText, null); + _configuration.closeDialogConfirmationText = Data.getDefaultAnyString(_configuration.closeDialogConfirmationText, ""); } function buildDefaultConfigurationCustomTriggers() { _configuration.onDoNotShowAgainChange = Data.getDefaultFunction(_configuration.onDoNotShowAgainChange, null); @@ -932,26 +941,27 @@ var require_journey = __commonJS({ return _public; }, removeStep: function(e) { + var t; if (Is.definedObject(e)) { - let t = false; - for (let o in _groups) { - if (_groups.hasOwnProperty(o)) { - for (let n in _groups[o].json) { - if (_groups[o].json.hasOwnProperty(n)) { - const i = _groups[o].json[n]; - if (i._currentView.element === e) { - fireCustomTriggerEvent(i.events.onRemoveStep, i._currentView.element); - _groups[o].keys.splice(_groups[o].keys.indexOf(i.order), 1); - delete _groups[o].json[i.order]; - _groups[o].keys.sort(); - t = true; + let o = false; + for (let n in _groups) { + if (_groups.hasOwnProperty(n)) { + for (let i in _groups[n].json) { + if (_groups[n].json.hasOwnProperty(i)) { + const r = _groups[n].json[i]; + if (r._currentView.element === e) { + fireCustomTriggerEvent((t = r.events) == null ? void 0 : t.onRemoveStep, r._currentView.element); + _groups[n].keys.splice(_groups[n].keys.indexOf(r.order), 1); + delete _groups[n].json[r.order]; + _groups[n].keys.sort(); + o = true; break; } } } } } - if (!t) { + if (!o) { DomElement.clearElementsByClassName(e, "journey-js-hint"); } else { resetDialogPosition(); @@ -960,14 +970,15 @@ var require_journey = __commonJS({ return _public; }, clearSteps: function(e = "") { + var t; resetDialogPosition(); - for (let t in _groups) { - if (_groups.hasOwnProperty(t)) { - if (!Is.definedString(e) || e === t) { - for (let e in _groups[t].json) { - if (_groups[t].json.hasOwnProperty(e)) { - const o = _groups[t].json[e]; - fireCustomTriggerEvent(o.events.onRemoveStep, o._currentView.element); + for (let o in _groups) { + if (_groups.hasOwnProperty(o)) { + if (!Is.definedString(e) || e === o) { + for (let e in _groups[o].json) { + if (_groups[o].json.hasOwnProperty(e)) { + const n = _groups[o].json[e]; + fireCustomTriggerEvent((t = n.events) == null ? void 0 : t.onRemoveStep, n._currentView.element); } } } diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 0b1a8a4..93053b2 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText as string );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText as string );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events?.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events?.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText as string;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText as string;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText as string;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events?.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title as string;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description as string;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events?.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events?.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events?.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip as string );\n } else {\n addToolTip( dot, bindingOptions.title as string );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) as string;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText?.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText?.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group as string );\n\n _groups[ bindingOptions.group as string ].json[ bindingOptions.order as number ] = bindingOptions;\n _groups[ bindingOptions.group as string ].keys.push( bindingOptions.order as number );\n\n fireCustomTriggerEvent( bindingOptions.events?.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events?.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events?.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events?.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events?.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events?.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events?.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events?.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events?.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText?.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events?.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events?.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index a0d258e..2215f40 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -224,27 +224,27 @@ var DomElement; let _groups_Current = _groups_Default; let _groups = {}; let _element_Focus_Element_PositionStyle = ""; - let _element_Disabled_Background = null; - let _element_Dialog = null; - let _element_Dialog_Close_Button = null; - let _element_Dialog_Title = null; - let _element_Dialog_Description = null; - let _element_Dialog_CheckBox_Container = null; - let _element_Dialog_CheckBox_Input = null; - let _element_Dialog_ProgressDots = null; - let _element_Dialog_ProgressBar = null; - let _element_Dialog_ProgressBar_Percentage = null; - let _element_Dialog_ProgressBar_Percentage_Text = null; - let _element_Dialog_Buttons = null; - let _element_Dialog_Buttons_Back_Button = null; - let _element_Dialog_Buttons_Next_Button = null; + let _element_Disabled_Background; + let _element_Dialog; + let _element_Dialog_Close_Button; + let _element_Dialog_Title; + let _element_Dialog_Description; + let _element_Dialog_CheckBox_Container; + let _element_Dialog_CheckBox_Input; + let _element_Dialog_ProgressDots; + let _element_Dialog_ProgressBar; + let _element_Dialog_ProgressBar_Percentage; + let _element_Dialog_ProgressBar_Percentage_Text; + let _element_Dialog_Buttons; + let _element_Dialog_Buttons_Back_Button; + let _element_Dialog_Buttons_Next_Button; let _element_Dialog_IsHint = false; let _element_Dialog_Move_Original_X = 0; let _element_Dialog_Move_Original_Y = 0; let _element_Dialog_Move_IsMoving = false; let _element_Dialog_Move_X = 0; let _element_Dialog_Move_Y = 0; - let _element_ToolTip = null; + let _element_ToolTip; let _element_ToolTip_Timer = 0; function setupDefaultGroup(e = null) { _groups = Data.getDefaultObject(e, {}); @@ -321,16 +321,17 @@ var DomElement; makeDialogMovable(); } function onDialogClose(e = true) { - let t = false; + var t; + let o = false; if (Is.definedString(_configuration.closeDialogConfirmationText) && e) { - t = confirm(_configuration.closeDialogConfirmationText); + o = confirm(_configuration.closeDialogConfirmationText); } else { - t = true; + o = true; } - if (t) { + if (o) { const e = getGroupBindingOptions(); if (Is.defined(e) && Is.defined(e._currentView.element)) { - fireCustomTriggerEvent(e.events.onClose, e._currentView.element); + fireCustomTriggerEvent((t = e.events) == null ? void 0 : t.onClose, e._currentView.element); } removeFocusClassFromLastElement(false); hideDisabledBackground(); @@ -346,10 +347,11 @@ var DomElement; } } function onDialogNext() { + var e; if (_groups[_groups_Current].position === _groups[_groups_Current].keys.length - 1) { - const e = getGroupBindingOptions(); + const t = getGroupBindingOptions(); onDialogClose(false); - fireCustomTriggerEvent(e.events.onFinish, e._currentView.element); + fireCustomTriggerEvent((e = t.events) == null ? void 0 : e.onFinish, t._currentView.element); } else { removeFocusClassFromLastElement(); _groups[_groups_Current].position++; @@ -357,9 +359,10 @@ var DomElement; } } function showDialogAndSetPosition() { - const e = getGroupBindingOptions(); - if (Is.defined(e) && Is.defined(e._currentView.element)) { - if (e.showDisabledBackground) { + var e; + const t = getGroupBindingOptions(); + if (Is.defined(t) && Is.defined(t._currentView.element)) { + if (t.showDisabledBackground) { showDisabledBackground(); } else { hideDisabledBackground(); @@ -367,14 +370,14 @@ var DomElement; hideToolTip(); _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? "block" : "none"; _configuration_ShortcutKeysEnabled = true; - e._currentView.element.className += " " + "journey-js-element-focus"; + t._currentView.element.className += " " + "journey-js-element-focus"; if (_configuration.scrollToElements) { - e._currentView.element.scrollIntoView(); + t._currentView.element.scrollIntoView(); } - const t = DomElement.getStyleValueByName(e._currentView.element, "position"); - if (t !== "" && t.toLowerCase() === "static") { - _element_Focus_Element_PositionStyle = t; - e._currentView.element.style.position = "relative"; + const o = DomElement.getStyleValueByName(t._currentView.element, "position"); + if (o !== "" && o.toLowerCase() === "static") { + _element_Focus_Element_PositionStyle = o; + t._currentView.element.style.position = "relative"; } DomElement.showElementBasedOnCondition(_element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain); DomElement.showElementBasedOnCondition(_element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[_groups_Current].keys.length > 1); @@ -388,13 +391,13 @@ var DomElement; } else { _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText; } - setDialogText(e); - setDialogPosition(null, e); + setDialogText(t); + setDialogPosition(null, t); buildProcessDots(); setProgressBarPosition(); - fireCustomTriggerEvent(e.events.onEnter, e._currentView.element); - if (e.sendClick) { - e._currentView.element.click(); + fireCustomTriggerEvent((e = t.events) == null ? void 0 : e.onEnter, t._currentView.element); + if (t.sendClick) { + t._currentView.element.click(); } } } @@ -411,12 +414,13 @@ var DomElement; } } function setDialogPosition(e, t) { + var o, n; if (_element_Dialog.style.display !== "block") { _element_Dialog.style.display = "block"; - fireCustomTriggerEvent(t.events.onOpen, t._currentView.element); + fireCustomTriggerEvent((o = t.events) == null ? void 0 : o.onOpen, t._currentView.element); } if (_groups[_groups_Current].position === 0) { - fireCustomTriggerEvent(t.events.onStart, t._currentView.element); + fireCustomTriggerEvent((n = t.events) == null ? void 0 : n.onStart, t._currentView.element); } _element_Dialog_IsHint = t.isHint === true; if (t.attach || t.isHint) { @@ -445,14 +449,15 @@ var DomElement; } } function removeFocusClassFromLastElement(e = true) { - const t = getGroupBindingOptions(); - if (Is.defined(t) && Is.defined(t._currentView.element)) { - t._currentView.element.className = t._currentView.element.className.replace(" " + "journey-js-element-focus", ""); + var t; + const o = getGroupBindingOptions(); + if (Is.defined(o) && Is.defined(o._currentView.element)) { + o._currentView.element.className = o._currentView.element.className.replace(" " + "journey-js-element-focus", ""); if (Is.defined(_element_Focus_Element_PositionStyle)) { - t._currentView.element.style.position = _element_Focus_Element_PositionStyle; + o._currentView.element.style.position = _element_Focus_Element_PositionStyle; } if (e) { - fireCustomTriggerEvent(t.events.onLeave, t._currentView.element); + fireCustomTriggerEvent((t = o.events) == null ? void 0 : t.onLeave, o._currentView.element); } } } @@ -467,7 +472,7 @@ var DomElement; } function buildProgressDot(e, t) { const o = _groups[_groups_Current].json[t]; - let n = null; + let n; if (e === _groups[_groups_Current].position) { n = DomElement.create("div", "dot-active"); } else { @@ -597,29 +602,31 @@ var DomElement; _groups[_groups_Current].keys.sort(); } function getElement(e) { - let t = true; + var t, o; + let n = true; if (Is.defined(e) && e.hasAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME)) { - const o = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); - if (Is.definedString(o)) { - const n = getObjectFromString(o); - if (n.parsed && Is.definedObject(n.object)) { - setupElement(e, buildAttributeOptions(n.object)); + const i = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); + if (Is.definedString(i)) { + const o = getObjectFromString(i); + if (o.parsed && Is.definedObject(o.object)) { + setupElement(e, buildAttributeOptions(o.object)); } else { if (!_configuration.safeMode) { - console.error(_configuration.attributeNotValidErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); - t = false; + console.error((t = _configuration.attributeNotValidErrorText) == null ? void 0 : t.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); + n = false; } } } else { if (!_configuration.safeMode) { - console.error(_configuration.attributeNotSetErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); - t = false; + console.error((o = _configuration.attributeNotSetErrorText) == null ? void 0 : o.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); + n = false; } } } - return t; + return n; } function setupElement(e, t) { + var o; t._currentView = {}; t._currentView.element = e; if (Is.definedNumber(t.order) && (Is.definedString(t.title) || Is.definedString(t.description))) { @@ -628,7 +635,7 @@ var DomElement; setupNewGroup(t.group); _groups[t.group].json[t.order] = t; _groups[t.group].keys.push(t.order); - fireCustomTriggerEvent(t.events.onAddStep, e); + fireCustomTriggerEvent((o = t.events) == null ? void 0 : o.onAddStep, e); } else { renderHint(t); } @@ -722,21 +729,22 @@ var DomElement; return buildAttributeOptionCustomTriggers(t); } function buildAttributeOptionStrings(e) { - e.title = Data.getDefaultString(e.title, null); - e.description = Data.getDefaultString(e.description, null); - e.tooltip = Data.getDefaultString(e.tooltip, null); + e.title = Data.getDefaultString(e.title, ""); + e.description = Data.getDefaultString(e.description, ""); + e.tooltip = Data.getDefaultString(e.tooltip, ""); return e; } function buildAttributeOptionCustomTriggers(e) { + var t, o, n, i, l, r, s, a; e.events = Data.getDefaultObject(e.events, {}); - e.events.onEnter = Data.getDefaultFunction(e.events.onEnter, null); - e.events.onLeave = Data.getDefaultFunction(e.events.onLeave, null); - e.events.onClose = Data.getDefaultFunction(e.events.onClose, null); - e.events.onFinish = Data.getDefaultFunction(e.events.onFinish, null); - e.events.onOpen = Data.getDefaultFunction(e.events.onOpen, null); - e.events.onStart = Data.getDefaultFunction(e.events.onStart, null); - e.events.onAddStep = Data.getDefaultFunction(e.events.onAddStep, null); - e.events.onRemoveStep = Data.getDefaultFunction(e.events.onRemoveStep, null); + e.events.onEnter = Data.getDefaultFunction((t = e.events) == null ? void 0 : t.onEnter, null); + e.events.onLeave = Data.getDefaultFunction((o = e.events) == null ? void 0 : o.onLeave, null); + e.events.onClose = Data.getDefaultFunction((n = e.events) == null ? void 0 : n.onClose, null); + e.events.onFinish = Data.getDefaultFunction((i = e.events) == null ? void 0 : i.onFinish, null); + e.events.onOpen = Data.getDefaultFunction((l = e.events) == null ? void 0 : l.onOpen, null); + e.events.onStart = Data.getDefaultFunction((r = e.events) == null ? void 0 : r.onStart, null); + e.events.onAddStep = Data.getDefaultFunction((s = e.events) == null ? void 0 : s.onAddStep, null); + e.events.onRemoveStep = Data.getDefaultFunction((a = e.events) == null ? void 0 : a.onRemoveStep, null); return e; } function fireCustomTriggerEvent(e, ...t) { @@ -775,6 +783,7 @@ var DomElement; return t; } function getObjectFromString(objectString) { + var _a; const result = { parsed: true, object: null @@ -791,7 +800,7 @@ var DomElement; } } catch (e) { if (!_configuration.safeMode) { - console.error(_configuration.objectErrorText.replace("{{error_1}}", e1.message).replace("{{error_2}}", e.message)); + console.error((_a = _configuration.objectErrorText) == null ? void 0 : _a.replace("{{error_1}}", e1.message).replace("{{error_2}}", e.message)); result.parsed = false; } result.object = null; @@ -805,7 +814,7 @@ var DomElement; _groups[_groups_Current].position = 0; } } - function buildDefaultConfiguration(e = null) { + function buildDefaultConfiguration(e = {}) { _configuration = Data.getDefaultObject(e, {}); _configuration.safeMode = Data.getDefaultBoolean(_configuration.safeMode, true); _configuration.domElementTypes = Data.getDefaultStringOrArray(_configuration.domElementTypes, [ "*" ]); @@ -835,7 +844,7 @@ var DomElement; _configuration.objectErrorText = Data.getDefaultAnyString(_configuration.objectErrorText, "Errors in object: {{error_1}}, {{error_2}}"); _configuration.attributeNotValidErrorText = Data.getDefaultAnyString(_configuration.attributeNotValidErrorText, "The attribute '{{attribute_name}}' is not a valid object."); _configuration.attributeNotSetErrorText = Data.getDefaultAnyString(_configuration.attributeNotSetErrorText, "The attribute '{{attribute_name}}' has not been set correctly."); - _configuration.closeDialogConfirmationText = Data.getDefaultAnyString(_configuration.closeDialogConfirmationText, null); + _configuration.closeDialogConfirmationText = Data.getDefaultAnyString(_configuration.closeDialogConfirmationText, ""); } function buildDefaultConfigurationCustomTriggers() { _configuration.onDoNotShowAgainChange = Data.getDefaultFunction(_configuration.onDoNotShowAgainChange, null); @@ -888,26 +897,27 @@ var DomElement; return _public; }, removeStep: function(e) { + var t; if (Is.definedObject(e)) { - let t = false; - for (let o in _groups) { - if (_groups.hasOwnProperty(o)) { - for (let n in _groups[o].json) { - if (_groups[o].json.hasOwnProperty(n)) { - const i = _groups[o].json[n]; - if (i._currentView.element === e) { - fireCustomTriggerEvent(i.events.onRemoveStep, i._currentView.element); - _groups[o].keys.splice(_groups[o].keys.indexOf(i.order), 1); - delete _groups[o].json[i.order]; - _groups[o].keys.sort(); - t = true; + let o = false; + for (let n in _groups) { + if (_groups.hasOwnProperty(n)) { + for (let i in _groups[n].json) { + if (_groups[n].json.hasOwnProperty(i)) { + const l = _groups[n].json[i]; + if (l._currentView.element === e) { + fireCustomTriggerEvent((t = l.events) == null ? void 0 : t.onRemoveStep, l._currentView.element); + _groups[n].keys.splice(_groups[n].keys.indexOf(l.order), 1); + delete _groups[n].json[l.order]; + _groups[n].keys.sort(); + o = true; break; } } } } } - if (!t) { + if (!o) { DomElement.clearElementsByClassName(e, "journey-js-hint"); } else { resetDialogPosition(); @@ -916,14 +926,15 @@ var DomElement; return _public; }, clearSteps: function(e = "") { + var t; resetDialogPosition(); - for (let t in _groups) { - if (_groups.hasOwnProperty(t)) { - if (!Is.definedString(e) || e === t) { - for (let e in _groups[t].json) { - if (_groups[t].json.hasOwnProperty(e)) { - const o = _groups[t].json[e]; - fireCustomTriggerEvent(o.events.onRemoveStep, o._currentView.element); + for (let o in _groups) { + if (_groups.hasOwnProperty(o)) { + if (!Is.definedString(e) || e === o) { + for (let e in _groups[o].json) { + if (_groups[o].json.hasOwnProperty(e)) { + const n = _groups[o].json[e]; + fireCustomTriggerEvent((t = n.events) == null ? void 0 : t.onRemoveStep, n._currentView.element); } } } diff --git a/dist/journey.js.map b/dist/journey.js.map index 92a25ff..1fc7f92 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: object ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: object ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement = null;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement = null;\n let _element_Dialog_Close_Button: HTMLElement = null;\n let _element_Dialog_Title: HTMLElement = null;\n let _element_Dialog_Description: HTMLElement = null;\n let _element_Dialog_CheckBox_Container: HTMLElement = null;\n let _element_Dialog_CheckBox_Input: HTMLInputElement = null;\n let _element_Dialog_ProgressDots: HTMLElement = null;\n let _element_Dialog_ProgressBar: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement = null;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement = null;\n let _element_Dialog_Buttons: HTMLElement = null;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement = null;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement = null;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement = null;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement = null;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip );\n } else {\n addToolTip( dot, bindingOptions.title );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group );\n\n _groups[ bindingOptions.group ].json[ bindingOptions.order ] = bindingOptions;\n _groups[ bindingOptions.group ].keys.push( bindingOptions.order );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, null );\n options.description = Data.getDefaultString( options.description, null );\n options.tooltip = Data.getDefaultString( options.tooltip, null );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: Function, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: object = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1 ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2 ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = null ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, null );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText as string );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText as string );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events?.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events?.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText as string;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText as string;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText as string;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events?.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title as string;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description as string;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events?.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events?.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events?.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip as string );\n } else {\n addToolTip( dot, bindingOptions.title as string );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) as string;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText?.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText?.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group as string );\n\n _groups[ bindingOptions.group as string ].json[ bindingOptions.order as number ] = bindingOptions;\n _groups[ bindingOptions.group as string ].keys.push( bindingOptions.order as number );\n\n fireCustomTriggerEvent( bindingOptions.events?.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events?.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events?.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events?.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events?.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events?.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events?.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events?.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events?.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText?.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events?.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events?.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index c080982..2980ffc 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -54,22 +54,22 @@ type Groups = Record { if ( _configuration.showDoNotShowAgain ) { @@ -216,7 +216,7 @@ type Groups = Record 1 ); - DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar && _groups[ _groups_Current ].keys.length > 1 ); - DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText ); - DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons ); + DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean ); + DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 ); + DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 ); + DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean ); + DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean ); - _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText; + _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText as string; _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0; if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) { - _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText; + _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText as string; } else { - _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText; + _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText as string; } setDialogText( bindingOptions ); setDialogPosition( null, bindingOptions ); buildProcessDots(); setProgressBarPosition(); - fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element ); + fireCustomTriggerEvent( bindingOptions.events?.onEnter, bindingOptions._currentView.element ); if ( bindingOptions.sendClick ) { bindingOptions._currentView.element.click(); @@ -310,13 +310,13 @@ type Groups = Record 1 ) { @@ -857,7 +857,7 @@ type Groups = Record Date: Thu, 4 Jul 2024 16:01:02 +0100 Subject: [PATCH 31/44] README updates. --- README.md | 2 +- README_NUGET.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6d9c81d..8af077f 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Journey.js

What features does Journey.js have?

- Zero-dependencies and extremely lightweight! -- Exportable for use in other frameworks! +- Written in TypeScript, allowing greater support for React, Angular, and other libraries! - Full API available via public functions. - Fully styled in CSS/SASS and compatible with the Bootstrap library. - Full CSS theme support (using :root variables, with a default dark-mode theme). diff --git a/README_NUGET.md b/README_NUGET.md index 777e623..68410ce 100644 --- a/README_NUGET.md +++ b/README_NUGET.md @@ -13,7 +13,7 @@ ## What features does Journey.js have? - Zero-dependencies and extremely lightweight! -- Exportable for use in other frameworks! +- Written in TypeScript, allowing greater support for React, Angular, and other libraries! - Full API available via public functions. - Fully styled in CSS/SASS and compatible with the Bootstrap library. - Full CSS theme support (using :root variables, with a default dark-mode theme). From 53b930d6fff9c12905e0cb2c51bfbb1764d8d27c Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 16:02:29 +0100 Subject: [PATCH 32/44] Package updates. --- package-lock.json | 62 +++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index b12de42..60e184d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1187,14 +1187,11 @@ "license": "MIT" }, "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -2076,16 +2073,13 @@ } }, "node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", - "dependencies": { - "whatwg-url": "^7.0.0" - }, "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, "node_modules/source-map-js": { @@ -2109,16 +2103,6 @@ "source-map": "^0.6.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -2256,6 +2240,16 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/terser": { "version": "5.31.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", @@ -2275,13 +2269,6 @@ "node": ">=10" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -2395,6 +2382,19 @@ } } }, + "node_modules/tsup/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/typescript": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", From e16024e868214b2dd49a6a455ac7d37c7ffa69bd Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 16:05:35 +0100 Subject: [PATCH 33/44] Keyword updates. --- journey.js.nuspec | 2 +- package.json | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/journey.js.nuspec b/journey.js.nuspec index 6f39f92..85ebdd1 100644 --- a/journey.js.nuspec +++ b/journey.js.nuspec @@ -10,7 +10,7 @@ README_NUGET.md MIT - javascript css html5 Journey.js walk-through guide steps + typescript javascript css html5 Journey.js walk-through guide steps guided-tour docs\images\icon.png William Troup diff --git a/package.json b/package.json index c6f266a..01afe44 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,15 @@ "url": "https://github.com/williamtroup/Journey.js" }, "keywords": [ + "typescript", "javascript", "css", "html5", - "Journey.js" + "Journey.js", + "walk-through", + "guided-tour", + "tour", + "steps" ], "bugs": { "url": "https://github.com/williamtroup/Journey.js/issues" From aff365cf8f2f73469e93df3faaf7cc4cb25c7b3d Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 16:10:56 +0100 Subject: [PATCH 34/44] Updates and improvements. --- dist/journey.esm.js | 151 ++++++++++++++---------------- dist/journey.esm.js.map | 2 +- dist/journey.js | 201 +++++++++++++++++++--------------------- dist/journey.js.map | 2 +- dist/journey.js.min.css | 3 +- dist/journey.min.js | 30 +----- src/journey.ts | 42 ++++----- 7 files changed, 190 insertions(+), 241 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index 097e90d..df36f4e 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -365,17 +365,16 @@ var require_journey = __commonJS({ makeDialogMovable(); } function onDialogClose(e = true) { - var t; - let o = false; + let t = false; if (Is.definedString(_configuration.closeDialogConfirmationText) && e) { - o = confirm(_configuration.closeDialogConfirmationText); + t = confirm(_configuration.closeDialogConfirmationText); } else { - o = true; + t = true; } - if (o) { + if (t) { const e = getGroupBindingOptions(); if (Is.defined(e) && Is.defined(e._currentView.element)) { - fireCustomTriggerEvent((t = e.events) == null ? void 0 : t.onClose, e._currentView.element); + fireCustomTriggerEvent(e.events.onClose, e._currentView.element); } removeFocusClassFromLastElement(false); hideDisabledBackground(); @@ -391,11 +390,10 @@ var require_journey = __commonJS({ } } function onDialogNext() { - var e; if (_groups[_groups_Current].position === _groups[_groups_Current].keys.length - 1) { - const t = getGroupBindingOptions(); + const e = getGroupBindingOptions(); onDialogClose(false); - fireCustomTriggerEvent((e = t.events) == null ? void 0 : e.onFinish, t._currentView.element); + fireCustomTriggerEvent(e.events.onFinish, e._currentView.element); } else { removeFocusClassFromLastElement(); _groups[_groups_Current].position++; @@ -403,10 +401,9 @@ var require_journey = __commonJS({ } } function showDialogAndSetPosition() { - var e; - const t = getGroupBindingOptions(); - if (Is.defined(t) && Is.defined(t._currentView.element)) { - if (t.showDisabledBackground) { + const e = getGroupBindingOptions(); + if (Is.defined(e) && Is.defined(e._currentView.element)) { + if (e.showDisabledBackground) { showDisabledBackground(); } else { hideDisabledBackground(); @@ -414,14 +411,14 @@ var require_journey = __commonJS({ hideToolTip(); _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? "block" : "none"; _configuration_ShortcutKeysEnabled = true; - t._currentView.element.className += " " + "journey-js-element-focus"; + e._currentView.element.className += " " + "journey-js-element-focus"; if (_configuration.scrollToElements) { - t._currentView.element.scrollIntoView(); + e._currentView.element.scrollIntoView(); } - const o = DomElement.getStyleValueByName(t._currentView.element, "position"); - if (o !== "" && o.toLowerCase() === "static") { - _element_Focus_Element_PositionStyle = o; - t._currentView.element.style.position = "relative"; + const t = DomElement.getStyleValueByName(e._currentView.element, "position"); + if (t !== "" && t.toLowerCase() === "static") { + _element_Focus_Element_PositionStyle = t; + e._currentView.element.style.position = "relative"; } DomElement.showElementBasedOnCondition(_element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain); DomElement.showElementBasedOnCondition(_element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[_groups_Current].keys.length > 1); @@ -435,13 +432,13 @@ var require_journey = __commonJS({ } else { _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText; } - setDialogText(t); - setDialogPosition(null, t); + setDialogText(e); + setDialogPosition(null, e); buildProcessDots(); setProgressBarPosition(); - fireCustomTriggerEvent((e = t.events) == null ? void 0 : e.onEnter, t._currentView.element); - if (t.sendClick) { - t._currentView.element.click(); + fireCustomTriggerEvent(e.events.onEnter, e._currentView.element); + if (e.sendClick) { + e._currentView.element.click(); } } } @@ -458,13 +455,12 @@ var require_journey = __commonJS({ } } function setDialogPosition(e, t) { - var o, n; if (_element_Dialog.style.display !== "block") { _element_Dialog.style.display = "block"; - fireCustomTriggerEvent((o = t.events) == null ? void 0 : o.onOpen, t._currentView.element); + fireCustomTriggerEvent(t.events.onOpen, t._currentView.element); } if (_groups[_groups_Current].position === 0) { - fireCustomTriggerEvent((n = t.events) == null ? void 0 : n.onStart, t._currentView.element); + fireCustomTriggerEvent(t.events.onStart, t._currentView.element); } _element_Dialog_IsHint = t.isHint === true; if (t.attach || t.isHint) { @@ -493,15 +489,14 @@ var require_journey = __commonJS({ } } function removeFocusClassFromLastElement(e = true) { - var t; - const o = getGroupBindingOptions(); - if (Is.defined(o) && Is.defined(o._currentView.element)) { - o._currentView.element.className = o._currentView.element.className.replace(" " + "journey-js-element-focus", ""); + const t = getGroupBindingOptions(); + if (Is.defined(t) && Is.defined(t._currentView.element)) { + t._currentView.element.className = t._currentView.element.className.replace(" " + "journey-js-element-focus", ""); if (Is.defined(_element_Focus_Element_PositionStyle)) { - o._currentView.element.style.position = _element_Focus_Element_PositionStyle; + t._currentView.element.style.position = _element_Focus_Element_PositionStyle; } if (e) { - fireCustomTriggerEvent((t = o.events) == null ? void 0 : t.onLeave, o._currentView.element); + fireCustomTriggerEvent(t.events.onLeave, t._currentView.element); } } } @@ -646,31 +641,29 @@ var require_journey = __commonJS({ _groups[_groups_Current].keys.sort(); } function getElement(e) { - var t, o; - let n = true; + let t = true; if (Is.defined(e) && e.hasAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME)) { - const i = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); - if (Is.definedString(i)) { - const o = getObjectFromString(i); - if (o.parsed && Is.definedObject(o.object)) { - setupElement(e, buildAttributeOptions(o.object)); + const o = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); + if (Is.definedString(o)) { + const n = getObjectFromString(o); + if (n.parsed && Is.definedObject(n.object)) { + setupElement(e, buildAttributeOptions(n.object)); } else { if (!_configuration.safeMode) { - console.error((t = _configuration.attributeNotValidErrorText) == null ? void 0 : t.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); - n = false; + console.error(_configuration.attributeNotValidErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); + t = false; } } } else { if (!_configuration.safeMode) { - console.error((o = _configuration.attributeNotSetErrorText) == null ? void 0 : o.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); - n = false; + console.error(_configuration.attributeNotSetErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); + t = false; } } } - return n; + return t; } function setupElement(e, t) { - var o; t._currentView = {}; t._currentView.element = e; if (Is.definedNumber(t.order) && (Is.definedString(t.title) || Is.definedString(t.description))) { @@ -679,7 +672,7 @@ var require_journey = __commonJS({ setupNewGroup(t.group); _groups[t.group].json[t.order] = t; _groups[t.group].keys.push(t.order); - fireCustomTriggerEvent((o = t.events) == null ? void 0 : o.onAddStep, e); + fireCustomTriggerEvent(t.events.onAddStep, e); } else { renderHint(t); } @@ -758,7 +751,7 @@ var require_journey = __commonJS({ } } function buildAttributeOptions(e) { - let t = !Is.definedObject(e) ? {} : e; + let t = Data.getDefaultObject(e, {}); t.order = Data.getDefaultNumber(t.order, 0); t.attach = Data.getDefaultBoolean(t.attach, true); t.sendClick = Data.getDefaultBoolean(t.sendClick, false); @@ -779,16 +772,15 @@ var require_journey = __commonJS({ return e; } function buildAttributeOptionCustomTriggers(e) { - var t, o, n, i, r, l, s, a; e.events = Data.getDefaultObject(e.events, {}); - e.events.onEnter = Data.getDefaultFunction((t = e.events) == null ? void 0 : t.onEnter, null); - e.events.onLeave = Data.getDefaultFunction((o = e.events) == null ? void 0 : o.onLeave, null); - e.events.onClose = Data.getDefaultFunction((n = e.events) == null ? void 0 : n.onClose, null); - e.events.onFinish = Data.getDefaultFunction((i = e.events) == null ? void 0 : i.onFinish, null); - e.events.onOpen = Data.getDefaultFunction((r = e.events) == null ? void 0 : r.onOpen, null); - e.events.onStart = Data.getDefaultFunction((l = e.events) == null ? void 0 : l.onStart, null); - e.events.onAddStep = Data.getDefaultFunction((s = e.events) == null ? void 0 : s.onAddStep, null); - e.events.onRemoveStep = Data.getDefaultFunction((a = e.events) == null ? void 0 : a.onRemoveStep, null); + e.events.onEnter = Data.getDefaultFunction(e.events.onEnter, null); + e.events.onLeave = Data.getDefaultFunction(e.events.onLeave, null); + e.events.onClose = Data.getDefaultFunction(e.events.onClose, null); + e.events.onFinish = Data.getDefaultFunction(e.events.onFinish, null); + e.events.onOpen = Data.getDefaultFunction(e.events.onOpen, null); + e.events.onStart = Data.getDefaultFunction(e.events.onStart, null); + e.events.onAddStep = Data.getDefaultFunction(e.events.onAddStep, null); + e.events.onRemoveStep = Data.getDefaultFunction(e.events.onRemoveStep, null); return e; } function fireCustomTriggerEvent(e, ...t) { @@ -827,7 +819,6 @@ var require_journey = __commonJS({ return t; } function getObjectFromString(objectString) { - var _a; const result = { parsed: true, object: null @@ -844,7 +835,7 @@ var require_journey = __commonJS({ } } catch (e) { if (!_configuration.safeMode) { - console.error((_a = _configuration.objectErrorText) == null ? void 0 : _a.replace("{{error_1}}", e1.message).replace("{{error_2}}", e.message)); + console.error(_configuration.objectErrorText.replace("{{error_1}}", e1.message).replace("{{error_2}}", e.message)); result.parsed = false; } result.object = null; @@ -941,27 +932,26 @@ var require_journey = __commonJS({ return _public; }, removeStep: function(e) { - var t; if (Is.definedObject(e)) { - let o = false; - for (let n in _groups) { - if (_groups.hasOwnProperty(n)) { - for (let i in _groups[n].json) { - if (_groups[n].json.hasOwnProperty(i)) { - const r = _groups[n].json[i]; - if (r._currentView.element === e) { - fireCustomTriggerEvent((t = r.events) == null ? void 0 : t.onRemoveStep, r._currentView.element); - _groups[n].keys.splice(_groups[n].keys.indexOf(r.order), 1); - delete _groups[n].json[r.order]; - _groups[n].keys.sort(); - o = true; + let t = false; + for (let o in _groups) { + if (_groups.hasOwnProperty(o)) { + for (let n in _groups[o].json) { + if (_groups[o].json.hasOwnProperty(n)) { + const i = _groups[o].json[n]; + if (i._currentView.element === e) { + fireCustomTriggerEvent(i.events.onRemoveStep, i._currentView.element); + _groups[o].keys.splice(_groups[o].keys.indexOf(i.order), 1); + delete _groups[o].json[i.order]; + _groups[o].keys.sort(); + t = true; break; } } } } } - if (!o) { + if (!t) { DomElement.clearElementsByClassName(e, "journey-js-hint"); } else { resetDialogPosition(); @@ -970,15 +960,14 @@ var require_journey = __commonJS({ return _public; }, clearSteps: function(e = "") { - var t; resetDialogPosition(); - for (let o in _groups) { - if (_groups.hasOwnProperty(o)) { - if (!Is.definedString(e) || e === o) { - for (let e in _groups[o].json) { - if (_groups[o].json.hasOwnProperty(e)) { - const n = _groups[o].json[e]; - fireCustomTriggerEvent((t = n.events) == null ? void 0 : t.onRemoveStep, n._currentView.element); + for (let t in _groups) { + if (_groups.hasOwnProperty(t)) { + if (!Is.definedString(e) || e === t) { + for (let e in _groups[t].json) { + if (_groups[t].json.hasOwnProperty(e)) { + const o = _groups[t].json[e]; + fireCustomTriggerEvent(o.events.onRemoveStep, o._currentView.element); } } } diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 93053b2..fe2265b 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":";;;;;;;;;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAaiB;AAbjB;AAAA;AAaO,MAAUA,eAAV;AACI,MAAMA,WAAA,4BAA4B;AAAA,OAD5B;AAAA;AAAA;;;ACbjB,IAGiB;AAHjB;AAAA;AAAA;AAGO,MAAUC,QAAV;AACI,eAAS,QAAS,OAAuB;AAC5C,eAAO,UAAU,QAAQ,UAAU,UAAa;AAAA,MACpD;AAFO,MAAAA,IAAS;AAIT,eAAS,cAAe,QAAwB;AACnD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,eAAgB,QAAwB;AACpD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,cAAe,QAAwB;AACnD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,gBAAiB,QAAwB;AACrD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,cAAe,QAAwB;AACnD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,aAAc,QAAwB;AAClD,eAAO,cAAe,MAAO,KAAK,kBAAkB;AAAA,MACxD;AAFO,MAAAA,IAAS;AAAA,OAzBH;AAAA;AAAA;;;ACHjB,IAIiB;AAJjB;AAAA;AAAA;AACA;AAGO,MAAUC,UAAV;AACI,eAAS,oBAAqB,OAAY,cAAgC;AAC7E,eAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,iBAAkB,OAAY,cAAgC;AAC1E,eAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,kBAAmB,OAAY,cAAkC;AAC7E,eAAO,GAAG,eAAgB,KAAM,IAAI,QAAQ;AAAA,MAChD;AAFO,MAAAA,MAAS;AAIT,eAAS,iBAAkB,OAAY,cAAgC;AAC1E,eAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,mBAAoB,OAAY,cAA0B;AACtE,eAAO,GAAG,gBAAiB,KAAM,IAAI,QAAQ;AAAA,MACjD;AAFO,MAAAA,MAAS;AAIT,eAAS,iBAAkB,OAAY,cAA0B;AACpE,eAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,gBAAiB,OAAY,cAA8B;AACvE,eAAO,GAAG,aAAc,KAAM,IAAI,QAAQ;AAAA,MAC9C;AAFO,MAAAA,MAAS;AAIT,eAAS,wBAAyB,OAAY,cAA8B;AAC/E,YAAIC,UAAgB;AAEpB,YAAK,GAAG,cAAe,KAAM,GAAI;AAC7B,gBAAM,SAAmB,MAAM,SAAS,EAAE,qBAAkB;AAE5D,cAAK,OAAO,WAAW,GAAI;AACvB,oBAAQ;AAAA,UACZ,OAAO;AACH,YAAAA,UAAS;AAAA,UACb;AAAA,QAEJ,OAAO;AACH,UAAAA,UAAS,gBAAiB,OAAO,YAAa;AAAA,QAClD;AAEA,eAAOA;AAAA,MACX;AAjBO,MAAAD,MAAS;AAAA,OA7BH;AAAA;AAAA;;;ACJjB,IAKiB;AALjB;AAAA;AAAA;AACA;AAIO,MAAUE,gBAAV;AACI,eAAS,OAAQ,MAAc,4BAA+C;AACjF,cAAM,WAAmB,KAAK,YAAY;AAC1C,cAAM,SAAkB,aAAa;AAErC,YAAID,UAAc,SAAS,SAAS,6BAA2B,IAAI,SAAS,cAAe,QAAS;AAEpG,YAAK,GAAG,QAAS,SAAU,GAAI;AAC3B,UAAAA,QAAO,YAAY;AAAA,QACvB;AAEA,eAAOA;AAAA,MACX;AAXO,MAAAC,YAAS;AAaT,eAAS,UAAW,SAAkC;AACzD,cAAMD,UAAmB;AAAA,UACrB,MAAM;AAAA,UACN,KAAK;AAAA,QACT;AAEA,eAAQ,WAAW,CAAC,MAAO,QAAQ,UAAW,KAAK,CAAC,MAAO,QAAQ,SAAU,GAAI;AAC7E,UAAAA,QAAO,QAAQ,QAAQ,aAAa,QAAQ;AAC5C,UAAAA,QAAO,OAAO,QAAQ,YAAY,QAAQ;AAE1C,oBAAU,QAAQ;AAAA,QACtB;AAEA,eAAOA;AAAA,MACX;AAdO,MAAAC,YAAS;AAgBT,eAAS,oBAA+B;AAC3C,cAAM,MAAmB,SAAS;AAElC,cAAMD,UAAmB;AAAA,UACrB,OAAQ,OAAO,eAAe,IAAI,eAAkB,IAAI,cAAc;AAAA,UACtE,MAAO,OAAO,eAAe,IAAI,cAAgB,IAAI,aAAa;AAAA,QACtE;AAEA,eAAOA;AAAA,MACX;AATO,MAAAC,YAAS;AAWT,eAAS,oBAAqB,SAAc,mBAAkC;AACjF,YAAI,QAAa;AAEjB,YAAK,SAAS,YAAY,kBAAmB;AACzC,kBAAQ,SAAS,YAAY,iBAAkB,SAAS,IAAK,EAAE,iBAAkB,iBAAkB;AAAA,QACvG,WAAY,QAAQ,cAAe;AAC/B,kBAAQ,QAAQ,aAAc,iBAAkB;AAAA,QACpD;AAEA,eAAO;AAAA,MACX;AAVO,MAAAA,YAAS;AAYT,eAAS,QAAS,QAAqB,MAA2B;AACrE,YAAI;AACA,cAAK,CAAC,OAAO,SAAU,IAAK,GAAI;AAC5B,mBAAO,YAAa,IAAK;AAAA,UAC7B;AAAA,QACJ,SAAU,GAAI;AACV,kBAAQ,KAAM,EAAE,OAAQ;AAAA,QAC5B;AAAA,MACJ;AARO,MAAAA,YAAS;AAUT,eAAS,WAAY,QAAqB,MAA2B;AACxE,YAAI;AACA,cAAK,OAAO,SAAU,IAAK,GAAI;AAC3B,mBAAO,YAAa,IAAK;AAAA,UAC7B;AAAA,QACJ,SAAU,GAAI;AACV,kBAAQ,KAAM,EAAE,OAAQ;AAAA,QAC5B;AAAA,MACJ;AARO,MAAAA,YAAS;AAUT,eAAS,aAAc,GAAgB;AAC1C,UAAE,eAAe;AACjB,UAAE,eAAe;AAAA,MACrB;AAHO,MAAAA,YAAS;AAKT,eAAS,2BAA4B,GAAe,SAA8B;AACrF,YAAI,OAAe,EAAE;AACrB,YAAI,MAAc,EAAE;AACpB,cAAM,iBAA2B,kBAAkB;AAEnD,gBAAQ,MAAM,UAAU;AAExB,YAAK,OAAO,QAAQ,cAAc,OAAO,YAAa;AAClD,kBAAQ,QAAQ;AAAA,QACpB,OAAO;AACH;AAAA,QACJ;AAEA,YAAK,MAAM,QAAQ,eAAe,OAAO,aAAc;AACnD,iBAAO,QAAQ;AAAA,QACnB,OAAO;AACH;AAAA,QACJ;AAEA,YAAK,OAAO,eAAe,MAAO;AAC9B,iBAAO,EAAE,QAAQ;AAAA,QACrB;AAEA,YAAK,MAAM,eAAe,KAAM;AAC5B,gBAAM,EAAE,QAAQ;AAAA,QACpB;AAEA,gBAAQ,MAAM,OAAO,OAAO;AAC5B,gBAAQ,MAAM,MAAM,MAAM;AAAA,MAC9B;AA7BO,MAAAA,YAAS;AA+BT,eAAS,4BAA6B,SAAsB,WAA4B;AAC3F,YAAK,WAAY;AACb,cAAK,QAAQ,MAAM,YAAY,SAAU;AACrC,oBAAQ,MAAM,UAAU;AAAA,UAC5B;AAAA,QAEJ,OAAO;AACH,cAAK,QAAQ,MAAM,YAAY,QAAS;AACpC,oBAAQ,MAAM,UAAU;AAAA,UAC5B;AAAA,QACJ;AAAA,MACJ;AAXO,MAAAA,YAAS;AAaT,eAAS,eAAgB,WAAwB,WAAuC;AAC3F,cAAM,gBAA6B,OAAQ,KAAM;AACjD,cAAM,QAAqB,OAAQ,SAAS,UAAW;AACvD,cAAM,QAA0B,OAAQ,OAAQ;AAEhD,kBAAU,YAAa,aAAc;AACrC,sBAAc,YAAa,KAAM;AACjC,cAAM,YAAa,KAAM;AAEzB,cAAM,OAAO;AAEb,cAAM,YAAyB,OAAQ,QAAQ,YAAa;AAC5D,cAAM,OAAoB,OAAQ,QAAQ,MAAO;AAEjD,aAAK,YAAY;AAEjB,cAAM,YAAa,SAAU;AAC7B,cAAM,YAAa,IAAK;AAExB,eAAO;AAAA,MACX;AApBO,MAAAA,YAAS;AAsBT,eAAS,yBAA0B,WAAwB,WAA2B;AACzF,YAAI,WAAsC,UAAU,uBAAwB,SAAU;AAEtF,eAAQ,SAAU,CAAE,GAAI;AACpB,mBAAU,CAAE,EAAE,WAAW,YAAa,SAAU,CAAE,CAAE;AAAA,QACxD;AAAA,MACJ;AANO,MAAAA,YAAS;AAAA,OAhJH;AAAA;AAAA;;;ACLjB;AAAA;AAoBA;AACA;AAEA;AACA;AACA;AAeA,KAAE,MAAM;AAEJ,UAAI,iBAAgC,CAAC;AAGrC,UAAI,qCAA8C;AAGlD,YAAM,kBAA0B;AAChC,UAAI,kBAA0B;AAC9B,UAAI,UAAkB,CAAC;AAGvB,UAAI;AAGJ,UAAI;AAGJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI,yBAAkC;AAGtC,UAAI,kCAA0C;AAC9C,UAAI,kCAA0C;AAC9C,UAAI,gCAAyC;AAC7C,UAAI,yBAAiC;AACrC,UAAI,yBAAiC;AAGrC,UAAI;AACJ,UAAI,yBAAiC;AASrC,eAAS,kBAAmB,SAAc,MAAc;AACpD,kBAAU,KAAK,iBAAkB,QAAQ,CAAC,CAAY;AAEtD,gBAAS,eAAgB,IAAI;AAAA,UACzB,MAAM,CAAC;AAAA,UACP,MAAM,CAAC;AAAA,UACP,UAAU;AAAA,QACd;AAAA,MACJ;AAEA,eAAS,cAAe,OAAuB;AAC3C,YAAK,CAAC,QAAQ,eAAgB,KAAM,GAAI;AACpC,kBAAS,KAAM,IAAI;AAAA,YACf,MAAM,CAAC;AAAA,YACP,MAAM,CAAC;AAAA,YACP,UAAU;AAAA,UACd;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,yBAA0C;AAC/C,eAAO,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,QAAS,CAAE;AAAA,MACnH;AASA,eAAS,2BAAkC;AACvC,uCAA+B,WAAW,OAAQ,OAAO,gCAAiC;AAE1F,qCAA6B,UAAU,MAAM;AACzC,cAAK,eAAe,sCAAuC;AACvD,0BAAc;AAAA,UAClB;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,yBAAgC;AACrC,mBAAW,QAAS,SAAS,MAAM,4BAA6B;AAAA,MACpE;AAEA,eAAS,yBAAgC;AACrC,mBAAW,WAAY,SAAS,MAAM,4BAA6B;AAAA,MACvE;AASA,eAAS,eAAsB;AAC3B,0BAAkB,WAAW,OAAQ,OAAO,mBAAoB;AAChE,wBAAgB,MAAM,UAAU;AAChC,iBAAS,KAAK,YAAa,eAAgB;AAE3C,uCAA+B,WAAW,OAAQ,UAAU,OAAQ;AACpE,wBAAgB,YAAa,4BAA6B;AAE1D,qCAA6B,UAAU,MAAM;AACzC,wBAAc;AAAA,QAClB;AAEA,mBAAY,8BAA8B,eAAe,sBAAiC;AAE1F,gCAAwB,WAAW,OAAQ,OAAO,OAAQ;AAC1D,wBAAgB,YAAa,qBAAsB;AAEnD,sCAA8B,WAAW,OAAQ,OAAO,aAAc;AACtE,wBAAgB,YAAa,2BAA4B;AAEzD,6CAAqC,WAAW,OAAQ,OAAO,oBAAqB;AACpF,wBAAgB,YAAa,kCAAmC;AAEhE,yCAAiC,WAAW,eAAgB,oCAAoC,eAAe,kBAA6B;AAE5I,uCAA+B,WAAW,MAAM;AAC5C,cAAK,eAAe,oBAAqB;AACrC,mCAAwB,eAAe,wBAAwB,+BAA+B,OAAQ;AAAA,UAC1G;AAAA,QACJ;AAEA,uCAA+B,WAAW,OAAQ,OAAO,eAAgB;AACzE,wBAAgB,YAAa,4BAA6B;AAE1D,sCAA8B,WAAW,OAAQ,OAAO,cAAe;AACvE,wBAAgB,YAAa,2BAA4B;AAEzD,iDAAyC,WAAW,OAAQ,OAAO,yBAA0B;AAC7F,oCAA4B,YAAa,sCAAuC;AAEhF,sDAA8C,WAAW,OAAQ,KAAK,8BAA+B;AACrG,+CAAuC,YAAa,2CAA4C;AAEhG,kCAA0B,WAAW,OAAQ,OAAO,SAAU;AAC9D,wBAAgB,YAAa,uBAAwB;AAErD,8CAAsC,WAAW,OAAQ,UAAU,MAAO;AAC1E,4CAAoC,UAAU;AAC9C,gCAAwB,YAAa,mCAAoC;AAEzE,8CAAsC,WAAW,OAAQ,UAAU,MAAO;AAC1E,4CAAoC,UAAU;AAC9C,gCAAwB,YAAa,mCAAoC;AAEzE,0BAAkB;AAAA,MACtB;AAEA,eAAS,cAAe,sBAA+B,MAAc;AA7MzE;AA8MQ,YAAI,YAAqB;AAEzB,YAAK,GAAG,cAAe,eAAe,2BAA4B,KAAK,qBAAsB;AACzF,sBAAY,QAAS,eAAe,2BAA4B;AAAA,QACpE,OAAO;AACH,sBAAY;AAAA,QAChB;AAEA,YAAK,WAAY;AACb,gBAAM,iBAAiC,uBAAuB;AAE9D,cAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,oCAAwB,oBAAe,WAAf,mBAAuB,SAAS,eAAe,aAAa,OAAQ;AAAA,UAChG;AAEA,0CAAiC,KAAM;AACvC,iCAAuB;AACvB,sBAAY;AAEZ,0BAAgB,MAAM,UAAU;AAAA,QACpC;AAAA,MACJ;AAEA,eAAS,eAAsB;AAC3B,YAAK,QAAS,eAAgB,EAAE,WAAW,GAAI;AAC3C,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE;AAE3B,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,eAAsB;AA/OnC;AAgPQ,YAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,gBAAM,iBAAiC,uBAAuB;AAE9D,wBAAe,KAAM;AACrB,kCAAwB,oBAAe,WAAf,mBAAuB,UAAU,eAAe,aAAa,OAAQ;AAAA,QAEjG,OAAO;AACH,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE;AAE3B,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,2BAAkC;AA/P/C;AAgQQ,cAAM,iBAAiC,uBAAuB;AAE9D,YAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,cAAK,eAAe,wBAAyB;AACzC,mCAAuB;AAAA,UAC3B,OAAO;AACH,mCAAuB;AAAA,UAC3B;AAEA,sBAAY;AAEZ,uCAA6B,MAAM,UAAU,eAAe,kBAAkB,UAAS;AACvF,+CAAqC;AAErC,yBAAe,aAAa,QAAQ,+BAA0B;AAE9D,cAAK,eAAe,kBAAmB;AACnC,2BAAe,aAAa,QAAQ,eAAe;AAAA,UACvD;AAEA,gBAAM,oBAA4B,WAAW,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAElH,cAAK,wCAAoC,kBAAkB,YAAY,MAAM,UAAW;AACpF,mDAAuC;AACvC,2BAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,UACzD;AAEA,qBAAW,4BAA6B,oCAAoC,eAAe,kBAA8B;AACzH,qBAAW,4BAA6B,8BAA8B,eAAe,oBAA+B,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AAC/J,qBAAW,4BAA6B,6BAA6B,eAAe,mBAA8B,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AAC7J,qBAAW,4BAA6B,6CAA6C,eAAe,mBAA+B;AACnI,qBAAW,4BAA6B,yBAAyB,eAAe,WAAuB;AAEvG,8CAAoC,YAAY,eAAe;AAC/D,8CAAoC,WAAW,QAAS,eAAgB,EAAE,aAAa;AAEvF,cAAK,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACrF,gDAAoC,YAAY,eAAe;AAAA,UACnE,OAAO;AACH,gDAAoC,YAAY,eAAe;AAAA,UACnE;AAEA,wBAAe,cAAe;AAC9B,4BAAmB,MAAM,cAAe;AACxC,2BAAiB;AACjB,iCAAuB;AACvB,kCAAwB,oBAAe,WAAf,mBAAuB,SAAS,eAAe,aAAa,OAAQ;AAE5F,cAAK,eAAe,WAAY;AAC5B,2BAAe,aAAa,QAAQ,MAAM;AAAA,UAC9C;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,cAAe,gBAAwC;AAC5D,YAAK,GAAG,cAAe,eAAe,KAAM,GAAI;AAC5C,gCAAsB,YAAY,eAAe;AAAA,QACrD,OAAO;AACH,gCAAsB;AAAA,QAC1B;AAEA,YAAK,GAAG,cAAe,eAAe,WAAY,GAAI;AAClD,sCAA4B,YAAY,eAAe;AAAA,QAC3D,OAAO;AACH,sCAA4B;AAAA,QAChC;AAAA,MACJ;AAEA,eAAS,kBAAmB,GAAQ,gBAAwC;AApUhF;AAqUQ,YAAK,gBAAgB,MAAM,YAAY,SAAU;AAC7C,0BAAgB,MAAM,UAAU;AAEhC,kCAAwB,oBAAe,WAAf,mBAAuB,QAAQ,eAAe,aAAa,OAAQ;AAAA,QAC/F;AAEA,YAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,kCAAwB,oBAAe,WAAf,mBAAuB,SAAS,eAAe,aAAa,OAAQ;AAAA,QAChG;AAEA,iCAAyB,eAAe,WAAW;AAEnD,YAAK,eAAe,UAAU,eAAe,QAAS;AAClD,cAAK,eAAe,UAAU,eAAe,0BAA2B;AACpE,uBAAW,2BAA4B,GAAG,eAAgB;AAAA,UAE9D,OAAO;AACH,kBAAM,SAAmB,WAAW,UAAW,eAAe,aAAa,OAAQ;AACnF,gBAAI,MAAgB,OAAO,MAAQ,eAAe,aAAa,QAAQ;AACvE,gBAAI,OAAiB,OAAO;AAE5B,gBAAK,OAAO,gBAAgB,cAAc,OAAO,cAAc,eAAe,YAAa;AACvF,sBAAS,gBAAgB;AACzB,sBAAQ,eAAe,aAAa,QAAQ;AAAA,YAChD;AAEA,gBAAK,MAAM,gBAAgB,eAAe,OAAO,eAAe,eAAe,UAAW;AACtF,qBAAS,gBAAgB,eAAe,eAAe,aAAa,QAAQ;AAAA,YAChF;AAEA,4BAAgB,MAAM,MAAM,MAAM;AAClC,4BAAgB,MAAM,OAAO,OAAO;AAAA,UACxC;AAAA,QAEJ,OAAO;AACH,gBAAM,iBAA2B,WAAW,kBAAkB;AAC9D,gBAAM,aAAqB,KAAK,IAAK,IAAO,OAAO,aAAa,gBAAgB,eAAgB,IAAM,eAAe,IAAK;AAC1H,gBAAM,YAAoB,KAAK,IAAK,IAAO,OAAO,cAAc,gBAAgB,gBAAiB,IAAM,eAAe,GAAI;AAE1H,0BAAgB,MAAM,OAAO,aAAa;AAC1C,0BAAgB,MAAM,MAAM,YAAY;AAAA,QAC5C;AAAA,MACJ;AAEA,eAAS,gCAAiC,oBAA6B,MAAc;AAjXzF;AAkXQ,cAAM,iBAAiC,uBAAuB;AAE9D,YAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,yBAAe,aAAa,QAAQ,YAAY,eAAe,aAAa,QAAQ,UAAU,0BAAsB,0CAAuC;AAE3J,cAAK,GAAG,QAAS,oCAAqC,GAAI;AACtD,2BAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,UACzD;AAEA,cAAK,mBAAoB;AACrB,oCAAwB,oBAAe,WAAf,mBAAuB,SAAS,eAAe,aAAa,OAAQ;AAAA,UAChG;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,mBAA0B;AAC/B,qCAA6B;AAE7B,YAAK,eAAe,kBAAmB;AACnC,gBAAM,aAAqB,QAAS,eAAgB,EAAE,KAAK;AAE3D,mBAAU,WAAmB,GAAG,WAAW,YAAY,YAAa;AAChE,6BAAkB,UAAU,QAAS,eAAgB,EAAE,KAAM,QAAS,CAAE;AAAA,UAC5E;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,iBAAkB,UAAkB,OAAuB;AAChE,cAAM,iBAAiC,QAAS,eAAgB,EAAE,KAAM,KAAM;AAC9E,YAAI;AAEJ,YAAK,aAAa,QAAS,eAAgB,EAAE,UAAW;AACpD,gBAAM,WAAW,OAAQ,OAAO,YAAa;AAAA,QACjD,OAAO;AAEH,gBAAM,WAAW,OAAQ,OAAO,KAAM;AAEtC,cAAI,UAAU,MAAM;AAChB,4CAAgC;AAEhC,oBAAS,eAAgB,EAAE,WAAW;AAEtC,qCAAyB;AAAA,UAC7B;AAAA,QACJ;AAEA,qCAA6B,YAAa,GAAI;AAE9C,YAAK,eAAe,yBAA0B;AAC1C,cAAK,GAAG,cAAe,eAAe,OAAQ,GAAI;AAC9C,uBAAY,KAAK,eAAe,OAAkB;AAAA,UACtD,OAAO;AACH,uBAAY,KAAK,eAAe,KAAgB;AAAA,UACpD;AAAA,QACJ;AAEA,YAAK,eAAe,wBAAyB;AACzC,cAAI,aAAa;AACjB,cAAI,aAAc,WAAW,GAAI,SAAS;AAAA,QAC9C;AAAA,MACJ;AAEA,eAAS,yBAAgC;AACrC,YAAK,eAAe,iBAAkB;AAClC,gBAAM,iBAAyB,4BAA4B,cAAc,QAAS,eAAgB,EAAE,KAAK;AACzG,gBAAM,SAAkB,QAAS,eAAgB,EAAE,WAAW,KAAM;AACpE,gBAAM,qBAA6B,KAAK,MAAU,QAAS,eAAgB,EAAE,WAAW,KAAM,QAAS,eAAgB,EAAE,KAAK,SAAW,GAAI;AAE7I,iDAAuC,MAAM,QAAQ,QAAQ;AAC7D,sDAA4C,YAAY,qBAAqB;AAAA,QACjF;AAAA,MACJ;AASA,eAAS,oBAA2B;AAChC,8BAAsB,cAAc;AACpC,8BAAsB,YAAY;AAClC,8BAAsB,gBAAgB;AAEtC,iBAAS,KAAK,iBAAkB,aAAa,uBAAwB;AACrE,iBAAS,KAAK,iBAAkB,cAAc,wBAAyB;AAAA,MAC3E;AAEA,eAAS,wBAAyB,GAAuB;AACrD,YAAK,CAAC,iCAAiC,CAAC,0BAA0B,eAAe,qBAAsB;AACnG,0BAAgB,aAAa;AAC7B,0CAAgC;AAChC,mCAAyB,EAAE,QAAQ,gBAAgB;AACnD,mCAAyB,EAAE,QAAQ,gBAAgB;AACnD,4CAAkC,gBAAgB;AAClD,4CAAkC,gBAAgB;AAAA,QACtD;AAAA,MACJ;AAEA,eAAS,wBAA+B;AACpC,YAAK,+BAAgC;AACjC,0CAAgC;AAChC,4CAAkC;AAClC,4CAAkC;AAClC,0BAAgB,YAAY;AAAA,QAChC;AAAA,MACJ;AAEA,eAAS,wBAAyB,GAAuB;AACrD,YAAK,+BAAgC;AACjC,0BAAgB,MAAM,OAAS,EAAE,QAAQ,yBAA2B;AACpE,0BAAgB,MAAM,MAAQ,EAAE,QAAQ,yBAA2B;AAAA,QACvE;AAAA,MACJ;AAEA,eAAS,2BAAkC;AACvC,YAAK,+BAAgC;AACjC,0BAAgB,MAAM,OAAO,kCAAkC;AAC/D,0BAAgB,MAAM,MAAM,kCAAkC;AAE9D,0CAAgC;AAChC,4CAAkC;AAClC,4CAAkC;AAClC,0BAAgB,YAAY;AAAA,QAChC;AAAA,MACJ;AASA,eAAS,gBAAuB;AAC5B,YAAK,CAAC,GAAG,QAAS,gBAAiB,GAAI;AACnC,6BAAmB,WAAW,OAAQ,OAAO,oBAAqB;AAClE,2BAAiB,MAAM,UAAU;AAEjC,mBAAS,KAAK,YAAa,gBAAiB;AAE5C,mBAAS,KAAK,iBAAkB,aAAa,MAAM;AAC/C,wBAAY;AAAA,UAChB,CAAE;AAEF,mBAAS,iBAAkB,UAAU,MAAM;AACvC,wBAAY;AAAA,UAChB,CAAE;AAAA,QACN;AAAA,MACJ;AAEA,eAAS,WAAY,SAAsB,MAAsB;AAC7D,YAAK,YAAY,MAAO;AACpB,kBAAQ,cAAc,CAAE,MAAmB;AACvC,wBAAa,GAAG,IAAK;AAAA,UACzB;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,YAAa,GAAQ,MAAsB;AAChD,mBAAW,aAAc,CAAE;AAC3B,oBAAY;AAEZ,iCAAyB,WAAY,MAAM;AACvC,2BAAiB,YAAY;AAC7B,2BAAiB,MAAM,UAAU;AAEjC,qBAAW,2BAA4B,GAAG,gBAAiB;AAAA,QAC/D,GAAG,eAAe,YAAa;AAAA,MACnC;AAEA,eAAS,cAAqB;AAC1B,YAAK,GAAG,QAAS,gBAAiB,GAAI;AAClC,cAAK,2BAA2B,GAAI;AAChC,yBAAc,sBAAuB;AACrC,qCAAyB;AAAA,UAC7B;AAEA,cAAK,iBAAiB,MAAM,YAAY,SAAU;AAC9C,6BAAiB,MAAM,UAAU;AAAA,UACrC;AAAA,QACJ;AAAA,MACJ;AASA,eAAS,cAAqB;AAC1B,cAAM,WAAqB,eAAe;AAC1C,cAAM,iBAAyB,SAAS;AAExC,iBAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,gBAAM,cAAyC,SAAS,qBAAsB,SAAU,YAAa,CAAE;AACvG,gBAAM,WAA0B,CAAC,EAAE,MAAM,KAAM,WAAY;AAC3D,gBAAM,iBAAyB,SAAS;AAExC,mBAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,gBAAK,CAAC,WAAY,SAAU,YAAa,CAAE,GAAI;AAC3C;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAEA,gBAAS,eAAgB,EAAE,KAAK,KAAK;AAAA,MACzC;AAEA,eAAS,WAAY,SAAiC;AArkB1D;AAskBQ,YAAID,UAAkB;AAEtB,YAAK,GAAG,QAAS,OAAQ,KAAK,QAAQ,aAAc,UAAU,yBAA0B,GAAI;AACxF,gBAAM,qBAA6B,QAAQ,aAAc,UAAU,yBAA0B;AAE7F,cAAK,GAAG,cAAe,kBAAmB,GAAI;AAC1C,kBAAM,iBAA+B,oBAAqB,kBAAmB;AAE7E,gBAAK,eAAe,UAAU,GAAG,cAAe,eAAe,MAAO,GAAI;AACtE,2BAAc,SAAS,sBAAuB,eAAe,MAAO,CAAE;AAAA,YAE1E,OAAO;AACH,kBAAK,CAAC,eAAe,UAAW;AAC5B,wBAAQ,OAAO,oBAAe,+BAAf,mBAA2C,QAAS,sBAAsB,UAAU,0BAA4B;AAC/H,gBAAAA,UAAS;AAAA,cACb;AAAA,YACJ;AAAA,UAEJ,OAAO;AACH,gBAAK,CAAC,eAAe,UAAW;AAC5B,sBAAQ,OAAO,oBAAe,6BAAf,mBAAyC,QAAS,sBAAsB,UAAU,0BAA4B;AAC7H,cAAAA,UAAS;AAAA,YACb;AAAA,UACJ;AAAA,QACJ;AAEA,eAAOA;AAAA,MACX;AAEA,eAAS,aAAc,SAAsB,gBAAwC;AAnmBzF;AAomBQ,uBAAe,eAAe,CAAC;AAC/B,uBAAe,aAAa,UAAU;AAEtC,YAAK,GAAG,cAAe,eAAe,KAAM,MAAO,GAAG,cAAe,eAAe,KAAM,KAAK,GAAG,cAAe,eAAe,WAAY,IAAM;AAC9I,kBAAQ,gBAAiB,UAAU,yBAA0B;AAE7D,cAAK,CAAC,eAAe,QAAS;AAC1B,0BAAe,eAAe,KAAgB;AAE9C,oBAAS,eAAe,KAAgB,EAAE,KAAM,eAAe,KAAgB,IAAI;AACnF,oBAAS,eAAe,KAAgB,EAAE,KAAK,KAAM,eAAe,KAAgB;AAEpF,oCAAwB,oBAAe,WAAf,mBAAuB,WAAW,OAAQ;AAAA,UAEtE,OAAO;AACH,uBAAY,cAAe;AAAA,UAC/B;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,WAAY,gBAAwC;AACzD,cAAM,gBAAwB,WAAW,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAE9G,YAAK,oCAAgC,cAAc,YAAY,MAAM,UAAW;AAC5E,yBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,QACzD;AAEA,cAAM,OAAoB,WAAW,OAAQ,OAAO,iBAAkB;AACtE,uBAAe,aAAa,QAAQ,YAAa,IAAK;AAEtD,aAAK,UAAU,CAAE,MAAmB;AAChC,qBAAW,aAAc,CAAE;AAE3B,6CAAmC,MAAM,UAAU;AACnD,uCAA6B,MAAM,UAAU;AAC7C,sCAA4B,MAAM,UAAU;AAC5C,kCAAwB,MAAM,UAAU;AACxC,+CAAqC;AAErC,wBAAe,cAAe;AAC9B,4BAAmB,GAAG,cAAe;AAErC,cAAK,eAAe,sBAAuB;AACvC,uBAAW,yBAA0B,eAAe,aAAa,SAAS,iBAAkB;AAAA,UAChG;AAAA,QACJ;AAAA,MACJ;AASA,eAAS,oBAAqB,YAAqB,MAAc;AAC7D,cAAM,eAAyB,YAAY,SAAS,mBAAmB,SAAS;AAChF,cAAM,aAAuB,YAAY,OAAO,mBAAmB,OAAO;AAE1E,YAAK,eAAe,qBAAsB;AACtC,uBAAc,WAAW,eAAgB;AAAA,QAC7C;AAEA,mBAAY,UAAU,cAAe;AAAA,MACzC;AAEA,eAAS,gBAAiB,GAA0B;AAChD,YAAK,QAAQ,OAAO,KAAK,eAAe,qBAAsB;AAC1D,cAAK,EAAE,gCAA0B;AAC7B,cAAE,eAAe;AACjB,0BAAc;AAAA,UAClB,OAAO;AAEH,gBAAK,oCAAqC;AACtC,kBAAK,EAAE,iCAAwB;AAC3B,kBAAE,eAAe;AACjB,6BAAa;AAAA,cAEjB,WAAY,EAAE,mCAAyB;AACnC,kBAAE,eAAe;AACjB,6BAAa;AAAA,cAEjB,WAAY,EAAE,6BAAsB;AAChC,kBAAE,eAAe;AACjB,kCAAkB;AAAA,cAEtB,WAAY,EAAE,iCAAwB;AAClC,kBAAE,eAAe;AACjB,oCAAoB;AAAA,cACxB;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,iBAAwB;AAC7B,YAAK,QAAQ,OAAO,GAAI;AACpB,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,oBAA2B;AAChC,YAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE,WAAW;AAEtC,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,sBAA6B;AAClC,YAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS;AAE/E,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AASA,eAAS,sBAAuB,YAAkB;AAC9C,YAAI,UAA0B,CAAC,GAAG,cAAe,UAAW,IAAI,CAAC,IAAsB;AACvF,gBAAQ,QAAQ,KAAK,iBAAkB,QAAQ,OAAO,CAAE;AACxD,gBAAQ,SAAS,KAAK,kBAAmB,QAAQ,QAAQ,IAAK;AAC9D,gBAAQ,YAAY,KAAK,kBAAmB,QAAQ,WAAW,KAAM;AACrE,gBAAQ,WAAW,KAAK,kBAAmB,QAAQ,UAAU,KAAM;AACnE,gBAAQ,aAAa,KAAK,kBAAmB,QAAQ,YAAY,KAAM;AACvE,gBAAQ,SAAS,KAAK,kBAAmB,QAAQ,QAAQ,KAAM;AAC/D,gBAAQ,2BAA2B,KAAK,kBAAmB,QAAQ,0BAA0B,KAAM;AACnG,gBAAQ,yBAAyB,KAAK,kBAAmB,QAAQ,wBAAwB,IAAK;AAC9F,gBAAQ,uBAAuB,KAAK,kBAAmB,QAAQ,sBAAsB,KAAM;AAC3F,gBAAQ,QAAQ,KAAK,iBAAkB,QAAQ,OAAO,eAAgB;AAEtE,kBAAU,4BAA6B,OAAQ;AAE/C,eAAO,mCAAoC,OAAQ;AAAA,MACvD;AAEA,eAAS,4BAA6B,SAA2C;AAC7E,gBAAQ,QAAQ,KAAK,iBAAkB,QAAQ,qBAAkB;AACjE,gBAAQ,cAAc,KAAK,iBAAkB,QAAQ,2BAAwB;AAC7E,gBAAQ,UAAU,KAAK,iBAAkB,QAAQ,uBAAoB;AAErE,eAAO;AAAA,MACX;AAEA,eAAS,mCAAoC,SAA2C;AA9vB5F;AA+vBQ,gBAAQ,SAAS,KAAK,iBAAkB,QAAQ,QAAQ,CAAC,CAAY;AACrE,gBAAQ,OAAO,UAAU,KAAK,oBAAoB,aAAQ,WAAR,mBAAgB,SAAS,IAAK;AAChF,gBAAQ,OAAO,UAAU,KAAK,oBAAoB,aAAQ,WAAR,mBAAgB,SAAS,IAAK;AAChF,gBAAQ,OAAO,UAAU,KAAK,oBAAoB,aAAQ,WAAR,mBAAgB,SAAS,IAAK;AAChF,gBAAQ,OAAO,WAAW,KAAK,oBAAoB,aAAQ,WAAR,mBAAgB,UAAU,IAAK;AAClF,gBAAQ,OAAO,SAAS,KAAK,oBAAoB,aAAQ,WAAR,mBAAgB,QAAQ,IAAK;AAC9E,gBAAQ,OAAO,UAAU,KAAK,oBAAoB,aAAQ,WAAR,mBAAgB,SAAS,IAAK;AAChF,gBAAQ,OAAO,YAAY,KAAK,oBAAoB,aAAQ,WAAR,mBAAgB,WAAW,IAAK;AACpF,gBAAQ,OAAO,eAAe,KAAK,oBAAoB,aAAQ,WAAR,mBAAgB,cAAc,IAAK;AAE1F,eAAO;AAAA,MACX;AASA,eAAS,uBAAwB,oBAAyB,MAAsB;AAC5E,YAAK,GAAG,gBAAiB,eAAgB,GAAI;AACzC,0BAAgB,MAAO,MAAM,CAAC,EAAE,MAAM,KAAM,MAAM,CAAE,CAAE;AAAA,QAC1D;AAAA,MACJ;AASA,eAAS,0BAAoC;AACzC,YAAI,OAAgB;AAEpB,YAAK,eAAe,6BAA8B;AAC9C,gBAAM,MAAc,OAAO,SAAS;AACpC,gBAAM,eAAoB,uBAAwB,GAAI;AAEtD,cAAK,GAAG,QAAS,aAAa,SAAU,GAAI;AACxC,kBAAM,UAAkB,SAAU,aAAa,WAAW,EAAG;AAE7D,gBAAK,CAAC,MAAO,OAAQ,KAAK,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AAC9E,sBAAS,eAAgB,EAAE,WAAW;AAAA,YAC1C;AAAA,UACJ;AAEA,cAAK,GAAG,QAAS,aAAa,MAAO,GAAI;AACrC,mBAAO,aAAa,WAAW;AAAA,UACnC;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AAEA,eAAS,uBAAwB,KAAoB;AACjD,cAAM,eAAoB,CAAC;AAC3B,cAAM,eAAyB,IAAI,MAAO,GAAI;AAE9C,YAAK,aAAa,SAAS,GAAI;AAC3B,gBAAM,aAAuB,aAAc,CAAE,EAAE,MAAO,GAAI;AAC1D,gBAAM,mBAA2B,WAAW;AAE5C,mBAAU,kBAA0B,GAAG,kBAAkB,kBAAkB,mBAAoB;AAC3F,kBAAM,YAAsB,WAAY,eAAgB,EAAE,MAAO,GAAI;AAErE,yBAAc,UAAW,CAAE,CAAE,IAAI,UAAW,CAAE;AAAA,UAClD;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AASA,eAAS,oBAAqB,cAAmC;AAh1BrE;AAi1BQ,cAAM,SAAuB;AAAA,UACzB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACZ;AAEA,YAAI;AACA,cAAK,GAAG,cAAe,YAAa,GAAI;AACpC,mBAAO,SAAS,KAAK,MAAO,YAAa;AAAA,UAC7C;AAAA,QAEJ,SAAU,IAAU;AAChB,cAAI;AACA,mBAAO,SAAS,KAAM,MAAM,eAAe,GAAI;AAE/C,gBAAK,GAAG,gBAAiB,OAAO,MAAO,GAAI;AACvC,qBAAO,SAAS,OAAO,OAAO;AAAA,YAClC;AAAA,UAEJ,SAAU,IAAU;AAChB,gBAAK,CAAC,eAAe,UAAW;AAC5B,sBAAQ,OAAO,oBAAe,oBAAf,mBAAgC,QAAS,eAAgB,GAAG,SAAU,QAAS,eAAgB,GAAG,QAAU;AAC3H,qBAAO,SAAS;AAAA,YACpB;AAEA,mBAAO,SAAS;AAAA,UACpB;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AASA,eAAS,sBAA6B;AAClC,YAAK,QAAQ,OAAO,GAAI;AACpB,wBAAe,KAAM;AAErB,kBAAS,eAAgB,EAAE,WAAW;AAAA,QAC1C;AAAA,MACJ;AASA,eAAS,0BAA2B,mBAAkC,CAAC,GAAW;AAC9E,yBAAiB,KAAK,iBAAkB,kBAAkB,CAAC,CAAmB;AAC9E,uBAAe,WAAW,KAAK,kBAAmB,eAAe,UAAU,IAAK;AAChF,uBAAe,kBAAkB,KAAK,wBAAyB,eAAe,iBAAiB,CAAE,GAAI,CAAE;AACvG,uBAAe,kBAAkB,KAAK,kBAAmB,eAAe,iBAAiB,IAAK;AAC9F,uBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,IAAK;AACtG,uBAAe,mBAAmB,KAAK,kBAAmB,eAAe,kBAAkB,IAAK;AAChG,uBAAe,8BAA8B,KAAK,kBAAmB,eAAe,6BAA6B,IAAK;AACtH,uBAAe,yBAAyB,KAAK,kBAAmB,eAAe,wBAAwB,KAAM;AAC7G,uBAAe,cAAc,KAAK,kBAAmB,eAAe,aAAa,IAAK;AACtF,uBAAe,qBAAqB,KAAK,kBAAmB,eAAe,oBAAoB,KAAM;AACrG,uBAAe,eAAe,KAAK,iBAAkB,eAAe,cAAc,GAAI;AACtF,uBAAe,0BAA0B,KAAK,kBAAmB,eAAe,yBAAyB,IAAK;AAC9G,uBAAe,uCAAuC,KAAK,kBAAmB,eAAe,sCAAsC,KAAM;AACzI,uBAAe,kBAAkB,KAAK,kBAAmB,eAAe,iBAAiB,KAAM;AAC/F,uBAAe,mBAAmB,KAAK,kBAAmB,eAAe,kBAAkB,KAAM;AACjG,uBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,KAAM;AACvG,uBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,KAAM;AAEvG,yCAAiC;AACjC,gDAAwC;AAAA,MAC5C;AAEA,eAAS,mCAA0C;AAC/C,uBAAe,iBAAiB,KAAK,oBAAqB,eAAe,gBAAgB,MAAO;AAChG,uBAAe,iBAAiB,KAAK,oBAAqB,eAAe,gBAAgB,MAAO;AAChG,uBAAe,mBAAmB,KAAK,oBAAqB,eAAe,kBAAkB,QAAS;AACtG,uBAAe,yBAAyB,KAAK,oBAAqB,eAAe,wBAAwB,OAAQ;AACjH,uBAAe,qBAAqB,KAAK,oBAAqB,eAAe,oBAAoB,mBAAoB;AACrH,uBAAe,kBAAkB,KAAK,oBAAqB,eAAe,iBAAiB,4CAA6C;AACxI,uBAAe,6BAA6B,KAAK,oBAAqB,eAAe,4BAA4B,2DAA4D;AAC7K,uBAAe,2BAA2B,KAAK,oBAAqB,eAAe,0BAA0B,gEAAiE;AAC9K,uBAAe,8BAA8B,KAAK,oBAAqB,eAAe,2CAAwC;AAAA,MAClI;AAEA,eAAS,0CAAiD;AACtD,uBAAe,yBAAyB,KAAK,mBAAoB,eAAe,wBAAwB,IAAK;AAAA,MACjH;AASA,YAAM,UAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOvB,OAAO,SAAW,wBAAyC;AACvD,cAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,8BAAkB,KAAK,iBAAkB,OAAO,eAAgB;AAEhE,gBAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,sBAAS,eAAgB,EAAE,WAAW;AAEtC,uCAAyB;AAAA,YAC7B;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,MAAM,SAAW,wBAAyC;AACtD,cAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,8BAAkB,KAAK,iBAAkB,OAAO,eAAgB;AAEhE,gBAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,kBAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,wBAAS,eAAgB,EAAE,WAAW;AAAA,cAC1C;AAEA,uCAAyB;AAAA,YAC7B;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,MAAM,WAAwB;AAC1B,cAAK,QAAQ,OAAO,GAAI;AACpB,0BAAc;AAAA,UAClB;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,QAAQ,WAAsB;AAC1B,iBAAO,GAAG,QAAS,eAAgB,KAAK,gBAAgB,MAAM,YAAY;AAAA,QAC9E;AAAA,QAEA,YAAY,WAAsB;AAC9B,iBAAO,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS;AAAA,QAC3F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,kBAAkB,WAAwB;AACtC,sBAAY;AAEZ,iBAAO;AAAA,QACX;AAAA,QAEA,SAAS,SAAW,SAAsB,SAAsC;AAC5E,cAAK,GAAG,cAAe,OAAQ,KAAK,GAAG,cAAe,OAAQ,GAAI;AAC9D,yBAAc,SAAS,sBAAuB,OAAQ,CAAE;AAExD,oBAAS,eAAgB,EAAE,KAAK,KAAK;AAErC,gCAAoB;AAAA,UACxB;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,SAAW,SAAmC;AAlgClE;AAmgCY,cAAK,GAAG,cAAe,OAAQ,GAAI;AAC/B,gBAAI,UAAmB;AAEvB,qBAAU,SAAS,SAAU;AACzB,kBAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,yBAAU,SAAS,QAAS,KAAM,EAAE,MAAO;AACvC,sBAAK,QAAS,KAAM,EAAE,KAAK,eAAgB,KAAM,GAAI;AACjD,0BAAM,iBAAiC,QAAS,KAAM,EAAE,KAAM,KAAM;AAEpE,wBAAK,eAAe,aAAa,YAAY,SAAU;AACnD,8CAAwB,oBAAe,WAAf,mBAAuB,cAAc,eAAe,aAAa,OAAQ;AAEjG,8BAAS,KAAM,EAAE,KAAK,OAAQ,QAAS,KAAM,EAAE,KAAK,QAAS,eAAe,KAAM,GAAG,CAAE;AAEvF,6BAAO,QAAS,KAAM,EAAE,KAAM,eAAe,KAAM;AAEnD,8BAAS,KAAM,EAAE,KAAK,KAAK;AAE3B,gCAAU;AACV;AAAA,oBACJ;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAEA,gBAAK,CAAC,SAAU;AACZ,yBAAW,yBAA0B,SAAS,iBAAkB;AAAA,YACpE,OAAO;AACH,kCAAoB;AAAA,YACxB;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,SAAW,wBAAyC;AAviCxE;AAwiCY,8BAAoB;AAEpB,mBAAU,aAAa,SAAU;AAC7B,gBAAK,QAAQ,eAAgB,SAAU,GAAI;AACvC,kBAAK,CAAC,GAAG,cAAe,KAAM,KAAK,UAAU,WAAY;AACrD,yBAAU,SAAS,QAAS,SAAU,EAAE,MAAO;AAC3C,sBAAK,QAAS,SAAU,EAAE,KAAK,eAAgB,KAAM,GAAI;AACrD,0BAAM,iBAAiC,QAAS,SAAU,EAAE,KAAM,KAAM;AAExE,4CAAwB,oBAAe,WAAf,mBAAuB,cAAc,eAAe,aAAa,OAAQ;AAAA,kBACrG;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAEA,cAAK,GAAG,cAAe,KAAM,GAAI;AAC7B,gBAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,qBAAO,QAAS,KAAM;AAAA,YAC1B;AAAA,UAEJ,OAAO;AACH,sBAAU,CAAC;AAAA,UACf;AAEA,cAAK,CAAC,GAAG,cAAe,KAAM,KAAK,UAAU,iBAAkB;AAC3D,8BAAmB,OAAQ;AAAA,UAC/B;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,WAAwB;AAChC,qBAAW,yBAA0B,SAAS,MAAM,iBAAkB;AAEtE,iBAAO;AAAA,QACX;AAAA,QAEA,kBAAkB,WAAwB;AACtC,kBAAS,eAAgB,EAAE,KAAK,QAAQ;AAExC,8BAAoB;AAEpB,iBAAO;AAAA,QACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,kBAAkB,SAAW,kBAA8C;AACvE,cAAK,GAAG,cAAe,gBAAiB,GAAI;AACxC,gBAAI,0BAAmC;AAEvC,qBAAU,gBAAgB,kBAAmB;AACzC,kBAAK,iBAAiB,eAAgB,YAAa,KAAK,eAAe,eAAgB,YAAa,KAAK,eAAgB,YAAa,MAAM,iBAAkB,YAAa,GAAI;AAC3K,+BAAgB,YAAa,IAAI,iBAAkB,YAAa;AAChE,0CAA0B;AAAA,cAC9B;AAAA,YACJ;AAEA,gBAAK,yBAA0B;AAC3B,wCAA2B,cAAe;AAAA,YAC9C;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,YAAY,WAAoB;AAC5B,iBAAO;AAAA,QACX;AAAA,MACJ;AASA,OAAE,MAAM;AACJ,kCAA0B;AAE1B,iBAAS,iBAAkB,oBAAoB,MAAM;AACjD,4BAAkB;AAClB,mCAAyB;AACzB,uBAAa;AACb,wBAAc;AACd,sBAAY;AACZ,8BAAoB;AAEpB,cAAK,wBAAwB,GAAI;AAC7B,oBAAQ,KAAK;AAAA,UACjB;AAAA,QACJ,CAAE;AAEF,YAAK,CAAC,GAAG,QAAS,OAAO,QAAS,GAAI;AAClC,iBAAO,WAAW;AAAA,QACtB;AAAA,MACJ,GAAK;AAAA,IACT,GAAK;AAAA;AAAA","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText as string );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText as string );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events?.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events?.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText as string;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText as string;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText as string;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events?.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title as string;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description as string;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events?.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events?.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events?.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip as string );\n } else {\n addToolTip( dot, bindingOptions.title as string );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) as string;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText?.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText?.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group as string );\n\n _groups[ bindingOptions.group as string ].json[ bindingOptions.order as number ] = bindingOptions;\n _groups[ bindingOptions.group as string ].keys.push( bindingOptions.order as number );\n\n fireCustomTriggerEvent( bindingOptions.events?.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events?.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events?.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events?.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events?.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events?.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events?.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events?.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events?.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText?.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events?.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events?.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText as string );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText as string );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText as string;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText as string;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText as string;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title as string;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description as string;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip as string );\n } else {\n addToolTip( dot, bindingOptions.title as string );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) as string;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group as string );\n\n _groups[ bindingOptions.group as string ].json[ bindingOptions.order as number ] = bindingOptions;\n _groups[ bindingOptions.group as string ].keys.push( bindingOptions.order as number );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index 2215f40..b9bbe33 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -23,14 +23,14 @@ var Is; return t(e) && typeof e === "string"; } e.definedString = i; - function l(e) { + function r(e) { return t(e) && typeof e === "function"; } - e.definedFunction = l; - function r(e) { + e.definedFunction = r; + function l(e) { return t(e) && typeof e === "number"; } - e.definedNumber = r; + e.definedNumber = l; function s(e) { return o(e) && e instanceof Array; } @@ -56,14 +56,14 @@ var Data; return Is.definedNumber(e) ? e : t; } e.getDefaultNumber = i; - function l(e, t) { + function r(e, t) { return Is.definedFunction(e) ? e : t; } - e.getDefaultFunction = l; - function r(e, t) { + e.getDefaultFunction = r; + function l(e, t) { return Is.definedObject(e) ? e : t; } - e.getDefaultObject = r; + e.getDefaultObject = l; function s(e, t) { return Is.definedArray(e) ? e : t; } @@ -130,7 +130,7 @@ var DomElement; return o; } e.getStyleValueByName = i; - function l(e, t) { + function r(e, t) { try { if (!e.contains(t)) { e.appendChild(t); @@ -139,8 +139,8 @@ var DomElement; console.warn(e.message); } } - e.addNode = l; - function r(e, t) { + e.addNode = r; + function l(e, t) { try { if (e.contains(t)) { e.removeChild(t); @@ -149,7 +149,7 @@ var DomElement; console.warn(e.message); } } - e.removeNode = r; + e.removeNode = l; function s(e) { e.preventDefault(); e.cancelBubble = true; @@ -158,7 +158,7 @@ var DomElement; function a(e, t) { let o = e.pageX; let i = e.pageY; - const l = n(); + const r = n(); t.style.display = "block"; if (o + t.offsetWidth > window.innerWidth) { o -= t.offsetWidth; @@ -170,17 +170,17 @@ var DomElement; } else { i++; } - if (o < l.left) { + if (o < r.left) { o = e.pageX + 1; } - if (i < l.top) { + if (i < r.top) { i = e.pageY + 1; } t.style.left = o + "px"; t.style.top = i + "px"; } e.showElementAtMousePosition = a; - function u(e, t) { + function _(e, t) { if (t) { if (e.style.display !== "block") { e.style.display = "block"; @@ -191,23 +191,23 @@ var DomElement; } } } - e.showElementBasedOnCondition = u; - function _(e, o) { + e.showElementBasedOnCondition = _; + function u(e, o) { const n = t("div"); const i = t("label", "checkbox"); - const l = t("input"); + const r = t("input"); e.appendChild(n); n.appendChild(i); - i.appendChild(l); - l.type = "checkbox"; - const r = t("span", "check-mark"); + i.appendChild(r); + r.type = "checkbox"; + const l = t("span", "check-mark"); const s = t("span", "text"); s.innerHTML = o; - i.appendChild(r); + i.appendChild(l); i.appendChild(s); - return l; + return r; } - e.createCheckBox = _; + e.createCheckBox = u; function g(e, t) { let o = e.getElementsByClassName(t); while (o[0]) { @@ -321,17 +321,16 @@ var DomElement; makeDialogMovable(); } function onDialogClose(e = true) { - var t; - let o = false; + let t = false; if (Is.definedString(_configuration.closeDialogConfirmationText) && e) { - o = confirm(_configuration.closeDialogConfirmationText); + t = confirm(_configuration.closeDialogConfirmationText); } else { - o = true; + t = true; } - if (o) { + if (t) { const e = getGroupBindingOptions(); if (Is.defined(e) && Is.defined(e._currentView.element)) { - fireCustomTriggerEvent((t = e.events) == null ? void 0 : t.onClose, e._currentView.element); + fireCustomTriggerEvent(e.events.onClose, e._currentView.element); } removeFocusClassFromLastElement(false); hideDisabledBackground(); @@ -347,11 +346,10 @@ var DomElement; } } function onDialogNext() { - var e; if (_groups[_groups_Current].position === _groups[_groups_Current].keys.length - 1) { - const t = getGroupBindingOptions(); + const e = getGroupBindingOptions(); onDialogClose(false); - fireCustomTriggerEvent((e = t.events) == null ? void 0 : e.onFinish, t._currentView.element); + fireCustomTriggerEvent(e.events.onFinish, e._currentView.element); } else { removeFocusClassFromLastElement(); _groups[_groups_Current].position++; @@ -359,10 +357,9 @@ var DomElement; } } function showDialogAndSetPosition() { - var e; - const t = getGroupBindingOptions(); - if (Is.defined(t) && Is.defined(t._currentView.element)) { - if (t.showDisabledBackground) { + const e = getGroupBindingOptions(); + if (Is.defined(e) && Is.defined(e._currentView.element)) { + if (e.showDisabledBackground) { showDisabledBackground(); } else { hideDisabledBackground(); @@ -370,14 +367,14 @@ var DomElement; hideToolTip(); _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? "block" : "none"; _configuration_ShortcutKeysEnabled = true; - t._currentView.element.className += " " + "journey-js-element-focus"; + e._currentView.element.className += " " + "journey-js-element-focus"; if (_configuration.scrollToElements) { - t._currentView.element.scrollIntoView(); + e._currentView.element.scrollIntoView(); } - const o = DomElement.getStyleValueByName(t._currentView.element, "position"); - if (o !== "" && o.toLowerCase() === "static") { - _element_Focus_Element_PositionStyle = o; - t._currentView.element.style.position = "relative"; + const t = DomElement.getStyleValueByName(e._currentView.element, "position"); + if (t !== "" && t.toLowerCase() === "static") { + _element_Focus_Element_PositionStyle = t; + e._currentView.element.style.position = "relative"; } DomElement.showElementBasedOnCondition(_element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain); DomElement.showElementBasedOnCondition(_element_Dialog_ProgressDots, _configuration.showProgressDots && _groups[_groups_Current].keys.length > 1); @@ -391,13 +388,13 @@ var DomElement; } else { _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText; } - setDialogText(t); - setDialogPosition(null, t); + setDialogText(e); + setDialogPosition(null, e); buildProcessDots(); setProgressBarPosition(); - fireCustomTriggerEvent((e = t.events) == null ? void 0 : e.onEnter, t._currentView.element); - if (t.sendClick) { - t._currentView.element.click(); + fireCustomTriggerEvent(e.events.onEnter, e._currentView.element); + if (e.sendClick) { + e._currentView.element.click(); } } } @@ -414,13 +411,12 @@ var DomElement; } } function setDialogPosition(e, t) { - var o, n; if (_element_Dialog.style.display !== "block") { _element_Dialog.style.display = "block"; - fireCustomTriggerEvent((o = t.events) == null ? void 0 : o.onOpen, t._currentView.element); + fireCustomTriggerEvent(t.events.onOpen, t._currentView.element); } if (_groups[_groups_Current].position === 0) { - fireCustomTriggerEvent((n = t.events) == null ? void 0 : n.onStart, t._currentView.element); + fireCustomTriggerEvent(t.events.onStart, t._currentView.element); } _element_Dialog_IsHint = t.isHint === true; if (t.attach || t.isHint) { @@ -449,15 +445,14 @@ var DomElement; } } function removeFocusClassFromLastElement(e = true) { - var t; - const o = getGroupBindingOptions(); - if (Is.defined(o) && Is.defined(o._currentView.element)) { - o._currentView.element.className = o._currentView.element.className.replace(" " + "journey-js-element-focus", ""); + const t = getGroupBindingOptions(); + if (Is.defined(t) && Is.defined(t._currentView.element)) { + t._currentView.element.className = t._currentView.element.className.replace(" " + "journey-js-element-focus", ""); if (Is.defined(_element_Focus_Element_PositionStyle)) { - o._currentView.element.style.position = _element_Focus_Element_PositionStyle; + t._currentView.element.style.position = _element_Focus_Element_PositionStyle; } if (e) { - fireCustomTriggerEvent((t = o.events) == null ? void 0 : t.onLeave, o._currentView.element); + fireCustomTriggerEvent(t.events.onLeave, t._currentView.element); } } } @@ -602,31 +597,29 @@ var DomElement; _groups[_groups_Current].keys.sort(); } function getElement(e) { - var t, o; - let n = true; + let t = true; if (Is.defined(e) && e.hasAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME)) { - const i = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); - if (Is.definedString(i)) { - const o = getObjectFromString(i); - if (o.parsed && Is.definedObject(o.object)) { - setupElement(e, buildAttributeOptions(o.object)); + const o = e.getAttribute(Constants.JOURNEY_JS_ATTRIBUTE_NAME); + if (Is.definedString(o)) { + const n = getObjectFromString(o); + if (n.parsed && Is.definedObject(n.object)) { + setupElement(e, buildAttributeOptions(n.object)); } else { if (!_configuration.safeMode) { - console.error((t = _configuration.attributeNotValidErrorText) == null ? void 0 : t.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); - n = false; + console.error(_configuration.attributeNotValidErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); + t = false; } } } else { if (!_configuration.safeMode) { - console.error((o = _configuration.attributeNotSetErrorText) == null ? void 0 : o.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); - n = false; + console.error(_configuration.attributeNotSetErrorText.replace("{{attribute_name}}", Constants.JOURNEY_JS_ATTRIBUTE_NAME)); + t = false; } } } - return n; + return t; } function setupElement(e, t) { - var o; t._currentView = {}; t._currentView.element = e; if (Is.definedNumber(t.order) && (Is.definedString(t.title) || Is.definedString(t.description))) { @@ -635,7 +628,7 @@ var DomElement; setupNewGroup(t.group); _groups[t.group].json[t.order] = t; _groups[t.group].keys.push(t.order); - fireCustomTriggerEvent((o = t.events) == null ? void 0 : o.onAddStep, e); + fireCustomTriggerEvent(t.events.onAddStep, e); } else { renderHint(t); } @@ -714,7 +707,7 @@ var DomElement; } } function buildAttributeOptions(e) { - let t = !Is.definedObject(e) ? {} : e; + let t = Data.getDefaultObject(e, {}); t.order = Data.getDefaultNumber(t.order, 0); t.attach = Data.getDefaultBoolean(t.attach, true); t.sendClick = Data.getDefaultBoolean(t.sendClick, false); @@ -735,16 +728,15 @@ var DomElement; return e; } function buildAttributeOptionCustomTriggers(e) { - var t, o, n, i, l, r, s, a; e.events = Data.getDefaultObject(e.events, {}); - e.events.onEnter = Data.getDefaultFunction((t = e.events) == null ? void 0 : t.onEnter, null); - e.events.onLeave = Data.getDefaultFunction((o = e.events) == null ? void 0 : o.onLeave, null); - e.events.onClose = Data.getDefaultFunction((n = e.events) == null ? void 0 : n.onClose, null); - e.events.onFinish = Data.getDefaultFunction((i = e.events) == null ? void 0 : i.onFinish, null); - e.events.onOpen = Data.getDefaultFunction((l = e.events) == null ? void 0 : l.onOpen, null); - e.events.onStart = Data.getDefaultFunction((r = e.events) == null ? void 0 : r.onStart, null); - e.events.onAddStep = Data.getDefaultFunction((s = e.events) == null ? void 0 : s.onAddStep, null); - e.events.onRemoveStep = Data.getDefaultFunction((a = e.events) == null ? void 0 : a.onRemoveStep, null); + e.events.onEnter = Data.getDefaultFunction(e.events.onEnter, null); + e.events.onLeave = Data.getDefaultFunction(e.events.onLeave, null); + e.events.onClose = Data.getDefaultFunction(e.events.onClose, null); + e.events.onFinish = Data.getDefaultFunction(e.events.onFinish, null); + e.events.onOpen = Data.getDefaultFunction(e.events.onOpen, null); + e.events.onStart = Data.getDefaultFunction(e.events.onStart, null); + e.events.onAddStep = Data.getDefaultFunction(e.events.onAddStep, null); + e.events.onRemoveStep = Data.getDefaultFunction(e.events.onRemoveStep, null); return e; } function fireCustomTriggerEvent(e, ...t) { @@ -783,7 +775,6 @@ var DomElement; return t; } function getObjectFromString(objectString) { - var _a; const result = { parsed: true, object: null @@ -800,7 +791,7 @@ var DomElement; } } catch (e) { if (!_configuration.safeMode) { - console.error((_a = _configuration.objectErrorText) == null ? void 0 : _a.replace("{{error_1}}", e1.message).replace("{{error_2}}", e.message)); + console.error(_configuration.objectErrorText.replace("{{error_1}}", e1.message).replace("{{error_2}}", e.message)); result.parsed = false; } result.object = null; @@ -897,27 +888,26 @@ var DomElement; return _public; }, removeStep: function(e) { - var t; if (Is.definedObject(e)) { - let o = false; - for (let n in _groups) { - if (_groups.hasOwnProperty(n)) { - for (let i in _groups[n].json) { - if (_groups[n].json.hasOwnProperty(i)) { - const l = _groups[n].json[i]; - if (l._currentView.element === e) { - fireCustomTriggerEvent((t = l.events) == null ? void 0 : t.onRemoveStep, l._currentView.element); - _groups[n].keys.splice(_groups[n].keys.indexOf(l.order), 1); - delete _groups[n].json[l.order]; - _groups[n].keys.sort(); - o = true; + let t = false; + for (let o in _groups) { + if (_groups.hasOwnProperty(o)) { + for (let n in _groups[o].json) { + if (_groups[o].json.hasOwnProperty(n)) { + const i = _groups[o].json[n]; + if (i._currentView.element === e) { + fireCustomTriggerEvent(i.events.onRemoveStep, i._currentView.element); + _groups[o].keys.splice(_groups[o].keys.indexOf(i.order), 1); + delete _groups[o].json[i.order]; + _groups[o].keys.sort(); + t = true; break; } } } } } - if (!o) { + if (!t) { DomElement.clearElementsByClassName(e, "journey-js-hint"); } else { resetDialogPosition(); @@ -926,15 +916,14 @@ var DomElement; return _public; }, clearSteps: function(e = "") { - var t; resetDialogPosition(); - for (let o in _groups) { - if (_groups.hasOwnProperty(o)) { - if (!Is.definedString(e) || e === o) { - for (let e in _groups[o].json) { - if (_groups[o].json.hasOwnProperty(e)) { - const n = _groups[o].json[e]; - fireCustomTriggerEvent((t = n.events) == null ? void 0 : t.onRemoveStep, n._currentView.element); + for (let t in _groups) { + if (_groups.hasOwnProperty(t)) { + if (!Is.definedString(e) || e === t) { + for (let e in _groups[t].json) { + if (_groups[t].json.hasOwnProperty(e)) { + const o = _groups[t].json[e]; + fireCustomTriggerEvent(o.events.onRemoveStep, o._currentView.element); } } } diff --git a/dist/journey.js.map b/dist/journey.js.map index 1fc7f92..3a1db91 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText as string );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText as string );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events?.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events?.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText as string;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText as string;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText as string;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events?.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title as string;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description as string;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events?.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events?.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events?.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip as string );\n } else {\n addToolTip( dot, bindingOptions.title as string );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) as string;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText?.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText?.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group as string );\n\n _groups[ bindingOptions.group as string ].json[ bindingOptions.order as number ] = bindingOptions;\n _groups[ bindingOptions.group as string ].keys.push( bindingOptions.order as number );\n\n fireCustomTriggerEvent( bindingOptions.events?.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = !Is.definedObject( newOptions ) ? {} as BindingOptions : newOptions;\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events?.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events?.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events?.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events?.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events?.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events?.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events?.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events?.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText?.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events?.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events?.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText as string );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText as string );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText as string;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText as string;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText as string;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title as string;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description as string;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip as string );\n } else {\n addToolTip( dot, bindingOptions.title as string );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) as string;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group as string );\n\n _groups[ bindingOptions.group as string ].json[ bindingOptions.order as number ] = bindingOptions;\n _groups[ bindingOptions.group as string ].keys.push( bindingOptions.order as number );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js.min.css b/dist/journey.js.min.css index e629127..3fe7e2e 100644 --- a/dist/journey.js.min.css +++ b/dist/journey.js.min.css @@ -1,2 +1 @@ -/*! Journey.js v2.0.0 | (c) Bunoon 2024 | MIT License */ -:root{--journey-js-default-font:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--journey-js-text-bold-weight:100;--journey-js-title-bold-weight:700;--journey-js-tooltip-bold-weight:300;--journey-js-color-black:#3b3a3a;--journey-js-color-white:#F5F5F5;--journey-js-color-gray:#AAAAAA;--journey-js-color-hint:rgba( 170, 170, 170, 0.5 );--journey-js-dialog-background-color:#002244;--journey-js-dialog-text-color:var(--journey-js-color-white);--journey-js-dialog-border-color:#72A0C1;--journey-js-dialog-button-background-color:#002D62;--journey-js-dialog-button-border-color:#3457D5;--journey-js-dialog-button-text-color:var(--journey-js-color-white);--journey-js-dialog-button-hover-background-color:#007FFF;--journey-js-dialog-button-hover-border-color:var(--journey-js-dialog-button-border-color);--journey-js-dialog-button-hover-text-color:var(--journey-js-dialog-button-text-color);--journey-js-dialog-button-active-background-color:#00b7ff;--journey-js-dialog-button-active-border-color:var(--journey-js-dialog-button-border-color);--journey-js-dialog-button-active-text-color:var(--journey-js-dialog-button-text-color);--journey-js-dialog-button-disabled-background-color:var(--journey-js-dialog-background-color);--journey-js-dialog-close-button-background-color:var(--journey-js-dialog-button-background-color);--journey-js-dialog-close-button-border-color:var(--journey-js-dialog-button-border-color);--journey-js-dialog-close-button-size:1.1rem;--journey-js-dialog-close-button-x-color:var(--journey-js-color-white);--journey-js-dialog-close-button-hover-background-color:var(--journey-js-dialog-button-hover-background-color);--journey-js-dialog-close-button-hover-x-color:var(--journey-js-dialog-close-button-x-color);--journey-js-dialog-close-button-hover-border-color:var(--journey-js-dialog-close-button-border-color);--journey-js-dialog-close-button-active-background-color:var(--journey-js-dialog-button-active-background-color);--journey-js-dialog-close-button-active-x-color:var(--journey-js-dialog-close-button-x-color);--journey-js-dialog-close-button-active-border-color:var(--journey-js-dialog-close-button-border-color);--journey-js-checkbox-background-color-checked:var(--journey-js-dialog-button-border-color);--journey-js-checkbox-background-color:var(--journey-js-dialog-button-background-color);--journey-js-checkbox-border-color-checked:var(--journey-js-checkbox-background-color-checked);--journey-js-checkbox-border-color:var(--journey-js-dialog-button-border-color);--journey-js-checkbox-border-hover-color:var(--journey-js-dialog-button-hover-background-color);--journey-js-tooltip-background-color:var(--journey-js-dialog-background-color);--journey-js-tooltip-border-color:var(--journey-js-dialog-border-color);--journey-js-tooltip-text-color:var(--journey-js-color-white);--journey-js-border-control-radius:0.25rem;--journey-js-border-radius:0.5rem;--journey-js-border-size:0.5px;--journey-js-spacing:10px;--journey-js-spacing-font-size:0.85rem;--journey-js-transition:all .3s;--journey-js-animation-length:0.5s}div.journey-js-dialog{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default;box-sizing:border-box;line-height:normal;font-family:var(--journey-js-default-font);position:absolute;display:none;border-radius:var(--journey-js-border-radius);background-color:var(--journey-js-dialog-background-color);color:var(--journey-js-dialog-text-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-border-color);padding:var(--journey-js-spacing);font-size:var(--journey-js-spacing-font-size);z-index:1001;width:300px;height:auto;transition:var(--journey-js-transition);transition-property:top,left}div.journey-js-dialog *{box-sizing:border-box;line-height:normal}div.journey-js-dialog *::before,div.journey-js-dialog *::after{box-sizing:border-box;line-height:normal}div.journey-js-dialog div:first-of-type{padding-right:calc(var(--journey-js-dialog-close-button-size) + var(--journey-js-spacing))}div.journey-js-dialog div.title{font-size:large;font-weight:var(--journey-js-title-bold-weight);margin-bottom:var(--journey-js-spacing)}div.journey-js-dialog div.description{font-weight:var(--journey-js-text-bold-weight)}div.journey-js-dialog-moving{transition:none!important;transition-property:none!important}div.journey-js-dialog button.close{position:absolute;top:var(--journey-js-spacing);right:var(--journey-js-spacing);width:var(--journey-js-dialog-close-button-size);height:var(--journey-js-dialog-close-button-size);border-radius:.25rem;padding:0;background-color:var(--journey-js-dialog-close-button-background-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-close-button-border-color);transition:var(--journey-js-transition)}div.journey-js-dialog button.close::before,div.journey-js-dialog button.close::after{content:"";width:2px;height:100%;background:var(--journey-js-dialog-close-button-x-color);display:block;transform:rotate(45deg) translateX(0);position:absolute;left:calc(50% - 0.5px);top:0}div.journey-js-dialog button.close::after{transform:rotate(-45deg) translateX(0)}div.journey-js-dialog button.close:active{border:var(--journey-js-border-size) solid var(--journey-js-dialog-close-button-active-border-color)!important;background-color:var(--journey-js-dialog-close-button-active-background-color)!important}div.journey-js-dialog button.close:active::before,div.journey-js-dialog button.close:active::after{background:var(--journey-js-dialog-close-button-active-x-color)!important}div.journey-js-dialog button.close:hover{cursor:pointer;border:var(--journey-js-border-size) solid var(--journey-js-dialog-close-button-hover-border-color);background-color:var(--journey-js-dialog-close-button-hover-background-color)}div.journey-js-dialog button.close:hover::before,div.journey-js-dialog button.close:hover::after{background:var(--journey-js-dialog-close-button-hover-x-color)}div.journey-js-dialog div.progress-dots{margin-top:var(--journey-js-spacing);margin-bottom:var(--journey-js-spacing);text-align:center}div.journey-js-dialog div.progress-dots div.dot,div.journey-js-dialog div.progress-dots div.dot-active{margin:2.5px;display:inline-block;padding:0!important}div.journey-js-dialog div.progress-dots div.dot{border-radius:50%;height:10px;width:10px;background-color:var(--journey-js-dialog-button-background-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-border-color);transition:var(--journey-js-transition)}div.journey-js-dialog div.progress-dots div.dot:active{background-color:var(--journey-js-dialog-button-active-background-color)!important;border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-active-border-color)!important;color:var(--journey-js-color-white)!important}div.journey-js-dialog div.progress-dots div.dot:hover{cursor:pointer;background-color:var(--journey-js-dialog-button-hover-background-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-hover-border-color);color:var(--journey-js-color-white)!important}div.journey-js-dialog div.progress-dots div.dot-number{height:25px!important;width:25px!important;padding:3px;display:inline-flex;justify-content:center;align-content:center;flex-direction:column;font-size:.8rem;border-radius:50%!important;color:var(--journey-js-color-gray)!important}div.journey-js-dialog div.progress-dots div.dot-active{position:relative;transition:var(--journey-js-transition);transition-property:width;border-radius:10px;height:10px;width:20px;background-color:var(--journey-js-dialog-button-border-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-border-color);color:var(--journey-js-color-white)!important}div.journey-js-dialog div.progress-dots div.dot-active::after{content:"";position:absolute;width:15px;height:1px;background-color:var(--journey-js-dialog-button-border-color);bottom:-5px;left:50%;transform:translate(-50%)}div.journey-js-dialog div.progress-bar{border-radius:var(--journey-js-border-radius);margin-top:var(--journey-js-spacing);margin-bottom:var(--journey-js-spacing);background-color:var(--journey-js-dialog-button-background-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-border-color);text-wrap:nowrap;overflow:hidden}div.journey-js-dialog div.progress-bar div.progress-bar-percentage{min-height:10px;background-color:var(--journey-js-dialog-button-border-color);transition:var(--journey-js-transition);transition-property:width;text-align:center;padding:0!important;margin:0!important}div.journey-js-dialog div.progress-bar div.progress-bar-percentage p.progress-bar-percentage-text{padding:calc(var(--journey-js-spacing) / 2)!important;font-size:smaller;margin:0!important;color:var(--journey-js-color-white)}div.journey-js-dialog div.checkbox-container{margin-top:var(--journey-js-spacing);margin-bottom:var(--journey-js-spacing)}div.journey-js-dialog div.checkbox-container label.checkbox{display:inline-block;position:relative;padding-left:25px;color:var(--journey-js-color-white)}div.journey-js-dialog div.checkbox-container label.checkbox input{display:none!important}div.journey-js-dialog div.checkbox-container label.checkbox input:checked~span.check-mark{background-color:var(--journey-js-checkbox-background-color-checked);border:var(--journey-js-border-size) solid var(--journey-js-checkbox-border-color-checked)}div.journey-js-dialog div.checkbox-container label.checkbox input:checked~span.check-mark::before{display:block}div.journey-js-dialog div.checkbox-container label.checkbox input:disabled~span.check-mark,div.journey-js-dialog div.checkbox-container label.checkbox input:disabled~span.text{opacity:.5}div.journey-js-dialog div.checkbox-container label.checkbox input:disabled~span.check-mark{border:var(--journey-js-border-size) solid var(--journey-js-color-black)!important}div.journey-js-dialog div.checkbox-container label.checkbox span.check-mark{position:absolute;top:.5px;left:0;height:15px;width:15px;background-color:var(--journey-js-checkbox-background-color);border-radius:var(--journey-js-border-control-radius);border:var(--journey-js-border-size) solid var(--journey-js-checkbox-border-color);transition:var(--journey-js-transition)}div.journey-js-dialog div.checkbox-container label.checkbox span.check-mark::before{content:"";transform:rotate(45deg);position:absolute;display:none;left:4px;top:.5px;width:6px;height:11px;border:solid var(--journey-js-color-white);border-width:0 2.5px 2.5px 0}div.journey-js-dialog div.checkbox-container label.checkbox:hover span.check-mark{border:var(--journey-js-border-size) solid var(--journey-js-checkbox-border-hover-color)}div.journey-js-dialog div.buttons{margin-top:calc(var(--journey-js-spacing) * 2);text-align:right;border-top:var(--journey-js-border-size) dotted var(--journey-js-dialog-button-border-color);padding-top:var(--journey-js-spacing)}div.journey-js-dialog div.buttons button:first-child{margin-left:0!important}div.journey-js-dialog div.buttons button.back,div.journey-js-dialog div.buttons button.next{border-radius:var(--journey-js-border-radius);background-color:var(--journey-js-dialog-button-background-color);color:var(--journey-js-dialog-button-text-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-border-color);min-width:100px;padding:var(--journey-js-spacing);transition:var(--journey-js-transition);outline:none;margin-left:var(--journey-js-spacing)}div.journey-js-dialog div.buttons button.back:not([disabled]):active,div.journey-js-dialog div.buttons button.next:not([disabled]):active{background-color:var(--journey-js-dialog-button-active-background-color)!important;color:var(--journey-js-dialog-button-active-text-color)!important;border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-active-border-color)!important}div.journey-js-dialog div.buttons button.back:not([disabled]):hover,div.journey-js-dialog div.buttons button.next:not([disabled]):hover{cursor:pointer;background-color:var(--journey-js-dialog-button-hover-background-color);color:var(--journey-js-dialog-button-hover-text-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-hover-border-color)}div.journey-js-dialog div.buttons button.back:disabled,div.journey-js-dialog div.buttons button.next:disabled{background-color:var(--journey-js-dialog-button-disabled-background-color)!important;color:var(--journey-js-color-gray)}div.journey-js-dialog div.buttons button.back{float:left}div.journey-js-dialog div.buttons button.next{font-weight:var(--journey-js-title-bold-weight);float:right}div.journey-js-hint{position:absolute;width:15px;height:15px;border-radius:50%;background-color:var(--journey-js-color-gray);right:-7.5px;top:-7.5px;animation:journey-js-hint-effect 2s infinite;cursor:pointer}@keyframes journey-js-hint-effect{0%{box-shadow:0 0 0 0 var(--journey-js-color-hint)}70%{box-shadow:0 0 0 10px var(--journey-js-color-hint)}100%{box-shadow:0 0 0 0 var(--journey-js-color-hint)}}div.journey-js-disabled-background{z-index:1000;position:fixed;background-color:#000;background-color:rgb(0 0 0 / .5);top:0;left:0;height:100%;width:100%}.journey-js-element-focus{z-index:1001!important}div.journey-js-tooltip{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default;box-sizing:border-box;line-height:normal;font-family:var(--journey-js-default-font);animation:fade-in-animation var(--journey-js-animation-length);position:absolute;background-color:var(--journey-js-tooltip-background-color);border:var(--journey-js-border-size) solid var(--journey-js-tooltip-border-color);color:var(--journey-js-tooltip-text-color);border-radius:var(--journey-js-border-radius);z-index:2000;max-width:300px;padding:var(--journey-js-spacing);font-size:var(--journey-js-spacing-font-size);font-weight:var(--journey-js-tooltip-bold-weight);display:none}@keyframes fade-in-animation{0%{opacity:0}100%{opacity:1}} \ No newline at end of file +:root{--journey-js-default-font: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--journey-js-text-bold-weight: 100;--journey-js-title-bold-weight: 700;--journey-js-tooltip-bold-weight: 300;--journey-js-color-black: #3b3a3a;--journey-js-color-white: #F5F5F5;--journey-js-color-gray: #AAAAAA;--journey-js-color-hint: rgba( 170, 170, 170, 0.5 );--journey-js-dialog-background-color: #002244;--journey-js-dialog-text-color: var(--journey-js-color-white);--journey-js-dialog-border-color: #72A0C1;--journey-js-dialog-button-background-color: #002D62;--journey-js-dialog-button-border-color: #3457D5;--journey-js-dialog-button-text-color: var(--journey-js-color-white);--journey-js-dialog-button-hover-background-color: #007FFF;--journey-js-dialog-button-hover-border-color: var(--journey-js-dialog-button-border-color);--journey-js-dialog-button-hover-text-color: var(--journey-js-dialog-button-text-color);--journey-js-dialog-button-active-background-color: #00b7ff;--journey-js-dialog-button-active-border-color: var(--journey-js-dialog-button-border-color);--journey-js-dialog-button-active-text-color: var(--journey-js-dialog-button-text-color);--journey-js-dialog-button-disabled-background-color: var(--journey-js-dialog-background-color);--journey-js-dialog-close-button-background-color: var(--journey-js-dialog-button-background-color);--journey-js-dialog-close-button-border-color: var(--journey-js-dialog-button-border-color);--journey-js-dialog-close-button-size: 1.1rem;--journey-js-dialog-close-button-x-color: var(--journey-js-color-white);--journey-js-dialog-close-button-hover-background-color: var(--journey-js-dialog-button-hover-background-color);--journey-js-dialog-close-button-hover-x-color: var(--journey-js-dialog-close-button-x-color);--journey-js-dialog-close-button-hover-border-color: var(--journey-js-dialog-close-button-border-color);--journey-js-dialog-close-button-active-background-color: var(--journey-js-dialog-button-active-background-color);--journey-js-dialog-close-button-active-x-color: var(--journey-js-dialog-close-button-x-color);--journey-js-dialog-close-button-active-border-color: var(--journey-js-dialog-close-button-border-color);--journey-js-checkbox-background-color-checked: var(--journey-js-dialog-button-border-color);--journey-js-checkbox-background-color: var(--journey-js-dialog-button-background-color);--journey-js-checkbox-border-color-checked: var(--journey-js-checkbox-background-color-checked);--journey-js-checkbox-border-color: var(--journey-js-dialog-button-border-color);--journey-js-checkbox-border-hover-color: var(--journey-js-dialog-button-hover-background-color);--journey-js-tooltip-background-color: var(--journey-js-dialog-background-color);--journey-js-tooltip-border-color: var(--journey-js-dialog-border-color);--journey-js-tooltip-text-color: var(--journey-js-color-white);--journey-js-border-control-radius: 0.25rem;--journey-js-border-radius: 0.5rem;--journey-js-border-size: 0.5px;--journey-js-spacing: 10px;--journey-js-spacing-font-size: 0.85rem;--journey-js-transition: all .3s;--journey-js-animation-length: 0.5s}div.journey-js-dialog{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default;box-sizing:border-box;line-height:normal;font-family:var(--journey-js-default-font);position:absolute;display:none;border-radius:var(--journey-js-border-radius);background-color:var(--journey-js-dialog-background-color);color:var(--journey-js-dialog-text-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-border-color);padding:var(--journey-js-spacing);font-size:var(--journey-js-spacing-font-size);z-index:1001;width:300px;height:auto;transition:var(--journey-js-transition);transition-property:top,left}div.journey-js-dialog *{box-sizing:border-box;line-height:normal}div.journey-js-dialog *::before,div.journey-js-dialog *::after{box-sizing:border-box;line-height:normal}div.journey-js-dialog div:first-of-type{padding-right:calc(var(--journey-js-dialog-close-button-size) + var(--journey-js-spacing))}div.journey-js-dialog div.title{font-size:large;font-weight:var(--journey-js-title-bold-weight);margin-bottom:var(--journey-js-spacing)}div.journey-js-dialog div.description{font-weight:var(--journey-js-text-bold-weight)}div.journey-js-dialog-moving{transition:none !important;transition-property:none !important}div.journey-js-dialog button.close{position:absolute;top:var(--journey-js-spacing);right:var(--journey-js-spacing);width:var(--journey-js-dialog-close-button-size);height:var(--journey-js-dialog-close-button-size);border-radius:.25rem;padding:0;background-color:var(--journey-js-dialog-close-button-background-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-close-button-border-color);transition:var(--journey-js-transition)}div.journey-js-dialog button.close::before,div.journey-js-dialog button.close::after{content:"";width:2px;height:100%;background:var(--journey-js-dialog-close-button-x-color);display:block;transform:rotate(45deg) translateX(0px);position:absolute;left:calc(50% - .5px);top:0}div.journey-js-dialog button.close::after{transform:rotate(-45deg) translateX(0px)}div.journey-js-dialog button.close:active{border:var(--journey-js-border-size) solid var(--journey-js-dialog-close-button-active-border-color) !important;background-color:var(--journey-js-dialog-close-button-active-background-color) !important}div.journey-js-dialog button.close:active::before,div.journey-js-dialog button.close:active::after{background:var(--journey-js-dialog-close-button-active-x-color) !important}div.journey-js-dialog button.close:hover{cursor:pointer;border:var(--journey-js-border-size) solid var(--journey-js-dialog-close-button-hover-border-color);background-color:var(--journey-js-dialog-close-button-hover-background-color)}div.journey-js-dialog button.close:hover::before,div.journey-js-dialog button.close:hover::after{background:var(--journey-js-dialog-close-button-hover-x-color)}div.journey-js-dialog div.progress-dots{margin-top:var(--journey-js-spacing);margin-bottom:var(--journey-js-spacing);text-align:center}div.journey-js-dialog div.progress-dots div.dot,div.journey-js-dialog div.progress-dots div.dot-active{margin:2.5px;display:inline-block;padding:0 !important}div.journey-js-dialog div.progress-dots div.dot{border-radius:50%;height:10px;width:10px;background-color:var(--journey-js-dialog-button-background-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-border-color);transition:var(--journey-js-transition)}div.journey-js-dialog div.progress-dots div.dot:active{background-color:var(--journey-js-dialog-button-active-background-color) !important;border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-active-border-color) !important;color:var(--journey-js-color-white) !important}div.journey-js-dialog div.progress-dots div.dot:hover{cursor:pointer;background-color:var(--journey-js-dialog-button-hover-background-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-hover-border-color);color:var(--journey-js-color-white) !important}div.journey-js-dialog div.progress-dots div.dot-number{height:25px !important;width:25px !important;padding:3px;display:inline-flex;justify-content:center;align-content:center;flex-direction:column;font-size:.8rem;border-radius:50% !important;color:var(--journey-js-color-gray) !important}div.journey-js-dialog div.progress-dots div.dot-active{position:relative;transition:var(--journey-js-transition);transition-property:width;border-radius:10px;height:10px;width:20px;background-color:var(--journey-js-dialog-button-border-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-border-color);color:var(--journey-js-color-white) !important}div.journey-js-dialog div.progress-dots div.dot-active::after{content:"";position:absolute;width:15px;height:1px;background-color:var(--journey-js-dialog-button-border-color);bottom:-5px;left:50%;transform:translate(-50%)}div.journey-js-dialog div.progress-bar{border-radius:var(--journey-js-border-radius);margin-top:var(--journey-js-spacing);margin-bottom:var(--journey-js-spacing);background-color:var(--journey-js-dialog-button-background-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-border-color);text-wrap:nowrap;overflow:hidden}div.journey-js-dialog div.progress-bar div.progress-bar-percentage{min-height:10px;background-color:var(--journey-js-dialog-button-border-color);transition:var(--journey-js-transition);transition-property:width;text-align:center;padding:0 !important;margin:0 !important}div.journey-js-dialog div.progress-bar div.progress-bar-percentage p.progress-bar-percentage-text{padding:calc(var(--journey-js-spacing)/2) !important;font-size:smaller;margin:0 !important;color:var(--journey-js-color-white)}div.journey-js-dialog div.checkbox-container{margin-top:var(--journey-js-spacing);margin-bottom:var(--journey-js-spacing)}div.journey-js-dialog div.checkbox-container label.checkbox{display:inline-block;position:relative;padding-left:25px;color:var(--journey-js-color-white)}div.journey-js-dialog div.checkbox-container label.checkbox input{display:none !important}div.journey-js-dialog div.checkbox-container label.checkbox input:checked~span.check-mark{background-color:var(--journey-js-checkbox-background-color-checked);border:var(--journey-js-border-size) solid var(--journey-js-checkbox-border-color-checked)}div.journey-js-dialog div.checkbox-container label.checkbox input:checked~span.check-mark::before{display:block}div.journey-js-dialog div.checkbox-container label.checkbox input:disabled~span.check-mark,div.journey-js-dialog div.checkbox-container label.checkbox input:disabled~span.text{opacity:.5}div.journey-js-dialog div.checkbox-container label.checkbox input:disabled~span.check-mark{border:var(--journey-js-border-size) solid var(--journey-js-color-black) !important}div.journey-js-dialog div.checkbox-container label.checkbox span.check-mark{position:absolute;top:.5px;left:0;height:15px;width:15px;background-color:var(--journey-js-checkbox-background-color);border-radius:var(--journey-js-border-control-radius);border:var(--journey-js-border-size) solid var(--journey-js-checkbox-border-color);transition:var(--journey-js-transition)}div.journey-js-dialog div.checkbox-container label.checkbox span.check-mark::before{content:"";transform:rotate(45deg);position:absolute;display:none;left:4px;top:.5px;width:6px;height:11px;border:solid var(--journey-js-color-white);border-width:0 2.5px 2.5px 0}div.journey-js-dialog div.checkbox-container label.checkbox:hover span.check-mark{border:var(--journey-js-border-size) solid var(--journey-js-checkbox-border-hover-color)}div.journey-js-dialog div.buttons{margin-top:calc(var(--journey-js-spacing)*2);text-align:right;border-top:var(--journey-js-border-size) dotted var(--journey-js-dialog-button-border-color);padding-top:var(--journey-js-spacing)}div.journey-js-dialog div.buttons button:first-child{margin-left:0 !important}div.journey-js-dialog div.buttons button.back,div.journey-js-dialog div.buttons button.next{border-radius:var(--journey-js-border-radius);background-color:var(--journey-js-dialog-button-background-color);color:var(--journey-js-dialog-button-text-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-border-color);min-width:100px;padding:var(--journey-js-spacing);transition:var(--journey-js-transition);outline:none;margin-left:var(--journey-js-spacing)}div.journey-js-dialog div.buttons button.back:not([disabled]):active,div.journey-js-dialog div.buttons button.next:not([disabled]):active{background-color:var(--journey-js-dialog-button-active-background-color) !important;color:var(--journey-js-dialog-button-active-text-color) !important;border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-active-border-color) !important}div.journey-js-dialog div.buttons button.back:not([disabled]):hover,div.journey-js-dialog div.buttons button.next:not([disabled]):hover{cursor:pointer;background-color:var(--journey-js-dialog-button-hover-background-color);color:var(--journey-js-dialog-button-hover-text-color);border:var(--journey-js-border-size) solid var(--journey-js-dialog-button-hover-border-color)}div.journey-js-dialog div.buttons button.back:disabled,div.journey-js-dialog div.buttons button.next:disabled{background-color:var(--journey-js-dialog-button-disabled-background-color) !important;color:var(--journey-js-color-gray)}div.journey-js-dialog div.buttons button.back{float:left}div.journey-js-dialog div.buttons button.next{font-weight:var(--journey-js-title-bold-weight);float:right}div.journey-js-hint{position:absolute;width:15px;height:15px;border-radius:50%;background-color:var(--journey-js-color-gray);right:-7.5px;top:-7.5px;animation:journey-js-hint-effect 2s infinite;cursor:pointer}@keyframes journey-js-hint-effect{0%{box-shadow:0 0 0 0 var(--journey-js-color-hint)}70%{box-shadow:0 0 0 10px var(--journey-js-color-hint)}100%{box-shadow:0 0 0 0 var(--journey-js-color-hint)}}div.journey-js-disabled-background{z-index:1000;position:fixed;background-color:#000;background-color:rgba(0,0,0,.5);top:0;left:0;height:100%;width:100%}.journey-js-element-focus{z-index:1001 !important}div.journey-js-tooltip{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:default;box-sizing:border-box;line-height:normal;font-family:var(--journey-js-default-font);animation:fade-in-animation var(--journey-js-animation-length);position:absolute;background-color:var(--journey-js-tooltip-background-color);border:var(--journey-js-border-size) solid var(--journey-js-tooltip-border-color);color:var(--journey-js-tooltip-text-color);border-radius:var(--journey-js-border-radius);z-index:2000;max-width:300px;padding:var(--journey-js-spacing);font-size:var(--journey-js-spacing-font-size);font-weight:var(--journey-js-tooltip-bold-weight);display:none}@keyframes fade-in-animation{0%{opacity:0}100%{opacity:1}} diff --git a/dist/journey.min.js b/dist/journey.min.js index 933a562..4e56920 100644 --- a/dist/journey.min.js +++ b/dist/journey.min.js @@ -1,29 +1 @@ -/*! Journey.js v2.0.0 | (c) Bunoon 2024 | MIT License */ -(function(){function oa(a){e=ea(a,{});e["default"]={json:{},keys:[],position:0}}function U(){return e[f].json[e[f].keys[e[f].position]]}function Ia(){M=p("div","journey-js-disabled-background");M.onclick=function(){d.closeDialogOnDisabledBackgroundClick&&G()}}function Ja(){g=p("div","journey-js-dialog");g.style.display="none";q.body.appendChild(g);N=p("button","close");g.appendChild(N);N.onclick=function(){G()};fa(N,d.closeButtonToolTipText);E=p("div","title");g.appendChild(E);V=p("div", -"description");g.appendChild(V);O=p("div","checkbox-container");g.appendChild(O);ha=Ka(O,d.doNotShowAgainText).input;ha.onchange=function(){d.showDoNotShowAgain&&w(d.onDoNotShowAgainChange,ha.checked)};H=p("div","progress-dots");g.appendChild(H);I=p("div","progress-bar");g.appendChild(I);W=p("div","progress-bar-percentage");I.appendChild(W);X=p("p","progress-bar-percentage-text");W.appendChild(X);J=p("div","buttons");g.appendChild(J);P=p("button","back");P.onclick=pa;J.appendChild(P);Y=p("button", -"next");Y.onclick=qa;J.appendChild(Y);E.onmousedown=La;E.onmouseup=ra;E.oncontextmenu=ra;q.body.addEventListener("mousemove",Ma);q.body.addEventListener("mouseleave",Na)}function G(a){a=m(a,!0);if(u(d.closeDialogConfirmationText)&&a?confirm(d.closeDialogConfirmationText):1)a=U(),n(a)&&n(a.currentView.element)&&w(a.events.onClose,a.currentView.element),K(!1),sa(q.body,M),Q(),g.style.display="none"}function pa(){0=e[f].keys.length-1?d.finishButtonText:d.nextButtonText;ua(a);va(null,a);H.innerHTML=v.empty;if(d.showProgressDots)for(b=e[f].keys.length,c=0;cr.innerWidth||b.alignRight)a-=g.offsetWidth,a+=b.currentView.element.offsetWidth;if(c+g.offsetHeight>r.innerHeight||b.alignTop)c-=g.offsetHeight+b.currentView.element.offsetHeight; -g.style.top=c+"px";g.style.left=a+"px"}else a=ya(),b=Z.max(0,(r.innerWidth-g.offsetWidth)/2+a.left),a=Z.max(0,(r.innerHeight-g.offsetHeight)/2+a.top),g.style.left=b+"px",g.style.top=a+"px"}function K(a){a=n(a)?a:!0;var b=U();n(b)&&n(b.currentView.element)&&(b.currentView.element.className=b.currentView.element.className.replace(v.space+"journey-js-element-focus",v.empty),n(ja)&&(b.currentView.element.style.position=ja),a&&w(b.events.onLeave,b.currentView.element))}function Oa(a,b){b=e[f].json[b]; -var c=null;a===e[f].position?c=p("div","dot-active"):(c=p("div","dot"),c.onclick=function(){K();e[f].position=a;B()});H.appendChild(c);d.showProgressDotToolTips&&(u(b.tooltip)?fa(c,b.tooltip):fa(c,b.title));d.showProgressDotNumbers&&(c.className+=" dot-number",c.innerHTML=(a+1).toString())}function La(a){F||wa||!d.dialogMovingEnabled||(g.className+=" journey-js-dialog-moving",F=!0,za=a.pageX-g.offsetLeft,Aa=a.pageY-g.offsetTop,aa=g.offsetLeft,ba=g.offsetTop)}function ra(){F&&(F=!1,ba=aa=0,g.className= -"journey-js-dialog")}function Ma(a){F&&(g.style.left=a.pageX-za+"px",g.style.top=a.pageY-Aa+"px")}function Na(){F&&(g.style.left=aa+"px",g.style.top=ba+"px",F=!1,ba=aa=0,g.className="journey-js-dialog")}function Pa(){n(x)||(x=p("div","journey-js-tooltip"),x.style.display="none",q.body.appendChild(x),q.body.addEventListener("mousemove",function(){Q()}),q.addEventListener("scroll",function(){Q()}))}function fa(a,b){null!==a&&(a.onmousemove=function(c){Qa(c,b)})}function Qa(a,b){Ba(a);Q();ca=setTimeout(function(){x.innerHTML= -b;x.style.display="block";xa(a,x)},d.tooltipDelay)}function Q(){n(x)&&(n(ca)&&(clearTimeout(ca),ca=null),"block"===x.style.display&&(x.style.display="none"))}function Ca(){for(var a=d.domElementTypes,b=a.length,c=0;cr.innerWidth?c-=b.offsetWidth:c++;h+b.offsetHeight>r.innerHeight?h-=b.offsetHeight:h++;c=e[f].keys.length-1};k.addDocumentSteps=function(){Ca();return k};k.addStep=function(a,b){D(a)&&D(b)&&(Da(a,Ea(b)),e[f].keys.sort(),da());return k};k.removeStep=function(a){if(D(a)){var b=!1,c;for(c in e)if(e.hasOwnProperty(c))for(var h in e[c].json)if(e[c].json.hasOwnProperty(h)){var l=e[c].json[h];if(l.currentView.element===a){w(l.events.onRemoveStep,l.currentView.element);e[c].keys.splice(e[c].keys.indexOf(l.order),1);delete e[c].json[l.order];e[c].keys.sort();b= -!0;break}}b?da():la(a,"journey-js-hint")}return k};k.clearSteps=function(a){da();for(var b in e)if(e.hasOwnProperty(b)&&(!u(a)||a===b))for(var c in e[b].json)if(e[b].json.hasOwnProperty(c)){var h=e[b].json[c];w(h.events.onRemoveStep,h.currentView.element)}u(a)?e.hasOwnProperty(a)&&delete e[a]:e={};u(a)&&"default"!==a||oa(e);return k};k.clearHints=function(){la(q.body,"journey-js-hint");return k};k.reverseStepOrder=function(){e[f].keys.reverse();da();return k};k.setConfiguration=function(a){if(D(a)){var b= -!1,c;for(c in a)a.hasOwnProperty(c)&&d.hasOwnProperty(c)&&d[c]!==a[c]&&(d[c]=a[c],b=!0);b&&Ga(d)}return k};k.getVersion=function(){return"2.0.0"};(function(a,b,c,h){q=a;r=b;Z=c;Fa=h;Ga();q.addEventListener("DOMContentLoaded",function(){oa();Ia();Ja();Pa();Ca();var l=void 0,C=(l=n(l)?l:!0)?q.addEventListener:q.removeEventListener;l=l?r.addEventListener:r.removeEventListener;d.shortcutKeysEnabled&&C("keydown",Ta);l("resize",Ua);C=!1;if(d.browserUrlParametersEnabled){l={};var t=r.location.href.split("?"); -if(1{function t(e){return null!=e&&""!==e}function o(e){return t(e)&&"object"==typeof e}e.defined=t,e.definedObject=o,e.definedBoolean=function(e){return t(e)&&"boolean"==typeof e},e.definedString=function(e){return t(e)&&"string"==typeof e},e.definedFunction=function(e){return t(e)&&"function"==typeof e},e.definedNumber=function(e){return t(e)&&"number"==typeof e},e.definedArray=function(e){return o(e)&&e instanceof Array}})(Is||(Is={})),(e=>{function t(e,t){return Is.definedArray(e)?e:t}e.getDefaultAnyString=function(e,t){return"string"==typeof e?e:t},e.getDefaultString=function(e,t){return Is.definedString(e)?e:t},e.getDefaultBoolean=function(e,t){return Is.definedBoolean(e)?e:t},e.getDefaultNumber=function(e,t){return Is.definedNumber(e)?e:t},e.getDefaultFunction=function(e,t){return Is.definedFunction(e)?e:t},e.getDefaultObject=function(e,t){return Is.definedObject(e)?e:t},e.getDefaultArray=t,e.getDefaultStringOrArray=function(e,o){let n=o;if(Is.definedString(e)){const t=e.toString().split(" ");0===t.length?e=o:n=t}else n=t(e,o);return n}})(Data||(Data={})),(e=>{function t(e,t=""){const o=e.toLowerCase();let n="text"===o?document.createTextNode(""):document.createElement(o);return Is.defined(t)&&(n.className=t),n}function o(){const e=document.documentElement;return{left:(window.pageXOffset||e.scrollLeft)-(e.clientLeft||0),top:(window.pageYOffset||e.scrollTop)-(e.clientTop||0)}}e.create=t,e.getOffset=function(e){const t={left:0,top:0};for(;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t.left+=e.offsetLeft-e.scrollLeft,t.top+=e.offsetTop-e.scrollTop,e=e.offsetParent;return t},e.getScrollPosition=o,e.getStyleValueByName=function(e,t){let o=null;return document.defaultView.getComputedStyle?o=document.defaultView.getComputedStyle(e,null).getPropertyValue(t):e.currentStyle&&(o=e.currentStyle[t]),o},e.addNode=function(e,t){try{e.contains(t)||e.appendChild(t)}catch(e){console.warn(e.message)}},e.removeNode=function(e,t){try{e.contains(t)&&e.removeChild(t)}catch(e){console.warn(e.message)}},e.cancelBubble=function(e){e.preventDefault(),e.cancelBubble=!0},e.showElementAtMousePosition=function(e,t){let n=e.pageX,i=e.pageY;const r=o();t.style.display="block",n+t.offsetWidth>window.innerWidth?n-=t.offsetWidth:n++,i+t.offsetHeight>window.innerHeight?i-=t.offsetHeight:i++,n{let _configuration={},_configuration_ShortcutKeysEnabled=!0;const _groups_Default="default";let _groups_Current=_groups_Default,_groups={},_element_Focus_Element_PositionStyle="",_element_Disabled_Background,_element_Dialog,_element_Dialog_Close_Button,_element_Dialog_Title,_element_Dialog_Description,_element_Dialog_CheckBox_Container,_element_Dialog_CheckBox_Input,_element_Dialog_ProgressDots,_element_Dialog_ProgressBar,_element_Dialog_ProgressBar_Percentage,_element_Dialog_ProgressBar_Percentage_Text,_element_Dialog_Buttons,_element_Dialog_Buttons_Back_Button,_element_Dialog_Buttons_Next_Button,_element_Dialog_IsHint=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_X=0,_element_Dialog_Move_Y=0,_element_ToolTip,_element_ToolTip_Timer=0;function setupDefaultGroup(e=null){_groups=Data.getDefaultObject(e,{}),_groups[_groups_Default]={json:{},keys:[],position:0}}function setupNewGroup(e){_groups.hasOwnProperty(e)||(_groups[e]={json:{},keys:[],position:0})}function getGroupBindingOptions(){return _groups[_groups_Current].json[_groups[_groups_Current].keys[_groups[_groups_Current].position]]}function renderDisabledBackground(){_element_Disabled_Background=DomElement.create("div","journey-js-disabled-background"),_element_Disabled_Background.onclick=()=>{_configuration.closeDialogOnDisabledBackgroundClick&&onDialogClose()}}function showDisabledBackground(){DomElement.addNode(document.body,_element_Disabled_Background)}function hideDisabledBackground(){DomElement.removeNode(document.body,_element_Disabled_Background)}function renderDialog(){_element_Dialog=DomElement.create("div","journey-js-dialog"),_element_Dialog.style.display="none",document.body.appendChild(_element_Dialog),_element_Dialog_Close_Button=DomElement.create("button","close"),_element_Dialog.appendChild(_element_Dialog_Close_Button),_element_Dialog_Close_Button.onclick=()=>{onDialogClose()},addToolTip(_element_Dialog_Close_Button,_configuration.closeButtonToolTipText),_element_Dialog_Title=DomElement.create("div","title"),_element_Dialog.appendChild(_element_Dialog_Title),_element_Dialog_Description=DomElement.create("div","description"),_element_Dialog.appendChild(_element_Dialog_Description),_element_Dialog_CheckBox_Container=DomElement.create("div","checkbox-container"),_element_Dialog.appendChild(_element_Dialog_CheckBox_Container),_element_Dialog_CheckBox_Input=DomElement.createCheckBox(_element_Dialog_CheckBox_Container,_configuration.doNotShowAgainText),_element_Dialog_CheckBox_Input.onchange=()=>{_configuration.showDoNotShowAgain&&fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange,_element_Dialog_CheckBox_Input.checked)},_element_Dialog_ProgressDots=DomElement.create("div","progress-dots"),_element_Dialog.appendChild(_element_Dialog_ProgressDots),_element_Dialog_ProgressBar=DomElement.create("div","progress-bar"),_element_Dialog.appendChild(_element_Dialog_ProgressBar),_element_Dialog_ProgressBar_Percentage=DomElement.create("div","progress-bar-percentage"),_element_Dialog_ProgressBar.appendChild(_element_Dialog_ProgressBar_Percentage),_element_Dialog_ProgressBar_Percentage_Text=DomElement.create("p","progress-bar-percentage-text"),_element_Dialog_ProgressBar_Percentage.appendChild(_element_Dialog_ProgressBar_Percentage_Text),_element_Dialog_Buttons=DomElement.create("div","buttons"),_element_Dialog.appendChild(_element_Dialog_Buttons),_element_Dialog_Buttons_Back_Button=DomElement.create("button","back"),_element_Dialog_Buttons_Back_Button.onclick=onDialogBack,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Back_Button),_element_Dialog_Buttons_Next_Button=DomElement.create("button","next"),_element_Dialog_Buttons_Next_Button.onclick=onDialogNext,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Next_Button),makeDialogMovable()}function onDialogClose(e=!0){let t=!1;if(t=!Is.definedString(_configuration.closeDialogConfirmationText)||!e||confirm(_configuration.closeDialogConfirmationText),t){const e=getGroupBindingOptions();Is.defined(e)&&Is.defined(e._currentView.element)&&fireCustomTriggerEvent(e.events.onClose,e._currentView.element),removeFocusClassFromLastElement(!1),hideDisabledBackground(),hideToolTip(),_element_Dialog.style.display="none"}}function onDialogBack(){_groups[_groups_Current].position>0&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position--,showDialogAndSetPosition())}function onDialogNext(){if(_groups[_groups_Current].position===_groups[_groups_Current].keys.length-1){const e=getGroupBindingOptions();onDialogClose(!1),fireCustomTriggerEvent(e.events.onFinish,e._currentView.element)}else removeFocusClassFromLastElement(),_groups[_groups_Current].position++,showDialogAndSetPosition()}function showDialogAndSetPosition(){const e=getGroupBindingOptions();if(Is.defined(e)&&Is.defined(e._currentView.element)){e.showDisabledBackground?showDisabledBackground():hideDisabledBackground(),hideToolTip(),_element_Dialog_Close_Button.style.display=_configuration.showCloseButton?"block":"none",_configuration_ShortcutKeysEnabled=!0,e._currentView.element.className+=" journey-js-element-focus",_configuration.scrollToElements&&e._currentView.element.scrollIntoView();const t=DomElement.getStyleValueByName(e._currentView.element,"position");""!==t&&"static"===t.toLowerCase()&&(_element_Focus_Element_PositionStyle=t,e._currentView.element.style.position="relative"),DomElement.showElementBasedOnCondition(_element_Dialog_CheckBox_Container,_configuration.showDoNotShowAgain),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressDots,_configuration.showProgressDots&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar,_configuration.showProgressBar&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text,_configuration.showProgressBarText),DomElement.showElementBasedOnCondition(_element_Dialog_Buttons,_configuration.showButtons),_element_Dialog_Buttons_Back_Button.innerHTML=_configuration.backButtonText,_element_Dialog_Buttons_Back_Button.disabled=0===_groups[_groups_Current].position,_groups[_groups_Current].position>=_groups[_groups_Current].keys.length-1?_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.finishButtonText:_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.nextButtonText,setDialogText(e),setDialogPosition(null,e),buildProcessDots(),setProgressBarPosition(),fireCustomTriggerEvent(e.events.onEnter,e._currentView.element),e.sendClick&&e._currentView.element.click()}}function setDialogText(e){Is.definedString(e.title)?_element_Dialog_Title.innerHTML=e.title:_element_Dialog_Title.innerHTML="",Is.definedString(e.description)?_element_Dialog_Description.innerHTML=e.description:_element_Dialog_Description.innerHTML=""}function setDialogPosition(e,t){if("block"!==_element_Dialog.style.display&&(_element_Dialog.style.display="block",fireCustomTriggerEvent(t.events.onOpen,t._currentView.element)),0===_groups[_groups_Current].position&&fireCustomTriggerEvent(t.events.onStart,t._currentView.element),_element_Dialog_IsHint=!0===t.isHint,t.attach||t.isHint)if(t.isHint&&t.alignHintToClickPosition)DomElement.showElementAtMousePosition(e,_element_Dialog);else{const e=DomElement.getOffset(t._currentView.element);let o=e.top+t._currentView.element.offsetHeight,n=e.left;(n+_element_Dialog.offsetWidth>window.innerWidth||t.alignRight)&&(n-=_element_Dialog.offsetWidth,n+=t._currentView.element.offsetWidth),(o+_element_Dialog.offsetHeight>window.innerHeight||t.alignTop)&&(o-=_element_Dialog.offsetHeight+t._currentView.element.offsetHeight),_element_Dialog.style.top=o+"px",_element_Dialog.style.left=n+"px"}else{const e=DomElement.getScrollPosition(),t=Math.max(0,(window.innerWidth-_element_Dialog.offsetWidth)/2+e.left),o=Math.max(0,(window.innerHeight-_element_Dialog.offsetHeight)/2+e.top);_element_Dialog.style.left=t+"px",_element_Dialog.style.top=o+"px"}}function removeFocusClassFromLastElement(e=!0){const t=getGroupBindingOptions();Is.defined(t)&&Is.defined(t._currentView.element)&&(t._currentView.element.className=t._currentView.element.className.replace(" journey-js-element-focus",""),Is.defined(_element_Focus_Element_PositionStyle)&&(t._currentView.element.style.position=_element_Focus_Element_PositionStyle),e&&fireCustomTriggerEvent(t.events.onLeave,t._currentView.element))}function buildProcessDots(){if(_element_Dialog_ProgressDots.innerHTML="",_configuration.showProgressDots){const e=_groups[_groups_Current].keys.length;for(let t=0;t{removeFocusClassFromLastElement(),_groups[_groups_Current].position=e,showDialogAndSetPosition()}),_element_Dialog_ProgressDots.appendChild(n),_configuration.showProgressDotToolTips&&(Is.definedString(o.tooltip)?addToolTip(n,o.tooltip):addToolTip(n,o.title)),_configuration.showProgressDotNumbers&&(n.className+=" dot-number",n.innerHTML=(e+1).toString())}function setProgressBarPosition(){if(_configuration.showProgressBar){const e=_element_Dialog_ProgressBar.offsetWidth/_groups[_groups_Current].keys.length,t=(_groups[_groups_Current].position+1)*e,o=Math.ceil((_groups[_groups_Current].position+1)/_groups[_groups_Current].keys.length*100);_element_Dialog_ProgressBar_Percentage.style.width=t+"px",_element_Dialog_ProgressBar_Percentage_Text.innerHTML=o+"%"}}function makeDialogMovable(){_element_Dialog_Title.onmousedown=onMoveTitleBarMouseDown,_element_Dialog_Title.onmouseup=onMoveTitleBarMouseUp,_element_Dialog_Title.oncontextmenu=onMoveTitleBarMouseUp,document.body.addEventListener("mousemove",onMoveDocumentMouseMove),document.body.addEventListener("mouseleave",onMoveDocumentMouseLeave)}function onMoveTitleBarMouseDown(e){_element_Dialog_Move_IsMoving||_element_Dialog_IsHint||!_configuration.dialogMovingEnabled||(_element_Dialog.className+=" journey-js-dialog-moving",_element_Dialog_Move_IsMoving=!0,_element_Dialog_Move_X=e.pageX-_element_Dialog.offsetLeft,_element_Dialog_Move_Y=e.pageY-_element_Dialog.offsetTop,_element_Dialog_Move_Original_X=_element_Dialog.offsetLeft,_element_Dialog_Move_Original_Y=_element_Dialog.offsetTop)}function onMoveTitleBarMouseUp(){_element_Dialog_Move_IsMoving&&(_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function onMoveDocumentMouseMove(e){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=e.pageX-_element_Dialog_Move_X+"px",_element_Dialog.style.top=e.pageY-_element_Dialog_Move_Y+"px")}function onMoveDocumentMouseLeave(){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=_element_Dialog_Move_Original_X+"px",_element_Dialog.style.top=_element_Dialog_Move_Original_Y+"px",_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function renderToolTip(){Is.defined(_element_ToolTip)||(_element_ToolTip=DomElement.create("div","journey-js-tooltip"),_element_ToolTip.style.display="none",document.body.appendChild(_element_ToolTip),document.body.addEventListener("mousemove",(()=>{hideToolTip()})),document.addEventListener("scroll",(()=>{hideToolTip()})))}function addToolTip(e,t){null!==e&&(e.onmousemove=e=>{showToolTip(e,t)})}function showToolTip(e,t){DomElement.cancelBubble(e),hideToolTip(),_element_ToolTip_Timer=setTimeout((()=>{_element_ToolTip.innerHTML=t,_element_ToolTip.style.display="block",DomElement.showElementAtMousePosition(e,_element_ToolTip)}),_configuration.tooltipDelay)}function hideToolTip(){Is.defined(_element_ToolTip)&&(0!==_element_ToolTip_Timer&&(clearTimeout(_element_ToolTip_Timer),_element_ToolTip_Timer=0),"block"===_element_ToolTip.style.display&&(_element_ToolTip.style.display="none"))}function getElements(){const e=_configuration.domElementTypes,t=e.length;for(let o=0;o{DomElement.cancelBubble(t),_element_Dialog_CheckBox_Container.style.display="none",_element_Dialog_ProgressDots.style.display="none",_element_Dialog_ProgressBar.style.display="none",_element_Dialog_Buttons.style.display="none",_configuration_ShortcutKeysEnabled=!1,setDialogText(e),setDialogPosition(t,e),e.removeHintWhenViewed&&DomElement.clearElementsByClassName(e._currentView.element,"journey-js-hint")}}function buildDocumentEvents(e=!0){const t=e?document.addEventListener:document.removeEventListener,o=e?window.addEventListener:window.removeEventListener;_configuration.shortcutKeysEnabled&&t("keydown",onWindowKeyDown),o("resize",onWindowResize)}function onWindowKeyDown(e){_public.isOpen()&&_configuration.shortcutKeysEnabled&&("Escape"===e.code?(e.preventDefault(),onDialogClose()):_configuration_ShortcutKeysEnabled&&("ArrowLeft"===e.code?(e.preventDefault(),onDialogBack()):"ArrowRight"===e.code?(e.preventDefault(),onDialogNext()):"ArrowUp"===e.code?(e.preventDefault(),onWindowKeyCodeUp()):"ArrowDown"===e.code&&(e.preventDefault(),onWindowKeyCodeDown())))}function onWindowResize(){_public.isOpen()&&showDialogAndSetPosition()}function onWindowKeyCodeUp(){0!==_groups[_groups_Current].position&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=0,showDialogAndSetPosition())}function onWindowKeyCodeDown(){_groups[_groups_Current].position!==_groups[_groups_Current].keys.length-1&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=_groups[_groups_Current].keys.length-1,showDialogAndSetPosition())}function buildAttributeOptions(e){let t=Data.getDefaultObject(e,{});return t.order=Data.getDefaultNumber(t.order,0),t.attach=Data.getDefaultBoolean(t.attach,!0),t.sendClick=Data.getDefaultBoolean(t.sendClick,!1),t.alignTop=Data.getDefaultBoolean(t.alignTop,!1),t.alignRight=Data.getDefaultBoolean(t.alignRight,!1),t.isHint=Data.getDefaultBoolean(t.isHint,!1),t.alignHintToClickPosition=Data.getDefaultBoolean(t.alignHintToClickPosition,!1),t.showDisabledBackground=Data.getDefaultBoolean(t.showDisabledBackground,!0),t.removeHintWhenViewed=Data.getDefaultBoolean(t.removeHintWhenViewed,!1),t.group=Data.getDefaultString(t.group,_groups_Default),t=buildAttributeOptionStrings(t),buildAttributeOptionCustomTriggers(t)}function buildAttributeOptionStrings(e){return e.title=Data.getDefaultString(e.title,""),e.description=Data.getDefaultString(e.description,""),e.tooltip=Data.getDefaultString(e.tooltip,""),e}function buildAttributeOptionCustomTriggers(e){return e.events=Data.getDefaultObject(e.events,{}),e.events.onEnter=Data.getDefaultFunction(e.events.onEnter,null),e.events.onLeave=Data.getDefaultFunction(e.events.onLeave,null),e.events.onClose=Data.getDefaultFunction(e.events.onClose,null),e.events.onFinish=Data.getDefaultFunction(e.events.onFinish,null),e.events.onOpen=Data.getDefaultFunction(e.events.onOpen,null),e.events.onStart=Data.getDefaultFunction(e.events.onStart,null),e.events.onAddStep=Data.getDefaultFunction(e.events.onAddStep,null),e.events.onRemoveStep=Data.getDefaultFunction(e.events.onRemoveStep,null),e}function fireCustomTriggerEvent(e,...t){Is.definedFunction(e)&&e.apply(null,[].slice.call(t,0))}function getBrowserUrlParameters(){let e=!1;if(_configuration.browserUrlParametersEnabled){const t=getBrowserUrlArguments(window.location.href);if(Is.defined(t.sjOrderId)){const e=parseInt(t.sjOrderId,10);!isNaN(e)&&e<=_groups[_groups_Current].keys.length-1&&(_groups[_groups_Current].position=e)}Is.defined(t.sjShow)&&(e="true"===t.sjShow)}return e}function getBrowserUrlArguments(e){const t={},o=e.split("?");if(o.length>1){const e=o[1].split("&"),n=e.length;for(let o=0;o=_groups[_groups_Current].keys.length-1},addDocumentSteps:function(){return getElements(),_public},addStep:function(e,t){return Is.definedObject(e)&&Is.definedObject(t)&&(setupElement(e,buildAttributeOptions(t)),_groups[_groups_Current].keys.sort(),resetDialogPosition()),_public},removeStep:function(e){if(Is.definedObject(e)){let t=!1;for(let o in _groups)if(_groups.hasOwnProperty(o))for(let n in _groups[o].json)if(_groups[o].json.hasOwnProperty(n)){const i=_groups[o].json[n];if(i._currentView.element===e){fireCustomTriggerEvent(i.events.onRemoveStep,i._currentView.element),_groups[o].keys.splice(_groups[o].keys.indexOf(i.order),1),delete _groups[o].json[i.order],_groups[o].keys.sort(),t=!0;break}}t?resetDialogPosition():DomElement.clearElementsByClassName(e,"journey-js-hint")}return _public},clearSteps:function(e=""){resetDialogPosition();for(let t in _groups)if(_groups.hasOwnProperty(t)&&(!Is.definedString(e)||e===t))for(let e in _groups[t].json)if(_groups[t].json.hasOwnProperty(e)){const o=_groups[t].json[e];fireCustomTriggerEvent(o.events.onRemoveStep,o._currentView.element)}return Is.definedString(e)?_groups.hasOwnProperty(e)&&delete _groups[e]:_groups={},Is.definedString(e)&&e!==_groups_Default||setupDefaultGroup(_groups),_public},clearHints:function(){return DomElement.clearElementsByClassName(document.body,"journey-js-hint"),_public},reverseStepOrder:function(){return _groups[_groups_Current].keys.reverse(),resetDialogPosition(),_public},setConfiguration:function(e){if(Is.definedObject(e)){let t=!1;for(let o in e)e.hasOwnProperty(o)&&_configuration.hasOwnProperty(o)&&_configuration[o]!==e[o]&&(_configuration[o]=e[o],t=!0);t&&buildDefaultConfiguration(_configuration)}return _public},getVersion:function(){return"2.0.0"}};buildDefaultConfiguration(),document.addEventListener("DOMContentLoaded",(()=>{setupDefaultGroup(),renderDisabledBackground(),renderDialog(),renderToolTip(),getElements(),buildDocumentEvents(),getBrowserUrlParameters()&&_public.show()})),Is.defined(window.$journey)||(window.$journey=_public)})(); \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 2980ffc..53d60c3 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -216,7 +216,7 @@ type Groups = Record Date: Thu, 4 Jul 2024 18:07:32 +0100 Subject: [PATCH 35/44] Removed lots of warnings. --- dist/journey.esm.js.map | 2 +- dist/journey.js.map | 2 +- src/journey.ts | 70 ++++++++++++++++++++--------------------- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index fe2265b..88c923e 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":";;;;;;;;;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAaiB;AAbjB;AAAA;AAaO,MAAUA,eAAV;AACI,MAAMA,WAAA,4BAA4B;AAAA,OAD5B;AAAA;AAAA;;;ACbjB,IAGiB;AAHjB;AAAA;AAAA;AAGO,MAAUC,QAAV;AACI,eAAS,QAAS,OAAuB;AAC5C,eAAO,UAAU,QAAQ,UAAU,UAAa;AAAA,MACpD;AAFO,MAAAA,IAAS;AAIT,eAAS,cAAe,QAAwB;AACnD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,eAAgB,QAAwB;AACpD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,cAAe,QAAwB;AACnD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,gBAAiB,QAAwB;AACrD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,cAAe,QAAwB;AACnD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,aAAc,QAAwB;AAClD,eAAO,cAAe,MAAO,KAAK,kBAAkB;AAAA,MACxD;AAFO,MAAAA,IAAS;AAAA,OAzBH;AAAA;AAAA;;;ACHjB,IAIiB;AAJjB;AAAA;AAAA;AACA;AAGO,MAAUC,UAAV;AACI,eAAS,oBAAqB,OAAY,cAAgC;AAC7E,eAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,iBAAkB,OAAY,cAAgC;AAC1E,eAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,kBAAmB,OAAY,cAAkC;AAC7E,eAAO,GAAG,eAAgB,KAAM,IAAI,QAAQ;AAAA,MAChD;AAFO,MAAAA,MAAS;AAIT,eAAS,iBAAkB,OAAY,cAAgC;AAC1E,eAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,mBAAoB,OAAY,cAA0B;AACtE,eAAO,GAAG,gBAAiB,KAAM,IAAI,QAAQ;AAAA,MACjD;AAFO,MAAAA,MAAS;AAIT,eAAS,iBAAkB,OAAY,cAA0B;AACpE,eAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,gBAAiB,OAAY,cAA8B;AACvE,eAAO,GAAG,aAAc,KAAM,IAAI,QAAQ;AAAA,MAC9C;AAFO,MAAAA,MAAS;AAIT,eAAS,wBAAyB,OAAY,cAA8B;AAC/E,YAAIC,UAAgB;AAEpB,YAAK,GAAG,cAAe,KAAM,GAAI;AAC7B,gBAAM,SAAmB,MAAM,SAAS,EAAE,qBAAkB;AAE5D,cAAK,OAAO,WAAW,GAAI;AACvB,oBAAQ;AAAA,UACZ,OAAO;AACH,YAAAA,UAAS;AAAA,UACb;AAAA,QAEJ,OAAO;AACH,UAAAA,UAAS,gBAAiB,OAAO,YAAa;AAAA,QAClD;AAEA,eAAOA;AAAA,MACX;AAjBO,MAAAD,MAAS;AAAA,OA7BH;AAAA;AAAA;;;ACJjB,IAKiB;AALjB;AAAA;AAAA;AACA;AAIO,MAAUE,gBAAV;AACI,eAAS,OAAQ,MAAc,4BAA+C;AACjF,cAAM,WAAmB,KAAK,YAAY;AAC1C,cAAM,SAAkB,aAAa;AAErC,YAAID,UAAc,SAAS,SAAS,6BAA2B,IAAI,SAAS,cAAe,QAAS;AAEpG,YAAK,GAAG,QAAS,SAAU,GAAI;AAC3B,UAAAA,QAAO,YAAY;AAAA,QACvB;AAEA,eAAOA;AAAA,MACX;AAXO,MAAAC,YAAS;AAaT,eAAS,UAAW,SAAkC;AACzD,cAAMD,UAAmB;AAAA,UACrB,MAAM;AAAA,UACN,KAAK;AAAA,QACT;AAEA,eAAQ,WAAW,CAAC,MAAO,QAAQ,UAAW,KAAK,CAAC,MAAO,QAAQ,SAAU,GAAI;AAC7E,UAAAA,QAAO,QAAQ,QAAQ,aAAa,QAAQ;AAC5C,UAAAA,QAAO,OAAO,QAAQ,YAAY,QAAQ;AAE1C,oBAAU,QAAQ;AAAA,QACtB;AAEA,eAAOA;AAAA,MACX;AAdO,MAAAC,YAAS;AAgBT,eAAS,oBAA+B;AAC3C,cAAM,MAAmB,SAAS;AAElC,cAAMD,UAAmB;AAAA,UACrB,OAAQ,OAAO,eAAe,IAAI,eAAkB,IAAI,cAAc;AAAA,UACtE,MAAO,OAAO,eAAe,IAAI,cAAgB,IAAI,aAAa;AAAA,QACtE;AAEA,eAAOA;AAAA,MACX;AATO,MAAAC,YAAS;AAWT,eAAS,oBAAqB,SAAc,mBAAkC;AACjF,YAAI,QAAa;AAEjB,YAAK,SAAS,YAAY,kBAAmB;AACzC,kBAAQ,SAAS,YAAY,iBAAkB,SAAS,IAAK,EAAE,iBAAkB,iBAAkB;AAAA,QACvG,WAAY,QAAQ,cAAe;AAC/B,kBAAQ,QAAQ,aAAc,iBAAkB;AAAA,QACpD;AAEA,eAAO;AAAA,MACX;AAVO,MAAAA,YAAS;AAYT,eAAS,QAAS,QAAqB,MAA2B;AACrE,YAAI;AACA,cAAK,CAAC,OAAO,SAAU,IAAK,GAAI;AAC5B,mBAAO,YAAa,IAAK;AAAA,UAC7B;AAAA,QACJ,SAAU,GAAI;AACV,kBAAQ,KAAM,EAAE,OAAQ;AAAA,QAC5B;AAAA,MACJ;AARO,MAAAA,YAAS;AAUT,eAAS,WAAY,QAAqB,MAA2B;AACxE,YAAI;AACA,cAAK,OAAO,SAAU,IAAK,GAAI;AAC3B,mBAAO,YAAa,IAAK;AAAA,UAC7B;AAAA,QACJ,SAAU,GAAI;AACV,kBAAQ,KAAM,EAAE,OAAQ;AAAA,QAC5B;AAAA,MACJ;AARO,MAAAA,YAAS;AAUT,eAAS,aAAc,GAAgB;AAC1C,UAAE,eAAe;AACjB,UAAE,eAAe;AAAA,MACrB;AAHO,MAAAA,YAAS;AAKT,eAAS,2BAA4B,GAAe,SAA8B;AACrF,YAAI,OAAe,EAAE;AACrB,YAAI,MAAc,EAAE;AACpB,cAAM,iBAA2B,kBAAkB;AAEnD,gBAAQ,MAAM,UAAU;AAExB,YAAK,OAAO,QAAQ,cAAc,OAAO,YAAa;AAClD,kBAAQ,QAAQ;AAAA,QACpB,OAAO;AACH;AAAA,QACJ;AAEA,YAAK,MAAM,QAAQ,eAAe,OAAO,aAAc;AACnD,iBAAO,QAAQ;AAAA,QACnB,OAAO;AACH;AAAA,QACJ;AAEA,YAAK,OAAO,eAAe,MAAO;AAC9B,iBAAO,EAAE,QAAQ;AAAA,QACrB;AAEA,YAAK,MAAM,eAAe,KAAM;AAC5B,gBAAM,EAAE,QAAQ;AAAA,QACpB;AAEA,gBAAQ,MAAM,OAAO,OAAO;AAC5B,gBAAQ,MAAM,MAAM,MAAM;AAAA,MAC9B;AA7BO,MAAAA,YAAS;AA+BT,eAAS,4BAA6B,SAAsB,WAA4B;AAC3F,YAAK,WAAY;AACb,cAAK,QAAQ,MAAM,YAAY,SAAU;AACrC,oBAAQ,MAAM,UAAU;AAAA,UAC5B;AAAA,QAEJ,OAAO;AACH,cAAK,QAAQ,MAAM,YAAY,QAAS;AACpC,oBAAQ,MAAM,UAAU;AAAA,UAC5B;AAAA,QACJ;AAAA,MACJ;AAXO,MAAAA,YAAS;AAaT,eAAS,eAAgB,WAAwB,WAAuC;AAC3F,cAAM,gBAA6B,OAAQ,KAAM;AACjD,cAAM,QAAqB,OAAQ,SAAS,UAAW;AACvD,cAAM,QAA0B,OAAQ,OAAQ;AAEhD,kBAAU,YAAa,aAAc;AACrC,sBAAc,YAAa,KAAM;AACjC,cAAM,YAAa,KAAM;AAEzB,cAAM,OAAO;AAEb,cAAM,YAAyB,OAAQ,QAAQ,YAAa;AAC5D,cAAM,OAAoB,OAAQ,QAAQ,MAAO;AAEjD,aAAK,YAAY;AAEjB,cAAM,YAAa,SAAU;AAC7B,cAAM,YAAa,IAAK;AAExB,eAAO;AAAA,MACX;AApBO,MAAAA,YAAS;AAsBT,eAAS,yBAA0B,WAAwB,WAA2B;AACzF,YAAI,WAAsC,UAAU,uBAAwB,SAAU;AAEtF,eAAQ,SAAU,CAAE,GAAI;AACpB,mBAAU,CAAE,EAAE,WAAW,YAAa,SAAU,CAAE,CAAE;AAAA,QACxD;AAAA,MACJ;AANO,MAAAA,YAAS;AAAA,OAhJH;AAAA;AAAA;;;ACLjB;AAAA;AAoBA;AACA;AAEA;AACA;AACA;AAeA,KAAE,MAAM;AAEJ,UAAI,iBAAgC,CAAC;AAGrC,UAAI,qCAA8C;AAGlD,YAAM,kBAA0B;AAChC,UAAI,kBAA0B;AAC9B,UAAI,UAAkB,CAAC;AAGvB,UAAI;AAGJ,UAAI;AAGJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI,yBAAkC;AAGtC,UAAI,kCAA0C;AAC9C,UAAI,kCAA0C;AAC9C,UAAI,gCAAyC;AAC7C,UAAI,yBAAiC;AACrC,UAAI,yBAAiC;AAGrC,UAAI;AACJ,UAAI,yBAAiC;AASrC,eAAS,kBAAmB,SAAc,MAAc;AACpD,kBAAU,KAAK,iBAAkB,QAAQ,CAAC,CAAY;AAEtD,gBAAS,eAAgB,IAAI;AAAA,UACzB,MAAM,CAAC;AAAA,UACP,MAAM,CAAC;AAAA,UACP,UAAU;AAAA,QACd;AAAA,MACJ;AAEA,eAAS,cAAe,OAAuB;AAC3C,YAAK,CAAC,QAAQ,eAAgB,KAAM,GAAI;AACpC,kBAAS,KAAM,IAAI;AAAA,YACf,MAAM,CAAC;AAAA,YACP,MAAM,CAAC;AAAA,YACP,UAAU;AAAA,UACd;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,yBAA0C;AAC/C,eAAO,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,QAAS,CAAE;AAAA,MACnH;AASA,eAAS,2BAAkC;AACvC,uCAA+B,WAAW,OAAQ,OAAO,gCAAiC;AAE1F,qCAA6B,UAAU,MAAM;AACzC,cAAK,eAAe,sCAAuC;AACvD,0BAAc;AAAA,UAClB;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,yBAAgC;AACrC,mBAAW,QAAS,SAAS,MAAM,4BAA6B;AAAA,MACpE;AAEA,eAAS,yBAAgC;AACrC,mBAAW,WAAY,SAAS,MAAM,4BAA6B;AAAA,MACvE;AASA,eAAS,eAAsB;AAC3B,0BAAkB,WAAW,OAAQ,OAAO,mBAAoB;AAChE,wBAAgB,MAAM,UAAU;AAChC,iBAAS,KAAK,YAAa,eAAgB;AAE3C,uCAA+B,WAAW,OAAQ,UAAU,OAAQ;AACpE,wBAAgB,YAAa,4BAA6B;AAE1D,qCAA6B,UAAU,MAAM;AACzC,wBAAc;AAAA,QAClB;AAEA,mBAAY,8BAA8B,eAAe,sBAAiC;AAE1F,gCAAwB,WAAW,OAAQ,OAAO,OAAQ;AAC1D,wBAAgB,YAAa,qBAAsB;AAEnD,sCAA8B,WAAW,OAAQ,OAAO,aAAc;AACtE,wBAAgB,YAAa,2BAA4B;AAEzD,6CAAqC,WAAW,OAAQ,OAAO,oBAAqB;AACpF,wBAAgB,YAAa,kCAAmC;AAEhE,yCAAiC,WAAW,eAAgB,oCAAoC,eAAe,kBAA6B;AAE5I,uCAA+B,WAAW,MAAM;AAC5C,cAAK,eAAe,oBAAqB;AACrC,mCAAwB,eAAe,wBAAwB,+BAA+B,OAAQ;AAAA,UAC1G;AAAA,QACJ;AAEA,uCAA+B,WAAW,OAAQ,OAAO,eAAgB;AACzE,wBAAgB,YAAa,4BAA6B;AAE1D,sCAA8B,WAAW,OAAQ,OAAO,cAAe;AACvE,wBAAgB,YAAa,2BAA4B;AAEzD,iDAAyC,WAAW,OAAQ,OAAO,yBAA0B;AAC7F,oCAA4B,YAAa,sCAAuC;AAEhF,sDAA8C,WAAW,OAAQ,KAAK,8BAA+B;AACrG,+CAAuC,YAAa,2CAA4C;AAEhG,kCAA0B,WAAW,OAAQ,OAAO,SAAU;AAC9D,wBAAgB,YAAa,uBAAwB;AAErD,8CAAsC,WAAW,OAAQ,UAAU,MAAO;AAC1E,4CAAoC,UAAU;AAC9C,gCAAwB,YAAa,mCAAoC;AAEzE,8CAAsC,WAAW,OAAQ,UAAU,MAAO;AAC1E,4CAAoC,UAAU;AAC9C,gCAAwB,YAAa,mCAAoC;AAEzE,0BAAkB;AAAA,MACtB;AAEA,eAAS,cAAe,sBAA+B,MAAc;AACjE,YAAI,YAAqB;AAEzB,YAAK,GAAG,cAAe,eAAe,2BAA4B,KAAK,qBAAsB;AACzF,sBAAY,QAAS,eAAe,2BAA4B;AAAA,QACpE,OAAO;AACH,sBAAY;AAAA,QAChB;AAEA,YAAK,WAAY;AACb,gBAAM,iBAAiC,uBAAuB;AAE9D,cAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,mCAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,UAC/F;AAEA,0CAAiC,KAAM;AACvC,iCAAuB;AACvB,sBAAY;AAEZ,0BAAgB,MAAM,UAAU;AAAA,QACpC;AAAA,MACJ;AAEA,eAAS,eAAsB;AAC3B,YAAK,QAAS,eAAgB,EAAE,WAAW,GAAI;AAC3C,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE;AAE3B,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,eAAsB;AAC3B,YAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,gBAAM,iBAAiC,uBAAuB;AAE9D,wBAAe,KAAM;AACrB,iCAAwB,eAAe,OAAO,UAAU,eAAe,aAAa,OAAQ;AAAA,QAEhG,OAAO;AACH,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE;AAE3B,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,2BAAkC;AACvC,cAAM,iBAAiC,uBAAuB;AAE9D,YAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,cAAK,eAAe,wBAAyB;AACzC,mCAAuB;AAAA,UAC3B,OAAO;AACH,mCAAuB;AAAA,UAC3B;AAEA,sBAAY;AAEZ,uCAA6B,MAAM,UAAU,eAAe,kBAAkB,UAAS;AACvF,+CAAqC;AAErC,yBAAe,aAAa,QAAQ,+BAA0B;AAE9D,cAAK,eAAe,kBAAmB;AACnC,2BAAe,aAAa,QAAQ,eAAe;AAAA,UACvD;AAEA,gBAAM,oBAA4B,WAAW,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAElH,cAAK,wCAAoC,kBAAkB,YAAY,MAAM,UAAW;AACpF,mDAAuC;AACvC,2BAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,UACzD;AAEA,qBAAW,4BAA6B,oCAAoC,eAAe,kBAA8B;AACzH,qBAAW,4BAA6B,8BAA8B,eAAe,oBAA+B,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AAC/J,qBAAW,4BAA6B,6BAA6B,eAAe,mBAA8B,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AAC7J,qBAAW,4BAA6B,6CAA6C,eAAe,mBAA+B;AACnI,qBAAW,4BAA6B,yBAAyB,eAAe,WAAuB;AAEvG,8CAAoC,YAAY,eAAe;AAC/D,8CAAoC,WAAW,QAAS,eAAgB,EAAE,aAAa;AAEvF,cAAK,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACrF,gDAAoC,YAAY,eAAe;AAAA,UACnE,OAAO;AACH,gDAAoC,YAAY,eAAe;AAAA,UACnE;AAEA,wBAAe,cAAe;AAC9B,4BAAmB,MAAM,cAAe;AACxC,2BAAiB;AACjB,iCAAuB;AACvB,iCAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAE3F,cAAK,eAAe,WAAY;AAC5B,2BAAe,aAAa,QAAQ,MAAM;AAAA,UAC9C;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,cAAe,gBAAwC;AAC5D,YAAK,GAAG,cAAe,eAAe,KAAM,GAAI;AAC5C,gCAAsB,YAAY,eAAe;AAAA,QACrD,OAAO;AACH,gCAAsB;AAAA,QAC1B;AAEA,YAAK,GAAG,cAAe,eAAe,WAAY,GAAI;AAClD,sCAA4B,YAAY,eAAe;AAAA,QAC3D,OAAO;AACH,sCAA4B;AAAA,QAChC;AAAA,MACJ;AAEA,eAAS,kBAAmB,GAAQ,gBAAwC;AACxE,YAAK,gBAAgB,MAAM,YAAY,SAAU;AAC7C,0BAAgB,MAAM,UAAU;AAEhC,iCAAwB,eAAe,OAAO,QAAQ,eAAe,aAAa,OAAQ;AAAA,QAC9F;AAEA,YAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,iCAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,QAC/F;AAEA,iCAAyB,eAAe,WAAW;AAEnD,YAAK,eAAe,UAAU,eAAe,QAAS;AAClD,cAAK,eAAe,UAAU,eAAe,0BAA2B;AACpE,uBAAW,2BAA4B,GAAG,eAAgB;AAAA,UAE9D,OAAO;AACH,kBAAM,SAAmB,WAAW,UAAW,eAAe,aAAa,OAAQ;AACnF,gBAAI,MAAgB,OAAO,MAAQ,eAAe,aAAa,QAAQ;AACvE,gBAAI,OAAiB,OAAO;AAE5B,gBAAK,OAAO,gBAAgB,cAAc,OAAO,cAAc,eAAe,YAAa;AACvF,sBAAS,gBAAgB;AACzB,sBAAQ,eAAe,aAAa,QAAQ;AAAA,YAChD;AAEA,gBAAK,MAAM,gBAAgB,eAAe,OAAO,eAAe,eAAe,UAAW;AACtF,qBAAS,gBAAgB,eAAe,eAAe,aAAa,QAAQ;AAAA,YAChF;AAEA,4BAAgB,MAAM,MAAM,MAAM;AAClC,4BAAgB,MAAM,OAAO,OAAO;AAAA,UACxC;AAAA,QAEJ,OAAO;AACH,gBAAM,iBAA2B,WAAW,kBAAkB;AAC9D,gBAAM,aAAqB,KAAK,IAAK,IAAO,OAAO,aAAa,gBAAgB,eAAgB,IAAM,eAAe,IAAK;AAC1H,gBAAM,YAAoB,KAAK,IAAK,IAAO,OAAO,cAAc,gBAAgB,gBAAiB,IAAM,eAAe,GAAI;AAE1H,0BAAgB,MAAM,OAAO,aAAa;AAC1C,0BAAgB,MAAM,MAAM,YAAY;AAAA,QAC5C;AAAA,MACJ;AAEA,eAAS,gCAAiC,oBAA6B,MAAc;AACjF,cAAM,iBAAiC,uBAAuB;AAE9D,YAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,yBAAe,aAAa,QAAQ,YAAY,eAAe,aAAa,QAAQ,UAAU,0BAAsB,0CAAuC;AAE3J,cAAK,GAAG,QAAS,oCAAqC,GAAI;AACtD,2BAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,UACzD;AAEA,cAAK,mBAAoB;AACrB,mCAAwB,eAAe,OAAO,SAAS,eAAe,aAAa,OAAQ;AAAA,UAC/F;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,mBAA0B;AAC/B,qCAA6B;AAE7B,YAAK,eAAe,kBAAmB;AACnC,gBAAM,aAAqB,QAAS,eAAgB,EAAE,KAAK;AAE3D,mBAAU,WAAmB,GAAG,WAAW,YAAY,YAAa;AAChE,6BAAkB,UAAU,QAAS,eAAgB,EAAE,KAAM,QAAS,CAAE;AAAA,UAC5E;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,iBAAkB,UAAkB,OAAuB;AAChE,cAAM,iBAAiC,QAAS,eAAgB,EAAE,KAAM,KAAM;AAC9E,YAAI;AAEJ,YAAK,aAAa,QAAS,eAAgB,EAAE,UAAW;AACpD,gBAAM,WAAW,OAAQ,OAAO,YAAa;AAAA,QACjD,OAAO;AAEH,gBAAM,WAAW,OAAQ,OAAO,KAAM;AAEtC,cAAI,UAAU,MAAM;AAChB,4CAAgC;AAEhC,oBAAS,eAAgB,EAAE,WAAW;AAEtC,qCAAyB;AAAA,UAC7B;AAAA,QACJ;AAEA,qCAA6B,YAAa,GAAI;AAE9C,YAAK,eAAe,yBAA0B;AAC1C,cAAK,GAAG,cAAe,eAAe,OAAQ,GAAI;AAC9C,uBAAY,KAAK,eAAe,OAAkB;AAAA,UACtD,OAAO;AACH,uBAAY,KAAK,eAAe,KAAgB;AAAA,UACpD;AAAA,QACJ;AAEA,YAAK,eAAe,wBAAyB;AACzC,cAAI,aAAa;AACjB,cAAI,aAAc,WAAW,GAAI,SAAS;AAAA,QAC9C;AAAA,MACJ;AAEA,eAAS,yBAAgC;AACrC,YAAK,eAAe,iBAAkB;AAClC,gBAAM,iBAAyB,4BAA4B,cAAc,QAAS,eAAgB,EAAE,KAAK;AACzG,gBAAM,SAAkB,QAAS,eAAgB,EAAE,WAAW,KAAM;AACpE,gBAAM,qBAA6B,KAAK,MAAU,QAAS,eAAgB,EAAE,WAAW,KAAM,QAAS,eAAgB,EAAE,KAAK,SAAW,GAAI;AAE7I,iDAAuC,MAAM,QAAQ,QAAQ;AAC7D,sDAA4C,YAAY,qBAAqB;AAAA,QACjF;AAAA,MACJ;AASA,eAAS,oBAA2B;AAChC,8BAAsB,cAAc;AACpC,8BAAsB,YAAY;AAClC,8BAAsB,gBAAgB;AAEtC,iBAAS,KAAK,iBAAkB,aAAa,uBAAwB;AACrE,iBAAS,KAAK,iBAAkB,cAAc,wBAAyB;AAAA,MAC3E;AAEA,eAAS,wBAAyB,GAAuB;AACrD,YAAK,CAAC,iCAAiC,CAAC,0BAA0B,eAAe,qBAAsB;AACnG,0BAAgB,aAAa;AAC7B,0CAAgC;AAChC,mCAAyB,EAAE,QAAQ,gBAAgB;AACnD,mCAAyB,EAAE,QAAQ,gBAAgB;AACnD,4CAAkC,gBAAgB;AAClD,4CAAkC,gBAAgB;AAAA,QACtD;AAAA,MACJ;AAEA,eAAS,wBAA+B;AACpC,YAAK,+BAAgC;AACjC,0CAAgC;AAChC,4CAAkC;AAClC,4CAAkC;AAClC,0BAAgB,YAAY;AAAA,QAChC;AAAA,MACJ;AAEA,eAAS,wBAAyB,GAAuB;AACrD,YAAK,+BAAgC;AACjC,0BAAgB,MAAM,OAAS,EAAE,QAAQ,yBAA2B;AACpE,0BAAgB,MAAM,MAAQ,EAAE,QAAQ,yBAA2B;AAAA,QACvE;AAAA,MACJ;AAEA,eAAS,2BAAkC;AACvC,YAAK,+BAAgC;AACjC,0BAAgB,MAAM,OAAO,kCAAkC;AAC/D,0BAAgB,MAAM,MAAM,kCAAkC;AAE9D,0CAAgC;AAChC,4CAAkC;AAClC,4CAAkC;AAClC,0BAAgB,YAAY;AAAA,QAChC;AAAA,MACJ;AASA,eAAS,gBAAuB;AAC5B,YAAK,CAAC,GAAG,QAAS,gBAAiB,GAAI;AACnC,6BAAmB,WAAW,OAAQ,OAAO,oBAAqB;AAClE,2BAAiB,MAAM,UAAU;AAEjC,mBAAS,KAAK,YAAa,gBAAiB;AAE5C,mBAAS,KAAK,iBAAkB,aAAa,MAAM;AAC/C,wBAAY;AAAA,UAChB,CAAE;AAEF,mBAAS,iBAAkB,UAAU,MAAM;AACvC,wBAAY;AAAA,UAChB,CAAE;AAAA,QACN;AAAA,MACJ;AAEA,eAAS,WAAY,SAAsB,MAAsB;AAC7D,YAAK,YAAY,MAAO;AACpB,kBAAQ,cAAc,CAAE,MAAmB;AACvC,wBAAa,GAAG,IAAK;AAAA,UACzB;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,YAAa,GAAQ,MAAsB;AAChD,mBAAW,aAAc,CAAE;AAC3B,oBAAY;AAEZ,iCAAyB,WAAY,MAAM;AACvC,2BAAiB,YAAY;AAC7B,2BAAiB,MAAM,UAAU;AAEjC,qBAAW,2BAA4B,GAAG,gBAAiB;AAAA,QAC/D,GAAG,eAAe,YAAa;AAAA,MACnC;AAEA,eAAS,cAAqB;AAC1B,YAAK,GAAG,QAAS,gBAAiB,GAAI;AAClC,cAAK,2BAA2B,GAAI;AAChC,yBAAc,sBAAuB;AACrC,qCAAyB;AAAA,UAC7B;AAEA,cAAK,iBAAiB,MAAM,YAAY,SAAU;AAC9C,6BAAiB,MAAM,UAAU;AAAA,UACrC;AAAA,QACJ;AAAA,MACJ;AASA,eAAS,cAAqB;AAC1B,cAAM,WAAqB,eAAe;AAC1C,cAAM,iBAAyB,SAAS;AAExC,iBAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,gBAAM,cAAyC,SAAS,qBAAsB,SAAU,YAAa,CAAE;AACvG,gBAAM,WAA0B,CAAC,EAAE,MAAM,KAAM,WAAY;AAC3D,gBAAM,iBAAyB,SAAS;AAExC,mBAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,gBAAK,CAAC,WAAY,SAAU,YAAa,CAAE,GAAI;AAC3C;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAEA,gBAAS,eAAgB,EAAE,KAAK,KAAK;AAAA,MACzC;AAEA,eAAS,WAAY,SAAiC;AAClD,YAAID,UAAkB;AAEtB,YAAK,GAAG,QAAS,OAAQ,KAAK,QAAQ,aAAc,UAAU,yBAA0B,GAAI;AACxF,gBAAM,qBAA6B,QAAQ,aAAc,UAAU,yBAA0B;AAE7F,cAAK,GAAG,cAAe,kBAAmB,GAAI;AAC1C,kBAAM,iBAA+B,oBAAqB,kBAAmB;AAE7E,gBAAK,eAAe,UAAU,GAAG,cAAe,eAAe,MAAO,GAAI;AACtE,2BAAc,SAAS,sBAAuB,eAAe,MAAO,CAAE;AAAA,YAE1E,OAAO;AACH,kBAAK,CAAC,eAAe,UAAW;AAC5B,wBAAQ,MAAO,eAAe,2BAA2B,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC9H,gBAAAA,UAAS;AAAA,cACb;AAAA,YACJ;AAAA,UAEJ,OAAO;AACH,gBAAK,CAAC,eAAe,UAAW;AAC5B,sBAAQ,MAAO,eAAe,yBAAyB,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC5H,cAAAA,UAAS;AAAA,YACb;AAAA,UACJ;AAAA,QACJ;AAEA,eAAOA;AAAA,MACX;AAEA,eAAS,aAAc,SAAsB,gBAAwC;AACjF,uBAAe,eAAe,CAAC;AAC/B,uBAAe,aAAa,UAAU;AAEtC,YAAK,GAAG,cAAe,eAAe,KAAM,MAAO,GAAG,cAAe,eAAe,KAAM,KAAK,GAAG,cAAe,eAAe,WAAY,IAAM;AAC9I,kBAAQ,gBAAiB,UAAU,yBAA0B;AAE7D,cAAK,CAAC,eAAe,QAAS;AAC1B,0BAAe,eAAe,KAAgB;AAE9C,oBAAS,eAAe,KAAgB,EAAE,KAAM,eAAe,KAAgB,IAAI;AACnF,oBAAS,eAAe,KAAgB,EAAE,KAAK,KAAM,eAAe,KAAgB;AAEpF,mCAAwB,eAAe,OAAO,WAAW,OAAQ;AAAA,UAErE,OAAO;AACH,uBAAY,cAAe;AAAA,UAC/B;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,WAAY,gBAAwC;AACzD,cAAM,gBAAwB,WAAW,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAE9G,YAAK,oCAAgC,cAAc,YAAY,MAAM,UAAW;AAC5E,yBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,QACzD;AAEA,cAAM,OAAoB,WAAW,OAAQ,OAAO,iBAAkB;AACtE,uBAAe,aAAa,QAAQ,YAAa,IAAK;AAEtD,aAAK,UAAU,CAAE,MAAmB;AAChC,qBAAW,aAAc,CAAE;AAE3B,6CAAmC,MAAM,UAAU;AACnD,uCAA6B,MAAM,UAAU;AAC7C,sCAA4B,MAAM,UAAU;AAC5C,kCAAwB,MAAM,UAAU;AACxC,+CAAqC;AAErC,wBAAe,cAAe;AAC9B,4BAAmB,GAAG,cAAe;AAErC,cAAK,eAAe,sBAAuB;AACvC,uBAAW,yBAA0B,eAAe,aAAa,SAAS,iBAAkB;AAAA,UAChG;AAAA,QACJ;AAAA,MACJ;AASA,eAAS,oBAAqB,YAAqB,MAAc;AAC7D,cAAM,eAAyB,YAAY,SAAS,mBAAmB,SAAS;AAChF,cAAM,aAAuB,YAAY,OAAO,mBAAmB,OAAO;AAE1E,YAAK,eAAe,qBAAsB;AACtC,uBAAc,WAAW,eAAgB;AAAA,QAC7C;AAEA,mBAAY,UAAU,cAAe;AAAA,MACzC;AAEA,eAAS,gBAAiB,GAA0B;AAChD,YAAK,QAAQ,OAAO,KAAK,eAAe,qBAAsB;AAC1D,cAAK,EAAE,gCAA0B;AAC7B,cAAE,eAAe;AACjB,0BAAc;AAAA,UAClB,OAAO;AAEH,gBAAK,oCAAqC;AACtC,kBAAK,EAAE,iCAAwB;AAC3B,kBAAE,eAAe;AACjB,6BAAa;AAAA,cAEjB,WAAY,EAAE,mCAAyB;AACnC,kBAAE,eAAe;AACjB,6BAAa;AAAA,cAEjB,WAAY,EAAE,6BAAsB;AAChC,kBAAE,eAAe;AACjB,kCAAkB;AAAA,cAEtB,WAAY,EAAE,iCAAwB;AAClC,kBAAE,eAAe;AACjB,oCAAoB;AAAA,cACxB;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,iBAAwB;AAC7B,YAAK,QAAQ,OAAO,GAAI;AACpB,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,oBAA2B;AAChC,YAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE,WAAW;AAEtC,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,sBAA6B;AAClC,YAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS;AAE/E,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AASA,eAAS,sBAAuB,YAAkB;AAC9C,YAAI,UAA0B,KAAK,iBAAkB,YAAY,CAAC,CAAoB;AACtF,gBAAQ,QAAQ,KAAK,iBAAkB,QAAQ,OAAO,CAAE;AACxD,gBAAQ,SAAS,KAAK,kBAAmB,QAAQ,QAAQ,IAAK;AAC9D,gBAAQ,YAAY,KAAK,kBAAmB,QAAQ,WAAW,KAAM;AACrE,gBAAQ,WAAW,KAAK,kBAAmB,QAAQ,UAAU,KAAM;AACnE,gBAAQ,aAAa,KAAK,kBAAmB,QAAQ,YAAY,KAAM;AACvE,gBAAQ,SAAS,KAAK,kBAAmB,QAAQ,QAAQ,KAAM;AAC/D,gBAAQ,2BAA2B,KAAK,kBAAmB,QAAQ,0BAA0B,KAAM;AACnG,gBAAQ,yBAAyB,KAAK,kBAAmB,QAAQ,wBAAwB,IAAK;AAC9F,gBAAQ,uBAAuB,KAAK,kBAAmB,QAAQ,sBAAsB,KAAM;AAC3F,gBAAQ,QAAQ,KAAK,iBAAkB,QAAQ,OAAO,eAAgB;AAEtE,kBAAU,4BAA6B,OAAQ;AAE/C,eAAO,mCAAoC,OAAQ;AAAA,MACvD;AAEA,eAAS,4BAA6B,SAA2C;AAC7E,gBAAQ,QAAQ,KAAK,iBAAkB,QAAQ,qBAAkB;AACjE,gBAAQ,cAAc,KAAK,iBAAkB,QAAQ,2BAAwB;AAC7E,gBAAQ,UAAU,KAAK,iBAAkB,QAAQ,uBAAoB;AAErE,eAAO;AAAA,MACX;AAEA,eAAS,mCAAoC,SAA2C;AACpF,gBAAQ,SAAS,KAAK,iBAAkB,QAAQ,QAAQ,CAAC,CAAY;AACrE,gBAAQ,OAAO,UAAU,KAAK,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC/E,gBAAQ,OAAO,UAAU,KAAK,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC/E,gBAAQ,OAAO,UAAU,KAAK,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC/E,gBAAQ,OAAO,WAAW,KAAK,mBAAoB,QAAQ,OAAO,UAAU,IAAK;AACjF,gBAAQ,OAAO,SAAS,KAAK,mBAAoB,QAAQ,OAAO,QAAQ,IAAK;AAC7E,gBAAQ,OAAO,UAAU,KAAK,mBAAoB,QAAQ,OAAO,SAAS,IAAK;AAC/E,gBAAQ,OAAO,YAAY,KAAK,mBAAoB,QAAQ,OAAO,WAAW,IAAK;AACnF,gBAAQ,OAAO,eAAe,KAAK,mBAAoB,QAAQ,OAAO,cAAc,IAAK;AAEzF,eAAO;AAAA,MACX;AASA,eAAS,uBAAwB,oBAAyB,MAAsB;AAC5E,YAAK,GAAG,gBAAiB,eAAgB,GAAI;AACzC,0BAAgB,MAAO,MAAM,CAAC,EAAE,MAAM,KAAM,MAAM,CAAE,CAAE;AAAA,QAC1D;AAAA,MACJ;AASA,eAAS,0BAAoC;AACzC,YAAI,OAAgB;AAEpB,YAAK,eAAe,6BAA8B;AAC9C,gBAAM,MAAc,OAAO,SAAS;AACpC,gBAAM,eAAoB,uBAAwB,GAAI;AAEtD,cAAK,GAAG,QAAS,aAAa,SAAU,GAAI;AACxC,kBAAM,UAAkB,SAAU,aAAa,WAAW,EAAG;AAE7D,gBAAK,CAAC,MAAO,OAAQ,KAAK,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AAC9E,sBAAS,eAAgB,EAAE,WAAW;AAAA,YAC1C;AAAA,UACJ;AAEA,cAAK,GAAG,QAAS,aAAa,MAAO,GAAI;AACrC,mBAAO,aAAa,WAAW;AAAA,UACnC;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AAEA,eAAS,uBAAwB,KAAoB;AACjD,cAAM,eAAoB,CAAC;AAC3B,cAAM,eAAyB,IAAI,MAAO,GAAI;AAE9C,YAAK,aAAa,SAAS,GAAI;AAC3B,gBAAM,aAAuB,aAAc,CAAE,EAAE,MAAO,GAAI;AAC1D,gBAAM,mBAA2B,WAAW;AAE5C,mBAAU,kBAA0B,GAAG,kBAAkB,kBAAkB,mBAAoB;AAC3F,kBAAM,YAAsB,WAAY,eAAgB,EAAE,MAAO,GAAI;AAErE,yBAAc,UAAW,CAAE,CAAE,IAAI,UAAW,CAAE;AAAA,UAClD;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AASA,eAAS,oBAAqB,cAAmC;AAC7D,cAAM,SAAuB;AAAA,UACzB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACZ;AAEA,YAAI;AACA,cAAK,GAAG,cAAe,YAAa,GAAI;AACpC,mBAAO,SAAS,KAAK,MAAO,YAAa;AAAA,UAC7C;AAAA,QAEJ,SAAU,IAAU;AAChB,cAAI;AACA,mBAAO,SAAS,KAAM,MAAM,eAAe,GAAI;AAE/C,gBAAK,GAAG,gBAAiB,OAAO,MAAO,GAAI;AACvC,qBAAO,SAAS,OAAO,OAAO;AAAA,YAClC;AAAA,UAEJ,SAAU,IAAU;AAChB,gBAAK,CAAC,eAAe,UAAW;AAC5B,sBAAQ,MAAO,eAAe,gBAAgB,QAAS,eAAgB,GAAG,OAAQ,EAAE,QAAS,eAAgB,GAAG,OAAQ,CAAE;AAC1H,qBAAO,SAAS;AAAA,YACpB;AAEA,mBAAO,SAAS;AAAA,UACpB;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AASA,eAAS,sBAA6B;AAClC,YAAK,QAAQ,OAAO,GAAI;AACpB,wBAAe,KAAM;AAErB,kBAAS,eAAgB,EAAE,WAAW;AAAA,QAC1C;AAAA,MACJ;AASA,eAAS,0BAA2B,mBAAkC,CAAC,GAAW;AAC9E,yBAAiB,KAAK,iBAAkB,kBAAkB,CAAC,CAAmB;AAC9E,uBAAe,WAAW,KAAK,kBAAmB,eAAe,UAAU,IAAK;AAChF,uBAAe,kBAAkB,KAAK,wBAAyB,eAAe,iBAAiB,CAAE,GAAI,CAAE;AACvG,uBAAe,kBAAkB,KAAK,kBAAmB,eAAe,iBAAiB,IAAK;AAC9F,uBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,IAAK;AACtG,uBAAe,mBAAmB,KAAK,kBAAmB,eAAe,kBAAkB,IAAK;AAChG,uBAAe,8BAA8B,KAAK,kBAAmB,eAAe,6BAA6B,IAAK;AACtH,uBAAe,yBAAyB,KAAK,kBAAmB,eAAe,wBAAwB,KAAM;AAC7G,uBAAe,cAAc,KAAK,kBAAmB,eAAe,aAAa,IAAK;AACtF,uBAAe,qBAAqB,KAAK,kBAAmB,eAAe,oBAAoB,KAAM;AACrG,uBAAe,eAAe,KAAK,iBAAkB,eAAe,cAAc,GAAI;AACtF,uBAAe,0BAA0B,KAAK,kBAAmB,eAAe,yBAAyB,IAAK;AAC9G,uBAAe,uCAAuC,KAAK,kBAAmB,eAAe,sCAAsC,KAAM;AACzI,uBAAe,kBAAkB,KAAK,kBAAmB,eAAe,iBAAiB,KAAM;AAC/F,uBAAe,mBAAmB,KAAK,kBAAmB,eAAe,kBAAkB,KAAM;AACjG,uBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,KAAM;AACvG,uBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,KAAM;AAEvG,yCAAiC;AACjC,gDAAwC;AAAA,MAC5C;AAEA,eAAS,mCAA0C;AAC/C,uBAAe,iBAAiB,KAAK,oBAAqB,eAAe,gBAAgB,MAAO;AAChG,uBAAe,iBAAiB,KAAK,oBAAqB,eAAe,gBAAgB,MAAO;AAChG,uBAAe,mBAAmB,KAAK,oBAAqB,eAAe,kBAAkB,QAAS;AACtG,uBAAe,yBAAyB,KAAK,oBAAqB,eAAe,wBAAwB,OAAQ;AACjH,uBAAe,qBAAqB,KAAK,oBAAqB,eAAe,oBAAoB,mBAAoB;AACrH,uBAAe,kBAAkB,KAAK,oBAAqB,eAAe,iBAAiB,4CAA6C;AACxI,uBAAe,6BAA6B,KAAK,oBAAqB,eAAe,4BAA4B,2DAA4D;AAC7K,uBAAe,2BAA2B,KAAK,oBAAqB,eAAe,0BAA0B,gEAAiE;AAC9K,uBAAe,8BAA8B,KAAK,oBAAqB,eAAe,2CAAwC;AAAA,MAClI;AAEA,eAAS,0CAAiD;AACtD,uBAAe,yBAAyB,KAAK,mBAAoB,eAAe,wBAAwB,IAAK;AAAA,MACjH;AASA,YAAM,UAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOvB,OAAO,SAAW,wBAAyC;AACvD,cAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,8BAAkB,KAAK,iBAAkB,OAAO,eAAgB;AAEhE,gBAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,sBAAS,eAAgB,EAAE,WAAW;AAEtC,uCAAyB;AAAA,YAC7B;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,MAAM,SAAW,wBAAyC;AACtD,cAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,8BAAkB,KAAK,iBAAkB,OAAO,eAAgB;AAEhE,gBAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,kBAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,wBAAS,eAAgB,EAAE,WAAW;AAAA,cAC1C;AAEA,uCAAyB;AAAA,YAC7B;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,MAAM,WAAwB;AAC1B,cAAK,QAAQ,OAAO,GAAI;AACpB,0BAAc;AAAA,UAClB;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,QAAQ,WAAsB;AAC1B,iBAAO,GAAG,QAAS,eAAgB,KAAK,gBAAgB,MAAM,YAAY;AAAA,QAC9E;AAAA,QAEA,YAAY,WAAsB;AAC9B,iBAAO,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS;AAAA,QAC3F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,kBAAkB,WAAwB;AACtC,sBAAY;AAEZ,iBAAO;AAAA,QACX;AAAA,QAEA,SAAS,SAAW,SAAsB,SAAsC;AAC5E,cAAK,GAAG,cAAe,OAAQ,KAAK,GAAG,cAAe,OAAQ,GAAI;AAC9D,yBAAc,SAAS,sBAAuB,OAAQ,CAAE;AAExD,oBAAS,eAAgB,EAAE,KAAK,KAAK;AAErC,gCAAoB;AAAA,UACxB;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,SAAW,SAAmC;AACtD,cAAK,GAAG,cAAe,OAAQ,GAAI;AAC/B,gBAAI,UAAmB;AAEvB,qBAAU,SAAS,SAAU;AACzB,kBAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,yBAAU,SAAS,QAAS,KAAM,EAAE,MAAO;AACvC,sBAAK,QAAS,KAAM,EAAE,KAAK,eAAgB,KAAM,GAAI;AACjD,0BAAM,iBAAiC,QAAS,KAAM,EAAE,KAAM,KAAM;AAEpE,wBAAK,eAAe,aAAa,YAAY,SAAU;AACnD,6CAAwB,eAAe,OAAO,cAAc,eAAe,aAAa,OAAQ;AAEhG,8BAAS,KAAM,EAAE,KAAK,OAAQ,QAAS,KAAM,EAAE,KAAK,QAAS,eAAe,KAAM,GAAG,CAAE;AAEvF,6BAAO,QAAS,KAAM,EAAE,KAAM,eAAe,KAAM;AAEnD,8BAAS,KAAM,EAAE,KAAK,KAAK;AAE3B,gCAAU;AACV;AAAA,oBACJ;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAEA,gBAAK,CAAC,SAAU;AACZ,yBAAW,yBAA0B,SAAS,iBAAkB;AAAA,YACpE,OAAO;AACH,kCAAoB;AAAA,YACxB;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,SAAW,wBAAyC;AAC5D,8BAAoB;AAEpB,mBAAU,aAAa,SAAU;AAC7B,gBAAK,QAAQ,eAAgB,SAAU,GAAI;AACvC,kBAAK,CAAC,GAAG,cAAe,KAAM,KAAK,UAAU,WAAY;AACrD,yBAAU,SAAS,QAAS,SAAU,EAAE,MAAO;AAC3C,sBAAK,QAAS,SAAU,EAAE,KAAK,eAAgB,KAAM,GAAI;AACrD,0BAAM,iBAAiC,QAAS,SAAU,EAAE,KAAM,KAAM;AAExE,2CAAwB,eAAe,OAAO,cAAc,eAAe,aAAa,OAAQ;AAAA,kBACpG;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAEA,cAAK,GAAG,cAAe,KAAM,GAAI;AAC7B,gBAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,qBAAO,QAAS,KAAM;AAAA,YAC1B;AAAA,UAEJ,OAAO;AACH,sBAAU,CAAC;AAAA,UACf;AAEA,cAAK,CAAC,GAAG,cAAe,KAAM,KAAK,UAAU,iBAAkB;AAC3D,8BAAmB,OAAQ;AAAA,UAC/B;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,WAAwB;AAChC,qBAAW,yBAA0B,SAAS,MAAM,iBAAkB;AAEtE,iBAAO;AAAA,QACX;AAAA,QAEA,kBAAkB,WAAwB;AACtC,kBAAS,eAAgB,EAAE,KAAK,QAAQ;AAExC,8BAAoB;AAEpB,iBAAO;AAAA,QACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,kBAAkB,SAAW,kBAA8C;AACvE,cAAK,GAAG,cAAe,gBAAiB,GAAI;AACxC,gBAAI,0BAAmC;AAEvC,qBAAU,gBAAgB,kBAAmB;AACzC,kBAAK,iBAAiB,eAAgB,YAAa,KAAK,eAAe,eAAgB,YAAa,KAAK,eAAgB,YAAa,MAAM,iBAAkB,YAAa,GAAI;AAC3K,+BAAgB,YAAa,IAAI,iBAAkB,YAAa;AAChE,0CAA0B;AAAA,cAC9B;AAAA,YACJ;AAEA,gBAAK,yBAA0B;AAC3B,wCAA2B,cAAe;AAAA,YAC9C;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,YAAY,WAAoB;AAC5B,iBAAO;AAAA,QACX;AAAA,MACJ;AASA,OAAE,MAAM;AACJ,kCAA0B;AAE1B,iBAAS,iBAAkB,oBAAoB,MAAM;AACjD,4BAAkB;AAClB,mCAAyB;AACzB,uBAAa;AACb,wBAAc;AACd,sBAAY;AACZ,8BAAoB;AAEpB,cAAK,wBAAwB,GAAI;AAC7B,oBAAQ,KAAK;AAAA,UACjB;AAAA,QACJ,CAAE;AAEF,YAAK,CAAC,GAAG,QAAS,OAAO,QAAS,GAAI;AAClC,iBAAO,WAAW;AAAA,QACtB;AAAA,MACJ,GAAK;AAAA,IACT,GAAK;AAAA;AAAA","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText as string );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText as string );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText as string;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText as string;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText as string;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title as string;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description as string;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip as string );\n } else {\n addToolTip( dot, bindingOptions.title as string );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) as string;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group as string );\n\n _groups[ bindingOptions.group as string ].json[ bindingOptions.order as number ] = bindingOptions;\n _groups[ bindingOptions.group as string ].keys.push( bindingOptions.order as number );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js.map b/dist/journey.js.map index 3a1db91..b6134a3 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText as string );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText as string );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events.onClose, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText as string;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText as string;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText as string;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title as string;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description as string;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip as string );\n } else {\n addToolTip( dot, bindingOptions.title as string );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) as string;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group as string );\n\n _groups[ bindingOptions.group as string ].json[ bindingOptions.order as number ] = bindingOptions;\n _groups[ bindingOptions.group as string ].keys.push( bindingOptions.order as number );\n\n fireCustomTriggerEvent( bindingOptions.events.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events.onEnter = Data.getDefaultFunction( options.events.onEnter, null );\n options.events.onLeave = Data.getDefaultFunction( options.events.onLeave, null );\n options.events.onClose = Data.getDefaultFunction( options.events.onClose, null );\n options.events.onFinish = Data.getDefaultFunction( options.events.onFinish, null );\n options.events.onOpen = Data.getDefaultFunction( options.events.onOpen, null );\n options.events.onStart = Data.getDefaultFunction( options.events.onStart, null );\n options.events.onAddStep = Data.getDefaultFunction( options.events.onAddStep, null );\n options.events.onRemoveStep = Data.getDefaultFunction( options.events.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 53d60c3..b6e6b12 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -158,7 +158,7 @@ type Groups = Record { if ( _configuration.showDoNotShowAgain ) { @@ -216,7 +216,7 @@ type Groups = Record= _groups[ _groups_Current ].keys.length - 1 ) { - _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText as string; + _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!; } else { - _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText as string; + _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!; } setDialogText( bindingOptions ); setDialogPosition( null, bindingOptions ); buildProcessDots(); setProgressBarPosition(); - fireCustomTriggerEvent( bindingOptions.events.onEnter, bindingOptions._currentView.element ); + fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element ); if ( bindingOptions.sendClick ) { bindingOptions._currentView.element.click(); @@ -310,13 +310,13 @@ type Groups = Record Date: Thu, 4 Jul 2024 18:17:43 +0100 Subject: [PATCH 36/44] Removed more warnings. --- dist/journey.esm.js.map | 2 +- dist/journey.js.map | 2 +- src/journey.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 88c923e..dfbc943 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js.map b/dist/journey.js.map index b6134a3..303c00f 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: Configuration ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index b6e6b12..1cdc5dd 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -32,7 +32,7 @@ type StringToJson = { }; type Groups = Record; keys: number[]; position: number; }>; @@ -1115,7 +1115,7 @@ type Groups = Record Date: Thu, 4 Jul 2024 18:25:12 +0100 Subject: [PATCH 37/44] Removed final warnings. --- dist/journey.esm.js | 9 +++++---- dist/journey.esm.js.map | 2 +- dist/journey.js | 9 +++++---- dist/journey.js.map | 2 +- dist/journey.min.js | 2 +- src/journey.ts | 9 +++++---- 6 files changed, 18 insertions(+), 15 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index df36f4e..b1e0891 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -997,14 +997,15 @@ var require_journey = __commonJS({ setConfiguration: function(e) { if (Is.definedObject(e)) { let t = false; - for (let o in e) { - if (e.hasOwnProperty(o) && _configuration.hasOwnProperty(o) && _configuration[o] !== e[o]) { - _configuration[o] = e[o]; + const o = _configuration; + for (let n in e) { + if (e.hasOwnProperty(n) && _configuration.hasOwnProperty(n) && o[n] !== e[n]) { + o[n] = e[n]; t = true; } } if (t) { - buildDefaultConfiguration(_configuration); + buildDefaultConfiguration(o); } } return _public; diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index dfbc943..46121db 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index b9bbe33..59e3701 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -953,14 +953,15 @@ var DomElement; setConfiguration: function(e) { if (Is.definedObject(e)) { let t = false; - for (let o in e) { - if (e.hasOwnProperty(o) && _configuration.hasOwnProperty(o) && _configuration[o] !== e[o]) { - _configuration[o] = e[o]; + const o = _configuration; + for (let n in e) { + if (e.hasOwnProperty(n) && _configuration.hasOwnProperty(n) && o[n] !== e[n]) { + o[n] = e[n]; t = true; } } if (t) { - buildDefaultConfiguration(_configuration); + buildDefaultConfiguration(o); } } return _public; diff --git a/dist/journey.js.map b/dist/journey.js.map index 303c00f..3fbe4d6 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n \n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && _configuration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n _configuration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( _configuration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.min.js b/dist/journey.min.js index 4e56920..6627432 100644 --- a/dist/journey.min.js +++ b/dist/journey.min.js @@ -1 +1 @@ -var Constants,Is,Data,DomElement;(Constants||(Constants={})).JOURNEY_JS_ATTRIBUTE_NAME="data-journey-js",(e=>{function t(e){return null!=e&&""!==e}function o(e){return t(e)&&"object"==typeof e}e.defined=t,e.definedObject=o,e.definedBoolean=function(e){return t(e)&&"boolean"==typeof e},e.definedString=function(e){return t(e)&&"string"==typeof e},e.definedFunction=function(e){return t(e)&&"function"==typeof e},e.definedNumber=function(e){return t(e)&&"number"==typeof e},e.definedArray=function(e){return o(e)&&e instanceof Array}})(Is||(Is={})),(e=>{function t(e,t){return Is.definedArray(e)?e:t}e.getDefaultAnyString=function(e,t){return"string"==typeof e?e:t},e.getDefaultString=function(e,t){return Is.definedString(e)?e:t},e.getDefaultBoolean=function(e,t){return Is.definedBoolean(e)?e:t},e.getDefaultNumber=function(e,t){return Is.definedNumber(e)?e:t},e.getDefaultFunction=function(e,t){return Is.definedFunction(e)?e:t},e.getDefaultObject=function(e,t){return Is.definedObject(e)?e:t},e.getDefaultArray=t,e.getDefaultStringOrArray=function(e,o){let n=o;if(Is.definedString(e)){const t=e.toString().split(" ");0===t.length?e=o:n=t}else n=t(e,o);return n}})(Data||(Data={})),(e=>{function t(e,t=""){const o=e.toLowerCase();let n="text"===o?document.createTextNode(""):document.createElement(o);return Is.defined(t)&&(n.className=t),n}function o(){const e=document.documentElement;return{left:(window.pageXOffset||e.scrollLeft)-(e.clientLeft||0),top:(window.pageYOffset||e.scrollTop)-(e.clientTop||0)}}e.create=t,e.getOffset=function(e){const t={left:0,top:0};for(;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t.left+=e.offsetLeft-e.scrollLeft,t.top+=e.offsetTop-e.scrollTop,e=e.offsetParent;return t},e.getScrollPosition=o,e.getStyleValueByName=function(e,t){let o=null;return document.defaultView.getComputedStyle?o=document.defaultView.getComputedStyle(e,null).getPropertyValue(t):e.currentStyle&&(o=e.currentStyle[t]),o},e.addNode=function(e,t){try{e.contains(t)||e.appendChild(t)}catch(e){console.warn(e.message)}},e.removeNode=function(e,t){try{e.contains(t)&&e.removeChild(t)}catch(e){console.warn(e.message)}},e.cancelBubble=function(e){e.preventDefault(),e.cancelBubble=!0},e.showElementAtMousePosition=function(e,t){let n=e.pageX,i=e.pageY;const r=o();t.style.display="block",n+t.offsetWidth>window.innerWidth?n-=t.offsetWidth:n++,i+t.offsetHeight>window.innerHeight?i-=t.offsetHeight:i++,n{let _configuration={},_configuration_ShortcutKeysEnabled=!0;const _groups_Default="default";let _groups_Current=_groups_Default,_groups={},_element_Focus_Element_PositionStyle="",_element_Disabled_Background,_element_Dialog,_element_Dialog_Close_Button,_element_Dialog_Title,_element_Dialog_Description,_element_Dialog_CheckBox_Container,_element_Dialog_CheckBox_Input,_element_Dialog_ProgressDots,_element_Dialog_ProgressBar,_element_Dialog_ProgressBar_Percentage,_element_Dialog_ProgressBar_Percentage_Text,_element_Dialog_Buttons,_element_Dialog_Buttons_Back_Button,_element_Dialog_Buttons_Next_Button,_element_Dialog_IsHint=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_X=0,_element_Dialog_Move_Y=0,_element_ToolTip,_element_ToolTip_Timer=0;function setupDefaultGroup(e=null){_groups=Data.getDefaultObject(e,{}),_groups[_groups_Default]={json:{},keys:[],position:0}}function setupNewGroup(e){_groups.hasOwnProperty(e)||(_groups[e]={json:{},keys:[],position:0})}function getGroupBindingOptions(){return _groups[_groups_Current].json[_groups[_groups_Current].keys[_groups[_groups_Current].position]]}function renderDisabledBackground(){_element_Disabled_Background=DomElement.create("div","journey-js-disabled-background"),_element_Disabled_Background.onclick=()=>{_configuration.closeDialogOnDisabledBackgroundClick&&onDialogClose()}}function showDisabledBackground(){DomElement.addNode(document.body,_element_Disabled_Background)}function hideDisabledBackground(){DomElement.removeNode(document.body,_element_Disabled_Background)}function renderDialog(){_element_Dialog=DomElement.create("div","journey-js-dialog"),_element_Dialog.style.display="none",document.body.appendChild(_element_Dialog),_element_Dialog_Close_Button=DomElement.create("button","close"),_element_Dialog.appendChild(_element_Dialog_Close_Button),_element_Dialog_Close_Button.onclick=()=>{onDialogClose()},addToolTip(_element_Dialog_Close_Button,_configuration.closeButtonToolTipText),_element_Dialog_Title=DomElement.create("div","title"),_element_Dialog.appendChild(_element_Dialog_Title),_element_Dialog_Description=DomElement.create("div","description"),_element_Dialog.appendChild(_element_Dialog_Description),_element_Dialog_CheckBox_Container=DomElement.create("div","checkbox-container"),_element_Dialog.appendChild(_element_Dialog_CheckBox_Container),_element_Dialog_CheckBox_Input=DomElement.createCheckBox(_element_Dialog_CheckBox_Container,_configuration.doNotShowAgainText),_element_Dialog_CheckBox_Input.onchange=()=>{_configuration.showDoNotShowAgain&&fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange,_element_Dialog_CheckBox_Input.checked)},_element_Dialog_ProgressDots=DomElement.create("div","progress-dots"),_element_Dialog.appendChild(_element_Dialog_ProgressDots),_element_Dialog_ProgressBar=DomElement.create("div","progress-bar"),_element_Dialog.appendChild(_element_Dialog_ProgressBar),_element_Dialog_ProgressBar_Percentage=DomElement.create("div","progress-bar-percentage"),_element_Dialog_ProgressBar.appendChild(_element_Dialog_ProgressBar_Percentage),_element_Dialog_ProgressBar_Percentage_Text=DomElement.create("p","progress-bar-percentage-text"),_element_Dialog_ProgressBar_Percentage.appendChild(_element_Dialog_ProgressBar_Percentage_Text),_element_Dialog_Buttons=DomElement.create("div","buttons"),_element_Dialog.appendChild(_element_Dialog_Buttons),_element_Dialog_Buttons_Back_Button=DomElement.create("button","back"),_element_Dialog_Buttons_Back_Button.onclick=onDialogBack,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Back_Button),_element_Dialog_Buttons_Next_Button=DomElement.create("button","next"),_element_Dialog_Buttons_Next_Button.onclick=onDialogNext,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Next_Button),makeDialogMovable()}function onDialogClose(e=!0){let t=!1;if(t=!Is.definedString(_configuration.closeDialogConfirmationText)||!e||confirm(_configuration.closeDialogConfirmationText),t){const e=getGroupBindingOptions();Is.defined(e)&&Is.defined(e._currentView.element)&&fireCustomTriggerEvent(e.events.onClose,e._currentView.element),removeFocusClassFromLastElement(!1),hideDisabledBackground(),hideToolTip(),_element_Dialog.style.display="none"}}function onDialogBack(){_groups[_groups_Current].position>0&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position--,showDialogAndSetPosition())}function onDialogNext(){if(_groups[_groups_Current].position===_groups[_groups_Current].keys.length-1){const e=getGroupBindingOptions();onDialogClose(!1),fireCustomTriggerEvent(e.events.onFinish,e._currentView.element)}else removeFocusClassFromLastElement(),_groups[_groups_Current].position++,showDialogAndSetPosition()}function showDialogAndSetPosition(){const e=getGroupBindingOptions();if(Is.defined(e)&&Is.defined(e._currentView.element)){e.showDisabledBackground?showDisabledBackground():hideDisabledBackground(),hideToolTip(),_element_Dialog_Close_Button.style.display=_configuration.showCloseButton?"block":"none",_configuration_ShortcutKeysEnabled=!0,e._currentView.element.className+=" journey-js-element-focus",_configuration.scrollToElements&&e._currentView.element.scrollIntoView();const t=DomElement.getStyleValueByName(e._currentView.element,"position");""!==t&&"static"===t.toLowerCase()&&(_element_Focus_Element_PositionStyle=t,e._currentView.element.style.position="relative"),DomElement.showElementBasedOnCondition(_element_Dialog_CheckBox_Container,_configuration.showDoNotShowAgain),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressDots,_configuration.showProgressDots&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar,_configuration.showProgressBar&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text,_configuration.showProgressBarText),DomElement.showElementBasedOnCondition(_element_Dialog_Buttons,_configuration.showButtons),_element_Dialog_Buttons_Back_Button.innerHTML=_configuration.backButtonText,_element_Dialog_Buttons_Back_Button.disabled=0===_groups[_groups_Current].position,_groups[_groups_Current].position>=_groups[_groups_Current].keys.length-1?_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.finishButtonText:_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.nextButtonText,setDialogText(e),setDialogPosition(null,e),buildProcessDots(),setProgressBarPosition(),fireCustomTriggerEvent(e.events.onEnter,e._currentView.element),e.sendClick&&e._currentView.element.click()}}function setDialogText(e){Is.definedString(e.title)?_element_Dialog_Title.innerHTML=e.title:_element_Dialog_Title.innerHTML="",Is.definedString(e.description)?_element_Dialog_Description.innerHTML=e.description:_element_Dialog_Description.innerHTML=""}function setDialogPosition(e,t){if("block"!==_element_Dialog.style.display&&(_element_Dialog.style.display="block",fireCustomTriggerEvent(t.events.onOpen,t._currentView.element)),0===_groups[_groups_Current].position&&fireCustomTriggerEvent(t.events.onStart,t._currentView.element),_element_Dialog_IsHint=!0===t.isHint,t.attach||t.isHint)if(t.isHint&&t.alignHintToClickPosition)DomElement.showElementAtMousePosition(e,_element_Dialog);else{const e=DomElement.getOffset(t._currentView.element);let o=e.top+t._currentView.element.offsetHeight,n=e.left;(n+_element_Dialog.offsetWidth>window.innerWidth||t.alignRight)&&(n-=_element_Dialog.offsetWidth,n+=t._currentView.element.offsetWidth),(o+_element_Dialog.offsetHeight>window.innerHeight||t.alignTop)&&(o-=_element_Dialog.offsetHeight+t._currentView.element.offsetHeight),_element_Dialog.style.top=o+"px",_element_Dialog.style.left=n+"px"}else{const e=DomElement.getScrollPosition(),t=Math.max(0,(window.innerWidth-_element_Dialog.offsetWidth)/2+e.left),o=Math.max(0,(window.innerHeight-_element_Dialog.offsetHeight)/2+e.top);_element_Dialog.style.left=t+"px",_element_Dialog.style.top=o+"px"}}function removeFocusClassFromLastElement(e=!0){const t=getGroupBindingOptions();Is.defined(t)&&Is.defined(t._currentView.element)&&(t._currentView.element.className=t._currentView.element.className.replace(" journey-js-element-focus",""),Is.defined(_element_Focus_Element_PositionStyle)&&(t._currentView.element.style.position=_element_Focus_Element_PositionStyle),e&&fireCustomTriggerEvent(t.events.onLeave,t._currentView.element))}function buildProcessDots(){if(_element_Dialog_ProgressDots.innerHTML="",_configuration.showProgressDots){const e=_groups[_groups_Current].keys.length;for(let t=0;t{removeFocusClassFromLastElement(),_groups[_groups_Current].position=e,showDialogAndSetPosition()}),_element_Dialog_ProgressDots.appendChild(n),_configuration.showProgressDotToolTips&&(Is.definedString(o.tooltip)?addToolTip(n,o.tooltip):addToolTip(n,o.title)),_configuration.showProgressDotNumbers&&(n.className+=" dot-number",n.innerHTML=(e+1).toString())}function setProgressBarPosition(){if(_configuration.showProgressBar){const e=_element_Dialog_ProgressBar.offsetWidth/_groups[_groups_Current].keys.length,t=(_groups[_groups_Current].position+1)*e,o=Math.ceil((_groups[_groups_Current].position+1)/_groups[_groups_Current].keys.length*100);_element_Dialog_ProgressBar_Percentage.style.width=t+"px",_element_Dialog_ProgressBar_Percentage_Text.innerHTML=o+"%"}}function makeDialogMovable(){_element_Dialog_Title.onmousedown=onMoveTitleBarMouseDown,_element_Dialog_Title.onmouseup=onMoveTitleBarMouseUp,_element_Dialog_Title.oncontextmenu=onMoveTitleBarMouseUp,document.body.addEventListener("mousemove",onMoveDocumentMouseMove),document.body.addEventListener("mouseleave",onMoveDocumentMouseLeave)}function onMoveTitleBarMouseDown(e){_element_Dialog_Move_IsMoving||_element_Dialog_IsHint||!_configuration.dialogMovingEnabled||(_element_Dialog.className+=" journey-js-dialog-moving",_element_Dialog_Move_IsMoving=!0,_element_Dialog_Move_X=e.pageX-_element_Dialog.offsetLeft,_element_Dialog_Move_Y=e.pageY-_element_Dialog.offsetTop,_element_Dialog_Move_Original_X=_element_Dialog.offsetLeft,_element_Dialog_Move_Original_Y=_element_Dialog.offsetTop)}function onMoveTitleBarMouseUp(){_element_Dialog_Move_IsMoving&&(_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function onMoveDocumentMouseMove(e){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=e.pageX-_element_Dialog_Move_X+"px",_element_Dialog.style.top=e.pageY-_element_Dialog_Move_Y+"px")}function onMoveDocumentMouseLeave(){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=_element_Dialog_Move_Original_X+"px",_element_Dialog.style.top=_element_Dialog_Move_Original_Y+"px",_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function renderToolTip(){Is.defined(_element_ToolTip)||(_element_ToolTip=DomElement.create("div","journey-js-tooltip"),_element_ToolTip.style.display="none",document.body.appendChild(_element_ToolTip),document.body.addEventListener("mousemove",(()=>{hideToolTip()})),document.addEventListener("scroll",(()=>{hideToolTip()})))}function addToolTip(e,t){null!==e&&(e.onmousemove=e=>{showToolTip(e,t)})}function showToolTip(e,t){DomElement.cancelBubble(e),hideToolTip(),_element_ToolTip_Timer=setTimeout((()=>{_element_ToolTip.innerHTML=t,_element_ToolTip.style.display="block",DomElement.showElementAtMousePosition(e,_element_ToolTip)}),_configuration.tooltipDelay)}function hideToolTip(){Is.defined(_element_ToolTip)&&(0!==_element_ToolTip_Timer&&(clearTimeout(_element_ToolTip_Timer),_element_ToolTip_Timer=0),"block"===_element_ToolTip.style.display&&(_element_ToolTip.style.display="none"))}function getElements(){const e=_configuration.domElementTypes,t=e.length;for(let o=0;o{DomElement.cancelBubble(t),_element_Dialog_CheckBox_Container.style.display="none",_element_Dialog_ProgressDots.style.display="none",_element_Dialog_ProgressBar.style.display="none",_element_Dialog_Buttons.style.display="none",_configuration_ShortcutKeysEnabled=!1,setDialogText(e),setDialogPosition(t,e),e.removeHintWhenViewed&&DomElement.clearElementsByClassName(e._currentView.element,"journey-js-hint")}}function buildDocumentEvents(e=!0){const t=e?document.addEventListener:document.removeEventListener,o=e?window.addEventListener:window.removeEventListener;_configuration.shortcutKeysEnabled&&t("keydown",onWindowKeyDown),o("resize",onWindowResize)}function onWindowKeyDown(e){_public.isOpen()&&_configuration.shortcutKeysEnabled&&("Escape"===e.code?(e.preventDefault(),onDialogClose()):_configuration_ShortcutKeysEnabled&&("ArrowLeft"===e.code?(e.preventDefault(),onDialogBack()):"ArrowRight"===e.code?(e.preventDefault(),onDialogNext()):"ArrowUp"===e.code?(e.preventDefault(),onWindowKeyCodeUp()):"ArrowDown"===e.code&&(e.preventDefault(),onWindowKeyCodeDown())))}function onWindowResize(){_public.isOpen()&&showDialogAndSetPosition()}function onWindowKeyCodeUp(){0!==_groups[_groups_Current].position&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=0,showDialogAndSetPosition())}function onWindowKeyCodeDown(){_groups[_groups_Current].position!==_groups[_groups_Current].keys.length-1&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=_groups[_groups_Current].keys.length-1,showDialogAndSetPosition())}function buildAttributeOptions(e){let t=Data.getDefaultObject(e,{});return t.order=Data.getDefaultNumber(t.order,0),t.attach=Data.getDefaultBoolean(t.attach,!0),t.sendClick=Data.getDefaultBoolean(t.sendClick,!1),t.alignTop=Data.getDefaultBoolean(t.alignTop,!1),t.alignRight=Data.getDefaultBoolean(t.alignRight,!1),t.isHint=Data.getDefaultBoolean(t.isHint,!1),t.alignHintToClickPosition=Data.getDefaultBoolean(t.alignHintToClickPosition,!1),t.showDisabledBackground=Data.getDefaultBoolean(t.showDisabledBackground,!0),t.removeHintWhenViewed=Data.getDefaultBoolean(t.removeHintWhenViewed,!1),t.group=Data.getDefaultString(t.group,_groups_Default),t=buildAttributeOptionStrings(t),buildAttributeOptionCustomTriggers(t)}function buildAttributeOptionStrings(e){return e.title=Data.getDefaultString(e.title,""),e.description=Data.getDefaultString(e.description,""),e.tooltip=Data.getDefaultString(e.tooltip,""),e}function buildAttributeOptionCustomTriggers(e){return e.events=Data.getDefaultObject(e.events,{}),e.events.onEnter=Data.getDefaultFunction(e.events.onEnter,null),e.events.onLeave=Data.getDefaultFunction(e.events.onLeave,null),e.events.onClose=Data.getDefaultFunction(e.events.onClose,null),e.events.onFinish=Data.getDefaultFunction(e.events.onFinish,null),e.events.onOpen=Data.getDefaultFunction(e.events.onOpen,null),e.events.onStart=Data.getDefaultFunction(e.events.onStart,null),e.events.onAddStep=Data.getDefaultFunction(e.events.onAddStep,null),e.events.onRemoveStep=Data.getDefaultFunction(e.events.onRemoveStep,null),e}function fireCustomTriggerEvent(e,...t){Is.definedFunction(e)&&e.apply(null,[].slice.call(t,0))}function getBrowserUrlParameters(){let e=!1;if(_configuration.browserUrlParametersEnabled){const t=getBrowserUrlArguments(window.location.href);if(Is.defined(t.sjOrderId)){const e=parseInt(t.sjOrderId,10);!isNaN(e)&&e<=_groups[_groups_Current].keys.length-1&&(_groups[_groups_Current].position=e)}Is.defined(t.sjShow)&&(e="true"===t.sjShow)}return e}function getBrowserUrlArguments(e){const t={},o=e.split("?");if(o.length>1){const e=o[1].split("&"),n=e.length;for(let o=0;o=_groups[_groups_Current].keys.length-1},addDocumentSteps:function(){return getElements(),_public},addStep:function(e,t){return Is.definedObject(e)&&Is.definedObject(t)&&(setupElement(e,buildAttributeOptions(t)),_groups[_groups_Current].keys.sort(),resetDialogPosition()),_public},removeStep:function(e){if(Is.definedObject(e)){let t=!1;for(let o in _groups)if(_groups.hasOwnProperty(o))for(let n in _groups[o].json)if(_groups[o].json.hasOwnProperty(n)){const i=_groups[o].json[n];if(i._currentView.element===e){fireCustomTriggerEvent(i.events.onRemoveStep,i._currentView.element),_groups[o].keys.splice(_groups[o].keys.indexOf(i.order),1),delete _groups[o].json[i.order],_groups[o].keys.sort(),t=!0;break}}t?resetDialogPosition():DomElement.clearElementsByClassName(e,"journey-js-hint")}return _public},clearSteps:function(e=""){resetDialogPosition();for(let t in _groups)if(_groups.hasOwnProperty(t)&&(!Is.definedString(e)||e===t))for(let e in _groups[t].json)if(_groups[t].json.hasOwnProperty(e)){const o=_groups[t].json[e];fireCustomTriggerEvent(o.events.onRemoveStep,o._currentView.element)}return Is.definedString(e)?_groups.hasOwnProperty(e)&&delete _groups[e]:_groups={},Is.definedString(e)&&e!==_groups_Default||setupDefaultGroup(_groups),_public},clearHints:function(){return DomElement.clearElementsByClassName(document.body,"journey-js-hint"),_public},reverseStepOrder:function(){return _groups[_groups_Current].keys.reverse(),resetDialogPosition(),_public},setConfiguration:function(e){if(Is.definedObject(e)){let t=!1;for(let o in e)e.hasOwnProperty(o)&&_configuration.hasOwnProperty(o)&&_configuration[o]!==e[o]&&(_configuration[o]=e[o],t=!0);t&&buildDefaultConfiguration(_configuration)}return _public},getVersion:function(){return"2.0.0"}};buildDefaultConfiguration(),document.addEventListener("DOMContentLoaded",(()=>{setupDefaultGroup(),renderDisabledBackground(),renderDialog(),renderToolTip(),getElements(),buildDocumentEvents(),getBrowserUrlParameters()&&_public.show()})),Is.defined(window.$journey)||(window.$journey=_public)})(); \ No newline at end of file +var Constants,Is,Data,DomElement;(Constants||(Constants={})).JOURNEY_JS_ATTRIBUTE_NAME="data-journey-js",(e=>{function t(e){return null!=e&&""!==e}function o(e){return t(e)&&"object"==typeof e}e.defined=t,e.definedObject=o,e.definedBoolean=function(e){return t(e)&&"boolean"==typeof e},e.definedString=function(e){return t(e)&&"string"==typeof e},e.definedFunction=function(e){return t(e)&&"function"==typeof e},e.definedNumber=function(e){return t(e)&&"number"==typeof e},e.definedArray=function(e){return o(e)&&e instanceof Array}})(Is||(Is={})),(e=>{function t(e,t){return Is.definedArray(e)?e:t}e.getDefaultAnyString=function(e,t){return"string"==typeof e?e:t},e.getDefaultString=function(e,t){return Is.definedString(e)?e:t},e.getDefaultBoolean=function(e,t){return Is.definedBoolean(e)?e:t},e.getDefaultNumber=function(e,t){return Is.definedNumber(e)?e:t},e.getDefaultFunction=function(e,t){return Is.definedFunction(e)?e:t},e.getDefaultObject=function(e,t){return Is.definedObject(e)?e:t},e.getDefaultArray=t,e.getDefaultStringOrArray=function(e,o){let n=o;if(Is.definedString(e)){const t=e.toString().split(" ");0===t.length?e=o:n=t}else n=t(e,o);return n}})(Data||(Data={})),(e=>{function t(e,t=""){const o=e.toLowerCase();let n="text"===o?document.createTextNode(""):document.createElement(o);return Is.defined(t)&&(n.className=t),n}function o(){const e=document.documentElement;return{left:(window.pageXOffset||e.scrollLeft)-(e.clientLeft||0),top:(window.pageYOffset||e.scrollTop)-(e.clientTop||0)}}e.create=t,e.getOffset=function(e){const t={left:0,top:0};for(;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t.left+=e.offsetLeft-e.scrollLeft,t.top+=e.offsetTop-e.scrollTop,e=e.offsetParent;return t},e.getScrollPosition=o,e.getStyleValueByName=function(e,t){let o=null;return document.defaultView.getComputedStyle?o=document.defaultView.getComputedStyle(e,null).getPropertyValue(t):e.currentStyle&&(o=e.currentStyle[t]),o},e.addNode=function(e,t){try{e.contains(t)||e.appendChild(t)}catch(e){console.warn(e.message)}},e.removeNode=function(e,t){try{e.contains(t)&&e.removeChild(t)}catch(e){console.warn(e.message)}},e.cancelBubble=function(e){e.preventDefault(),e.cancelBubble=!0},e.showElementAtMousePosition=function(e,t){let n=e.pageX,i=e.pageY;const r=o();t.style.display="block",n+t.offsetWidth>window.innerWidth?n-=t.offsetWidth:n++,i+t.offsetHeight>window.innerHeight?i-=t.offsetHeight:i++,n{let _configuration={},_configuration_ShortcutKeysEnabled=!0;const _groups_Default="default";let _groups_Current=_groups_Default,_groups={},_element_Focus_Element_PositionStyle="",_element_Disabled_Background,_element_Dialog,_element_Dialog_Close_Button,_element_Dialog_Title,_element_Dialog_Description,_element_Dialog_CheckBox_Container,_element_Dialog_CheckBox_Input,_element_Dialog_ProgressDots,_element_Dialog_ProgressBar,_element_Dialog_ProgressBar_Percentage,_element_Dialog_ProgressBar_Percentage_Text,_element_Dialog_Buttons,_element_Dialog_Buttons_Back_Button,_element_Dialog_Buttons_Next_Button,_element_Dialog_IsHint=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_X=0,_element_Dialog_Move_Y=0,_element_ToolTip,_element_ToolTip_Timer=0;function setupDefaultGroup(e=null){_groups=Data.getDefaultObject(e,{}),_groups[_groups_Default]={json:{},keys:[],position:0}}function setupNewGroup(e){_groups.hasOwnProperty(e)||(_groups[e]={json:{},keys:[],position:0})}function getGroupBindingOptions(){return _groups[_groups_Current].json[_groups[_groups_Current].keys[_groups[_groups_Current].position]]}function renderDisabledBackground(){_element_Disabled_Background=DomElement.create("div","journey-js-disabled-background"),_element_Disabled_Background.onclick=()=>{_configuration.closeDialogOnDisabledBackgroundClick&&onDialogClose()}}function showDisabledBackground(){DomElement.addNode(document.body,_element_Disabled_Background)}function hideDisabledBackground(){DomElement.removeNode(document.body,_element_Disabled_Background)}function renderDialog(){_element_Dialog=DomElement.create("div","journey-js-dialog"),_element_Dialog.style.display="none",document.body.appendChild(_element_Dialog),_element_Dialog_Close_Button=DomElement.create("button","close"),_element_Dialog.appendChild(_element_Dialog_Close_Button),_element_Dialog_Close_Button.onclick=()=>{onDialogClose()},addToolTip(_element_Dialog_Close_Button,_configuration.closeButtonToolTipText),_element_Dialog_Title=DomElement.create("div","title"),_element_Dialog.appendChild(_element_Dialog_Title),_element_Dialog_Description=DomElement.create("div","description"),_element_Dialog.appendChild(_element_Dialog_Description),_element_Dialog_CheckBox_Container=DomElement.create("div","checkbox-container"),_element_Dialog.appendChild(_element_Dialog_CheckBox_Container),_element_Dialog_CheckBox_Input=DomElement.createCheckBox(_element_Dialog_CheckBox_Container,_configuration.doNotShowAgainText),_element_Dialog_CheckBox_Input.onchange=()=>{_configuration.showDoNotShowAgain&&fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange,_element_Dialog_CheckBox_Input.checked)},_element_Dialog_ProgressDots=DomElement.create("div","progress-dots"),_element_Dialog.appendChild(_element_Dialog_ProgressDots),_element_Dialog_ProgressBar=DomElement.create("div","progress-bar"),_element_Dialog.appendChild(_element_Dialog_ProgressBar),_element_Dialog_ProgressBar_Percentage=DomElement.create("div","progress-bar-percentage"),_element_Dialog_ProgressBar.appendChild(_element_Dialog_ProgressBar_Percentage),_element_Dialog_ProgressBar_Percentage_Text=DomElement.create("p","progress-bar-percentage-text"),_element_Dialog_ProgressBar_Percentage.appendChild(_element_Dialog_ProgressBar_Percentage_Text),_element_Dialog_Buttons=DomElement.create("div","buttons"),_element_Dialog.appendChild(_element_Dialog_Buttons),_element_Dialog_Buttons_Back_Button=DomElement.create("button","back"),_element_Dialog_Buttons_Back_Button.onclick=onDialogBack,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Back_Button),_element_Dialog_Buttons_Next_Button=DomElement.create("button","next"),_element_Dialog_Buttons_Next_Button.onclick=onDialogNext,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Next_Button),makeDialogMovable()}function onDialogClose(e=!0){let t=!1;if(t=!Is.definedString(_configuration.closeDialogConfirmationText)||!e||confirm(_configuration.closeDialogConfirmationText),t){const e=getGroupBindingOptions();Is.defined(e)&&Is.defined(e._currentView.element)&&fireCustomTriggerEvent(e.events.onClose,e._currentView.element),removeFocusClassFromLastElement(!1),hideDisabledBackground(),hideToolTip(),_element_Dialog.style.display="none"}}function onDialogBack(){_groups[_groups_Current].position>0&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position--,showDialogAndSetPosition())}function onDialogNext(){if(_groups[_groups_Current].position===_groups[_groups_Current].keys.length-1){const e=getGroupBindingOptions();onDialogClose(!1),fireCustomTriggerEvent(e.events.onFinish,e._currentView.element)}else removeFocusClassFromLastElement(),_groups[_groups_Current].position++,showDialogAndSetPosition()}function showDialogAndSetPosition(){const e=getGroupBindingOptions();if(Is.defined(e)&&Is.defined(e._currentView.element)){e.showDisabledBackground?showDisabledBackground():hideDisabledBackground(),hideToolTip(),_element_Dialog_Close_Button.style.display=_configuration.showCloseButton?"block":"none",_configuration_ShortcutKeysEnabled=!0,e._currentView.element.className+=" journey-js-element-focus",_configuration.scrollToElements&&e._currentView.element.scrollIntoView();const t=DomElement.getStyleValueByName(e._currentView.element,"position");""!==t&&"static"===t.toLowerCase()&&(_element_Focus_Element_PositionStyle=t,e._currentView.element.style.position="relative"),DomElement.showElementBasedOnCondition(_element_Dialog_CheckBox_Container,_configuration.showDoNotShowAgain),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressDots,_configuration.showProgressDots&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar,_configuration.showProgressBar&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text,_configuration.showProgressBarText),DomElement.showElementBasedOnCondition(_element_Dialog_Buttons,_configuration.showButtons),_element_Dialog_Buttons_Back_Button.innerHTML=_configuration.backButtonText,_element_Dialog_Buttons_Back_Button.disabled=0===_groups[_groups_Current].position,_groups[_groups_Current].position>=_groups[_groups_Current].keys.length-1?_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.finishButtonText:_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.nextButtonText,setDialogText(e),setDialogPosition(null,e),buildProcessDots(),setProgressBarPosition(),fireCustomTriggerEvent(e.events.onEnter,e._currentView.element),e.sendClick&&e._currentView.element.click()}}function setDialogText(e){Is.definedString(e.title)?_element_Dialog_Title.innerHTML=e.title:_element_Dialog_Title.innerHTML="",Is.definedString(e.description)?_element_Dialog_Description.innerHTML=e.description:_element_Dialog_Description.innerHTML=""}function setDialogPosition(e,t){if("block"!==_element_Dialog.style.display&&(_element_Dialog.style.display="block",fireCustomTriggerEvent(t.events.onOpen,t._currentView.element)),0===_groups[_groups_Current].position&&fireCustomTriggerEvent(t.events.onStart,t._currentView.element),_element_Dialog_IsHint=!0===t.isHint,t.attach||t.isHint)if(t.isHint&&t.alignHintToClickPosition)DomElement.showElementAtMousePosition(e,_element_Dialog);else{const e=DomElement.getOffset(t._currentView.element);let o=e.top+t._currentView.element.offsetHeight,n=e.left;(n+_element_Dialog.offsetWidth>window.innerWidth||t.alignRight)&&(n-=_element_Dialog.offsetWidth,n+=t._currentView.element.offsetWidth),(o+_element_Dialog.offsetHeight>window.innerHeight||t.alignTop)&&(o-=_element_Dialog.offsetHeight+t._currentView.element.offsetHeight),_element_Dialog.style.top=o+"px",_element_Dialog.style.left=n+"px"}else{const e=DomElement.getScrollPosition(),t=Math.max(0,(window.innerWidth-_element_Dialog.offsetWidth)/2+e.left),o=Math.max(0,(window.innerHeight-_element_Dialog.offsetHeight)/2+e.top);_element_Dialog.style.left=t+"px",_element_Dialog.style.top=o+"px"}}function removeFocusClassFromLastElement(e=!0){const t=getGroupBindingOptions();Is.defined(t)&&Is.defined(t._currentView.element)&&(t._currentView.element.className=t._currentView.element.className.replace(" journey-js-element-focus",""),Is.defined(_element_Focus_Element_PositionStyle)&&(t._currentView.element.style.position=_element_Focus_Element_PositionStyle),e&&fireCustomTriggerEvent(t.events.onLeave,t._currentView.element))}function buildProcessDots(){if(_element_Dialog_ProgressDots.innerHTML="",_configuration.showProgressDots){const e=_groups[_groups_Current].keys.length;for(let t=0;t{removeFocusClassFromLastElement(),_groups[_groups_Current].position=e,showDialogAndSetPosition()}),_element_Dialog_ProgressDots.appendChild(n),_configuration.showProgressDotToolTips&&(Is.definedString(o.tooltip)?addToolTip(n,o.tooltip):addToolTip(n,o.title)),_configuration.showProgressDotNumbers&&(n.className+=" dot-number",n.innerHTML=(e+1).toString())}function setProgressBarPosition(){if(_configuration.showProgressBar){const e=_element_Dialog_ProgressBar.offsetWidth/_groups[_groups_Current].keys.length,t=(_groups[_groups_Current].position+1)*e,o=Math.ceil((_groups[_groups_Current].position+1)/_groups[_groups_Current].keys.length*100);_element_Dialog_ProgressBar_Percentage.style.width=t+"px",_element_Dialog_ProgressBar_Percentage_Text.innerHTML=o+"%"}}function makeDialogMovable(){_element_Dialog_Title.onmousedown=onMoveTitleBarMouseDown,_element_Dialog_Title.onmouseup=onMoveTitleBarMouseUp,_element_Dialog_Title.oncontextmenu=onMoveTitleBarMouseUp,document.body.addEventListener("mousemove",onMoveDocumentMouseMove),document.body.addEventListener("mouseleave",onMoveDocumentMouseLeave)}function onMoveTitleBarMouseDown(e){_element_Dialog_Move_IsMoving||_element_Dialog_IsHint||!_configuration.dialogMovingEnabled||(_element_Dialog.className+=" journey-js-dialog-moving",_element_Dialog_Move_IsMoving=!0,_element_Dialog_Move_X=e.pageX-_element_Dialog.offsetLeft,_element_Dialog_Move_Y=e.pageY-_element_Dialog.offsetTop,_element_Dialog_Move_Original_X=_element_Dialog.offsetLeft,_element_Dialog_Move_Original_Y=_element_Dialog.offsetTop)}function onMoveTitleBarMouseUp(){_element_Dialog_Move_IsMoving&&(_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function onMoveDocumentMouseMove(e){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=e.pageX-_element_Dialog_Move_X+"px",_element_Dialog.style.top=e.pageY-_element_Dialog_Move_Y+"px")}function onMoveDocumentMouseLeave(){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=_element_Dialog_Move_Original_X+"px",_element_Dialog.style.top=_element_Dialog_Move_Original_Y+"px",_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function renderToolTip(){Is.defined(_element_ToolTip)||(_element_ToolTip=DomElement.create("div","journey-js-tooltip"),_element_ToolTip.style.display="none",document.body.appendChild(_element_ToolTip),document.body.addEventListener("mousemove",(()=>{hideToolTip()})),document.addEventListener("scroll",(()=>{hideToolTip()})))}function addToolTip(e,t){null!==e&&(e.onmousemove=e=>{showToolTip(e,t)})}function showToolTip(e,t){DomElement.cancelBubble(e),hideToolTip(),_element_ToolTip_Timer=setTimeout((()=>{_element_ToolTip.innerHTML=t,_element_ToolTip.style.display="block",DomElement.showElementAtMousePosition(e,_element_ToolTip)}),_configuration.tooltipDelay)}function hideToolTip(){Is.defined(_element_ToolTip)&&(0!==_element_ToolTip_Timer&&(clearTimeout(_element_ToolTip_Timer),_element_ToolTip_Timer=0),"block"===_element_ToolTip.style.display&&(_element_ToolTip.style.display="none"))}function getElements(){const e=_configuration.domElementTypes,t=e.length;for(let o=0;o{DomElement.cancelBubble(t),_element_Dialog_CheckBox_Container.style.display="none",_element_Dialog_ProgressDots.style.display="none",_element_Dialog_ProgressBar.style.display="none",_element_Dialog_Buttons.style.display="none",_configuration_ShortcutKeysEnabled=!1,setDialogText(e),setDialogPosition(t,e),e.removeHintWhenViewed&&DomElement.clearElementsByClassName(e._currentView.element,"journey-js-hint")}}function buildDocumentEvents(e=!0){const t=e?document.addEventListener:document.removeEventListener,o=e?window.addEventListener:window.removeEventListener;_configuration.shortcutKeysEnabled&&t("keydown",onWindowKeyDown),o("resize",onWindowResize)}function onWindowKeyDown(e){_public.isOpen()&&_configuration.shortcutKeysEnabled&&("Escape"===e.code?(e.preventDefault(),onDialogClose()):_configuration_ShortcutKeysEnabled&&("ArrowLeft"===e.code?(e.preventDefault(),onDialogBack()):"ArrowRight"===e.code?(e.preventDefault(),onDialogNext()):"ArrowUp"===e.code?(e.preventDefault(),onWindowKeyCodeUp()):"ArrowDown"===e.code&&(e.preventDefault(),onWindowKeyCodeDown())))}function onWindowResize(){_public.isOpen()&&showDialogAndSetPosition()}function onWindowKeyCodeUp(){0!==_groups[_groups_Current].position&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=0,showDialogAndSetPosition())}function onWindowKeyCodeDown(){_groups[_groups_Current].position!==_groups[_groups_Current].keys.length-1&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=_groups[_groups_Current].keys.length-1,showDialogAndSetPosition())}function buildAttributeOptions(e){let t=Data.getDefaultObject(e,{});return t.order=Data.getDefaultNumber(t.order,0),t.attach=Data.getDefaultBoolean(t.attach,!0),t.sendClick=Data.getDefaultBoolean(t.sendClick,!1),t.alignTop=Data.getDefaultBoolean(t.alignTop,!1),t.alignRight=Data.getDefaultBoolean(t.alignRight,!1),t.isHint=Data.getDefaultBoolean(t.isHint,!1),t.alignHintToClickPosition=Data.getDefaultBoolean(t.alignHintToClickPosition,!1),t.showDisabledBackground=Data.getDefaultBoolean(t.showDisabledBackground,!0),t.removeHintWhenViewed=Data.getDefaultBoolean(t.removeHintWhenViewed,!1),t.group=Data.getDefaultString(t.group,_groups_Default),t=buildAttributeOptionStrings(t),buildAttributeOptionCustomTriggers(t)}function buildAttributeOptionStrings(e){return e.title=Data.getDefaultString(e.title,""),e.description=Data.getDefaultString(e.description,""),e.tooltip=Data.getDefaultString(e.tooltip,""),e}function buildAttributeOptionCustomTriggers(e){return e.events=Data.getDefaultObject(e.events,{}),e.events.onEnter=Data.getDefaultFunction(e.events.onEnter,null),e.events.onLeave=Data.getDefaultFunction(e.events.onLeave,null),e.events.onClose=Data.getDefaultFunction(e.events.onClose,null),e.events.onFinish=Data.getDefaultFunction(e.events.onFinish,null),e.events.onOpen=Data.getDefaultFunction(e.events.onOpen,null),e.events.onStart=Data.getDefaultFunction(e.events.onStart,null),e.events.onAddStep=Data.getDefaultFunction(e.events.onAddStep,null),e.events.onRemoveStep=Data.getDefaultFunction(e.events.onRemoveStep,null),e}function fireCustomTriggerEvent(e,...t){Is.definedFunction(e)&&e.apply(null,[].slice.call(t,0))}function getBrowserUrlParameters(){let e=!1;if(_configuration.browserUrlParametersEnabled){const t=getBrowserUrlArguments(window.location.href);if(Is.defined(t.sjOrderId)){const e=parseInt(t.sjOrderId,10);!isNaN(e)&&e<=_groups[_groups_Current].keys.length-1&&(_groups[_groups_Current].position=e)}Is.defined(t.sjShow)&&(e="true"===t.sjShow)}return e}function getBrowserUrlArguments(e){const t={},o=e.split("?");if(o.length>1){const e=o[1].split("&"),n=e.length;for(let o=0;o=_groups[_groups_Current].keys.length-1},addDocumentSteps:function(){return getElements(),_public},addStep:function(e,t){return Is.definedObject(e)&&Is.definedObject(t)&&(setupElement(e,buildAttributeOptions(t)),_groups[_groups_Current].keys.sort(),resetDialogPosition()),_public},removeStep:function(e){if(Is.definedObject(e)){let t=!1;for(let o in _groups)if(_groups.hasOwnProperty(o))for(let n in _groups[o].json)if(_groups[o].json.hasOwnProperty(n)){const i=_groups[o].json[n];if(i._currentView.element===e){fireCustomTriggerEvent(i.events.onRemoveStep,i._currentView.element),_groups[o].keys.splice(_groups[o].keys.indexOf(i.order),1),delete _groups[o].json[i.order],_groups[o].keys.sort(),t=!0;break}}t?resetDialogPosition():DomElement.clearElementsByClassName(e,"journey-js-hint")}return _public},clearSteps:function(e=""){resetDialogPosition();for(let t in _groups)if(_groups.hasOwnProperty(t)&&(!Is.definedString(e)||e===t))for(let e in _groups[t].json)if(_groups[t].json.hasOwnProperty(e)){const o=_groups[t].json[e];fireCustomTriggerEvent(o.events.onRemoveStep,o._currentView.element)}return Is.definedString(e)?_groups.hasOwnProperty(e)&&delete _groups[e]:_groups={},Is.definedString(e)&&e!==_groups_Default||setupDefaultGroup(_groups),_public},clearHints:function(){return DomElement.clearElementsByClassName(document.body,"journey-js-hint"),_public},reverseStepOrder:function(){return _groups[_groups_Current].keys.reverse(),resetDialogPosition(),_public},setConfiguration:function(e){if(Is.definedObject(e)){let t=!1;const o=_configuration;for(let n in e)e.hasOwnProperty(n)&&_configuration.hasOwnProperty(n)&&o[n]!==e[n]&&(o[n]=e[n],t=!0);t&&buildDefaultConfiguration(o)}return _public},getVersion:function(){return"2.0.0"}};buildDefaultConfiguration(),document.addEventListener("DOMContentLoaded",(()=>{setupDefaultGroup(),renderDisabledBackground(),renderDialog(),renderToolTip(),getElements(),buildDocumentEvents(),getBrowserUrlParameters()&&_public.show()})),Is.defined(window.$journey)||(window.$journey=_public)})(); \ No newline at end of file diff --git a/src/journey.ts b/src/journey.ts index 1cdc5dd..b1abee1 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -1118,16 +1118,17 @@ type Groups = Record Date: Thu, 4 Jul 2024 18:27:35 +0100 Subject: [PATCH 38/44] Strict mode is now always on. --- dist/journey.esm.js | 8 +++++++- dist/journey.esm.js.map | 2 +- dist/journey.js | 2 ++ dist/journey.js.map | 2 +- dist/journey.min.js | 2 +- tsconfig.json | 2 +- 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index b1e0891..ce3b262 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -11,13 +11,16 @@ var __commonJS = (e, t) => function o() { }; var init_enum = __esm({ - "src/ts/enum.ts"() {} + "src/ts/enum.ts"() { + "use strict"; + } }); var Constants; var init_constant = __esm({ "src/ts/constant.ts"() { + "use strict"; (e => { e.JOURNEY_JS_ATTRIBUTE_NAME = "data-journey-js"; })(Constants || (Constants = {})); @@ -28,6 +31,7 @@ var Is; var init_is = __esm({ "src/ts/is.ts"() { + "use strict"; init_enum(); (e => { function t(e) { @@ -66,6 +70,7 @@ var Data; var init_data = __esm({ "src/ts/data.ts"() { + "use strict"; init_enum(); init_is(); (e => { @@ -120,6 +125,7 @@ var DomElement; var init_dom = __esm({ "src/ts/dom.ts"() { + "use strict"; init_enum(); init_is(); (e => { diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 46121db..786d892 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index 59e3701..01880dc 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -1,3 +1,5 @@ +"use strict"; + var Constants; (e => { diff --git a/dist/journey.js.map b/dist/journey.js.map index 3fbe4d6..42f33c5 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":";;;AAaO,IAAU;AAAA,CAAV,CAAUA,eAAV;AACI,EAAMA,WAAA,4BAA4B;AAAA,GAD5B;;;ACVV,IAAU;AAAA,CAAV,CAAUC,QAAV;AACI,WAAS,QAAS,OAAuB;AAC5C,WAAO,UAAU,QAAQ,UAAU,UAAa;AAAA,EACpD;AAFO,EAAAA,IAAS;AAIT,WAAS,cAAe,QAAwB;AACnD,WAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,EAClD;AAFO,EAAAA,IAAS;AAIT,WAAS,eAAgB,QAAwB;AACpD,WAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,EAClD;AAFO,EAAAA,IAAS;AAIT,WAAS,cAAe,QAAwB;AACnD,WAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,EAClD;AAFO,EAAAA,IAAS;AAIT,WAAS,gBAAiB,QAAwB;AACrD,WAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,EAClD;AAFO,EAAAA,IAAS;AAIT,WAAS,cAAe,QAAwB;AACnD,WAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,EAClD;AAFO,EAAAA,IAAS;AAIT,WAAS,aAAc,QAAwB;AAClD,WAAO,cAAe,MAAO,KAAK,kBAAkB;AAAA,EACxD;AAFO,EAAAA,IAAS;AAAA,GAzBH;;;ACCV,IAAU;AAAA,CAAV,CAAUC,UAAV;AACI,WAAS,oBAAqB,OAAY,cAAgC;AAC7E,WAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,EAC/C;AAFO,EAAAA,MAAS;AAIT,WAAS,iBAAkB,OAAY,cAAgC;AAC1E,WAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,EAC/C;AAFO,EAAAA,MAAS;AAIT,WAAS,kBAAmB,OAAY,cAAkC;AAC7E,WAAO,GAAG,eAAgB,KAAM,IAAI,QAAQ;AAAA,EAChD;AAFO,EAAAA,MAAS;AAIT,WAAS,iBAAkB,OAAY,cAAgC;AAC1E,WAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,EAC/C;AAFO,EAAAA,MAAS;AAIT,WAAS,mBAAoB,OAAY,cAA0B;AACtE,WAAO,GAAG,gBAAiB,KAAM,IAAI,QAAQ;AAAA,EACjD;AAFO,EAAAA,MAAS;AAIT,WAAS,iBAAkB,OAAY,cAA0B;AACpE,WAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,EAC/C;AAFO,EAAAA,MAAS;AAIT,WAAS,gBAAiB,OAAY,cAA8B;AACvE,WAAO,GAAG,aAAc,KAAM,IAAI,QAAQ;AAAA,EAC9C;AAFO,EAAAA,MAAS;AAIT,WAAS,wBAAyB,OAAY,cAA8B;AAC/E,QAAIC,UAAgB;AAEpB,QAAK,GAAG,cAAe,KAAM,GAAI;AAC7B,YAAM,SAAmB,MAAM,SAAS,EAAE,qBAAkB;AAE5D,UAAK,OAAO,WAAW,GAAI;AACvB,gBAAQ;AAAA,MACZ,OAAO;AACH,QAAAA,UAAS;AAAA,MACb;AAAA,IAEJ,OAAO;AACH,MAAAA,UAAS,gBAAiB,OAAO,YAAa;AAAA,IAClD;AAEA,WAAOA;AAAA,EACX;AAjBO,EAAAD,MAAS;AAAA,GA7BH;;;ACCV,IAAU;AAAA,CAAV,CAAUE,gBAAV;AACI,WAAS,OAAQ,MAAc,4BAA+C;AACjF,UAAM,WAAmB,KAAK,YAAY;AAC1C,UAAM,SAAkB,aAAa;AAErC,QAAID,UAAc,SAAS,SAAS,6BAA2B,IAAI,SAAS,cAAe,QAAS;AAEpG,QAAK,GAAG,QAAS,SAAU,GAAI;AAC3B,MAAAA,QAAO,YAAY;AAAA,IACvB;AAEA,WAAOA;AAAA,EACX;AAXO,EAAAC,YAAS;AAaT,WAAS,UAAW,SAAkC;AACzD,UAAMD,UAAmB;AAAA,MACrB,MAAM;AAAA,MACN,KAAK;AAAA,IACT;AAEA,WAAQ,WAAW,CAAC,MAAO,QAAQ,UAAW,KAAK,CAAC,MAAO,QAAQ,SAAU,GAAI;AAC7E,MAAAA,QAAO,QAAQ,QAAQ,aAAa,QAAQ;AAC5C,MAAAA,QAAO,OAAO,QAAQ,YAAY,QAAQ;AAE1C,gBAAU,QAAQ;AAAA,IACtB;AAEA,WAAOA;AAAA,EACX;AAdO,EAAAC,YAAS;AAgBT,WAAS,oBAA+B;AAC3C,UAAM,MAAmB,SAAS;AAElC,UAAMD,UAAmB;AAAA,MACrB,OAAQ,OAAO,eAAe,IAAI,eAAkB,IAAI,cAAc;AAAA,MACtE,MAAO,OAAO,eAAe,IAAI,cAAgB,IAAI,aAAa;AAAA,IACtE;AAEA,WAAOA;AAAA,EACX;AATO,EAAAC,YAAS;AAWT,WAAS,oBAAqB,SAAc,mBAAkC;AACjF,QAAI,QAAa;AAEjB,QAAK,SAAS,YAAY,kBAAmB;AACzC,cAAQ,SAAS,YAAY,iBAAkB,SAAS,IAAK,EAAE,iBAAkB,iBAAkB;AAAA,IACvG,WAAY,QAAQ,cAAe;AAC/B,cAAQ,QAAQ,aAAc,iBAAkB;AAAA,IACpD;AAEA,WAAO;AAAA,EACX;AAVO,EAAAA,YAAS;AAYT,WAAS,QAAS,QAAqB,MAA2B;AACrE,QAAI;AACA,UAAK,CAAC,OAAO,SAAU,IAAK,GAAI;AAC5B,eAAO,YAAa,IAAK;AAAA,MAC7B;AAAA,IACJ,SAAU,GAAI;AACV,cAAQ,KAAM,EAAE,OAAQ;AAAA,IAC5B;AAAA,EACJ;AARO,EAAAA,YAAS;AAUT,WAAS,WAAY,QAAqB,MAA2B;AACxE,QAAI;AACA,UAAK,OAAO,SAAU,IAAK,GAAI;AAC3B,eAAO,YAAa,IAAK;AAAA,MAC7B;AAAA,IACJ,SAAU,GAAI;AACV,cAAQ,KAAM,EAAE,OAAQ;AAAA,IAC5B;AAAA,EACJ;AARO,EAAAA,YAAS;AAUT,WAAS,aAAc,GAAgB;AAC1C,MAAE,eAAe;AACjB,MAAE,eAAe;AAAA,EACrB;AAHO,EAAAA,YAAS;AAKT,WAAS,2BAA4B,GAAe,SAA8B;AACrF,QAAI,OAAe,EAAE;AACrB,QAAI,MAAc,EAAE;AACpB,UAAM,iBAA2B,kBAAkB;AAEnD,YAAQ,MAAM,UAAU;AAExB,QAAK,OAAO,QAAQ,cAAc,OAAO,YAAa;AAClD,cAAQ,QAAQ;AAAA,IACpB,OAAO;AACH;AAAA,IACJ;AAEA,QAAK,MAAM,QAAQ,eAAe,OAAO,aAAc;AACnD,aAAO,QAAQ;AAAA,IACnB,OAAO;AACH;AAAA,IACJ;AAEA,QAAK,OAAO,eAAe,MAAO;AAC9B,aAAO,EAAE,QAAQ;AAAA,IACrB;AAEA,QAAK,MAAM,eAAe,KAAM;AAC5B,YAAM,EAAE,QAAQ;AAAA,IACpB;AAEA,YAAQ,MAAM,OAAO,OAAO;AAC5B,YAAQ,MAAM,MAAM,MAAM;AAAA,EAC9B;AA7BO,EAAAA,YAAS;AA+BT,WAAS,4BAA6B,SAAsB,WAA4B;AAC3F,QAAK,WAAY;AACb,UAAK,QAAQ,MAAM,YAAY,SAAU;AACrC,gBAAQ,MAAM,UAAU;AAAA,MAC5B;AAAA,IAEJ,OAAO;AACH,UAAK,QAAQ,MAAM,YAAY,QAAS;AACpC,gBAAQ,MAAM,UAAU;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAXO,EAAAA,YAAS;AAaT,WAAS,eAAgB,WAAwB,WAAuC;AAC3F,UAAM,gBAA6B,OAAQ,KAAM;AACjD,UAAM,QAAqB,OAAQ,SAAS,UAAW;AACvD,UAAM,QAA0B,OAAQ,OAAQ;AAEhD,cAAU,YAAa,aAAc;AACrC,kBAAc,YAAa,KAAM;AACjC,UAAM,YAAa,KAAM;AAEzB,UAAM,OAAO;AAEb,UAAM,YAAyB,OAAQ,QAAQ,YAAa;AAC5D,UAAM,OAAoB,OAAQ,QAAQ,MAAO;AAEjD,SAAK,YAAY;AAEjB,UAAM,YAAa,SAAU;AAC7B,UAAM,YAAa,IAAK;AAExB,WAAO;AAAA,EACX;AApBO,EAAAA,YAAS;AAsBT,WAAS,yBAA0B,WAAwB,WAA2B;AACzF,QAAI,WAAsC,UAAU,uBAAwB,SAAU;AAEtF,WAAQ,SAAU,CAAE,GAAI;AACpB,eAAU,CAAE,EAAE,WAAW,YAAa,SAAU,CAAE,CAAE;AAAA,IACxD;AAAA,EACJ;AANO,EAAAA,YAAS;AAAA,GAhJH;;;CCmCf,MAAM;AAEJ,MAAI,iBAAgC,CAAC;AAGrC,MAAI,qCAA8C;AAGlD,QAAM,kBAA0B;AAChC,MAAI,kBAA0B;AAC9B,MAAI,UAAkB,CAAC;AAGvB,MAAI;AAGJ,MAAI;AAGJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,yBAAkC;AAGtC,MAAI,kCAA0C;AAC9C,MAAI,kCAA0C;AAC9C,MAAI,gCAAyC;AAC7C,MAAI,yBAAiC;AACrC,MAAI,yBAAiC;AAGrC,MAAI;AACJ,MAAI,yBAAiC;AASrC,WAAS,kBAAmB,SAAc,MAAc;AACpD,cAAU,KAAK,iBAAkB,QAAQ,CAAC,CAAY;AAEtD,YAAS,eAAgB,IAAI;AAAA,MACzB,MAAM,CAAC;AAAA,MACP,MAAM,CAAC;AAAA,MACP,UAAU;AAAA,IACd;AAAA,EACJ;AAEA,WAAS,cAAe,OAAuB;AAC3C,QAAK,CAAC,QAAQ,eAAgB,KAAM,GAAI;AACpC,cAAS,KAAM,IAAI;AAAA,QACf,MAAM,CAAC;AAAA,QACP,MAAM,CAAC;AAAA,QACP,UAAU;AAAA,MACd;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAA0C;AAC/C,WAAO,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,QAAS,CAAE;AAAA,EACnH;AASA,WAAS,2BAAkC;AACvC,mCAA+B,WAAW,OAAQ,OAAO,gCAAiC;AAE1F,iCAA6B,UAAU,MAAM;AACzC,UAAK,eAAe,sCAAuC;AACvD,sBAAc;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,yBAAgC;AACrC,eAAW,QAAS,SAAS,MAAM,4BAA6B;AAAA,EACpE;AAEA,WAAS,yBAAgC;AACrC,eAAW,WAAY,SAAS,MAAM,4BAA6B;AAAA,EACvE;AASA,WAAS,eAAsB;AAC3B,sBAAkB,WAAW,OAAQ,OAAO,mBAAoB;AAChE,oBAAgB,MAAM,UAAU;AAChC,aAAS,KAAK,YAAa,eAAgB;AAE3C,mCAA+B,WAAW,OAAQ,UAAU,OAAQ;AACpE,oBAAgB,YAAa,4BAA6B;AAE1D,iCAA6B,UAAU,MAAM;AACzC,oBAAc;AAAA,IAClB;AAEA,eAAY,8BAA8B,eAAe,sBAAwB;AAEjF,4BAAwB,WAAW,OAAQ,OAAO,OAAQ;AAC1D,oBAAgB,YAAa,qBAAsB;AAEnD,kCAA8B,WAAW,OAAQ,OAAO,aAAc;AACtE,oBAAgB,YAAa,2BAA4B;AAEzD,yCAAqC,WAAW,OAAQ,OAAO,oBAAqB;AACpF,oBAAgB,YAAa,kCAAmC;AAEhE,qCAAiC,WAAW,eAAgB,oCAAoC,eAAe,kBAAoB;AAEnI,mCAA+B,WAAW,MAAM;AAC5C,UAAK,eAAe,oBAAqB;AACrC,+BAAwB,eAAe,wBAAwB,+BAA+B,OAAQ;AAAA,MAC1G;AAAA,IACJ;AAEA,mCAA+B,WAAW,OAAQ,OAAO,eAAgB;AACzE,oBAAgB,YAAa,4BAA6B;AAE1D,kCAA8B,WAAW,OAAQ,OAAO,cAAe;AACvE,oBAAgB,YAAa,2BAA4B;AAEzD,6CAAyC,WAAW,OAAQ,OAAO,yBAA0B;AAC7F,gCAA4B,YAAa,sCAAuC;AAEhF,kDAA8C,WAAW,OAAQ,KAAK,8BAA+B;AACrG,2CAAuC,YAAa,2CAA4C;AAEhG,8BAA0B,WAAW,OAAQ,OAAO,SAAU;AAC9D,oBAAgB,YAAa,uBAAwB;AAErD,0CAAsC,WAAW,OAAQ,UAAU,MAAO;AAC1E,wCAAoC,UAAU;AAC9C,4BAAwB,YAAa,mCAAoC;AAEzE,0CAAsC,WAAW,OAAQ,UAAU,MAAO;AAC1E,wCAAoC,UAAU;AAC9C,4BAAwB,YAAa,mCAAoC;AAEzE,sBAAkB;AAAA,EACtB;AAEA,WAAS,cAAe,sBAA+B,MAAc;AACjE,QAAI,YAAqB;AAEzB,QAAK,GAAG,cAAe,eAAe,2BAA4B,KAAK,qBAAsB;AACzF,kBAAY,QAAS,eAAe,2BAA4B;AAAA,IACpE,OAAO;AACH,kBAAY;AAAA,IAChB;AAEA,QAAK,WAAY;AACb,YAAM,iBAAiC,uBAAuB;AAE9D,UAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,+BAAwB,eAAe,OAAQ,SAAU,eAAe,aAAa,OAAQ;AAAA,MACjG;AAEA,sCAAiC,KAAM;AACvC,6BAAuB;AACvB,kBAAY;AAEZ,sBAAgB,MAAM,UAAU;AAAA,IACpC;AAAA,EACJ;AAEA,WAAS,eAAsB;AAC3B,QAAK,QAAS,eAAgB,EAAE,WAAW,GAAI;AAC3C,sCAAgC;AAEhC,cAAS,eAAgB,EAAE;AAE3B,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,eAAsB;AAC3B,QAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,YAAM,iBAAiC,uBAAuB;AAE9D,oBAAe,KAAM;AACrB,6BAAwB,eAAe,OAAQ,UAAU,eAAe,aAAa,OAAQ;AAAA,IAEjG,OAAO;AACH,sCAAgC;AAEhC,cAAS,eAAgB,EAAE;AAE3B,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,2BAAkC;AACvC,UAAM,iBAAiC,uBAAuB;AAE9D,QAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,UAAK,eAAe,wBAAyB;AACzC,+BAAuB;AAAA,MAC3B,OAAO;AACH,+BAAuB;AAAA,MAC3B;AAEA,kBAAY;AAEZ,mCAA6B,MAAM,UAAU,eAAe,kBAAkB,UAAS;AACvF,2CAAqC;AAErC,qBAAe,aAAa,QAAQ,+BAA0B;AAE9D,UAAK,eAAe,kBAAmB;AACnC,uBAAe,aAAa,QAAQ,eAAe;AAAA,MACvD;AAEA,YAAM,oBAA4B,WAAW,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAElH,UAAK,wCAAoC,kBAAkB,YAAY,MAAM,UAAW;AACpF,+CAAuC;AACvC,uBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,MACzD;AAEA,iBAAW,4BAA6B,oCAAoC,eAAe,kBAA8B;AACzH,iBAAW,4BAA6B,8BAA8B,eAAe,oBAA+B,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AAC/J,iBAAW,4BAA6B,6BAA6B,eAAe,mBAA8B,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AAC7J,iBAAW,4BAA6B,6CAA6C,eAAe,mBAA+B;AACnI,iBAAW,4BAA6B,yBAAyB,eAAe,WAAuB;AAEvG,0CAAoC,YAAY,eAAe;AAC/D,0CAAoC,WAAW,QAAS,eAAgB,EAAE,aAAa;AAEvF,UAAK,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACrF,4CAAoC,YAAY,eAAe;AAAA,MACnE,OAAO;AACH,4CAAoC,YAAY,eAAe;AAAA,MACnE;AAEA,oBAAe,cAAe;AAC9B,wBAAmB,MAAM,cAAe;AACxC,uBAAiB;AACjB,6BAAuB;AACvB,6BAAwB,eAAe,OAAQ,SAAS,eAAe,aAAa,OAAQ;AAE5F,UAAK,eAAe,WAAY;AAC5B,uBAAe,aAAa,QAAQ,MAAM;AAAA,MAC9C;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,cAAe,gBAAwC;AAC5D,QAAK,GAAG,cAAe,eAAe,KAAM,GAAI;AAC5C,4BAAsB,YAAY,eAAe;AAAA,IACrD,OAAO;AACH,4BAAsB;AAAA,IAC1B;AAEA,QAAK,GAAG,cAAe,eAAe,WAAY,GAAI;AAClD,kCAA4B,YAAY,eAAe;AAAA,IAC3D,OAAO;AACH,kCAA4B;AAAA,IAChC;AAAA,EACJ;AAEA,WAAS,kBAAmB,GAAQ,gBAAwC;AACxE,QAAK,gBAAgB,MAAM,YAAY,SAAU;AAC7C,sBAAgB,MAAM,UAAU;AAEhC,6BAAwB,eAAe,OAAQ,QAAQ,eAAe,aAAa,OAAQ;AAAA,IAC/F;AAEA,QAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,6BAAwB,eAAe,OAAQ,SAAS,eAAe,aAAa,OAAQ;AAAA,IAChG;AAEA,6BAAyB,eAAe,WAAW;AAEnD,QAAK,eAAe,UAAU,eAAe,QAAS;AAClD,UAAK,eAAe,UAAU,eAAe,0BAA2B;AACpE,mBAAW,2BAA4B,GAAG,eAAgB;AAAA,MAE9D,OAAO;AACH,cAAM,SAAmB,WAAW,UAAW,eAAe,aAAa,OAAQ;AACnF,YAAI,MAAgB,OAAO,MAAQ,eAAe,aAAa,QAAQ;AACvE,YAAI,OAAiB,OAAO;AAE5B,YAAK,OAAO,gBAAgB,cAAc,OAAO,cAAc,eAAe,YAAa;AACvF,kBAAS,gBAAgB;AACzB,kBAAQ,eAAe,aAAa,QAAQ;AAAA,QAChD;AAEA,YAAK,MAAM,gBAAgB,eAAe,OAAO,eAAe,eAAe,UAAW;AACtF,iBAAS,gBAAgB,eAAe,eAAe,aAAa,QAAQ;AAAA,QAChF;AAEA,wBAAgB,MAAM,MAAM,MAAM;AAClC,wBAAgB,MAAM,OAAO,OAAO;AAAA,MACxC;AAAA,IAEJ,OAAO;AACH,YAAM,iBAA2B,WAAW,kBAAkB;AAC9D,YAAM,aAAqB,KAAK,IAAK,IAAO,OAAO,aAAa,gBAAgB,eAAgB,IAAM,eAAe,IAAK;AAC1H,YAAM,YAAoB,KAAK,IAAK,IAAO,OAAO,cAAc,gBAAgB,gBAAiB,IAAM,eAAe,GAAI;AAE1H,sBAAgB,MAAM,OAAO,aAAa;AAC1C,sBAAgB,MAAM,MAAM,YAAY;AAAA,IAC5C;AAAA,EACJ;AAEA,WAAS,gCAAiC,oBAA6B,MAAc;AACjF,UAAM,iBAAiC,uBAAuB;AAE9D,QAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,qBAAe,aAAa,QAAQ,YAAY,eAAe,aAAa,QAAQ,UAAU,0BAAsB,0CAAuC;AAE3J,UAAK,GAAG,QAAS,oCAAqC,GAAI;AACtD,uBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,MACzD;AAEA,UAAK,mBAAoB;AACrB,+BAAwB,eAAe,OAAQ,SAAS,eAAe,aAAa,OAAQ;AAAA,MAChG;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,mBAA0B;AAC/B,iCAA6B;AAE7B,QAAK,eAAe,kBAAmB;AACnC,YAAM,aAAqB,QAAS,eAAgB,EAAE,KAAK;AAE3D,eAAU,WAAmB,GAAG,WAAW,YAAY,YAAa;AAChE,yBAAkB,UAAU,QAAS,eAAgB,EAAE,KAAM,QAAS,CAAE;AAAA,MAC5E;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,iBAAkB,UAAkB,OAAuB;AAChE,UAAM,iBAAiC,QAAS,eAAgB,EAAE,KAAM,KAAM;AAC9E,QAAI;AAEJ,QAAK,aAAa,QAAS,eAAgB,EAAE,UAAW;AACpD,YAAM,WAAW,OAAQ,OAAO,YAAa;AAAA,IACjD,OAAO;AAEH,YAAM,WAAW,OAAQ,OAAO,KAAM;AAEtC,UAAI,UAAU,MAAM;AAChB,wCAAgC;AAEhC,gBAAS,eAAgB,EAAE,WAAW;AAEtC,iCAAyB;AAAA,MAC7B;AAAA,IACJ;AAEA,iCAA6B,YAAa,GAAI;AAE9C,QAAK,eAAe,yBAA0B;AAC1C,UAAK,GAAG,cAAe,eAAe,OAAQ,GAAI;AAC9C,mBAAY,KAAK,eAAe,OAAS;AAAA,MAC7C,OAAO;AACH,mBAAY,KAAK,eAAe,KAAO;AAAA,MAC3C;AAAA,IACJ;AAEA,QAAK,eAAe,wBAAyB;AACzC,UAAI,aAAa;AACjB,UAAI,aAAc,WAAW,GAAI,SAAS;AAAA,IAC9C;AAAA,EACJ;AAEA,WAAS,yBAAgC;AACrC,QAAK,eAAe,iBAAkB;AAClC,YAAM,iBAAyB,4BAA4B,cAAc,QAAS,eAAgB,EAAE,KAAK;AACzG,YAAM,SAAkB,QAAS,eAAgB,EAAE,WAAW,KAAM;AACpE,YAAM,qBAA6B,KAAK,MAAU,QAAS,eAAgB,EAAE,WAAW,KAAM,QAAS,eAAgB,EAAE,KAAK,SAAW,GAAI;AAE7I,6CAAuC,MAAM,QAAQ,QAAQ;AAC7D,kDAA4C,YAAY,qBAAqB;AAAA,IACjF;AAAA,EACJ;AASA,WAAS,oBAA2B;AAChC,0BAAsB,cAAc;AACpC,0BAAsB,YAAY;AAClC,0BAAsB,gBAAgB;AAEtC,aAAS,KAAK,iBAAkB,aAAa,uBAAwB;AACrE,aAAS,KAAK,iBAAkB,cAAc,wBAAyB;AAAA,EAC3E;AAEA,WAAS,wBAAyB,GAAuB;AACrD,QAAK,CAAC,iCAAiC,CAAC,0BAA0B,eAAe,qBAAsB;AACnG,sBAAgB,aAAa;AAC7B,sCAAgC;AAChC,+BAAyB,EAAE,QAAQ,gBAAgB;AACnD,+BAAyB,EAAE,QAAQ,gBAAgB;AACnD,wCAAkC,gBAAgB;AAClD,wCAAkC,gBAAgB;AAAA,IACtD;AAAA,EACJ;AAEA,WAAS,wBAA+B;AACpC,QAAK,+BAAgC;AACjC,sCAAgC;AAChC,wCAAkC;AAClC,wCAAkC;AAClC,sBAAgB,YAAY;AAAA,IAChC;AAAA,EACJ;AAEA,WAAS,wBAAyB,GAAuB;AACrD,QAAK,+BAAgC;AACjC,sBAAgB,MAAM,OAAS,EAAE,QAAQ,yBAA2B;AACpE,sBAAgB,MAAM,MAAQ,EAAE,QAAQ,yBAA2B;AAAA,IACvE;AAAA,EACJ;AAEA,WAAS,2BAAkC;AACvC,QAAK,+BAAgC;AACjC,sBAAgB,MAAM,OAAO,kCAAkC;AAC/D,sBAAgB,MAAM,MAAM,kCAAkC;AAE9D,sCAAgC;AAChC,wCAAkC;AAClC,wCAAkC;AAClC,sBAAgB,YAAY;AAAA,IAChC;AAAA,EACJ;AASA,WAAS,gBAAuB;AAC5B,QAAK,CAAC,GAAG,QAAS,gBAAiB,GAAI;AACnC,yBAAmB,WAAW,OAAQ,OAAO,oBAAqB;AAClE,uBAAiB,MAAM,UAAU;AAEjC,eAAS,KAAK,YAAa,gBAAiB;AAE5C,eAAS,KAAK,iBAAkB,aAAa,MAAM;AAC/C,oBAAY;AAAA,MAChB,CAAE;AAEF,eAAS,iBAAkB,UAAU,MAAM;AACvC,oBAAY;AAAA,MAChB,CAAE;AAAA,IACN;AAAA,EACJ;AAEA,WAAS,WAAY,SAAsB,MAAsB;AAC7D,QAAK,YAAY,MAAO;AACpB,cAAQ,cAAc,CAAE,MAAmB;AACvC,oBAAa,GAAG,IAAK;AAAA,MACzB;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,YAAa,GAAQ,MAAsB;AAChD,eAAW,aAAc,CAAE;AAC3B,gBAAY;AAEZ,6BAAyB,WAAY,MAAM;AACvC,uBAAiB,YAAY;AAC7B,uBAAiB,MAAM,UAAU;AAEjC,iBAAW,2BAA4B,GAAG,gBAAiB;AAAA,IAC/D,GAAG,eAAe,YAAa;AAAA,EACnC;AAEA,WAAS,cAAqB;AAC1B,QAAK,GAAG,QAAS,gBAAiB,GAAI;AAClC,UAAK,2BAA2B,GAAI;AAChC,qBAAc,sBAAuB;AACrC,iCAAyB;AAAA,MAC7B;AAEA,UAAK,iBAAiB,MAAM,YAAY,SAAU;AAC9C,yBAAiB,MAAM,UAAU;AAAA,MACrC;AAAA,IACJ;AAAA,EACJ;AASA,WAAS,cAAqB;AAC1B,UAAM,WAAqB,eAAe;AAC1C,UAAM,iBAAyB,SAAS;AAExC,aAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,YAAM,cAAyC,SAAS,qBAAsB,SAAU,YAAa,CAAE;AACvG,YAAM,WAA0B,CAAC,EAAE,MAAM,KAAM,WAAY;AAC3D,YAAM,iBAAyB,SAAS;AAExC,eAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,YAAK,CAAC,WAAY,SAAU,YAAa,CAAE,GAAI;AAC3C;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,YAAS,eAAgB,EAAE,KAAK,KAAK;AAAA,EACzC;AAEA,WAAS,WAAY,SAAiC;AAClD,QAAID,UAAkB;AAEtB,QAAK,GAAG,QAAS,OAAQ,KAAK,QAAQ,aAAc,UAAU,yBAA0B,GAAI;AACxF,YAAM,qBAA6B,QAAQ,aAAc,UAAU,yBAA0B;AAE7F,UAAK,GAAG,cAAe,kBAAmB,GAAI;AAC1C,cAAM,iBAA+B,oBAAqB,kBAAmB;AAE7E,YAAK,eAAe,UAAU,GAAG,cAAe,eAAe,MAAO,GAAI;AACtE,uBAAc,SAAS,sBAAuB,eAAe,MAAO,CAAE;AAAA,QAE1E,OAAO;AACH,cAAK,CAAC,eAAe,UAAW;AAC5B,oBAAQ,MAAO,eAAe,2BAA4B,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC/H,YAAAA,UAAS;AAAA,UACb;AAAA,QACJ;AAAA,MAEJ,OAAO;AACH,YAAK,CAAC,eAAe,UAAW;AAC5B,kBAAQ,MAAO,eAAe,yBAA0B,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC7H,UAAAA,UAAS;AAAA,QACb;AAAA,MACJ;AAAA,IACJ;AAEA,WAAOA;AAAA,EACX;AAEA,WAAS,aAAc,SAAsB,gBAAwC;AACjF,mBAAe,eAAe,CAAC;AAC/B,mBAAe,aAAa,UAAU;AAEtC,QAAK,GAAG,cAAe,eAAe,KAAM,MAAO,GAAG,cAAe,eAAe,KAAM,KAAK,GAAG,cAAe,eAAe,WAAY,IAAM;AAC9I,cAAQ,gBAAiB,UAAU,yBAA0B;AAE7D,UAAK,CAAC,eAAe,QAAS;AAC1B,sBAAe,eAAe,KAAO;AAErC,gBAAS,eAAe,KAAO,EAAE,KAAM,eAAe,KAAO,IAAI;AACjE,gBAAS,eAAe,KAAO,EAAE,KAAK,KAAM,eAAe,KAAO;AAElE,+BAAwB,eAAe,OAAQ,WAAW,OAAQ;AAAA,MAEtE,OAAO;AACH,mBAAY,cAAe;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,WAAY,gBAAwC;AACzD,UAAM,gBAAwB,WAAW,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAE9G,QAAK,oCAAgC,cAAc,YAAY,MAAM,UAAW;AAC5E,qBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,IACzD;AAEA,UAAM,OAAoB,WAAW,OAAQ,OAAO,iBAAkB;AACtE,mBAAe,aAAa,QAAQ,YAAa,IAAK;AAEtD,SAAK,UAAU,CAAE,MAAmB;AAChC,iBAAW,aAAc,CAAE;AAE3B,yCAAmC,MAAM,UAAU;AACnD,mCAA6B,MAAM,UAAU;AAC7C,kCAA4B,MAAM,UAAU;AAC5C,8BAAwB,MAAM,UAAU;AACxC,2CAAqC;AAErC,oBAAe,cAAe;AAC9B,wBAAmB,GAAG,cAAe;AAErC,UAAK,eAAe,sBAAuB;AACvC,mBAAW,yBAA0B,eAAe,aAAa,SAAS,iBAAkB;AAAA,MAChG;AAAA,IACJ;AAAA,EACJ;AASA,WAAS,oBAAqB,YAAqB,MAAc;AAC7D,UAAM,eAAyB,YAAY,SAAS,mBAAmB,SAAS;AAChF,UAAM,aAAuB,YAAY,OAAO,mBAAmB,OAAO;AAE1E,QAAK,eAAe,qBAAsB;AACtC,mBAAc,WAAW,eAAgB;AAAA,IAC7C;AAEA,eAAY,UAAU,cAAe;AAAA,EACzC;AAEA,WAAS,gBAAiB,GAA0B;AAChD,QAAK,QAAQ,OAAO,KAAK,eAAe,qBAAsB;AAC1D,UAAK,EAAE,gCAA0B;AAC7B,UAAE,eAAe;AACjB,sBAAc;AAAA,MAClB,OAAO;AAEH,YAAK,oCAAqC;AACtC,cAAK,EAAE,iCAAwB;AAC3B,cAAE,eAAe;AACjB,yBAAa;AAAA,UAEjB,WAAY,EAAE,mCAAyB;AACnC,cAAE,eAAe;AACjB,yBAAa;AAAA,UAEjB,WAAY,EAAE,6BAAsB;AAChC,cAAE,eAAe;AACjB,8BAAkB;AAAA,UAEtB,WAAY,EAAE,iCAAwB;AAClC,cAAE,eAAe;AACjB,gCAAoB;AAAA,UACxB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,iBAAwB;AAC7B,QAAK,QAAQ,OAAO,GAAI;AACpB,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,oBAA2B;AAChC,QAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,sCAAgC;AAEhC,cAAS,eAAgB,EAAE,WAAW;AAEtC,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AAEA,WAAS,sBAA6B;AAClC,QAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,sCAAgC;AAEhC,cAAS,eAAgB,EAAE,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS;AAE/E,+BAAyB;AAAA,IAC7B;AAAA,EACJ;AASA,WAAS,sBAAuB,YAAkB;AAC9C,QAAI,UAA0B,KAAK,iBAAkB,YAAY,CAAC,CAAoB;AACtF,YAAQ,QAAQ,KAAK,iBAAkB,QAAQ,OAAO,CAAE;AACxD,YAAQ,SAAS,KAAK,kBAAmB,QAAQ,QAAQ,IAAK;AAC9D,YAAQ,YAAY,KAAK,kBAAmB,QAAQ,WAAW,KAAM;AACrE,YAAQ,WAAW,KAAK,kBAAmB,QAAQ,UAAU,KAAM;AACnE,YAAQ,aAAa,KAAK,kBAAmB,QAAQ,YAAY,KAAM;AACvE,YAAQ,SAAS,KAAK,kBAAmB,QAAQ,QAAQ,KAAM;AAC/D,YAAQ,2BAA2B,KAAK,kBAAmB,QAAQ,0BAA0B,KAAM;AACnG,YAAQ,yBAAyB,KAAK,kBAAmB,QAAQ,wBAAwB,IAAK;AAC9F,YAAQ,uBAAuB,KAAK,kBAAmB,QAAQ,sBAAsB,KAAM;AAC3F,YAAQ,QAAQ,KAAK,iBAAkB,QAAQ,OAAO,eAAgB;AAEtE,cAAU,4BAA6B,OAAQ;AAE/C,WAAO,mCAAoC,OAAQ;AAAA,EACvD;AAEA,WAAS,4BAA6B,SAA2C;AAC7E,YAAQ,QAAQ,KAAK,iBAAkB,QAAQ,qBAAkB;AACjE,YAAQ,cAAc,KAAK,iBAAkB,QAAQ,2BAAwB;AAC7E,YAAQ,UAAU,KAAK,iBAAkB,QAAQ,uBAAoB;AAErE,WAAO;AAAA,EACX;AAEA,WAAS,mCAAoC,SAA2C;AACpF,YAAQ,SAAS,KAAK,iBAAkB,QAAQ,QAAQ,CAAC,CAAY;AACrE,YAAQ,OAAQ,UAAU,KAAK,mBAAoB,QAAQ,OAAQ,SAAS,IAAK;AACjF,YAAQ,OAAQ,UAAU,KAAK,mBAAoB,QAAQ,OAAQ,SAAS,IAAK;AACjF,YAAQ,OAAQ,UAAU,KAAK,mBAAoB,QAAQ,OAAQ,SAAS,IAAK;AACjF,YAAQ,OAAQ,WAAW,KAAK,mBAAoB,QAAQ,OAAQ,UAAU,IAAK;AACnF,YAAQ,OAAQ,SAAS,KAAK,mBAAoB,QAAQ,OAAQ,QAAQ,IAAK;AAC/E,YAAQ,OAAQ,UAAU,KAAK,mBAAoB,QAAQ,OAAQ,SAAS,IAAK;AACjF,YAAQ,OAAQ,YAAY,KAAK,mBAAoB,QAAQ,OAAQ,WAAW,IAAK;AACrF,YAAQ,OAAQ,eAAe,KAAK,mBAAoB,QAAQ,OAAQ,cAAc,IAAK;AAE3F,WAAO;AAAA,EACX;AASA,WAAS,uBAAwB,oBAAyB,MAAsB;AAC5E,QAAK,GAAG,gBAAiB,eAAgB,GAAI;AACzC,sBAAgB,MAAO,MAAM,CAAC,EAAE,MAAM,KAAM,MAAM,CAAE,CAAE;AAAA,IAC1D;AAAA,EACJ;AASA,WAAS,0BAAoC;AACzC,QAAI,OAAgB;AAEpB,QAAK,eAAe,6BAA8B;AAC9C,YAAM,MAAc,OAAO,SAAS;AACpC,YAAM,eAAoB,uBAAwB,GAAI;AAEtD,UAAK,GAAG,QAAS,aAAa,SAAU,GAAI;AACxC,cAAM,UAAkB,SAAU,aAAa,WAAW,EAAG;AAE7D,YAAK,CAAC,MAAO,OAAQ,KAAK,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AAC9E,kBAAS,eAAgB,EAAE,WAAW;AAAA,QAC1C;AAAA,MACJ;AAEA,UAAK,GAAG,QAAS,aAAa,MAAO,GAAI;AACrC,eAAO,aAAa,WAAW;AAAA,MACnC;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAEA,WAAS,uBAAwB,KAAoB;AACjD,UAAM,eAAoB,CAAC;AAC3B,UAAM,eAAyB,IAAI,MAAO,GAAI;AAE9C,QAAK,aAAa,SAAS,GAAI;AAC3B,YAAM,aAAuB,aAAc,CAAE,EAAE,MAAO,GAAI;AAC1D,YAAM,mBAA2B,WAAW;AAE5C,eAAU,kBAA0B,GAAG,kBAAkB,kBAAkB,mBAAoB;AAC3F,cAAM,YAAsB,WAAY,eAAgB,EAAE,MAAO,GAAI;AAErE,qBAAc,UAAW,CAAE,CAAE,IAAI,UAAW,CAAE;AAAA,MAClD;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AASA,WAAS,oBAAqB,cAAmC;AAC7D,UAAM,SAAuB;AAAA,MACzB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ;AAEA,QAAI;AACA,UAAK,GAAG,cAAe,YAAa,GAAI;AACpC,eAAO,SAAS,KAAK,MAAO,YAAa;AAAA,MAC7C;AAAA,IAEJ,SAAU,IAAU;AAChB,UAAI;AACA,eAAO,SAAS,KAAM,MAAM,eAAe,GAAI;AAE/C,YAAK,GAAG,gBAAiB,OAAO,MAAO,GAAI;AACvC,iBAAO,SAAS,OAAO,OAAO;AAAA,QAClC;AAAA,MAEJ,SAAU,IAAU;AAChB,YAAK,CAAC,eAAe,UAAW;AAC5B,kBAAQ,MAAO,eAAe,gBAAiB,QAAS,eAAgB,GAAG,OAAQ,EAAE,QAAS,eAAgB,GAAG,OAAQ,CAAE;AAC3H,iBAAO,SAAS;AAAA,QACpB;AAEA,eAAO,SAAS;AAAA,MACpB;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AASA,WAAS,sBAA6B;AAClC,QAAK,QAAQ,OAAO,GAAI;AACpB,oBAAe,KAAM;AAErB,cAAS,eAAgB,EAAE,WAAW;AAAA,IAC1C;AAAA,EACJ;AASA,WAAS,0BAA2B,mBAAkC,CAAC,GAAW;AAC9E,qBAAiB,KAAK,iBAAkB,kBAAkB,CAAC,CAAmB;AAC9E,mBAAe,WAAW,KAAK,kBAAmB,eAAe,UAAU,IAAK;AAChF,mBAAe,kBAAkB,KAAK,wBAAyB,eAAe,iBAAiB,CAAE,GAAI,CAAE;AACvG,mBAAe,kBAAkB,KAAK,kBAAmB,eAAe,iBAAiB,IAAK;AAC9F,mBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,IAAK;AACtG,mBAAe,mBAAmB,KAAK,kBAAmB,eAAe,kBAAkB,IAAK;AAChG,mBAAe,8BAA8B,KAAK,kBAAmB,eAAe,6BAA6B,IAAK;AACtH,mBAAe,yBAAyB,KAAK,kBAAmB,eAAe,wBAAwB,KAAM;AAC7G,mBAAe,cAAc,KAAK,kBAAmB,eAAe,aAAa,IAAK;AACtF,mBAAe,qBAAqB,KAAK,kBAAmB,eAAe,oBAAoB,KAAM;AACrG,mBAAe,eAAe,KAAK,iBAAkB,eAAe,cAAc,GAAI;AACtF,mBAAe,0BAA0B,KAAK,kBAAmB,eAAe,yBAAyB,IAAK;AAC9G,mBAAe,uCAAuC,KAAK,kBAAmB,eAAe,sCAAsC,KAAM;AACzI,mBAAe,kBAAkB,KAAK,kBAAmB,eAAe,iBAAiB,KAAM;AAC/F,mBAAe,mBAAmB,KAAK,kBAAmB,eAAe,kBAAkB,KAAM;AACjG,mBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,KAAM;AACvG,mBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,KAAM;AAEvG,qCAAiC;AACjC,4CAAwC;AAAA,EAC5C;AAEA,WAAS,mCAA0C;AAC/C,mBAAe,iBAAiB,KAAK,oBAAqB,eAAe,gBAAgB,MAAO;AAChG,mBAAe,iBAAiB,KAAK,oBAAqB,eAAe,gBAAgB,MAAO;AAChG,mBAAe,mBAAmB,KAAK,oBAAqB,eAAe,kBAAkB,QAAS;AACtG,mBAAe,yBAAyB,KAAK,oBAAqB,eAAe,wBAAwB,OAAQ;AACjH,mBAAe,qBAAqB,KAAK,oBAAqB,eAAe,oBAAoB,mBAAoB;AACrH,mBAAe,kBAAkB,KAAK,oBAAqB,eAAe,iBAAiB,4CAA6C;AACxI,mBAAe,6BAA6B,KAAK,oBAAqB,eAAe,4BAA4B,2DAA4D;AAC7K,mBAAe,2BAA2B,KAAK,oBAAqB,eAAe,0BAA0B,gEAAiE;AAC9K,mBAAe,8BAA8B,KAAK,oBAAqB,eAAe,2CAAwC;AAAA,EAClI;AAEA,WAAS,0CAAiD;AACtD,mBAAe,yBAAyB,KAAK,mBAAoB,eAAe,wBAAwB,IAAK;AAAA,EACjH;AASA,QAAM,UAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOvB,OAAO,SAAW,wBAAyC;AACvD,UAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,0BAAkB,KAAK,iBAAkB,OAAO,eAAgB;AAEhE,YAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,kBAAS,eAAgB,EAAE,WAAW;AAEtC,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,MAAM,SAAW,wBAAyC;AACtD,UAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,0BAAkB,KAAK,iBAAkB,OAAO,eAAgB;AAEhE,YAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,cAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,oBAAS,eAAgB,EAAE,WAAW;AAAA,UAC1C;AAEA,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,MAAM,WAAwB;AAC1B,UAAK,QAAQ,OAAO,GAAI;AACpB,sBAAc;AAAA,MAClB;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,QAAQ,WAAsB;AAC1B,aAAO,GAAG,QAAS,eAAgB,KAAK,gBAAgB,MAAM,YAAY;AAAA,IAC9E;AAAA,IAEA,YAAY,WAAsB;AAC9B,aAAO,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS;AAAA,IAC3F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,kBAAkB,WAAwB;AACtC,kBAAY;AAEZ,aAAO;AAAA,IACX;AAAA,IAEA,SAAS,SAAW,SAAsB,SAAsC;AAC5E,UAAK,GAAG,cAAe,OAAQ,KAAK,GAAG,cAAe,OAAQ,GAAI;AAC9D,qBAAc,SAAS,sBAAuB,OAAQ,CAAE;AAExD,gBAAS,eAAgB,EAAE,KAAK,KAAK;AAErC,4BAAoB;AAAA,MACxB;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,SAAW,SAAmC;AACtD,UAAK,GAAG,cAAe,OAAQ,GAAI;AAC/B,YAAI,UAAmB;AAEvB,iBAAU,SAAS,SAAU;AACzB,cAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,qBAAU,SAAS,QAAS,KAAM,EAAE,MAAO;AACvC,kBAAK,QAAS,KAAM,EAAE,KAAK,eAAgB,KAAM,GAAI;AACjD,sBAAM,iBAAiC,QAAS,KAAM,EAAE,KAAM,KAAM;AAEpE,oBAAK,eAAe,aAAa,YAAY,SAAU;AACnD,yCAAwB,eAAe,OAAQ,cAAc,eAAe,aAAa,OAAQ;AAEjG,0BAAS,KAAM,EAAE,KAAK,OAAQ,QAAS,KAAM,EAAE,KAAK,QAAS,eAAe,KAAO,GAAG,CAAE;AAExF,yBAAO,QAAS,KAAM,EAAE,KAAM,eAAe,KAAO;AAEpD,0BAAS,KAAM,EAAE,KAAK,KAAK;AAE3B,4BAAU;AACV;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAEA,YAAK,CAAC,SAAU;AACZ,qBAAW,yBAA0B,SAAS,iBAAkB;AAAA,QACpE,OAAO;AACH,8BAAoB;AAAA,QACxB;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,SAAW,wBAAyC;AAC5D,0BAAoB;AAEpB,eAAU,aAAa,SAAU;AAC7B,YAAK,QAAQ,eAAgB,SAAU,GAAI;AACvC,cAAK,CAAC,GAAG,cAAe,KAAM,KAAK,UAAU,WAAY;AACrD,qBAAU,SAAS,QAAS,SAAU,EAAE,MAAO;AAC3C,kBAAK,QAAS,SAAU,EAAE,KAAK,eAAgB,KAAM,GAAI;AACrD,sBAAM,iBAAiC,QAAS,SAAU,EAAE,KAAM,KAAM;AAExE,uCAAwB,eAAe,OAAQ,cAAc,eAAe,aAAa,OAAQ;AAAA,cACrG;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,UAAK,GAAG,cAAe,KAAM,GAAI;AAC7B,YAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,iBAAO,QAAS,KAAM;AAAA,QAC1B;AAAA,MAEJ,OAAO;AACH,kBAAU,CAAC;AAAA,MACf;AAEA,UAAK,CAAC,GAAG,cAAe,KAAM,KAAK,UAAU,iBAAkB;AAC3D,0BAAmB,OAAQ;AAAA,MAC/B;AAEA,aAAO;AAAA,IACX;AAAA,IAEA,YAAY,WAAwB;AAChC,iBAAW,yBAA0B,SAAS,MAAM,iBAAkB;AAEtE,aAAO;AAAA,IACX;AAAA,IAEA,kBAAkB,WAAwB;AACtC,cAAS,eAAgB,EAAE,KAAK,QAAQ;AAExC,0BAAoB;AAEpB,aAAO;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,kBAAkB,SAAW,kBAAoC;AAC7D,UAAK,GAAG,cAAe,gBAAiB,GAAI;AACxC,YAAI,0BAAmC;AACvC,cAAM,2BAAgC;AAEtC,iBAAU,gBAAgB,kBAAmB;AACzC,cAAK,iBAAiB,eAAgB,YAAa,KAAK,eAAe,eAAgB,YAAa,KAAK,yBAA0B,YAAa,MAAM,iBAAkB,YAAa,GAAI;AACrL,qCAA0B,YAAa,IAAI,iBAAkB,YAAa;AAC1E,sCAA0B;AAAA,UAC9B;AAAA,QACJ;AAEA,YAAK,yBAA0B;AAC3B,oCAA2B,wBAAyB;AAAA,QACxD;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,YAAY,WAAoB;AAC5B,aAAO;AAAA,IACX;AAAA,EACJ;AASA,GAAE,MAAM;AACJ,8BAA0B;AAE1B,aAAS,iBAAkB,oBAAoB,MAAM;AACjD,wBAAkB;AAClB,+BAAyB;AACzB,mBAAa;AACb,oBAAc;AACd,kBAAY;AACZ,0BAAoB;AAEpB,UAAK,wBAAwB,GAAI;AAC7B,gBAAQ,KAAK;AAAA,MACjB;AAAA,IACJ,CAAE;AAEF,QAAK,CAAC,GAAG,QAAS,OAAO,QAAS,GAAI;AAClC,aAAO,WAAW;AAAA,IACtB;AAAA,EACJ,GAAK;AACT,GAAK","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.min.js b/dist/journey.min.js index 6627432..111bb49 100644 --- a/dist/journey.min.js +++ b/dist/journey.min.js @@ -1 +1 @@ -var Constants,Is,Data,DomElement;(Constants||(Constants={})).JOURNEY_JS_ATTRIBUTE_NAME="data-journey-js",(e=>{function t(e){return null!=e&&""!==e}function o(e){return t(e)&&"object"==typeof e}e.defined=t,e.definedObject=o,e.definedBoolean=function(e){return t(e)&&"boolean"==typeof e},e.definedString=function(e){return t(e)&&"string"==typeof e},e.definedFunction=function(e){return t(e)&&"function"==typeof e},e.definedNumber=function(e){return t(e)&&"number"==typeof e},e.definedArray=function(e){return o(e)&&e instanceof Array}})(Is||(Is={})),(e=>{function t(e,t){return Is.definedArray(e)?e:t}e.getDefaultAnyString=function(e,t){return"string"==typeof e?e:t},e.getDefaultString=function(e,t){return Is.definedString(e)?e:t},e.getDefaultBoolean=function(e,t){return Is.definedBoolean(e)?e:t},e.getDefaultNumber=function(e,t){return Is.definedNumber(e)?e:t},e.getDefaultFunction=function(e,t){return Is.definedFunction(e)?e:t},e.getDefaultObject=function(e,t){return Is.definedObject(e)?e:t},e.getDefaultArray=t,e.getDefaultStringOrArray=function(e,o){let n=o;if(Is.definedString(e)){const t=e.toString().split(" ");0===t.length?e=o:n=t}else n=t(e,o);return n}})(Data||(Data={})),(e=>{function t(e,t=""){const o=e.toLowerCase();let n="text"===o?document.createTextNode(""):document.createElement(o);return Is.defined(t)&&(n.className=t),n}function o(){const e=document.documentElement;return{left:(window.pageXOffset||e.scrollLeft)-(e.clientLeft||0),top:(window.pageYOffset||e.scrollTop)-(e.clientTop||0)}}e.create=t,e.getOffset=function(e){const t={left:0,top:0};for(;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t.left+=e.offsetLeft-e.scrollLeft,t.top+=e.offsetTop-e.scrollTop,e=e.offsetParent;return t},e.getScrollPosition=o,e.getStyleValueByName=function(e,t){let o=null;return document.defaultView.getComputedStyle?o=document.defaultView.getComputedStyle(e,null).getPropertyValue(t):e.currentStyle&&(o=e.currentStyle[t]),o},e.addNode=function(e,t){try{e.contains(t)||e.appendChild(t)}catch(e){console.warn(e.message)}},e.removeNode=function(e,t){try{e.contains(t)&&e.removeChild(t)}catch(e){console.warn(e.message)}},e.cancelBubble=function(e){e.preventDefault(),e.cancelBubble=!0},e.showElementAtMousePosition=function(e,t){let n=e.pageX,i=e.pageY;const r=o();t.style.display="block",n+t.offsetWidth>window.innerWidth?n-=t.offsetWidth:n++,i+t.offsetHeight>window.innerHeight?i-=t.offsetHeight:i++,n{let _configuration={},_configuration_ShortcutKeysEnabled=!0;const _groups_Default="default";let _groups_Current=_groups_Default,_groups={},_element_Focus_Element_PositionStyle="",_element_Disabled_Background,_element_Dialog,_element_Dialog_Close_Button,_element_Dialog_Title,_element_Dialog_Description,_element_Dialog_CheckBox_Container,_element_Dialog_CheckBox_Input,_element_Dialog_ProgressDots,_element_Dialog_ProgressBar,_element_Dialog_ProgressBar_Percentage,_element_Dialog_ProgressBar_Percentage_Text,_element_Dialog_Buttons,_element_Dialog_Buttons_Back_Button,_element_Dialog_Buttons_Next_Button,_element_Dialog_IsHint=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_X=0,_element_Dialog_Move_Y=0,_element_ToolTip,_element_ToolTip_Timer=0;function setupDefaultGroup(e=null){_groups=Data.getDefaultObject(e,{}),_groups[_groups_Default]={json:{},keys:[],position:0}}function setupNewGroup(e){_groups.hasOwnProperty(e)||(_groups[e]={json:{},keys:[],position:0})}function getGroupBindingOptions(){return _groups[_groups_Current].json[_groups[_groups_Current].keys[_groups[_groups_Current].position]]}function renderDisabledBackground(){_element_Disabled_Background=DomElement.create("div","journey-js-disabled-background"),_element_Disabled_Background.onclick=()=>{_configuration.closeDialogOnDisabledBackgroundClick&&onDialogClose()}}function showDisabledBackground(){DomElement.addNode(document.body,_element_Disabled_Background)}function hideDisabledBackground(){DomElement.removeNode(document.body,_element_Disabled_Background)}function renderDialog(){_element_Dialog=DomElement.create("div","journey-js-dialog"),_element_Dialog.style.display="none",document.body.appendChild(_element_Dialog),_element_Dialog_Close_Button=DomElement.create("button","close"),_element_Dialog.appendChild(_element_Dialog_Close_Button),_element_Dialog_Close_Button.onclick=()=>{onDialogClose()},addToolTip(_element_Dialog_Close_Button,_configuration.closeButtonToolTipText),_element_Dialog_Title=DomElement.create("div","title"),_element_Dialog.appendChild(_element_Dialog_Title),_element_Dialog_Description=DomElement.create("div","description"),_element_Dialog.appendChild(_element_Dialog_Description),_element_Dialog_CheckBox_Container=DomElement.create("div","checkbox-container"),_element_Dialog.appendChild(_element_Dialog_CheckBox_Container),_element_Dialog_CheckBox_Input=DomElement.createCheckBox(_element_Dialog_CheckBox_Container,_configuration.doNotShowAgainText),_element_Dialog_CheckBox_Input.onchange=()=>{_configuration.showDoNotShowAgain&&fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange,_element_Dialog_CheckBox_Input.checked)},_element_Dialog_ProgressDots=DomElement.create("div","progress-dots"),_element_Dialog.appendChild(_element_Dialog_ProgressDots),_element_Dialog_ProgressBar=DomElement.create("div","progress-bar"),_element_Dialog.appendChild(_element_Dialog_ProgressBar),_element_Dialog_ProgressBar_Percentage=DomElement.create("div","progress-bar-percentage"),_element_Dialog_ProgressBar.appendChild(_element_Dialog_ProgressBar_Percentage),_element_Dialog_ProgressBar_Percentage_Text=DomElement.create("p","progress-bar-percentage-text"),_element_Dialog_ProgressBar_Percentage.appendChild(_element_Dialog_ProgressBar_Percentage_Text),_element_Dialog_Buttons=DomElement.create("div","buttons"),_element_Dialog.appendChild(_element_Dialog_Buttons),_element_Dialog_Buttons_Back_Button=DomElement.create("button","back"),_element_Dialog_Buttons_Back_Button.onclick=onDialogBack,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Back_Button),_element_Dialog_Buttons_Next_Button=DomElement.create("button","next"),_element_Dialog_Buttons_Next_Button.onclick=onDialogNext,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Next_Button),makeDialogMovable()}function onDialogClose(e=!0){let t=!1;if(t=!Is.definedString(_configuration.closeDialogConfirmationText)||!e||confirm(_configuration.closeDialogConfirmationText),t){const e=getGroupBindingOptions();Is.defined(e)&&Is.defined(e._currentView.element)&&fireCustomTriggerEvent(e.events.onClose,e._currentView.element),removeFocusClassFromLastElement(!1),hideDisabledBackground(),hideToolTip(),_element_Dialog.style.display="none"}}function onDialogBack(){_groups[_groups_Current].position>0&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position--,showDialogAndSetPosition())}function onDialogNext(){if(_groups[_groups_Current].position===_groups[_groups_Current].keys.length-1){const e=getGroupBindingOptions();onDialogClose(!1),fireCustomTriggerEvent(e.events.onFinish,e._currentView.element)}else removeFocusClassFromLastElement(),_groups[_groups_Current].position++,showDialogAndSetPosition()}function showDialogAndSetPosition(){const e=getGroupBindingOptions();if(Is.defined(e)&&Is.defined(e._currentView.element)){e.showDisabledBackground?showDisabledBackground():hideDisabledBackground(),hideToolTip(),_element_Dialog_Close_Button.style.display=_configuration.showCloseButton?"block":"none",_configuration_ShortcutKeysEnabled=!0,e._currentView.element.className+=" journey-js-element-focus",_configuration.scrollToElements&&e._currentView.element.scrollIntoView();const t=DomElement.getStyleValueByName(e._currentView.element,"position");""!==t&&"static"===t.toLowerCase()&&(_element_Focus_Element_PositionStyle=t,e._currentView.element.style.position="relative"),DomElement.showElementBasedOnCondition(_element_Dialog_CheckBox_Container,_configuration.showDoNotShowAgain),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressDots,_configuration.showProgressDots&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar,_configuration.showProgressBar&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text,_configuration.showProgressBarText),DomElement.showElementBasedOnCondition(_element_Dialog_Buttons,_configuration.showButtons),_element_Dialog_Buttons_Back_Button.innerHTML=_configuration.backButtonText,_element_Dialog_Buttons_Back_Button.disabled=0===_groups[_groups_Current].position,_groups[_groups_Current].position>=_groups[_groups_Current].keys.length-1?_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.finishButtonText:_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.nextButtonText,setDialogText(e),setDialogPosition(null,e),buildProcessDots(),setProgressBarPosition(),fireCustomTriggerEvent(e.events.onEnter,e._currentView.element),e.sendClick&&e._currentView.element.click()}}function setDialogText(e){Is.definedString(e.title)?_element_Dialog_Title.innerHTML=e.title:_element_Dialog_Title.innerHTML="",Is.definedString(e.description)?_element_Dialog_Description.innerHTML=e.description:_element_Dialog_Description.innerHTML=""}function setDialogPosition(e,t){if("block"!==_element_Dialog.style.display&&(_element_Dialog.style.display="block",fireCustomTriggerEvent(t.events.onOpen,t._currentView.element)),0===_groups[_groups_Current].position&&fireCustomTriggerEvent(t.events.onStart,t._currentView.element),_element_Dialog_IsHint=!0===t.isHint,t.attach||t.isHint)if(t.isHint&&t.alignHintToClickPosition)DomElement.showElementAtMousePosition(e,_element_Dialog);else{const e=DomElement.getOffset(t._currentView.element);let o=e.top+t._currentView.element.offsetHeight,n=e.left;(n+_element_Dialog.offsetWidth>window.innerWidth||t.alignRight)&&(n-=_element_Dialog.offsetWidth,n+=t._currentView.element.offsetWidth),(o+_element_Dialog.offsetHeight>window.innerHeight||t.alignTop)&&(o-=_element_Dialog.offsetHeight+t._currentView.element.offsetHeight),_element_Dialog.style.top=o+"px",_element_Dialog.style.left=n+"px"}else{const e=DomElement.getScrollPosition(),t=Math.max(0,(window.innerWidth-_element_Dialog.offsetWidth)/2+e.left),o=Math.max(0,(window.innerHeight-_element_Dialog.offsetHeight)/2+e.top);_element_Dialog.style.left=t+"px",_element_Dialog.style.top=o+"px"}}function removeFocusClassFromLastElement(e=!0){const t=getGroupBindingOptions();Is.defined(t)&&Is.defined(t._currentView.element)&&(t._currentView.element.className=t._currentView.element.className.replace(" journey-js-element-focus",""),Is.defined(_element_Focus_Element_PositionStyle)&&(t._currentView.element.style.position=_element_Focus_Element_PositionStyle),e&&fireCustomTriggerEvent(t.events.onLeave,t._currentView.element))}function buildProcessDots(){if(_element_Dialog_ProgressDots.innerHTML="",_configuration.showProgressDots){const e=_groups[_groups_Current].keys.length;for(let t=0;t{removeFocusClassFromLastElement(),_groups[_groups_Current].position=e,showDialogAndSetPosition()}),_element_Dialog_ProgressDots.appendChild(n),_configuration.showProgressDotToolTips&&(Is.definedString(o.tooltip)?addToolTip(n,o.tooltip):addToolTip(n,o.title)),_configuration.showProgressDotNumbers&&(n.className+=" dot-number",n.innerHTML=(e+1).toString())}function setProgressBarPosition(){if(_configuration.showProgressBar){const e=_element_Dialog_ProgressBar.offsetWidth/_groups[_groups_Current].keys.length,t=(_groups[_groups_Current].position+1)*e,o=Math.ceil((_groups[_groups_Current].position+1)/_groups[_groups_Current].keys.length*100);_element_Dialog_ProgressBar_Percentage.style.width=t+"px",_element_Dialog_ProgressBar_Percentage_Text.innerHTML=o+"%"}}function makeDialogMovable(){_element_Dialog_Title.onmousedown=onMoveTitleBarMouseDown,_element_Dialog_Title.onmouseup=onMoveTitleBarMouseUp,_element_Dialog_Title.oncontextmenu=onMoveTitleBarMouseUp,document.body.addEventListener("mousemove",onMoveDocumentMouseMove),document.body.addEventListener("mouseleave",onMoveDocumentMouseLeave)}function onMoveTitleBarMouseDown(e){_element_Dialog_Move_IsMoving||_element_Dialog_IsHint||!_configuration.dialogMovingEnabled||(_element_Dialog.className+=" journey-js-dialog-moving",_element_Dialog_Move_IsMoving=!0,_element_Dialog_Move_X=e.pageX-_element_Dialog.offsetLeft,_element_Dialog_Move_Y=e.pageY-_element_Dialog.offsetTop,_element_Dialog_Move_Original_X=_element_Dialog.offsetLeft,_element_Dialog_Move_Original_Y=_element_Dialog.offsetTop)}function onMoveTitleBarMouseUp(){_element_Dialog_Move_IsMoving&&(_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function onMoveDocumentMouseMove(e){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=e.pageX-_element_Dialog_Move_X+"px",_element_Dialog.style.top=e.pageY-_element_Dialog_Move_Y+"px")}function onMoveDocumentMouseLeave(){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=_element_Dialog_Move_Original_X+"px",_element_Dialog.style.top=_element_Dialog_Move_Original_Y+"px",_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function renderToolTip(){Is.defined(_element_ToolTip)||(_element_ToolTip=DomElement.create("div","journey-js-tooltip"),_element_ToolTip.style.display="none",document.body.appendChild(_element_ToolTip),document.body.addEventListener("mousemove",(()=>{hideToolTip()})),document.addEventListener("scroll",(()=>{hideToolTip()})))}function addToolTip(e,t){null!==e&&(e.onmousemove=e=>{showToolTip(e,t)})}function showToolTip(e,t){DomElement.cancelBubble(e),hideToolTip(),_element_ToolTip_Timer=setTimeout((()=>{_element_ToolTip.innerHTML=t,_element_ToolTip.style.display="block",DomElement.showElementAtMousePosition(e,_element_ToolTip)}),_configuration.tooltipDelay)}function hideToolTip(){Is.defined(_element_ToolTip)&&(0!==_element_ToolTip_Timer&&(clearTimeout(_element_ToolTip_Timer),_element_ToolTip_Timer=0),"block"===_element_ToolTip.style.display&&(_element_ToolTip.style.display="none"))}function getElements(){const e=_configuration.domElementTypes,t=e.length;for(let o=0;o{DomElement.cancelBubble(t),_element_Dialog_CheckBox_Container.style.display="none",_element_Dialog_ProgressDots.style.display="none",_element_Dialog_ProgressBar.style.display="none",_element_Dialog_Buttons.style.display="none",_configuration_ShortcutKeysEnabled=!1,setDialogText(e),setDialogPosition(t,e),e.removeHintWhenViewed&&DomElement.clearElementsByClassName(e._currentView.element,"journey-js-hint")}}function buildDocumentEvents(e=!0){const t=e?document.addEventListener:document.removeEventListener,o=e?window.addEventListener:window.removeEventListener;_configuration.shortcutKeysEnabled&&t("keydown",onWindowKeyDown),o("resize",onWindowResize)}function onWindowKeyDown(e){_public.isOpen()&&_configuration.shortcutKeysEnabled&&("Escape"===e.code?(e.preventDefault(),onDialogClose()):_configuration_ShortcutKeysEnabled&&("ArrowLeft"===e.code?(e.preventDefault(),onDialogBack()):"ArrowRight"===e.code?(e.preventDefault(),onDialogNext()):"ArrowUp"===e.code?(e.preventDefault(),onWindowKeyCodeUp()):"ArrowDown"===e.code&&(e.preventDefault(),onWindowKeyCodeDown())))}function onWindowResize(){_public.isOpen()&&showDialogAndSetPosition()}function onWindowKeyCodeUp(){0!==_groups[_groups_Current].position&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=0,showDialogAndSetPosition())}function onWindowKeyCodeDown(){_groups[_groups_Current].position!==_groups[_groups_Current].keys.length-1&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=_groups[_groups_Current].keys.length-1,showDialogAndSetPosition())}function buildAttributeOptions(e){let t=Data.getDefaultObject(e,{});return t.order=Data.getDefaultNumber(t.order,0),t.attach=Data.getDefaultBoolean(t.attach,!0),t.sendClick=Data.getDefaultBoolean(t.sendClick,!1),t.alignTop=Data.getDefaultBoolean(t.alignTop,!1),t.alignRight=Data.getDefaultBoolean(t.alignRight,!1),t.isHint=Data.getDefaultBoolean(t.isHint,!1),t.alignHintToClickPosition=Data.getDefaultBoolean(t.alignHintToClickPosition,!1),t.showDisabledBackground=Data.getDefaultBoolean(t.showDisabledBackground,!0),t.removeHintWhenViewed=Data.getDefaultBoolean(t.removeHintWhenViewed,!1),t.group=Data.getDefaultString(t.group,_groups_Default),t=buildAttributeOptionStrings(t),buildAttributeOptionCustomTriggers(t)}function buildAttributeOptionStrings(e){return e.title=Data.getDefaultString(e.title,""),e.description=Data.getDefaultString(e.description,""),e.tooltip=Data.getDefaultString(e.tooltip,""),e}function buildAttributeOptionCustomTriggers(e){return e.events=Data.getDefaultObject(e.events,{}),e.events.onEnter=Data.getDefaultFunction(e.events.onEnter,null),e.events.onLeave=Data.getDefaultFunction(e.events.onLeave,null),e.events.onClose=Data.getDefaultFunction(e.events.onClose,null),e.events.onFinish=Data.getDefaultFunction(e.events.onFinish,null),e.events.onOpen=Data.getDefaultFunction(e.events.onOpen,null),e.events.onStart=Data.getDefaultFunction(e.events.onStart,null),e.events.onAddStep=Data.getDefaultFunction(e.events.onAddStep,null),e.events.onRemoveStep=Data.getDefaultFunction(e.events.onRemoveStep,null),e}function fireCustomTriggerEvent(e,...t){Is.definedFunction(e)&&e.apply(null,[].slice.call(t,0))}function getBrowserUrlParameters(){let e=!1;if(_configuration.browserUrlParametersEnabled){const t=getBrowserUrlArguments(window.location.href);if(Is.defined(t.sjOrderId)){const e=parseInt(t.sjOrderId,10);!isNaN(e)&&e<=_groups[_groups_Current].keys.length-1&&(_groups[_groups_Current].position=e)}Is.defined(t.sjShow)&&(e="true"===t.sjShow)}return e}function getBrowserUrlArguments(e){const t={},o=e.split("?");if(o.length>1){const e=o[1].split("&"),n=e.length;for(let o=0;o=_groups[_groups_Current].keys.length-1},addDocumentSteps:function(){return getElements(),_public},addStep:function(e,t){return Is.definedObject(e)&&Is.definedObject(t)&&(setupElement(e,buildAttributeOptions(t)),_groups[_groups_Current].keys.sort(),resetDialogPosition()),_public},removeStep:function(e){if(Is.definedObject(e)){let t=!1;for(let o in _groups)if(_groups.hasOwnProperty(o))for(let n in _groups[o].json)if(_groups[o].json.hasOwnProperty(n)){const i=_groups[o].json[n];if(i._currentView.element===e){fireCustomTriggerEvent(i.events.onRemoveStep,i._currentView.element),_groups[o].keys.splice(_groups[o].keys.indexOf(i.order),1),delete _groups[o].json[i.order],_groups[o].keys.sort(),t=!0;break}}t?resetDialogPosition():DomElement.clearElementsByClassName(e,"journey-js-hint")}return _public},clearSteps:function(e=""){resetDialogPosition();for(let t in _groups)if(_groups.hasOwnProperty(t)&&(!Is.definedString(e)||e===t))for(let e in _groups[t].json)if(_groups[t].json.hasOwnProperty(e)){const o=_groups[t].json[e];fireCustomTriggerEvent(o.events.onRemoveStep,o._currentView.element)}return Is.definedString(e)?_groups.hasOwnProperty(e)&&delete _groups[e]:_groups={},Is.definedString(e)&&e!==_groups_Default||setupDefaultGroup(_groups),_public},clearHints:function(){return DomElement.clearElementsByClassName(document.body,"journey-js-hint"),_public},reverseStepOrder:function(){return _groups[_groups_Current].keys.reverse(),resetDialogPosition(),_public},setConfiguration:function(e){if(Is.definedObject(e)){let t=!1;const o=_configuration;for(let n in e)e.hasOwnProperty(n)&&_configuration.hasOwnProperty(n)&&o[n]!==e[n]&&(o[n]=e[n],t=!0);t&&buildDefaultConfiguration(o)}return _public},getVersion:function(){return"2.0.0"}};buildDefaultConfiguration(),document.addEventListener("DOMContentLoaded",(()=>{setupDefaultGroup(),renderDisabledBackground(),renderDialog(),renderToolTip(),getElements(),buildDocumentEvents(),getBrowserUrlParameters()&&_public.show()})),Is.defined(window.$journey)||(window.$journey=_public)})(); \ No newline at end of file +"use strict";var Constants,Is,Data,DomElement;(Constants||(Constants={})).JOURNEY_JS_ATTRIBUTE_NAME="data-journey-js",(e=>{function t(e){return null!=e&&""!==e}function o(e){return t(e)&&"object"==typeof e}e.defined=t,e.definedObject=o,e.definedBoolean=function(e){return t(e)&&"boolean"==typeof e},e.definedString=function(e){return t(e)&&"string"==typeof e},e.definedFunction=function(e){return t(e)&&"function"==typeof e},e.definedNumber=function(e){return t(e)&&"number"==typeof e},e.definedArray=function(e){return o(e)&&e instanceof Array}})(Is||(Is={})),(e=>{function t(e,t){return Is.definedArray(e)?e:t}e.getDefaultAnyString=function(e,t){return"string"==typeof e?e:t},e.getDefaultString=function(e,t){return Is.definedString(e)?e:t},e.getDefaultBoolean=function(e,t){return Is.definedBoolean(e)?e:t},e.getDefaultNumber=function(e,t){return Is.definedNumber(e)?e:t},e.getDefaultFunction=function(e,t){return Is.definedFunction(e)?e:t},e.getDefaultObject=function(e,t){return Is.definedObject(e)?e:t},e.getDefaultArray=t,e.getDefaultStringOrArray=function(e,o){let n=o;if(Is.definedString(e)){const t=e.toString().split(" ");0===t.length?e=o:n=t}else n=t(e,o);return n}})(Data||(Data={})),(e=>{function t(e,t=""){const o=e.toLowerCase();let n="text"===o?document.createTextNode(""):document.createElement(o);return Is.defined(t)&&(n.className=t),n}function o(){const e=document.documentElement;return{left:(window.pageXOffset||e.scrollLeft)-(e.clientLeft||0),top:(window.pageYOffset||e.scrollTop)-(e.clientTop||0)}}e.create=t,e.getOffset=function(e){const t={left:0,top:0};for(;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t.left+=e.offsetLeft-e.scrollLeft,t.top+=e.offsetTop-e.scrollTop,e=e.offsetParent;return t},e.getScrollPosition=o,e.getStyleValueByName=function(e,t){let o=null;return document.defaultView.getComputedStyle?o=document.defaultView.getComputedStyle(e,null).getPropertyValue(t):e.currentStyle&&(o=e.currentStyle[t]),o},e.addNode=function(e,t){try{e.contains(t)||e.appendChild(t)}catch(e){console.warn(e.message)}},e.removeNode=function(e,t){try{e.contains(t)&&e.removeChild(t)}catch(e){console.warn(e.message)}},e.cancelBubble=function(e){e.preventDefault(),e.cancelBubble=!0},e.showElementAtMousePosition=function(e,t){let n=e.pageX,i=e.pageY;const r=o();t.style.display="block",n+t.offsetWidth>window.innerWidth?n-=t.offsetWidth:n++,i+t.offsetHeight>window.innerHeight?i-=t.offsetHeight:i++,n{let _configuration={},_configuration_ShortcutKeysEnabled=!0;const _groups_Default="default";let _groups_Current=_groups_Default,_groups={},_element_Focus_Element_PositionStyle="",_element_Disabled_Background,_element_Dialog,_element_Dialog_Close_Button,_element_Dialog_Title,_element_Dialog_Description,_element_Dialog_CheckBox_Container,_element_Dialog_CheckBox_Input,_element_Dialog_ProgressDots,_element_Dialog_ProgressBar,_element_Dialog_ProgressBar_Percentage,_element_Dialog_ProgressBar_Percentage_Text,_element_Dialog_Buttons,_element_Dialog_Buttons_Back_Button,_element_Dialog_Buttons_Next_Button,_element_Dialog_IsHint=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_X=0,_element_Dialog_Move_Y=0,_element_ToolTip,_element_ToolTip_Timer=0;function setupDefaultGroup(e=null){_groups=Data.getDefaultObject(e,{}),_groups[_groups_Default]={json:{},keys:[],position:0}}function setupNewGroup(e){_groups.hasOwnProperty(e)||(_groups[e]={json:{},keys:[],position:0})}function getGroupBindingOptions(){return _groups[_groups_Current].json[_groups[_groups_Current].keys[_groups[_groups_Current].position]]}function renderDisabledBackground(){_element_Disabled_Background=DomElement.create("div","journey-js-disabled-background"),_element_Disabled_Background.onclick=()=>{_configuration.closeDialogOnDisabledBackgroundClick&&onDialogClose()}}function showDisabledBackground(){DomElement.addNode(document.body,_element_Disabled_Background)}function hideDisabledBackground(){DomElement.removeNode(document.body,_element_Disabled_Background)}function renderDialog(){_element_Dialog=DomElement.create("div","journey-js-dialog"),_element_Dialog.style.display="none",document.body.appendChild(_element_Dialog),_element_Dialog_Close_Button=DomElement.create("button","close"),_element_Dialog.appendChild(_element_Dialog_Close_Button),_element_Dialog_Close_Button.onclick=()=>{onDialogClose()},addToolTip(_element_Dialog_Close_Button,_configuration.closeButtonToolTipText),_element_Dialog_Title=DomElement.create("div","title"),_element_Dialog.appendChild(_element_Dialog_Title),_element_Dialog_Description=DomElement.create("div","description"),_element_Dialog.appendChild(_element_Dialog_Description),_element_Dialog_CheckBox_Container=DomElement.create("div","checkbox-container"),_element_Dialog.appendChild(_element_Dialog_CheckBox_Container),_element_Dialog_CheckBox_Input=DomElement.createCheckBox(_element_Dialog_CheckBox_Container,_configuration.doNotShowAgainText),_element_Dialog_CheckBox_Input.onchange=()=>{_configuration.showDoNotShowAgain&&fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange,_element_Dialog_CheckBox_Input.checked)},_element_Dialog_ProgressDots=DomElement.create("div","progress-dots"),_element_Dialog.appendChild(_element_Dialog_ProgressDots),_element_Dialog_ProgressBar=DomElement.create("div","progress-bar"),_element_Dialog.appendChild(_element_Dialog_ProgressBar),_element_Dialog_ProgressBar_Percentage=DomElement.create("div","progress-bar-percentage"),_element_Dialog_ProgressBar.appendChild(_element_Dialog_ProgressBar_Percentage),_element_Dialog_ProgressBar_Percentage_Text=DomElement.create("p","progress-bar-percentage-text"),_element_Dialog_ProgressBar_Percentage.appendChild(_element_Dialog_ProgressBar_Percentage_Text),_element_Dialog_Buttons=DomElement.create("div","buttons"),_element_Dialog.appendChild(_element_Dialog_Buttons),_element_Dialog_Buttons_Back_Button=DomElement.create("button","back"),_element_Dialog_Buttons_Back_Button.onclick=onDialogBack,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Back_Button),_element_Dialog_Buttons_Next_Button=DomElement.create("button","next"),_element_Dialog_Buttons_Next_Button.onclick=onDialogNext,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Next_Button),makeDialogMovable()}function onDialogClose(e=!0){let t=!1;if(t=!Is.definedString(_configuration.closeDialogConfirmationText)||!e||confirm(_configuration.closeDialogConfirmationText),t){const e=getGroupBindingOptions();Is.defined(e)&&Is.defined(e._currentView.element)&&fireCustomTriggerEvent(e.events.onClose,e._currentView.element),removeFocusClassFromLastElement(!1),hideDisabledBackground(),hideToolTip(),_element_Dialog.style.display="none"}}function onDialogBack(){_groups[_groups_Current].position>0&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position--,showDialogAndSetPosition())}function onDialogNext(){if(_groups[_groups_Current].position===_groups[_groups_Current].keys.length-1){const e=getGroupBindingOptions();onDialogClose(!1),fireCustomTriggerEvent(e.events.onFinish,e._currentView.element)}else removeFocusClassFromLastElement(),_groups[_groups_Current].position++,showDialogAndSetPosition()}function showDialogAndSetPosition(){const e=getGroupBindingOptions();if(Is.defined(e)&&Is.defined(e._currentView.element)){e.showDisabledBackground?showDisabledBackground():hideDisabledBackground(),hideToolTip(),_element_Dialog_Close_Button.style.display=_configuration.showCloseButton?"block":"none",_configuration_ShortcutKeysEnabled=!0,e._currentView.element.className+=" journey-js-element-focus",_configuration.scrollToElements&&e._currentView.element.scrollIntoView();const t=DomElement.getStyleValueByName(e._currentView.element,"position");""!==t&&"static"===t.toLowerCase()&&(_element_Focus_Element_PositionStyle=t,e._currentView.element.style.position="relative"),DomElement.showElementBasedOnCondition(_element_Dialog_CheckBox_Container,_configuration.showDoNotShowAgain),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressDots,_configuration.showProgressDots&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar,_configuration.showProgressBar&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text,_configuration.showProgressBarText),DomElement.showElementBasedOnCondition(_element_Dialog_Buttons,_configuration.showButtons),_element_Dialog_Buttons_Back_Button.innerHTML=_configuration.backButtonText,_element_Dialog_Buttons_Back_Button.disabled=0===_groups[_groups_Current].position,_groups[_groups_Current].position>=_groups[_groups_Current].keys.length-1?_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.finishButtonText:_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.nextButtonText,setDialogText(e),setDialogPosition(null,e),buildProcessDots(),setProgressBarPosition(),fireCustomTriggerEvent(e.events.onEnter,e._currentView.element),e.sendClick&&e._currentView.element.click()}}function setDialogText(e){Is.definedString(e.title)?_element_Dialog_Title.innerHTML=e.title:_element_Dialog_Title.innerHTML="",Is.definedString(e.description)?_element_Dialog_Description.innerHTML=e.description:_element_Dialog_Description.innerHTML=""}function setDialogPosition(e,t){if("block"!==_element_Dialog.style.display&&(_element_Dialog.style.display="block",fireCustomTriggerEvent(t.events.onOpen,t._currentView.element)),0===_groups[_groups_Current].position&&fireCustomTriggerEvent(t.events.onStart,t._currentView.element),_element_Dialog_IsHint=!0===t.isHint,t.attach||t.isHint)if(t.isHint&&t.alignHintToClickPosition)DomElement.showElementAtMousePosition(e,_element_Dialog);else{const e=DomElement.getOffset(t._currentView.element);let o=e.top+t._currentView.element.offsetHeight,n=e.left;(n+_element_Dialog.offsetWidth>window.innerWidth||t.alignRight)&&(n-=_element_Dialog.offsetWidth,n+=t._currentView.element.offsetWidth),(o+_element_Dialog.offsetHeight>window.innerHeight||t.alignTop)&&(o-=_element_Dialog.offsetHeight+t._currentView.element.offsetHeight),_element_Dialog.style.top=o+"px",_element_Dialog.style.left=n+"px"}else{const e=DomElement.getScrollPosition(),t=Math.max(0,(window.innerWidth-_element_Dialog.offsetWidth)/2+e.left),o=Math.max(0,(window.innerHeight-_element_Dialog.offsetHeight)/2+e.top);_element_Dialog.style.left=t+"px",_element_Dialog.style.top=o+"px"}}function removeFocusClassFromLastElement(e=!0){const t=getGroupBindingOptions();Is.defined(t)&&Is.defined(t._currentView.element)&&(t._currentView.element.className=t._currentView.element.className.replace(" journey-js-element-focus",""),Is.defined(_element_Focus_Element_PositionStyle)&&(t._currentView.element.style.position=_element_Focus_Element_PositionStyle),e&&fireCustomTriggerEvent(t.events.onLeave,t._currentView.element))}function buildProcessDots(){if(_element_Dialog_ProgressDots.innerHTML="",_configuration.showProgressDots){const e=_groups[_groups_Current].keys.length;for(let t=0;t{removeFocusClassFromLastElement(),_groups[_groups_Current].position=e,showDialogAndSetPosition()}),_element_Dialog_ProgressDots.appendChild(n),_configuration.showProgressDotToolTips&&(Is.definedString(o.tooltip)?addToolTip(n,o.tooltip):addToolTip(n,o.title)),_configuration.showProgressDotNumbers&&(n.className+=" dot-number",n.innerHTML=(e+1).toString())}function setProgressBarPosition(){if(_configuration.showProgressBar){const e=_element_Dialog_ProgressBar.offsetWidth/_groups[_groups_Current].keys.length,t=(_groups[_groups_Current].position+1)*e,o=Math.ceil((_groups[_groups_Current].position+1)/_groups[_groups_Current].keys.length*100);_element_Dialog_ProgressBar_Percentage.style.width=t+"px",_element_Dialog_ProgressBar_Percentage_Text.innerHTML=o+"%"}}function makeDialogMovable(){_element_Dialog_Title.onmousedown=onMoveTitleBarMouseDown,_element_Dialog_Title.onmouseup=onMoveTitleBarMouseUp,_element_Dialog_Title.oncontextmenu=onMoveTitleBarMouseUp,document.body.addEventListener("mousemove",onMoveDocumentMouseMove),document.body.addEventListener("mouseleave",onMoveDocumentMouseLeave)}function onMoveTitleBarMouseDown(e){_element_Dialog_Move_IsMoving||_element_Dialog_IsHint||!_configuration.dialogMovingEnabled||(_element_Dialog.className+=" journey-js-dialog-moving",_element_Dialog_Move_IsMoving=!0,_element_Dialog_Move_X=e.pageX-_element_Dialog.offsetLeft,_element_Dialog_Move_Y=e.pageY-_element_Dialog.offsetTop,_element_Dialog_Move_Original_X=_element_Dialog.offsetLeft,_element_Dialog_Move_Original_Y=_element_Dialog.offsetTop)}function onMoveTitleBarMouseUp(){_element_Dialog_Move_IsMoving&&(_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function onMoveDocumentMouseMove(e){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=e.pageX-_element_Dialog_Move_X+"px",_element_Dialog.style.top=e.pageY-_element_Dialog_Move_Y+"px")}function onMoveDocumentMouseLeave(){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=_element_Dialog_Move_Original_X+"px",_element_Dialog.style.top=_element_Dialog_Move_Original_Y+"px",_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function renderToolTip(){Is.defined(_element_ToolTip)||(_element_ToolTip=DomElement.create("div","journey-js-tooltip"),_element_ToolTip.style.display="none",document.body.appendChild(_element_ToolTip),document.body.addEventListener("mousemove",(()=>{hideToolTip()})),document.addEventListener("scroll",(()=>{hideToolTip()})))}function addToolTip(e,t){null!==e&&(e.onmousemove=e=>{showToolTip(e,t)})}function showToolTip(e,t){DomElement.cancelBubble(e),hideToolTip(),_element_ToolTip_Timer=setTimeout((()=>{_element_ToolTip.innerHTML=t,_element_ToolTip.style.display="block",DomElement.showElementAtMousePosition(e,_element_ToolTip)}),_configuration.tooltipDelay)}function hideToolTip(){Is.defined(_element_ToolTip)&&(0!==_element_ToolTip_Timer&&(clearTimeout(_element_ToolTip_Timer),_element_ToolTip_Timer=0),"block"===_element_ToolTip.style.display&&(_element_ToolTip.style.display="none"))}function getElements(){const e=_configuration.domElementTypes,t=e.length;for(let o=0;o{DomElement.cancelBubble(t),_element_Dialog_CheckBox_Container.style.display="none",_element_Dialog_ProgressDots.style.display="none",_element_Dialog_ProgressBar.style.display="none",_element_Dialog_Buttons.style.display="none",_configuration_ShortcutKeysEnabled=!1,setDialogText(e),setDialogPosition(t,e),e.removeHintWhenViewed&&DomElement.clearElementsByClassName(e._currentView.element,"journey-js-hint")}}function buildDocumentEvents(e=!0){const t=e?document.addEventListener:document.removeEventListener,o=e?window.addEventListener:window.removeEventListener;_configuration.shortcutKeysEnabled&&t("keydown",onWindowKeyDown),o("resize",onWindowResize)}function onWindowKeyDown(e){_public.isOpen()&&_configuration.shortcutKeysEnabled&&("Escape"===e.code?(e.preventDefault(),onDialogClose()):_configuration_ShortcutKeysEnabled&&("ArrowLeft"===e.code?(e.preventDefault(),onDialogBack()):"ArrowRight"===e.code?(e.preventDefault(),onDialogNext()):"ArrowUp"===e.code?(e.preventDefault(),onWindowKeyCodeUp()):"ArrowDown"===e.code&&(e.preventDefault(),onWindowKeyCodeDown())))}function onWindowResize(){_public.isOpen()&&showDialogAndSetPosition()}function onWindowKeyCodeUp(){0!==_groups[_groups_Current].position&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=0,showDialogAndSetPosition())}function onWindowKeyCodeDown(){_groups[_groups_Current].position!==_groups[_groups_Current].keys.length-1&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=_groups[_groups_Current].keys.length-1,showDialogAndSetPosition())}function buildAttributeOptions(e){let t=Data.getDefaultObject(e,{});return t.order=Data.getDefaultNumber(t.order,0),t.attach=Data.getDefaultBoolean(t.attach,!0),t.sendClick=Data.getDefaultBoolean(t.sendClick,!1),t.alignTop=Data.getDefaultBoolean(t.alignTop,!1),t.alignRight=Data.getDefaultBoolean(t.alignRight,!1),t.isHint=Data.getDefaultBoolean(t.isHint,!1),t.alignHintToClickPosition=Data.getDefaultBoolean(t.alignHintToClickPosition,!1),t.showDisabledBackground=Data.getDefaultBoolean(t.showDisabledBackground,!0),t.removeHintWhenViewed=Data.getDefaultBoolean(t.removeHintWhenViewed,!1),t.group=Data.getDefaultString(t.group,_groups_Default),t=buildAttributeOptionStrings(t),buildAttributeOptionCustomTriggers(t)}function buildAttributeOptionStrings(e){return e.title=Data.getDefaultString(e.title,""),e.description=Data.getDefaultString(e.description,""),e.tooltip=Data.getDefaultString(e.tooltip,""),e}function buildAttributeOptionCustomTriggers(e){return e.events=Data.getDefaultObject(e.events,{}),e.events.onEnter=Data.getDefaultFunction(e.events.onEnter,null),e.events.onLeave=Data.getDefaultFunction(e.events.onLeave,null),e.events.onClose=Data.getDefaultFunction(e.events.onClose,null),e.events.onFinish=Data.getDefaultFunction(e.events.onFinish,null),e.events.onOpen=Data.getDefaultFunction(e.events.onOpen,null),e.events.onStart=Data.getDefaultFunction(e.events.onStart,null),e.events.onAddStep=Data.getDefaultFunction(e.events.onAddStep,null),e.events.onRemoveStep=Data.getDefaultFunction(e.events.onRemoveStep,null),e}function fireCustomTriggerEvent(e,...t){Is.definedFunction(e)&&e.apply(null,[].slice.call(t,0))}function getBrowserUrlParameters(){let e=!1;if(_configuration.browserUrlParametersEnabled){const t=getBrowserUrlArguments(window.location.href);if(Is.defined(t.sjOrderId)){const e=parseInt(t.sjOrderId,10);!isNaN(e)&&e<=_groups[_groups_Current].keys.length-1&&(_groups[_groups_Current].position=e)}Is.defined(t.sjShow)&&(e="true"===t.sjShow)}return e}function getBrowserUrlArguments(e){const t={},o=e.split("?");if(o.length>1){const e=o[1].split("&"),n=e.length;for(let o=0;o=_groups[_groups_Current].keys.length-1},addDocumentSteps:function(){return getElements(),_public},addStep:function(e,t){return Is.definedObject(e)&&Is.definedObject(t)&&(setupElement(e,buildAttributeOptions(t)),_groups[_groups_Current].keys.sort(),resetDialogPosition()),_public},removeStep:function(e){if(Is.definedObject(e)){let t=!1;for(let o in _groups)if(_groups.hasOwnProperty(o))for(let n in _groups[o].json)if(_groups[o].json.hasOwnProperty(n)){const i=_groups[o].json[n];if(i._currentView.element===e){fireCustomTriggerEvent(i.events.onRemoveStep,i._currentView.element),_groups[o].keys.splice(_groups[o].keys.indexOf(i.order),1),delete _groups[o].json[i.order],_groups[o].keys.sort(),t=!0;break}}t?resetDialogPosition():DomElement.clearElementsByClassName(e,"journey-js-hint")}return _public},clearSteps:function(e=""){resetDialogPosition();for(let t in _groups)if(_groups.hasOwnProperty(t)&&(!Is.definedString(e)||e===t))for(let e in _groups[t].json)if(_groups[t].json.hasOwnProperty(e)){const o=_groups[t].json[e];fireCustomTriggerEvent(o.events.onRemoveStep,o._currentView.element)}return Is.definedString(e)?_groups.hasOwnProperty(e)&&delete _groups[e]:_groups={},Is.definedString(e)&&e!==_groups_Default||setupDefaultGroup(_groups),_public},clearHints:function(){return DomElement.clearElementsByClassName(document.body,"journey-js-hint"),_public},reverseStepOrder:function(){return _groups[_groups_Current].keys.reverse(),resetDialogPosition(),_public},setConfiguration:function(e){if(Is.definedObject(e)){let t=!1;const o=_configuration;for(let n in e)e.hasOwnProperty(n)&&_configuration.hasOwnProperty(n)&&o[n]!==e[n]&&(o[n]=e[n],t=!0);t&&buildDefaultConfiguration(o)}return _public},getVersion:function(){return"2.0.0"}};buildDefaultConfiguration(),document.addEventListener("DOMContentLoaded",(()=>{setupDefaultGroup(),renderDisabledBackground(),renderDialog(),renderToolTip(),getElements(),buildDocumentEvents(),getBrowserUrlParameters()&&_public.show()})),Is.defined(window.$journey)||(window.$journey=_public)})(); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 42eb67d..363f865 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,7 @@ "skipLibCheck": true, "removeComments": true, "sourceMap": true, - "strict": false + "strict": true }, "include": [ "src/**/*.ts" From d3e1ea7d781920456226cab59ed6280f71559b85 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 18:41:45 +0100 Subject: [PATCH 39/44] Minor comment updates. --- src/journey.ts | 8 ++++---- src/ts/api.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/journey.ts b/src/journey.ts index b1abee1..70f5517 100644 --- a/src/journey.ts +++ b/src/journey.ts @@ -949,7 +949,7 @@ type Groups = Record Date: Thu, 4 Jul 2024 18:43:34 +0100 Subject: [PATCH 40/44] Removed source testing files (no longer needed). --- test/dist/journey.js.basic.html | 36 ------ test/dist/journey.js.bootstrap.html | 108 ------------------ test/dist/journey.js.close-confirmation.html | 41 ------- test/dist/journey.js.no-steps.html | 36 ------ test/{src => }/journey.js.basic.html | 6 +- test/{src => }/journey.js.bootstrap.html | 6 +- .../journey.js.close-confirmation.html | 6 +- test/{dist => }/journey.js.min.html | 6 +- test/{src => }/journey.js.no-steps.html | 6 +- test/{dist => }/journey.js.translations.html | 8 +- test/src/journey.js.translations.html | 37 ------ 11 files changed, 19 insertions(+), 277 deletions(-) delete mode 100644 test/dist/journey.js.basic.html delete mode 100644 test/dist/journey.js.bootstrap.html delete mode 100644 test/dist/journey.js.close-confirmation.html delete mode 100644 test/dist/journey.js.no-steps.html rename test/{src => }/journey.js.basic.html (90%) rename test/{src => }/journey.js.bootstrap.html (97%) rename test/{src => }/journey.js.close-confirmation.html (91%) rename test/{dist => }/journey.js.min.html (89%) rename test/{src => }/journey.js.no-steps.html (87%) rename test/{dist => }/journey.js.translations.html (90%) delete mode 100644 test/src/journey.js.translations.html diff --git a/test/dist/journey.js.basic.html b/test/dist/journey.js.basic.html deleted file mode 100644 index e36af5e..0000000 --- a/test/dist/journey.js.basic.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - Journey.js - Basic - - - - - - -
-

Journey.js - Basic

-

This is a basic example of how to use Journey.js to guide you through a website.

-
- -
- - - - - -
-
- -

Show/Hide:

- -
- - - - \ No newline at end of file diff --git a/test/dist/journey.js.bootstrap.html b/test/dist/journey.js.bootstrap.html deleted file mode 100644 index d47a8af..0000000 --- a/test/dist/journey.js.bootstrap.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - Journey.js - Bootstrap - - - - - - - -
-

Journey.js - Bootstrap

-

This is a basic example of how to use Journey.js to guide you through a website, alongside Bootstrap.

-
- -
-

Journey Step Buttons:

- - - - - -
- -

Journey Step Buttons (in a separate journey group):

- - - -
- -
-

Show/Hide:

- - - - - - -
- -

Manage Steps:

- - - - - - -
- -

Configuration:

- -
- -

Additional Data:

- -
- - - - \ No newline at end of file diff --git a/test/dist/journey.js.close-confirmation.html b/test/dist/journey.js.close-confirmation.html deleted file mode 100644 index af908ad..0000000 --- a/test/dist/journey.js.close-confirmation.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Journey.js - Close Confirmation - - - - - - -
-

Journey.js - Close Confirmation

-

This is a basic example of how to use Journey.js to guide you through a website, with a close confirmation message used.

-
- -
- - - - - -
-
- -

Show/Hide:

- -
- - - - \ No newline at end of file diff --git a/test/dist/journey.js.no-steps.html b/test/dist/journey.js.no-steps.html deleted file mode 100644 index 19ab19a..0000000 --- a/test/dist/journey.js.no-steps.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - Journey.js - No Steps - - - - - - -
-

Journey.js - No Steps

-

This is a basic example of how to use Journey.js to guide you through a website, but with no steps currently available.

-
- -
- - - - - -
-
- -

Show/Hide:

- -
- - - - \ No newline at end of file diff --git a/test/src/journey.js.basic.html b/test/journey.js.basic.html similarity index 90% rename from test/src/journey.js.basic.html rename to test/journey.js.basic.html index 4b01e89..43880d4 100644 --- a/test/src/journey.js.basic.html +++ b/test/journey.js.basic.html @@ -4,9 +4,9 @@ Journey.js - Basic - - - + + + diff --git a/test/src/journey.js.bootstrap.html b/test/journey.js.bootstrap.html similarity index 97% rename from test/src/journey.js.bootstrap.html rename to test/journey.js.bootstrap.html index d3bdae8..74fd917 100644 --- a/test/src/journey.js.bootstrap.html +++ b/test/journey.js.bootstrap.html @@ -4,10 +4,10 @@ Journey.js - Bootstrap - - + + - + diff --git a/test/src/journey.js.close-confirmation.html b/test/journey.js.close-confirmation.html similarity index 91% rename from test/src/journey.js.close-confirmation.html rename to test/journey.js.close-confirmation.html index 7b5753b..99c272f 100644 --- a/test/src/journey.js.close-confirmation.html +++ b/test/journey.js.close-confirmation.html @@ -4,9 +4,9 @@ Journey.js - Close Confirmation - - - + + + diff --git a/test/dist/journey.js.min.html b/test/journey.js.min.html similarity index 89% rename from test/dist/journey.js.min.html rename to test/journey.js.min.html index 439821e..7092d89 100644 --- a/test/dist/journey.js.min.html +++ b/test/journey.js.min.html @@ -4,9 +4,9 @@ Journey.js - Minimized - - - + + + diff --git a/test/src/journey.js.no-steps.html b/test/journey.js.no-steps.html similarity index 87% rename from test/src/journey.js.no-steps.html rename to test/journey.js.no-steps.html index f40b7a7..a99c995 100644 --- a/test/src/journey.js.no-steps.html +++ b/test/journey.js.no-steps.html @@ -4,9 +4,9 @@ Journey.js - No Steps - - - + + + diff --git a/test/dist/journey.js.translations.html b/test/journey.js.translations.html similarity index 90% rename from test/dist/journey.js.translations.html rename to test/journey.js.translations.html index 0d2317e..ab8867b 100644 --- a/test/dist/journey.js.translations.html +++ b/test/journey.js.translations.html @@ -4,10 +4,10 @@ Journey.js - Translations - - - - + + + + diff --git a/test/src/journey.js.translations.html b/test/src/journey.js.translations.html deleted file mode 100644 index 9a9e305..0000000 --- a/test/src/journey.js.translations.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - Journey.js - Translations - - - - - - - -
-

Journey.js - Translations

-

This is a basic example of how to use Journey.js to guide you through a website using translations..

-
- -
- - - - - -
-
- -

Show/Hide:

- -
- - - - \ No newline at end of file From 4790512582990696b8a1766bcdc5124d170b3eb5 Mon Sep 17 00:00:00 2001 From: William Troup Date: Thu, 4 Jul 2024 18:54:57 +0100 Subject: [PATCH 41/44] Improved testing files. --- test/journey.js.basic.html | 12 ++++++------ test/journey.js.close-confirmation.html | 12 ++++++------ test/journey.js.min.html | 15 ++++++++++----- test/journey.js.no-steps.html | 12 ++++++------ test/journey.js.translations.html | 12 ++++++------ 5 files changed, 34 insertions(+), 29 deletions(-) diff --git a/test/journey.js.basic.html b/test/journey.js.basic.html index 43880d4..337ae9f 100644 --- a/test/journey.js.basic.html +++ b/test/journey.js.basic.html @@ -16,15 +16,15 @@

Journey.js - Basic

- - - - - + + + + +

-

Show/Hide:

+

Show:

diff --git a/test/journey.js.close-confirmation.html b/test/journey.js.close-confirmation.html index 99c272f..752763b 100644 --- a/test/journey.js.close-confirmation.html +++ b/test/journey.js.close-confirmation.html @@ -16,15 +16,15 @@

Journey.js - Close Confirmation

- - - - - + + + + +

-

Show/Hide:

+

Show:

diff --git a/test/journey.js.min.html b/test/journey.js.min.html index 7092d89..0e29da3 100644 --- a/test/journey.js.min.html +++ b/test/journey.js.min.html @@ -16,11 +16,16 @@

Journey.js - Minimized

- - - - - + + + + + +
+
+ +

Show:

+
diff --git a/test/journey.js.no-steps.html b/test/journey.js.no-steps.html index a99c995..c010205 100644 --- a/test/journey.js.no-steps.html +++ b/test/journey.js.no-steps.html @@ -16,15 +16,15 @@

Journey.js - No Steps

- - - - - + + + + +

-

Show/Hide:

+

Show:

diff --git a/test/journey.js.translations.html b/test/journey.js.translations.html index ab8867b..b7bb2a2 100644 --- a/test/journey.js.translations.html +++ b/test/journey.js.translations.html @@ -17,15 +17,15 @@

Journey.js - Translations

- - - - - + + + + +

-

Show/Hide:

+

Show:

From f40064305f6fdf2d3475b73ab46e4045fc250603 Mon Sep 17 00:00:00 2001 From: William Troup Date: Fri, 5 Jul 2024 11:09:25 +0100 Subject: [PATCH 42/44] Removed more strict warnings. --- dist/journey.esm.js.map | 2 +- dist/journey.js.map | 2 +- src/ts/dom.ts | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 786d892..3ea92c4 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView!.getComputedStyle! ) {\n value = document.defaultView!.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode!.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js.map b/dist/journey.js.map index 42f33c5..850c22a 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView.getComputedStyle ) {\n value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView!.getComputedStyle! ) {\n value = document.defaultView!.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode!.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/ts/dom.ts b/src/ts/dom.ts index 2b7c85a..e3038d9 100644 --- a/src/ts/dom.ts +++ b/src/ts/dom.ts @@ -47,8 +47,8 @@ export namespace DomElement { export function getStyleValueByName( element: any, stylePropertyName: string ) : any { let value: any = null; - if ( document.defaultView.getComputedStyle ) { - value = document.defaultView.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); + if ( document.defaultView!.getComputedStyle! ) { + value = document.defaultView!.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); } else if ( element.currentStyle ) { value = element.currentStyle[ stylePropertyName ]; } @@ -61,7 +61,7 @@ export namespace DomElement { if ( !parent.contains( node ) ) { parent.appendChild( node ); } - } catch ( e ) { + } catch ( e: any ) { console.warn( e.message ); } } @@ -71,7 +71,7 @@ export namespace DomElement { if ( parent.contains( node ) ) { parent.removeChild( node ); } - } catch ( e ) { + } catch ( e: any ) { console.warn( e.message ); } } @@ -151,7 +151,7 @@ export namespace DomElement { let elements: HTMLCollectionOf = container.getElementsByClassName( className ); while ( elements[ 0 ] ) { - elements[ 0 ].parentNode.removeChild( elements[ 0 ] ); + elements[ 0 ].parentNode!.removeChild( elements[ 0 ] ); } } } \ No newline at end of file From 3f9a86f498375fbfb4630ee55048b2eb7f5df78c Mon Sep 17 00:00:00 2001 From: William Troup Date: Fri, 5 Jul 2024 11:10:42 +0100 Subject: [PATCH 43/44] Added comments. --- dist/journey.esm.js.map | 2 +- dist/journey.js.map | 2 +- src/ts/api.ts | 13 +++++++++++++ src/ts/data.ts | 13 +++++++++++++ src/ts/dom.ts | 13 +++++++++++++ src/ts/enum.ts | 13 +++++++++++++ src/ts/is.ts | 13 +++++++++++++ src/ts/type.ts | 13 +++++++++++++ 8 files changed, 80 insertions(+), 2 deletions(-) diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index 3ea92c4..bbf7ec0 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":";;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAaiB;AAbjB;AAAA;AAAA;AAaO,MAAUA,eAAV;AACI,MAAMA,WAAA,4BAA4B;AAAA,OAD5B;AAAA;AAAA;;;ACbjB,IAGiB;AAHjB;AAAA;AAAA;AAAA;AAGO,MAAUC,QAAV;AACI,eAAS,QAAS,OAAuB;AAC5C,eAAO,UAAU,QAAQ,UAAU,UAAa;AAAA,MACpD;AAFO,MAAAA,IAAS;AAIT,eAAS,cAAe,QAAwB;AACnD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,eAAgB,QAAwB;AACpD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,cAAe,QAAwB;AACnD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,gBAAiB,QAAwB;AACrD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,cAAe,QAAwB;AACnD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,aAAc,QAAwB;AAClD,eAAO,cAAe,MAAO,KAAK,kBAAkB;AAAA,MACxD;AAFO,MAAAA,IAAS;AAAA,OAzBH;AAAA;AAAA;;;ACHjB,IAIiB;AAJjB;AAAA;AAAA;AAAA;AACA;AAGO,MAAUC,UAAV;AACI,eAAS,oBAAqB,OAAY,cAAgC;AAC7E,eAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,iBAAkB,OAAY,cAAgC;AAC1E,eAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,kBAAmB,OAAY,cAAkC;AAC7E,eAAO,GAAG,eAAgB,KAAM,IAAI,QAAQ;AAAA,MAChD;AAFO,MAAAA,MAAS;AAIT,eAAS,iBAAkB,OAAY,cAAgC;AAC1E,eAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,mBAAoB,OAAY,cAA0B;AACtE,eAAO,GAAG,gBAAiB,KAAM,IAAI,QAAQ;AAAA,MACjD;AAFO,MAAAA,MAAS;AAIT,eAAS,iBAAkB,OAAY,cAA0B;AACpE,eAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,gBAAiB,OAAY,cAA8B;AACvE,eAAO,GAAG,aAAc,KAAM,IAAI,QAAQ;AAAA,MAC9C;AAFO,MAAAA,MAAS;AAIT,eAAS,wBAAyB,OAAY,cAA8B;AAC/E,YAAIC,UAAgB;AAEpB,YAAK,GAAG,cAAe,KAAM,GAAI;AAC7B,gBAAM,SAAmB,MAAM,SAAS,EAAE,qBAAkB;AAE5D,cAAK,OAAO,WAAW,GAAI;AACvB,oBAAQ;AAAA,UACZ,OAAO;AACH,YAAAA,UAAS;AAAA,UACb;AAAA,QAEJ,OAAO;AACH,UAAAA,UAAS,gBAAiB,OAAO,YAAa;AAAA,QAClD;AAEA,eAAOA;AAAA,MACX;AAjBO,MAAAD,MAAS;AAAA,OA7BH;AAAA;AAAA;;;ACJjB,IAKiB;AALjB;AAAA;AAAA;AAAA;AACA;AAIO,MAAUE,gBAAV;AACI,eAAS,OAAQ,MAAc,4BAA+C;AACjF,cAAM,WAAmB,KAAK,YAAY;AAC1C,cAAM,SAAkB,aAAa;AAErC,YAAID,UAAc,SAAS,SAAS,6BAA2B,IAAI,SAAS,cAAe,QAAS;AAEpG,YAAK,GAAG,QAAS,SAAU,GAAI;AAC3B,UAAAA,QAAO,YAAY;AAAA,QACvB;AAEA,eAAOA;AAAA,MACX;AAXO,MAAAC,YAAS;AAaT,eAAS,UAAW,SAAkC;AACzD,cAAMD,UAAmB;AAAA,UACrB,MAAM;AAAA,UACN,KAAK;AAAA,QACT;AAEA,eAAQ,WAAW,CAAC,MAAO,QAAQ,UAAW,KAAK,CAAC,MAAO,QAAQ,SAAU,GAAI;AAC7E,UAAAA,QAAO,QAAQ,QAAQ,aAAa,QAAQ;AAC5C,UAAAA,QAAO,OAAO,QAAQ,YAAY,QAAQ;AAE1C,oBAAU,QAAQ;AAAA,QACtB;AAEA,eAAOA;AAAA,MACX;AAdO,MAAAC,YAAS;AAgBT,eAAS,oBAA+B;AAC3C,cAAM,MAAmB,SAAS;AAElC,cAAMD,UAAmB;AAAA,UACrB,OAAQ,OAAO,eAAe,IAAI,eAAkB,IAAI,cAAc;AAAA,UACtE,MAAO,OAAO,eAAe,IAAI,cAAgB,IAAI,aAAa;AAAA,QACtE;AAEA,eAAOA;AAAA,MACX;AATO,MAAAC,YAAS;AAWT,eAAS,oBAAqB,SAAc,mBAAkC;AACjF,YAAI,QAAa;AAEjB,YAAK,SAAS,YAAa,kBAAoB;AAC3C,kBAAQ,SAAS,YAAa,iBAAkB,SAAS,IAAK,EAAE,iBAAkB,iBAAkB;AAAA,QACxG,WAAY,QAAQ,cAAe;AAC/B,kBAAQ,QAAQ,aAAc,iBAAkB;AAAA,QACpD;AAEA,eAAO;AAAA,MACX;AAVO,MAAAA,YAAS;AAYT,eAAS,QAAS,QAAqB,MAA2B;AACrE,YAAI;AACA,cAAK,CAAC,OAAO,SAAU,IAAK,GAAI;AAC5B,mBAAO,YAAa,IAAK;AAAA,UAC7B;AAAA,QACJ,SAAU,GAAS;AACf,kBAAQ,KAAM,EAAE,OAAQ;AAAA,QAC5B;AAAA,MACJ;AARO,MAAAA,YAAS;AAUT,eAAS,WAAY,QAAqB,MAA2B;AACxE,YAAI;AACA,cAAK,OAAO,SAAU,IAAK,GAAI;AAC3B,mBAAO,YAAa,IAAK;AAAA,UAC7B;AAAA,QACJ,SAAU,GAAS;AACf,kBAAQ,KAAM,EAAE,OAAQ;AAAA,QAC5B;AAAA,MACJ;AARO,MAAAA,YAAS;AAUT,eAAS,aAAc,GAAgB;AAC1C,UAAE,eAAe;AACjB,UAAE,eAAe;AAAA,MACrB;AAHO,MAAAA,YAAS;AAKT,eAAS,2BAA4B,GAAe,SAA8B;AACrF,YAAI,OAAe,EAAE;AACrB,YAAI,MAAc,EAAE;AACpB,cAAM,iBAA2B,kBAAkB;AAEnD,gBAAQ,MAAM,UAAU;AAExB,YAAK,OAAO,QAAQ,cAAc,OAAO,YAAa;AAClD,kBAAQ,QAAQ;AAAA,QACpB,OAAO;AACH;AAAA,QACJ;AAEA,YAAK,MAAM,QAAQ,eAAe,OAAO,aAAc;AACnD,iBAAO,QAAQ;AAAA,QACnB,OAAO;AACH;AAAA,QACJ;AAEA,YAAK,OAAO,eAAe,MAAO;AAC9B,iBAAO,EAAE,QAAQ;AAAA,QACrB;AAEA,YAAK,MAAM,eAAe,KAAM;AAC5B,gBAAM,EAAE,QAAQ;AAAA,QACpB;AAEA,gBAAQ,MAAM,OAAO,OAAO;AAC5B,gBAAQ,MAAM,MAAM,MAAM;AAAA,MAC9B;AA7BO,MAAAA,YAAS;AA+BT,eAAS,4BAA6B,SAAsB,WAA4B;AAC3F,YAAK,WAAY;AACb,cAAK,QAAQ,MAAM,YAAY,SAAU;AACrC,oBAAQ,MAAM,UAAU;AAAA,UAC5B;AAAA,QAEJ,OAAO;AACH,cAAK,QAAQ,MAAM,YAAY,QAAS;AACpC,oBAAQ,MAAM,UAAU;AAAA,UAC5B;AAAA,QACJ;AAAA,MACJ;AAXO,MAAAA,YAAS;AAaT,eAAS,eAAgB,WAAwB,WAAuC;AAC3F,cAAM,gBAA6B,OAAQ,KAAM;AACjD,cAAM,QAAqB,OAAQ,SAAS,UAAW;AACvD,cAAM,QAA0B,OAAQ,OAAQ;AAEhD,kBAAU,YAAa,aAAc;AACrC,sBAAc,YAAa,KAAM;AACjC,cAAM,YAAa,KAAM;AAEzB,cAAM,OAAO;AAEb,cAAM,YAAyB,OAAQ,QAAQ,YAAa;AAC5D,cAAM,OAAoB,OAAQ,QAAQ,MAAO;AAEjD,aAAK,YAAY;AAEjB,cAAM,YAAa,SAAU;AAC7B,cAAM,YAAa,IAAK;AAExB,eAAO;AAAA,MACX;AApBO,MAAAA,YAAS;AAsBT,eAAS,yBAA0B,WAAwB,WAA2B;AACzF,YAAI,WAAsC,UAAU,uBAAwB,SAAU;AAEtF,eAAQ,SAAU,CAAE,GAAI;AACpB,mBAAU,CAAE,EAAE,WAAY,YAAa,SAAU,CAAE,CAAE;AAAA,QACzD;AAAA,MACJ;AANO,MAAAA,YAAS;AAAA,OAhJH;AAAA;AAAA;;;ACLjB;AAAA;AAoBA;AACA;AAEA;AACA;AACA;AAeA,KAAE,MAAM;AAEJ,UAAI,iBAAgC,CAAC;AAGrC,UAAI,qCAA8C;AAGlD,YAAM,kBAA0B;AAChC,UAAI,kBAA0B;AAC9B,UAAI,UAAkB,CAAC;AAGvB,UAAI;AAGJ,UAAI;AAGJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI,yBAAkC;AAGtC,UAAI,kCAA0C;AAC9C,UAAI,kCAA0C;AAC9C,UAAI,gCAAyC;AAC7C,UAAI,yBAAiC;AACrC,UAAI,yBAAiC;AAGrC,UAAI;AACJ,UAAI,yBAAiC;AASrC,eAAS,kBAAmB,SAAc,MAAc;AACpD,kBAAU,KAAK,iBAAkB,QAAQ,CAAC,CAAY;AAEtD,gBAAS,eAAgB,IAAI;AAAA,UACzB,MAAM,CAAC;AAAA,UACP,MAAM,CAAC;AAAA,UACP,UAAU;AAAA,QACd;AAAA,MACJ;AAEA,eAAS,cAAe,OAAuB;AAC3C,YAAK,CAAC,QAAQ,eAAgB,KAAM,GAAI;AACpC,kBAAS,KAAM,IAAI;AAAA,YACf,MAAM,CAAC;AAAA,YACP,MAAM,CAAC;AAAA,YACP,UAAU;AAAA,UACd;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,yBAA0C;AAC/C,eAAO,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,QAAS,CAAE;AAAA,MACnH;AASA,eAAS,2BAAkC;AACvC,uCAA+B,WAAW,OAAQ,OAAO,gCAAiC;AAE1F,qCAA6B,UAAU,MAAM;AACzC,cAAK,eAAe,sCAAuC;AACvD,0BAAc;AAAA,UAClB;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,yBAAgC;AACrC,mBAAW,QAAS,SAAS,MAAM,4BAA6B;AAAA,MACpE;AAEA,eAAS,yBAAgC;AACrC,mBAAW,WAAY,SAAS,MAAM,4BAA6B;AAAA,MACvE;AASA,eAAS,eAAsB;AAC3B,0BAAkB,WAAW,OAAQ,OAAO,mBAAoB;AAChE,wBAAgB,MAAM,UAAU;AAChC,iBAAS,KAAK,YAAa,eAAgB;AAE3C,uCAA+B,WAAW,OAAQ,UAAU,OAAQ;AACpE,wBAAgB,YAAa,4BAA6B;AAE1D,qCAA6B,UAAU,MAAM;AACzC,wBAAc;AAAA,QAClB;AAEA,mBAAY,8BAA8B,eAAe,sBAAwB;AAEjF,gCAAwB,WAAW,OAAQ,OAAO,OAAQ;AAC1D,wBAAgB,YAAa,qBAAsB;AAEnD,sCAA8B,WAAW,OAAQ,OAAO,aAAc;AACtE,wBAAgB,YAAa,2BAA4B;AAEzD,6CAAqC,WAAW,OAAQ,OAAO,oBAAqB;AACpF,wBAAgB,YAAa,kCAAmC;AAEhE,yCAAiC,WAAW,eAAgB,oCAAoC,eAAe,kBAAoB;AAEnI,uCAA+B,WAAW,MAAM;AAC5C,cAAK,eAAe,oBAAqB;AACrC,mCAAwB,eAAe,wBAAwB,+BAA+B,OAAQ;AAAA,UAC1G;AAAA,QACJ;AAEA,uCAA+B,WAAW,OAAQ,OAAO,eAAgB;AACzE,wBAAgB,YAAa,4BAA6B;AAE1D,sCAA8B,WAAW,OAAQ,OAAO,cAAe;AACvE,wBAAgB,YAAa,2BAA4B;AAEzD,iDAAyC,WAAW,OAAQ,OAAO,yBAA0B;AAC7F,oCAA4B,YAAa,sCAAuC;AAEhF,sDAA8C,WAAW,OAAQ,KAAK,8BAA+B;AACrG,+CAAuC,YAAa,2CAA4C;AAEhG,kCAA0B,WAAW,OAAQ,OAAO,SAAU;AAC9D,wBAAgB,YAAa,uBAAwB;AAErD,8CAAsC,WAAW,OAAQ,UAAU,MAAO;AAC1E,4CAAoC,UAAU;AAC9C,gCAAwB,YAAa,mCAAoC;AAEzE,8CAAsC,WAAW,OAAQ,UAAU,MAAO;AAC1E,4CAAoC,UAAU;AAC9C,gCAAwB,YAAa,mCAAoC;AAEzE,0BAAkB;AAAA,MACtB;AAEA,eAAS,cAAe,sBAA+B,MAAc;AACjE,YAAI,YAAqB;AAEzB,YAAK,GAAG,cAAe,eAAe,2BAA4B,KAAK,qBAAsB;AACzF,sBAAY,QAAS,eAAe,2BAA4B;AAAA,QACpE,OAAO;AACH,sBAAY;AAAA,QAChB;AAEA,YAAK,WAAY;AACb,gBAAM,iBAAiC,uBAAuB;AAE9D,cAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,mCAAwB,eAAe,OAAQ,SAAU,eAAe,aAAa,OAAQ;AAAA,UACjG;AAEA,0CAAiC,KAAM;AACvC,iCAAuB;AACvB,sBAAY;AAEZ,0BAAgB,MAAM,UAAU;AAAA,QACpC;AAAA,MACJ;AAEA,eAAS,eAAsB;AAC3B,YAAK,QAAS,eAAgB,EAAE,WAAW,GAAI;AAC3C,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE;AAE3B,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,eAAsB;AAC3B,YAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,gBAAM,iBAAiC,uBAAuB;AAE9D,wBAAe,KAAM;AACrB,iCAAwB,eAAe,OAAQ,UAAU,eAAe,aAAa,OAAQ;AAAA,QAEjG,OAAO;AACH,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE;AAE3B,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,2BAAkC;AACvC,cAAM,iBAAiC,uBAAuB;AAE9D,YAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,cAAK,eAAe,wBAAyB;AACzC,mCAAuB;AAAA,UAC3B,OAAO;AACH,mCAAuB;AAAA,UAC3B;AAEA,sBAAY;AAEZ,uCAA6B,MAAM,UAAU,eAAe,kBAAkB,UAAS;AACvF,+CAAqC;AAErC,yBAAe,aAAa,QAAQ,+BAA0B;AAE9D,cAAK,eAAe,kBAAmB;AACnC,2BAAe,aAAa,QAAQ,eAAe;AAAA,UACvD;AAEA,gBAAM,oBAA4B,WAAW,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAElH,cAAK,wCAAoC,kBAAkB,YAAY,MAAM,UAAW;AACpF,mDAAuC;AACvC,2BAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,UACzD;AAEA,qBAAW,4BAA6B,oCAAoC,eAAe,kBAA8B;AACzH,qBAAW,4BAA6B,8BAA8B,eAAe,oBAA+B,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AAC/J,qBAAW,4BAA6B,6BAA6B,eAAe,mBAA8B,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AAC7J,qBAAW,4BAA6B,6CAA6C,eAAe,mBAA+B;AACnI,qBAAW,4BAA6B,yBAAyB,eAAe,WAAuB;AAEvG,8CAAoC,YAAY,eAAe;AAC/D,8CAAoC,WAAW,QAAS,eAAgB,EAAE,aAAa;AAEvF,cAAK,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACrF,gDAAoC,YAAY,eAAe;AAAA,UACnE,OAAO;AACH,gDAAoC,YAAY,eAAe;AAAA,UACnE;AAEA,wBAAe,cAAe;AAC9B,4BAAmB,MAAM,cAAe;AACxC,2BAAiB;AACjB,iCAAuB;AACvB,iCAAwB,eAAe,OAAQ,SAAS,eAAe,aAAa,OAAQ;AAE5F,cAAK,eAAe,WAAY;AAC5B,2BAAe,aAAa,QAAQ,MAAM;AAAA,UAC9C;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,cAAe,gBAAwC;AAC5D,YAAK,GAAG,cAAe,eAAe,KAAM,GAAI;AAC5C,gCAAsB,YAAY,eAAe;AAAA,QACrD,OAAO;AACH,gCAAsB;AAAA,QAC1B;AAEA,YAAK,GAAG,cAAe,eAAe,WAAY,GAAI;AAClD,sCAA4B,YAAY,eAAe;AAAA,QAC3D,OAAO;AACH,sCAA4B;AAAA,QAChC;AAAA,MACJ;AAEA,eAAS,kBAAmB,GAAQ,gBAAwC;AACxE,YAAK,gBAAgB,MAAM,YAAY,SAAU;AAC7C,0BAAgB,MAAM,UAAU;AAEhC,iCAAwB,eAAe,OAAQ,QAAQ,eAAe,aAAa,OAAQ;AAAA,QAC/F;AAEA,YAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,iCAAwB,eAAe,OAAQ,SAAS,eAAe,aAAa,OAAQ;AAAA,QAChG;AAEA,iCAAyB,eAAe,WAAW;AAEnD,YAAK,eAAe,UAAU,eAAe,QAAS;AAClD,cAAK,eAAe,UAAU,eAAe,0BAA2B;AACpE,uBAAW,2BAA4B,GAAG,eAAgB;AAAA,UAE9D,OAAO;AACH,kBAAM,SAAmB,WAAW,UAAW,eAAe,aAAa,OAAQ;AACnF,gBAAI,MAAgB,OAAO,MAAQ,eAAe,aAAa,QAAQ;AACvE,gBAAI,OAAiB,OAAO;AAE5B,gBAAK,OAAO,gBAAgB,cAAc,OAAO,cAAc,eAAe,YAAa;AACvF,sBAAS,gBAAgB;AACzB,sBAAQ,eAAe,aAAa,QAAQ;AAAA,YAChD;AAEA,gBAAK,MAAM,gBAAgB,eAAe,OAAO,eAAe,eAAe,UAAW;AACtF,qBAAS,gBAAgB,eAAe,eAAe,aAAa,QAAQ;AAAA,YAChF;AAEA,4BAAgB,MAAM,MAAM,MAAM;AAClC,4BAAgB,MAAM,OAAO,OAAO;AAAA,UACxC;AAAA,QAEJ,OAAO;AACH,gBAAM,iBAA2B,WAAW,kBAAkB;AAC9D,gBAAM,aAAqB,KAAK,IAAK,IAAO,OAAO,aAAa,gBAAgB,eAAgB,IAAM,eAAe,IAAK;AAC1H,gBAAM,YAAoB,KAAK,IAAK,IAAO,OAAO,cAAc,gBAAgB,gBAAiB,IAAM,eAAe,GAAI;AAE1H,0BAAgB,MAAM,OAAO,aAAa;AAC1C,0BAAgB,MAAM,MAAM,YAAY;AAAA,QAC5C;AAAA,MACJ;AAEA,eAAS,gCAAiC,oBAA6B,MAAc;AACjF,cAAM,iBAAiC,uBAAuB;AAE9D,YAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,yBAAe,aAAa,QAAQ,YAAY,eAAe,aAAa,QAAQ,UAAU,0BAAsB,0CAAuC;AAE3J,cAAK,GAAG,QAAS,oCAAqC,GAAI;AACtD,2BAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,UACzD;AAEA,cAAK,mBAAoB;AACrB,mCAAwB,eAAe,OAAQ,SAAS,eAAe,aAAa,OAAQ;AAAA,UAChG;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,mBAA0B;AAC/B,qCAA6B;AAE7B,YAAK,eAAe,kBAAmB;AACnC,gBAAM,aAAqB,QAAS,eAAgB,EAAE,KAAK;AAE3D,mBAAU,WAAmB,GAAG,WAAW,YAAY,YAAa;AAChE,6BAAkB,UAAU,QAAS,eAAgB,EAAE,KAAM,QAAS,CAAE;AAAA,UAC5E;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,iBAAkB,UAAkB,OAAuB;AAChE,cAAM,iBAAiC,QAAS,eAAgB,EAAE,KAAM,KAAM;AAC9E,YAAI;AAEJ,YAAK,aAAa,QAAS,eAAgB,EAAE,UAAW;AACpD,gBAAM,WAAW,OAAQ,OAAO,YAAa;AAAA,QACjD,OAAO;AAEH,gBAAM,WAAW,OAAQ,OAAO,KAAM;AAEtC,cAAI,UAAU,MAAM;AAChB,4CAAgC;AAEhC,oBAAS,eAAgB,EAAE,WAAW;AAEtC,qCAAyB;AAAA,UAC7B;AAAA,QACJ;AAEA,qCAA6B,YAAa,GAAI;AAE9C,YAAK,eAAe,yBAA0B;AAC1C,cAAK,GAAG,cAAe,eAAe,OAAQ,GAAI;AAC9C,uBAAY,KAAK,eAAe,OAAS;AAAA,UAC7C,OAAO;AACH,uBAAY,KAAK,eAAe,KAAO;AAAA,UAC3C;AAAA,QACJ;AAEA,YAAK,eAAe,wBAAyB;AACzC,cAAI,aAAa;AACjB,cAAI,aAAc,WAAW,GAAI,SAAS;AAAA,QAC9C;AAAA,MACJ;AAEA,eAAS,yBAAgC;AACrC,YAAK,eAAe,iBAAkB;AAClC,gBAAM,iBAAyB,4BAA4B,cAAc,QAAS,eAAgB,EAAE,KAAK;AACzG,gBAAM,SAAkB,QAAS,eAAgB,EAAE,WAAW,KAAM;AACpE,gBAAM,qBAA6B,KAAK,MAAU,QAAS,eAAgB,EAAE,WAAW,KAAM,QAAS,eAAgB,EAAE,KAAK,SAAW,GAAI;AAE7I,iDAAuC,MAAM,QAAQ,QAAQ;AAC7D,sDAA4C,YAAY,qBAAqB;AAAA,QACjF;AAAA,MACJ;AASA,eAAS,oBAA2B;AAChC,8BAAsB,cAAc;AACpC,8BAAsB,YAAY;AAClC,8BAAsB,gBAAgB;AAEtC,iBAAS,KAAK,iBAAkB,aAAa,uBAAwB;AACrE,iBAAS,KAAK,iBAAkB,cAAc,wBAAyB;AAAA,MAC3E;AAEA,eAAS,wBAAyB,GAAuB;AACrD,YAAK,CAAC,iCAAiC,CAAC,0BAA0B,eAAe,qBAAsB;AACnG,0BAAgB,aAAa;AAC7B,0CAAgC;AAChC,mCAAyB,EAAE,QAAQ,gBAAgB;AACnD,mCAAyB,EAAE,QAAQ,gBAAgB;AACnD,4CAAkC,gBAAgB;AAClD,4CAAkC,gBAAgB;AAAA,QACtD;AAAA,MACJ;AAEA,eAAS,wBAA+B;AACpC,YAAK,+BAAgC;AACjC,0CAAgC;AAChC,4CAAkC;AAClC,4CAAkC;AAClC,0BAAgB,YAAY;AAAA,QAChC;AAAA,MACJ;AAEA,eAAS,wBAAyB,GAAuB;AACrD,YAAK,+BAAgC;AACjC,0BAAgB,MAAM,OAAS,EAAE,QAAQ,yBAA2B;AACpE,0BAAgB,MAAM,MAAQ,EAAE,QAAQ,yBAA2B;AAAA,QACvE;AAAA,MACJ;AAEA,eAAS,2BAAkC;AACvC,YAAK,+BAAgC;AACjC,0BAAgB,MAAM,OAAO,kCAAkC;AAC/D,0BAAgB,MAAM,MAAM,kCAAkC;AAE9D,0CAAgC;AAChC,4CAAkC;AAClC,4CAAkC;AAClC,0BAAgB,YAAY;AAAA,QAChC;AAAA,MACJ;AASA,eAAS,gBAAuB;AAC5B,YAAK,CAAC,GAAG,QAAS,gBAAiB,GAAI;AACnC,6BAAmB,WAAW,OAAQ,OAAO,oBAAqB;AAClE,2BAAiB,MAAM,UAAU;AAEjC,mBAAS,KAAK,YAAa,gBAAiB;AAE5C,mBAAS,KAAK,iBAAkB,aAAa,MAAM;AAC/C,wBAAY;AAAA,UAChB,CAAE;AAEF,mBAAS,iBAAkB,UAAU,MAAM;AACvC,wBAAY;AAAA,UAChB,CAAE;AAAA,QACN;AAAA,MACJ;AAEA,eAAS,WAAY,SAAsB,MAAsB;AAC7D,YAAK,YAAY,MAAO;AACpB,kBAAQ,cAAc,CAAE,MAAmB;AACvC,wBAAa,GAAG,IAAK;AAAA,UACzB;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,YAAa,GAAQ,MAAsB;AAChD,mBAAW,aAAc,CAAE;AAC3B,oBAAY;AAEZ,iCAAyB,WAAY,MAAM;AACvC,2BAAiB,YAAY;AAC7B,2BAAiB,MAAM,UAAU;AAEjC,qBAAW,2BAA4B,GAAG,gBAAiB;AAAA,QAC/D,GAAG,eAAe,YAAa;AAAA,MACnC;AAEA,eAAS,cAAqB;AAC1B,YAAK,GAAG,QAAS,gBAAiB,GAAI;AAClC,cAAK,2BAA2B,GAAI;AAChC,yBAAc,sBAAuB;AACrC,qCAAyB;AAAA,UAC7B;AAEA,cAAK,iBAAiB,MAAM,YAAY,SAAU;AAC9C,6BAAiB,MAAM,UAAU;AAAA,UACrC;AAAA,QACJ;AAAA,MACJ;AASA,eAAS,cAAqB;AAC1B,cAAM,WAAqB,eAAe;AAC1C,cAAM,iBAAyB,SAAS;AAExC,iBAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,gBAAM,cAAyC,SAAS,qBAAsB,SAAU,YAAa,CAAE;AACvG,gBAAM,WAA0B,CAAC,EAAE,MAAM,KAAM,WAAY;AAC3D,gBAAM,iBAAyB,SAAS;AAExC,mBAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,gBAAK,CAAC,WAAY,SAAU,YAAa,CAAE,GAAI;AAC3C;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAEA,gBAAS,eAAgB,EAAE,KAAK,KAAK;AAAA,MACzC;AAEA,eAAS,WAAY,SAAiC;AAClD,YAAID,UAAkB;AAEtB,YAAK,GAAG,QAAS,OAAQ,KAAK,QAAQ,aAAc,UAAU,yBAA0B,GAAI;AACxF,gBAAM,qBAA6B,QAAQ,aAAc,UAAU,yBAA0B;AAE7F,cAAK,GAAG,cAAe,kBAAmB,GAAI;AAC1C,kBAAM,iBAA+B,oBAAqB,kBAAmB;AAE7E,gBAAK,eAAe,UAAU,GAAG,cAAe,eAAe,MAAO,GAAI;AACtE,2BAAc,SAAS,sBAAuB,eAAe,MAAO,CAAE;AAAA,YAE1E,OAAO;AACH,kBAAK,CAAC,eAAe,UAAW;AAC5B,wBAAQ,MAAO,eAAe,2BAA4B,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC/H,gBAAAA,UAAS;AAAA,cACb;AAAA,YACJ;AAAA,UAEJ,OAAO;AACH,gBAAK,CAAC,eAAe,UAAW;AAC5B,sBAAQ,MAAO,eAAe,yBAA0B,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC7H,cAAAA,UAAS;AAAA,YACb;AAAA,UACJ;AAAA,QACJ;AAEA,eAAOA;AAAA,MACX;AAEA,eAAS,aAAc,SAAsB,gBAAwC;AACjF,uBAAe,eAAe,CAAC;AAC/B,uBAAe,aAAa,UAAU;AAEtC,YAAK,GAAG,cAAe,eAAe,KAAM,MAAO,GAAG,cAAe,eAAe,KAAM,KAAK,GAAG,cAAe,eAAe,WAAY,IAAM;AAC9I,kBAAQ,gBAAiB,UAAU,yBAA0B;AAE7D,cAAK,CAAC,eAAe,QAAS;AAC1B,0BAAe,eAAe,KAAO;AAErC,oBAAS,eAAe,KAAO,EAAE,KAAM,eAAe,KAAO,IAAI;AACjE,oBAAS,eAAe,KAAO,EAAE,KAAK,KAAM,eAAe,KAAO;AAElE,mCAAwB,eAAe,OAAQ,WAAW,OAAQ;AAAA,UAEtE,OAAO;AACH,uBAAY,cAAe;AAAA,UAC/B;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,WAAY,gBAAwC;AACzD,cAAM,gBAAwB,WAAW,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAE9G,YAAK,oCAAgC,cAAc,YAAY,MAAM,UAAW;AAC5E,yBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,QACzD;AAEA,cAAM,OAAoB,WAAW,OAAQ,OAAO,iBAAkB;AACtE,uBAAe,aAAa,QAAQ,YAAa,IAAK;AAEtD,aAAK,UAAU,CAAE,MAAmB;AAChC,qBAAW,aAAc,CAAE;AAE3B,6CAAmC,MAAM,UAAU;AACnD,uCAA6B,MAAM,UAAU;AAC7C,sCAA4B,MAAM,UAAU;AAC5C,kCAAwB,MAAM,UAAU;AACxC,+CAAqC;AAErC,wBAAe,cAAe;AAC9B,4BAAmB,GAAG,cAAe;AAErC,cAAK,eAAe,sBAAuB;AACvC,uBAAW,yBAA0B,eAAe,aAAa,SAAS,iBAAkB;AAAA,UAChG;AAAA,QACJ;AAAA,MACJ;AASA,eAAS,oBAAqB,YAAqB,MAAc;AAC7D,cAAM,eAAyB,YAAY,SAAS,mBAAmB,SAAS;AAChF,cAAM,aAAuB,YAAY,OAAO,mBAAmB,OAAO;AAE1E,YAAK,eAAe,qBAAsB;AACtC,uBAAc,WAAW,eAAgB;AAAA,QAC7C;AAEA,mBAAY,UAAU,cAAe;AAAA,MACzC;AAEA,eAAS,gBAAiB,GAA0B;AAChD,YAAK,QAAQ,OAAO,KAAK,eAAe,qBAAsB;AAC1D,cAAK,EAAE,gCAA0B;AAC7B,cAAE,eAAe;AACjB,0BAAc;AAAA,UAClB,OAAO;AAEH,gBAAK,oCAAqC;AACtC,kBAAK,EAAE,iCAAwB;AAC3B,kBAAE,eAAe;AACjB,6BAAa;AAAA,cAEjB,WAAY,EAAE,mCAAyB;AACnC,kBAAE,eAAe;AACjB,6BAAa;AAAA,cAEjB,WAAY,EAAE,6BAAsB;AAChC,kBAAE,eAAe;AACjB,kCAAkB;AAAA,cAEtB,WAAY,EAAE,iCAAwB;AAClC,kBAAE,eAAe;AACjB,oCAAoB;AAAA,cACxB;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,iBAAwB;AAC7B,YAAK,QAAQ,OAAO,GAAI;AACpB,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,oBAA2B;AAChC,YAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE,WAAW;AAEtC,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,sBAA6B;AAClC,YAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS;AAE/E,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AASA,eAAS,sBAAuB,YAAkB;AAC9C,YAAI,UAA0B,KAAK,iBAAkB,YAAY,CAAC,CAAoB;AACtF,gBAAQ,QAAQ,KAAK,iBAAkB,QAAQ,OAAO,CAAE;AACxD,gBAAQ,SAAS,KAAK,kBAAmB,QAAQ,QAAQ,IAAK;AAC9D,gBAAQ,YAAY,KAAK,kBAAmB,QAAQ,WAAW,KAAM;AACrE,gBAAQ,WAAW,KAAK,kBAAmB,QAAQ,UAAU,KAAM;AACnE,gBAAQ,aAAa,KAAK,kBAAmB,QAAQ,YAAY,KAAM;AACvE,gBAAQ,SAAS,KAAK,kBAAmB,QAAQ,QAAQ,KAAM;AAC/D,gBAAQ,2BAA2B,KAAK,kBAAmB,QAAQ,0BAA0B,KAAM;AACnG,gBAAQ,yBAAyB,KAAK,kBAAmB,QAAQ,wBAAwB,IAAK;AAC9F,gBAAQ,uBAAuB,KAAK,kBAAmB,QAAQ,sBAAsB,KAAM;AAC3F,gBAAQ,QAAQ,KAAK,iBAAkB,QAAQ,OAAO,eAAgB;AAEtE,kBAAU,4BAA6B,OAAQ;AAE/C,eAAO,mCAAoC,OAAQ;AAAA,MACvD;AAEA,eAAS,4BAA6B,SAA2C;AAC7E,gBAAQ,QAAQ,KAAK,iBAAkB,QAAQ,qBAAkB;AACjE,gBAAQ,cAAc,KAAK,iBAAkB,QAAQ,2BAAwB;AAC7E,gBAAQ,UAAU,KAAK,iBAAkB,QAAQ,uBAAoB;AAErE,eAAO;AAAA,MACX;AAEA,eAAS,mCAAoC,SAA2C;AACpF,gBAAQ,SAAS,KAAK,iBAAkB,QAAQ,QAAQ,CAAC,CAAY;AACrE,gBAAQ,OAAQ,UAAU,KAAK,mBAAoB,QAAQ,OAAQ,SAAS,IAAK;AACjF,gBAAQ,OAAQ,UAAU,KAAK,mBAAoB,QAAQ,OAAQ,SAAS,IAAK;AACjF,gBAAQ,OAAQ,UAAU,KAAK,mBAAoB,QAAQ,OAAQ,SAAS,IAAK;AACjF,gBAAQ,OAAQ,WAAW,KAAK,mBAAoB,QAAQ,OAAQ,UAAU,IAAK;AACnF,gBAAQ,OAAQ,SAAS,KAAK,mBAAoB,QAAQ,OAAQ,QAAQ,IAAK;AAC/E,gBAAQ,OAAQ,UAAU,KAAK,mBAAoB,QAAQ,OAAQ,SAAS,IAAK;AACjF,gBAAQ,OAAQ,YAAY,KAAK,mBAAoB,QAAQ,OAAQ,WAAW,IAAK;AACrF,gBAAQ,OAAQ,eAAe,KAAK,mBAAoB,QAAQ,OAAQ,cAAc,IAAK;AAE3F,eAAO;AAAA,MACX;AASA,eAAS,uBAAwB,oBAAyB,MAAsB;AAC5E,YAAK,GAAG,gBAAiB,eAAgB,GAAI;AACzC,0BAAgB,MAAO,MAAM,CAAC,EAAE,MAAM,KAAM,MAAM,CAAE,CAAE;AAAA,QAC1D;AAAA,MACJ;AASA,eAAS,0BAAoC;AACzC,YAAI,OAAgB;AAEpB,YAAK,eAAe,6BAA8B;AAC9C,gBAAM,MAAc,OAAO,SAAS;AACpC,gBAAM,eAAoB,uBAAwB,GAAI;AAEtD,cAAK,GAAG,QAAS,aAAa,SAAU,GAAI;AACxC,kBAAM,UAAkB,SAAU,aAAa,WAAW,EAAG;AAE7D,gBAAK,CAAC,MAAO,OAAQ,KAAK,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AAC9E,sBAAS,eAAgB,EAAE,WAAW;AAAA,YAC1C;AAAA,UACJ;AAEA,cAAK,GAAG,QAAS,aAAa,MAAO,GAAI;AACrC,mBAAO,aAAa,WAAW;AAAA,UACnC;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AAEA,eAAS,uBAAwB,KAAoB;AACjD,cAAM,eAAoB,CAAC;AAC3B,cAAM,eAAyB,IAAI,MAAO,GAAI;AAE9C,YAAK,aAAa,SAAS,GAAI;AAC3B,gBAAM,aAAuB,aAAc,CAAE,EAAE,MAAO,GAAI;AAC1D,gBAAM,mBAA2B,WAAW;AAE5C,mBAAU,kBAA0B,GAAG,kBAAkB,kBAAkB,mBAAoB;AAC3F,kBAAM,YAAsB,WAAY,eAAgB,EAAE,MAAO,GAAI;AAErE,yBAAc,UAAW,CAAE,CAAE,IAAI,UAAW,CAAE;AAAA,UAClD;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AASA,eAAS,oBAAqB,cAAmC;AAC7D,cAAM,SAAuB;AAAA,UACzB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACZ;AAEA,YAAI;AACA,cAAK,GAAG,cAAe,YAAa,GAAI;AACpC,mBAAO,SAAS,KAAK,MAAO,YAAa;AAAA,UAC7C;AAAA,QAEJ,SAAU,IAAU;AAChB,cAAI;AACA,mBAAO,SAAS,KAAM,MAAM,eAAe,GAAI;AAE/C,gBAAK,GAAG,gBAAiB,OAAO,MAAO,GAAI;AACvC,qBAAO,SAAS,OAAO,OAAO;AAAA,YAClC;AAAA,UAEJ,SAAU,IAAU;AAChB,gBAAK,CAAC,eAAe,UAAW;AAC5B,sBAAQ,MAAO,eAAe,gBAAiB,QAAS,eAAgB,GAAG,OAAQ,EAAE,QAAS,eAAgB,GAAG,OAAQ,CAAE;AAC3H,qBAAO,SAAS;AAAA,YACpB;AAEA,mBAAO,SAAS;AAAA,UACpB;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AASA,eAAS,sBAA6B;AAClC,YAAK,QAAQ,OAAO,GAAI;AACpB,wBAAe,KAAM;AAErB,kBAAS,eAAgB,EAAE,WAAW;AAAA,QAC1C;AAAA,MACJ;AASA,eAAS,0BAA2B,mBAAkC,CAAC,GAAW;AAC9E,yBAAiB,KAAK,iBAAkB,kBAAkB,CAAC,CAAmB;AAC9E,uBAAe,WAAW,KAAK,kBAAmB,eAAe,UAAU,IAAK;AAChF,uBAAe,kBAAkB,KAAK,wBAAyB,eAAe,iBAAiB,CAAE,GAAI,CAAE;AACvG,uBAAe,kBAAkB,KAAK,kBAAmB,eAAe,iBAAiB,IAAK;AAC9F,uBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,IAAK;AACtG,uBAAe,mBAAmB,KAAK,kBAAmB,eAAe,kBAAkB,IAAK;AAChG,uBAAe,8BAA8B,KAAK,kBAAmB,eAAe,6BAA6B,IAAK;AACtH,uBAAe,yBAAyB,KAAK,kBAAmB,eAAe,wBAAwB,KAAM;AAC7G,uBAAe,cAAc,KAAK,kBAAmB,eAAe,aAAa,IAAK;AACtF,uBAAe,qBAAqB,KAAK,kBAAmB,eAAe,oBAAoB,KAAM;AACrG,uBAAe,eAAe,KAAK,iBAAkB,eAAe,cAAc,GAAI;AACtF,uBAAe,0BAA0B,KAAK,kBAAmB,eAAe,yBAAyB,IAAK;AAC9G,uBAAe,uCAAuC,KAAK,kBAAmB,eAAe,sCAAsC,KAAM;AACzI,uBAAe,kBAAkB,KAAK,kBAAmB,eAAe,iBAAiB,KAAM;AAC/F,uBAAe,mBAAmB,KAAK,kBAAmB,eAAe,kBAAkB,KAAM;AACjG,uBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,KAAM;AACvG,uBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,KAAM;AAEvG,yCAAiC;AACjC,gDAAwC;AAAA,MAC5C;AAEA,eAAS,mCAA0C;AAC/C,uBAAe,iBAAiB,KAAK,oBAAqB,eAAe,gBAAgB,MAAO;AAChG,uBAAe,iBAAiB,KAAK,oBAAqB,eAAe,gBAAgB,MAAO;AAChG,uBAAe,mBAAmB,KAAK,oBAAqB,eAAe,kBAAkB,QAAS;AACtG,uBAAe,yBAAyB,KAAK,oBAAqB,eAAe,wBAAwB,OAAQ;AACjH,uBAAe,qBAAqB,KAAK,oBAAqB,eAAe,oBAAoB,mBAAoB;AACrH,uBAAe,kBAAkB,KAAK,oBAAqB,eAAe,iBAAiB,4CAA6C;AACxI,uBAAe,6BAA6B,KAAK,oBAAqB,eAAe,4BAA4B,2DAA4D;AAC7K,uBAAe,2BAA2B,KAAK,oBAAqB,eAAe,0BAA0B,gEAAiE;AAC9K,uBAAe,8BAA8B,KAAK,oBAAqB,eAAe,2CAAwC;AAAA,MAClI;AAEA,eAAS,0CAAiD;AACtD,uBAAe,yBAAyB,KAAK,mBAAoB,eAAe,wBAAwB,IAAK;AAAA,MACjH;AASA,YAAM,UAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOvB,OAAO,SAAW,wBAAyC;AACvD,cAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,8BAAkB,KAAK,iBAAkB,OAAO,eAAgB;AAEhE,gBAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,sBAAS,eAAgB,EAAE,WAAW;AAEtC,uCAAyB;AAAA,YAC7B;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,MAAM,SAAW,wBAAyC;AACtD,cAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,8BAAkB,KAAK,iBAAkB,OAAO,eAAgB;AAEhE,gBAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,kBAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,wBAAS,eAAgB,EAAE,WAAW;AAAA,cAC1C;AAEA,uCAAyB;AAAA,YAC7B;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,MAAM,WAAwB;AAC1B,cAAK,QAAQ,OAAO,GAAI;AACpB,0BAAc;AAAA,UAClB;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,QAAQ,WAAsB;AAC1B,iBAAO,GAAG,QAAS,eAAgB,KAAK,gBAAgB,MAAM,YAAY;AAAA,QAC9E;AAAA,QAEA,YAAY,WAAsB;AAC9B,iBAAO,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS;AAAA,QAC3F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,kBAAkB,WAAwB;AACtC,sBAAY;AAEZ,iBAAO;AAAA,QACX;AAAA,QAEA,SAAS,SAAW,SAAsB,SAAsC;AAC5E,cAAK,GAAG,cAAe,OAAQ,KAAK,GAAG,cAAe,OAAQ,GAAI;AAC9D,yBAAc,SAAS,sBAAuB,OAAQ,CAAE;AAExD,oBAAS,eAAgB,EAAE,KAAK,KAAK;AAErC,gCAAoB;AAAA,UACxB;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,SAAW,SAAmC;AACtD,cAAK,GAAG,cAAe,OAAQ,GAAI;AAC/B,gBAAI,UAAmB;AAEvB,qBAAU,SAAS,SAAU;AACzB,kBAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,yBAAU,SAAS,QAAS,KAAM,EAAE,MAAO;AACvC,sBAAK,QAAS,KAAM,EAAE,KAAK,eAAgB,KAAM,GAAI;AACjD,0BAAM,iBAAiC,QAAS,KAAM,EAAE,KAAM,KAAM;AAEpE,wBAAK,eAAe,aAAa,YAAY,SAAU;AACnD,6CAAwB,eAAe,OAAQ,cAAc,eAAe,aAAa,OAAQ;AAEjG,8BAAS,KAAM,EAAE,KAAK,OAAQ,QAAS,KAAM,EAAE,KAAK,QAAS,eAAe,KAAO,GAAG,CAAE;AAExF,6BAAO,QAAS,KAAM,EAAE,KAAM,eAAe,KAAO;AAEpD,8BAAS,KAAM,EAAE,KAAK,KAAK;AAE3B,gCAAU;AACV;AAAA,oBACJ;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAEA,gBAAK,CAAC,SAAU;AACZ,yBAAW,yBAA0B,SAAS,iBAAkB;AAAA,YACpE,OAAO;AACH,kCAAoB;AAAA,YACxB;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,SAAW,wBAAyC;AAC5D,8BAAoB;AAEpB,mBAAU,aAAa,SAAU;AAC7B,gBAAK,QAAQ,eAAgB,SAAU,GAAI;AACvC,kBAAK,CAAC,GAAG,cAAe,KAAM,KAAK,UAAU,WAAY;AACrD,yBAAU,SAAS,QAAS,SAAU,EAAE,MAAO;AAC3C,sBAAK,QAAS,SAAU,EAAE,KAAK,eAAgB,KAAM,GAAI;AACrD,0BAAM,iBAAiC,QAAS,SAAU,EAAE,KAAM,KAAM;AAExE,2CAAwB,eAAe,OAAQ,cAAc,eAAe,aAAa,OAAQ;AAAA,kBACrG;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAEA,cAAK,GAAG,cAAe,KAAM,GAAI;AAC7B,gBAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,qBAAO,QAAS,KAAM;AAAA,YAC1B;AAAA,UAEJ,OAAO;AACH,sBAAU,CAAC;AAAA,UACf;AAEA,cAAK,CAAC,GAAG,cAAe,KAAM,KAAK,UAAU,iBAAkB;AAC3D,8BAAmB,OAAQ;AAAA,UAC/B;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,WAAwB;AAChC,qBAAW,yBAA0B,SAAS,MAAM,iBAAkB;AAEtE,iBAAO;AAAA,QACX;AAAA,QAEA,kBAAkB,WAAwB;AACtC,kBAAS,eAAgB,EAAE,KAAK,QAAQ;AAExC,8BAAoB;AAEpB,iBAAO;AAAA,QACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,kBAAkB,SAAW,kBAAoC;AAC7D,cAAK,GAAG,cAAe,gBAAiB,GAAI;AACxC,gBAAI,0BAAmC;AACvC,kBAAM,2BAAgC;AAEtC,qBAAU,gBAAgB,kBAAmB;AACzC,kBAAK,iBAAiB,eAAgB,YAAa,KAAK,eAAe,eAAgB,YAAa,KAAK,yBAA0B,YAAa,MAAM,iBAAkB,YAAa,GAAI;AACrL,yCAA0B,YAAa,IAAI,iBAAkB,YAAa;AAC1E,0CAA0B;AAAA,cAC9B;AAAA,YACJ;AAEA,gBAAK,yBAA0B;AAC3B,wCAA2B,wBAAyB;AAAA,YACxD;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,YAAY,WAAoB;AAC5B,iBAAO;AAAA,QACX;AAAA,MACJ;AASA,OAAE,MAAM;AACJ,kCAA0B;AAE1B,iBAAS,iBAAkB,oBAAoB,MAAM;AACjD,4BAAkB;AAClB,mCAAyB;AACzB,uBAAa;AACb,wBAAc;AACd,sBAAY;AACZ,8BAAoB;AAEpB,cAAK,wBAAwB,GAAI;AAC7B,oBAAQ,KAAK;AAAA,UACjB;AAAA,QACJ,CAAE;AAEF,YAAK,CAAC,GAAG,QAAS,OAAO,QAAS,GAAI;AAClC,iBAAO,WAAW;AAAA,QACtB;AAAA,MACJ,GAAK;AAAA,IACT,GAAK;AAAA;AAAA","sourcesContent":["export const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView!.getComputedStyle! ) {\n value = document.defaultView!.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode!.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView!.getComputedStyle! ) {\n value = document.defaultView!.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode!.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js.map b/dist/journey.js.map index 850c22a..f17d4c6 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","import { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","import { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView!.getComputedStyle! ) {\n value = document.defaultView!.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode!.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView!.getComputedStyle! ) {\n value = document.defaultView!.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode!.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/src/ts/api.ts b/src/ts/api.ts index 6a2f364..70ef6ae 100644 --- a/src/ts/api.ts +++ b/src/ts/api.ts @@ -1,3 +1,16 @@ +/** + * Journey.js + * + * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps! + * + * @file journey.js + * @version v2.0.0 + * @author Bunoon + * @license MIT License + * @copyright Bunoon 2024 + */ + + import { type Configuration, type BindingOptions } from "./type"; diff --git a/src/ts/data.ts b/src/ts/data.ts index eaa2826..91e1094 100644 --- a/src/ts/data.ts +++ b/src/ts/data.ts @@ -1,3 +1,16 @@ +/** + * Journey.js + * + * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps! + * + * @file journey.js + * @version v2.0.0 + * @author Bunoon + * @license MIT License + * @copyright Bunoon 2024 + */ + + import { Char } from "./enum"; import { Is } from "./is"; diff --git a/src/ts/dom.ts b/src/ts/dom.ts index e3038d9..67c6485 100644 --- a/src/ts/dom.ts +++ b/src/ts/dom.ts @@ -1,3 +1,16 @@ +/** + * Journey.js + * + * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps! + * + * @file journey.js + * @version v2.0.0 + * @author Bunoon + * @license MIT License + * @copyright Bunoon 2024 + */ + + import { Char } from "./enum"; import { Is } from "./is"; import { type Position } from "./type"; diff --git a/src/ts/enum.ts b/src/ts/enum.ts index 2f4d2c9..cf5a117 100644 --- a/src/ts/enum.ts +++ b/src/ts/enum.ts @@ -1,3 +1,16 @@ +/** + * Journey.js + * + * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps! + * + * @file journey.js + * @version v2.0.0 + * @author Bunoon + * @license MIT License + * @copyright Bunoon 2024 + */ + + export const enum Char { empty = "", space = " ", diff --git a/src/ts/is.ts b/src/ts/is.ts index 3c57fac..d59e62f 100644 --- a/src/ts/is.ts +++ b/src/ts/is.ts @@ -1,3 +1,16 @@ +/** + * Journey.js + * + * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps! + * + * @file journey.js + * @version v2.0.0 + * @author Bunoon + * @license MIT License + * @copyright Bunoon 2024 + */ + + import { Char } from "./enum"; diff --git a/src/ts/type.ts b/src/ts/type.ts index 708ed6b..ed54804 100644 --- a/src/ts/type.ts +++ b/src/ts/type.ts @@ -1,3 +1,16 @@ +/** + * Journey.js + * + * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps! + * + * @file journey.js + * @version v2.0.0 + * @author Bunoon + * @license MIT License + * @copyright Bunoon 2024 + */ + + export type Position = { left: number; top: number; From 1f84dc22e4998cfb0503fbe78d3a2eaf38be61c8 Mon Sep 17 00:00:00 2001 From: William Troup Date: Fri, 5 Jul 2024 11:29:25 +0100 Subject: [PATCH 44/44] Removed deprecated methods. --- dist/journey.esm.js | 4 ++-- dist/journey.esm.js.map | 2 +- dist/journey.js | 4 ++-- dist/journey.js.map | 2 +- dist/journey.min.js | 2 +- src/ts/dom.ts | 6 +++--- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/dist/journey.esm.js b/dist/journey.esm.js index ce3b262..31e2207 100644 --- a/dist/journey.esm.js +++ b/dist/journey.esm.js @@ -155,8 +155,8 @@ var init_dom = __esm({ function n() { const e = document.documentElement; const t = { - left: (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0), - top: (window.pageYOffset || e.scrollTop) - (e.clientTop || 0) + left: e.scrollLeft - (e.clientLeft || 0), + top: e.scrollTop - (e.clientTop || 0) }; return t; } diff --git a/dist/journey.esm.js.map b/dist/journey.esm.js.map index bbf7ec0..8ad4398 100644 --- a/dist/journey.esm.js.map +++ b/dist/journey.esm.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":";;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAaiB;AAbjB;AAAA;AAAA;AAaO,MAAUA,eAAV;AACI,MAAMA,WAAA,4BAA4B;AAAA,OAD5B;AAAA;AAAA;;;ACbjB,IAgBiB;AAhBjB;AAAA;AAAA;AAaA;AAGO,MAAUC,QAAV;AACI,eAAS,QAAS,OAAuB;AAC5C,eAAO,UAAU,QAAQ,UAAU,UAAa;AAAA,MACpD;AAFO,MAAAA,IAAS;AAIT,eAAS,cAAe,QAAwB;AACnD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,eAAgB,QAAwB;AACpD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,cAAe,QAAwB;AACnD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,gBAAiB,QAAwB;AACrD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,cAAe,QAAwB;AACnD,eAAO,QAAS,MAAO,KAAK,OAAO,WAAW;AAAA,MAClD;AAFO,MAAAA,IAAS;AAIT,eAAS,aAAc,QAAwB;AAClD,eAAO,cAAe,MAAO,KAAK,kBAAkB;AAAA,MACxD;AAFO,MAAAA,IAAS;AAAA,OAzBH;AAAA;AAAA;;;AChBjB,IAiBiB;AAjBjB;AAAA;AAAA;AAaA;AACA;AAGO,MAAUC,UAAV;AACI,eAAS,oBAAqB,OAAY,cAAgC;AAC7E,eAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,iBAAkB,OAAY,cAAgC;AAC1E,eAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,kBAAmB,OAAY,cAAkC;AAC7E,eAAO,GAAG,eAAgB,KAAM,IAAI,QAAQ;AAAA,MAChD;AAFO,MAAAA,MAAS;AAIT,eAAS,iBAAkB,OAAY,cAAgC;AAC1E,eAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,mBAAoB,OAAY,cAA0B;AACtE,eAAO,GAAG,gBAAiB,KAAM,IAAI,QAAQ;AAAA,MACjD;AAFO,MAAAA,MAAS;AAIT,eAAS,iBAAkB,OAAY,cAA0B;AACpE,eAAO,GAAG,cAAe,KAAM,IAAI,QAAQ;AAAA,MAC/C;AAFO,MAAAA,MAAS;AAIT,eAAS,gBAAiB,OAAY,cAA8B;AACvE,eAAO,GAAG,aAAc,KAAM,IAAI,QAAQ;AAAA,MAC9C;AAFO,MAAAA,MAAS;AAIT,eAAS,wBAAyB,OAAY,cAA8B;AAC/E,YAAIC,UAAgB;AAEpB,YAAK,GAAG,cAAe,KAAM,GAAI;AAC7B,gBAAM,SAAmB,MAAM,SAAS,EAAE,qBAAkB;AAE5D,cAAK,OAAO,WAAW,GAAI;AACvB,oBAAQ;AAAA,UACZ,OAAO;AACH,YAAAA,UAAS;AAAA,UACb;AAAA,QAEJ,OAAO;AACH,UAAAA,UAAS,gBAAiB,OAAO,YAAa;AAAA,QAClD;AAEA,eAAOA;AAAA,MACX;AAjBO,MAAAD,MAAS;AAAA,OA7BH;AAAA;AAAA;;;ACjBjB,IAkBiB;AAlBjB;AAAA;AAAA;AAaA;AACA;AAIO,MAAUE,gBAAV;AACI,eAAS,OAAQ,MAAc,4BAA+C;AACjF,cAAM,WAAmB,KAAK,YAAY;AAC1C,cAAM,SAAkB,aAAa;AAErC,YAAID,UAAc,SAAS,SAAS,6BAA2B,IAAI,SAAS,cAAe,QAAS;AAEpG,YAAK,GAAG,QAAS,SAAU,GAAI;AAC3B,UAAAA,QAAO,YAAY;AAAA,QACvB;AAEA,eAAOA;AAAA,MACX;AAXO,MAAAC,YAAS;AAaT,eAAS,UAAW,SAAkC;AACzD,cAAMD,UAAmB;AAAA,UACrB,MAAM;AAAA,UACN,KAAK;AAAA,QACT;AAEA,eAAQ,WAAW,CAAC,MAAO,QAAQ,UAAW,KAAK,CAAC,MAAO,QAAQ,SAAU,GAAI;AAC7E,UAAAA,QAAO,QAAQ,QAAQ,aAAa,QAAQ;AAC5C,UAAAA,QAAO,OAAO,QAAQ,YAAY,QAAQ;AAE1C,oBAAU,QAAQ;AAAA,QACtB;AAEA,eAAOA;AAAA,MACX;AAdO,MAAAC,YAAS;AAgBT,eAAS,oBAA+B;AAC3C,cAAM,MAAmB,SAAS;AAElC,cAAMD,UAAmB;AAAA,UACrB,OAAQ,OAAO,eAAe,IAAI,eAAkB,IAAI,cAAc;AAAA,UACtE,MAAO,OAAO,eAAe,IAAI,cAAgB,IAAI,aAAa;AAAA,QACtE;AAEA,eAAOA;AAAA,MACX;AATO,MAAAC,YAAS;AAWT,eAAS,oBAAqB,SAAc,mBAAkC;AACjF,YAAI,QAAa;AAEjB,YAAK,SAAS,YAAa,kBAAoB;AAC3C,kBAAQ,SAAS,YAAa,iBAAkB,SAAS,IAAK,EAAE,iBAAkB,iBAAkB;AAAA,QACxG,WAAY,QAAQ,cAAe;AAC/B,kBAAQ,QAAQ,aAAc,iBAAkB;AAAA,QACpD;AAEA,eAAO;AAAA,MACX;AAVO,MAAAA,YAAS;AAYT,eAAS,QAAS,QAAqB,MAA2B;AACrE,YAAI;AACA,cAAK,CAAC,OAAO,SAAU,IAAK,GAAI;AAC5B,mBAAO,YAAa,IAAK;AAAA,UAC7B;AAAA,QACJ,SAAU,GAAS;AACf,kBAAQ,KAAM,EAAE,OAAQ;AAAA,QAC5B;AAAA,MACJ;AARO,MAAAA,YAAS;AAUT,eAAS,WAAY,QAAqB,MAA2B;AACxE,YAAI;AACA,cAAK,OAAO,SAAU,IAAK,GAAI;AAC3B,mBAAO,YAAa,IAAK;AAAA,UAC7B;AAAA,QACJ,SAAU,GAAS;AACf,kBAAQ,KAAM,EAAE,OAAQ;AAAA,QAC5B;AAAA,MACJ;AARO,MAAAA,YAAS;AAUT,eAAS,aAAc,GAAgB;AAC1C,UAAE,eAAe;AACjB,UAAE,eAAe;AAAA,MACrB;AAHO,MAAAA,YAAS;AAKT,eAAS,2BAA4B,GAAe,SAA8B;AACrF,YAAI,OAAe,EAAE;AACrB,YAAI,MAAc,EAAE;AACpB,cAAM,iBAA2B,kBAAkB;AAEnD,gBAAQ,MAAM,UAAU;AAExB,YAAK,OAAO,QAAQ,cAAc,OAAO,YAAa;AAClD,kBAAQ,QAAQ;AAAA,QACpB,OAAO;AACH;AAAA,QACJ;AAEA,YAAK,MAAM,QAAQ,eAAe,OAAO,aAAc;AACnD,iBAAO,QAAQ;AAAA,QACnB,OAAO;AACH;AAAA,QACJ;AAEA,YAAK,OAAO,eAAe,MAAO;AAC9B,iBAAO,EAAE,QAAQ;AAAA,QACrB;AAEA,YAAK,MAAM,eAAe,KAAM;AAC5B,gBAAM,EAAE,QAAQ;AAAA,QACpB;AAEA,gBAAQ,MAAM,OAAO,OAAO;AAC5B,gBAAQ,MAAM,MAAM,MAAM;AAAA,MAC9B;AA7BO,MAAAA,YAAS;AA+BT,eAAS,4BAA6B,SAAsB,WAA4B;AAC3F,YAAK,WAAY;AACb,cAAK,QAAQ,MAAM,YAAY,SAAU;AACrC,oBAAQ,MAAM,UAAU;AAAA,UAC5B;AAAA,QAEJ,OAAO;AACH,cAAK,QAAQ,MAAM,YAAY,QAAS;AACpC,oBAAQ,MAAM,UAAU;AAAA,UAC5B;AAAA,QACJ;AAAA,MACJ;AAXO,MAAAA,YAAS;AAaT,eAAS,eAAgB,WAAwB,WAAuC;AAC3F,cAAM,gBAA6B,OAAQ,KAAM;AACjD,cAAM,QAAqB,OAAQ,SAAS,UAAW;AACvD,cAAM,QAA0B,OAAQ,OAAQ;AAEhD,kBAAU,YAAa,aAAc;AACrC,sBAAc,YAAa,KAAM;AACjC,cAAM,YAAa,KAAM;AAEzB,cAAM,OAAO;AAEb,cAAM,YAAyB,OAAQ,QAAQ,YAAa;AAC5D,cAAM,OAAoB,OAAQ,QAAQ,MAAO;AAEjD,aAAK,YAAY;AAEjB,cAAM,YAAa,SAAU;AAC7B,cAAM,YAAa,IAAK;AAExB,eAAO;AAAA,MACX;AApBO,MAAAA,YAAS;AAsBT,eAAS,yBAA0B,WAAwB,WAA2B;AACzF,YAAI,WAAsC,UAAU,uBAAwB,SAAU;AAEtF,eAAQ,SAAU,CAAE,GAAI;AACpB,mBAAU,CAAE,EAAE,WAAY,YAAa,SAAU,CAAE,CAAE;AAAA,QACzD;AAAA,MACJ;AANO,MAAAA,YAAS;AAAA,OAhJH;AAAA;AAAA;;;AClBjB;AAAA;AAoBA;AACA;AAEA;AACA;AACA;AAeA,KAAE,MAAM;AAEJ,UAAI,iBAAgC,CAAC;AAGrC,UAAI,qCAA8C;AAGlD,YAAM,kBAA0B;AAChC,UAAI,kBAA0B;AAC9B,UAAI,UAAkB,CAAC;AAGvB,UAAI;AAGJ,UAAI;AAGJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAI,yBAAkC;AAGtC,UAAI,kCAA0C;AAC9C,UAAI,kCAA0C;AAC9C,UAAI,gCAAyC;AAC7C,UAAI,yBAAiC;AACrC,UAAI,yBAAiC;AAGrC,UAAI;AACJ,UAAI,yBAAiC;AASrC,eAAS,kBAAmB,SAAc,MAAc;AACpD,kBAAU,KAAK,iBAAkB,QAAQ,CAAC,CAAY;AAEtD,gBAAS,eAAgB,IAAI;AAAA,UACzB,MAAM,CAAC;AAAA,UACP,MAAM,CAAC;AAAA,UACP,UAAU;AAAA,QACd;AAAA,MACJ;AAEA,eAAS,cAAe,OAAuB;AAC3C,YAAK,CAAC,QAAQ,eAAgB,KAAM,GAAI;AACpC,kBAAS,KAAM,IAAI;AAAA,YACf,MAAM,CAAC;AAAA,YACP,MAAM,CAAC;AAAA,YACP,UAAU;AAAA,UACd;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,yBAA0C;AAC/C,eAAO,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,KAAM,QAAS,eAAgB,EAAE,QAAS,CAAE;AAAA,MACnH;AASA,eAAS,2BAAkC;AACvC,uCAA+B,WAAW,OAAQ,OAAO,gCAAiC;AAE1F,qCAA6B,UAAU,MAAM;AACzC,cAAK,eAAe,sCAAuC;AACvD,0BAAc;AAAA,UAClB;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,yBAAgC;AACrC,mBAAW,QAAS,SAAS,MAAM,4BAA6B;AAAA,MACpE;AAEA,eAAS,yBAAgC;AACrC,mBAAW,WAAY,SAAS,MAAM,4BAA6B;AAAA,MACvE;AASA,eAAS,eAAsB;AAC3B,0BAAkB,WAAW,OAAQ,OAAO,mBAAoB;AAChE,wBAAgB,MAAM,UAAU;AAChC,iBAAS,KAAK,YAAa,eAAgB;AAE3C,uCAA+B,WAAW,OAAQ,UAAU,OAAQ;AACpE,wBAAgB,YAAa,4BAA6B;AAE1D,qCAA6B,UAAU,MAAM;AACzC,wBAAc;AAAA,QAClB;AAEA,mBAAY,8BAA8B,eAAe,sBAAwB;AAEjF,gCAAwB,WAAW,OAAQ,OAAO,OAAQ;AAC1D,wBAAgB,YAAa,qBAAsB;AAEnD,sCAA8B,WAAW,OAAQ,OAAO,aAAc;AACtE,wBAAgB,YAAa,2BAA4B;AAEzD,6CAAqC,WAAW,OAAQ,OAAO,oBAAqB;AACpF,wBAAgB,YAAa,kCAAmC;AAEhE,yCAAiC,WAAW,eAAgB,oCAAoC,eAAe,kBAAoB;AAEnI,uCAA+B,WAAW,MAAM;AAC5C,cAAK,eAAe,oBAAqB;AACrC,mCAAwB,eAAe,wBAAwB,+BAA+B,OAAQ;AAAA,UAC1G;AAAA,QACJ;AAEA,uCAA+B,WAAW,OAAQ,OAAO,eAAgB;AACzE,wBAAgB,YAAa,4BAA6B;AAE1D,sCAA8B,WAAW,OAAQ,OAAO,cAAe;AACvE,wBAAgB,YAAa,2BAA4B;AAEzD,iDAAyC,WAAW,OAAQ,OAAO,yBAA0B;AAC7F,oCAA4B,YAAa,sCAAuC;AAEhF,sDAA8C,WAAW,OAAQ,KAAK,8BAA+B;AACrG,+CAAuC,YAAa,2CAA4C;AAEhG,kCAA0B,WAAW,OAAQ,OAAO,SAAU;AAC9D,wBAAgB,YAAa,uBAAwB;AAErD,8CAAsC,WAAW,OAAQ,UAAU,MAAO;AAC1E,4CAAoC,UAAU;AAC9C,gCAAwB,YAAa,mCAAoC;AAEzE,8CAAsC,WAAW,OAAQ,UAAU,MAAO;AAC1E,4CAAoC,UAAU;AAC9C,gCAAwB,YAAa,mCAAoC;AAEzE,0BAAkB;AAAA,MACtB;AAEA,eAAS,cAAe,sBAA+B,MAAc;AACjE,YAAI,YAAqB;AAEzB,YAAK,GAAG,cAAe,eAAe,2BAA4B,KAAK,qBAAsB;AACzF,sBAAY,QAAS,eAAe,2BAA4B;AAAA,QACpE,OAAO;AACH,sBAAY;AAAA,QAChB;AAEA,YAAK,WAAY;AACb,gBAAM,iBAAiC,uBAAuB;AAE9D,cAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,mCAAwB,eAAe,OAAQ,SAAU,eAAe,aAAa,OAAQ;AAAA,UACjG;AAEA,0CAAiC,KAAM;AACvC,iCAAuB;AACvB,sBAAY;AAEZ,0BAAgB,MAAM,UAAU;AAAA,QACpC;AAAA,MACJ;AAEA,eAAS,eAAsB;AAC3B,YAAK,QAAS,eAAgB,EAAE,WAAW,GAAI;AAC3C,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE;AAE3B,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,eAAsB;AAC3B,YAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,gBAAM,iBAAiC,uBAAuB;AAE9D,wBAAe,KAAM;AACrB,iCAAwB,eAAe,OAAQ,UAAU,eAAe,aAAa,OAAQ;AAAA,QAEjG,OAAO;AACH,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE;AAE3B,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,2BAAkC;AACvC,cAAM,iBAAiC,uBAAuB;AAE9D,YAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,cAAK,eAAe,wBAAyB;AACzC,mCAAuB;AAAA,UAC3B,OAAO;AACH,mCAAuB;AAAA,UAC3B;AAEA,sBAAY;AAEZ,uCAA6B,MAAM,UAAU,eAAe,kBAAkB,UAAS;AACvF,+CAAqC;AAErC,yBAAe,aAAa,QAAQ,+BAA0B;AAE9D,cAAK,eAAe,kBAAmB;AACnC,2BAAe,aAAa,QAAQ,eAAe;AAAA,UACvD;AAEA,gBAAM,oBAA4B,WAAW,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAElH,cAAK,wCAAoC,kBAAkB,YAAY,MAAM,UAAW;AACpF,mDAAuC;AACvC,2BAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,UACzD;AAEA,qBAAW,4BAA6B,oCAAoC,eAAe,kBAA8B;AACzH,qBAAW,4BAA6B,8BAA8B,eAAe,oBAA+B,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AAC/J,qBAAW,4BAA6B,6BAA6B,eAAe,mBAA8B,QAAS,eAAgB,EAAE,KAAK,SAAS,CAAE;AAC7J,qBAAW,4BAA6B,6CAA6C,eAAe,mBAA+B;AACnI,qBAAW,4BAA6B,yBAAyB,eAAe,WAAuB;AAEvG,8CAAoC,YAAY,eAAe;AAC/D,8CAAoC,WAAW,QAAS,eAAgB,EAAE,aAAa;AAEvF,cAAK,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACrF,gDAAoC,YAAY,eAAe;AAAA,UACnE,OAAO;AACH,gDAAoC,YAAY,eAAe;AAAA,UACnE;AAEA,wBAAe,cAAe;AAC9B,4BAAmB,MAAM,cAAe;AACxC,2BAAiB;AACjB,iCAAuB;AACvB,iCAAwB,eAAe,OAAQ,SAAS,eAAe,aAAa,OAAQ;AAE5F,cAAK,eAAe,WAAY;AAC5B,2BAAe,aAAa,QAAQ,MAAM;AAAA,UAC9C;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,cAAe,gBAAwC;AAC5D,YAAK,GAAG,cAAe,eAAe,KAAM,GAAI;AAC5C,gCAAsB,YAAY,eAAe;AAAA,QACrD,OAAO;AACH,gCAAsB;AAAA,QAC1B;AAEA,YAAK,GAAG,cAAe,eAAe,WAAY,GAAI;AAClD,sCAA4B,YAAY,eAAe;AAAA,QAC3D,OAAO;AACH,sCAA4B;AAAA,QAChC;AAAA,MACJ;AAEA,eAAS,kBAAmB,GAAQ,gBAAwC;AACxE,YAAK,gBAAgB,MAAM,YAAY,SAAU;AAC7C,0BAAgB,MAAM,UAAU;AAEhC,iCAAwB,eAAe,OAAQ,QAAQ,eAAe,aAAa,OAAQ;AAAA,QAC/F;AAEA,YAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,iCAAwB,eAAe,OAAQ,SAAS,eAAe,aAAa,OAAQ;AAAA,QAChG;AAEA,iCAAyB,eAAe,WAAW;AAEnD,YAAK,eAAe,UAAU,eAAe,QAAS;AAClD,cAAK,eAAe,UAAU,eAAe,0BAA2B;AACpE,uBAAW,2BAA4B,GAAG,eAAgB;AAAA,UAE9D,OAAO;AACH,kBAAM,SAAmB,WAAW,UAAW,eAAe,aAAa,OAAQ;AACnF,gBAAI,MAAgB,OAAO,MAAQ,eAAe,aAAa,QAAQ;AACvE,gBAAI,OAAiB,OAAO;AAE5B,gBAAK,OAAO,gBAAgB,cAAc,OAAO,cAAc,eAAe,YAAa;AACvF,sBAAS,gBAAgB;AACzB,sBAAQ,eAAe,aAAa,QAAQ;AAAA,YAChD;AAEA,gBAAK,MAAM,gBAAgB,eAAe,OAAO,eAAe,eAAe,UAAW;AACtF,qBAAS,gBAAgB,eAAe,eAAe,aAAa,QAAQ;AAAA,YAChF;AAEA,4BAAgB,MAAM,MAAM,MAAM;AAClC,4BAAgB,MAAM,OAAO,OAAO;AAAA,UACxC;AAAA,QAEJ,OAAO;AACH,gBAAM,iBAA2B,WAAW,kBAAkB;AAC9D,gBAAM,aAAqB,KAAK,IAAK,IAAO,OAAO,aAAa,gBAAgB,eAAgB,IAAM,eAAe,IAAK;AAC1H,gBAAM,YAAoB,KAAK,IAAK,IAAO,OAAO,cAAc,gBAAgB,gBAAiB,IAAM,eAAe,GAAI;AAE1H,0BAAgB,MAAM,OAAO,aAAa;AAC1C,0BAAgB,MAAM,MAAM,YAAY;AAAA,QAC5C;AAAA,MACJ;AAEA,eAAS,gCAAiC,oBAA6B,MAAc;AACjF,cAAM,iBAAiC,uBAAuB;AAE9D,YAAK,GAAG,QAAS,cAAe,KAAK,GAAG,QAAS,eAAe,aAAa,OAAQ,GAAI;AACrF,yBAAe,aAAa,QAAQ,YAAY,eAAe,aAAa,QAAQ,UAAU,0BAAsB,0CAAuC;AAE3J,cAAK,GAAG,QAAS,oCAAqC,GAAI;AACtD,2BAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,UACzD;AAEA,cAAK,mBAAoB;AACrB,mCAAwB,eAAe,OAAQ,SAAS,eAAe,aAAa,OAAQ;AAAA,UAChG;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,mBAA0B;AAC/B,qCAA6B;AAE7B,YAAK,eAAe,kBAAmB;AACnC,gBAAM,aAAqB,QAAS,eAAgB,EAAE,KAAK;AAE3D,mBAAU,WAAmB,GAAG,WAAW,YAAY,YAAa;AAChE,6BAAkB,UAAU,QAAS,eAAgB,EAAE,KAAM,QAAS,CAAE;AAAA,UAC5E;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,iBAAkB,UAAkB,OAAuB;AAChE,cAAM,iBAAiC,QAAS,eAAgB,EAAE,KAAM,KAAM;AAC9E,YAAI;AAEJ,YAAK,aAAa,QAAS,eAAgB,EAAE,UAAW;AACpD,gBAAM,WAAW,OAAQ,OAAO,YAAa;AAAA,QACjD,OAAO;AAEH,gBAAM,WAAW,OAAQ,OAAO,KAAM;AAEtC,cAAI,UAAU,MAAM;AAChB,4CAAgC;AAEhC,oBAAS,eAAgB,EAAE,WAAW;AAEtC,qCAAyB;AAAA,UAC7B;AAAA,QACJ;AAEA,qCAA6B,YAAa,GAAI;AAE9C,YAAK,eAAe,yBAA0B;AAC1C,cAAK,GAAG,cAAe,eAAe,OAAQ,GAAI;AAC9C,uBAAY,KAAK,eAAe,OAAS;AAAA,UAC7C,OAAO;AACH,uBAAY,KAAK,eAAe,KAAO;AAAA,UAC3C;AAAA,QACJ;AAEA,YAAK,eAAe,wBAAyB;AACzC,cAAI,aAAa;AACjB,cAAI,aAAc,WAAW,GAAI,SAAS;AAAA,QAC9C;AAAA,MACJ;AAEA,eAAS,yBAAgC;AACrC,YAAK,eAAe,iBAAkB;AAClC,gBAAM,iBAAyB,4BAA4B,cAAc,QAAS,eAAgB,EAAE,KAAK;AACzG,gBAAM,SAAkB,QAAS,eAAgB,EAAE,WAAW,KAAM;AACpE,gBAAM,qBAA6B,KAAK,MAAU,QAAS,eAAgB,EAAE,WAAW,KAAM,QAAS,eAAgB,EAAE,KAAK,SAAW,GAAI;AAE7I,iDAAuC,MAAM,QAAQ,QAAQ;AAC7D,sDAA4C,YAAY,qBAAqB;AAAA,QACjF;AAAA,MACJ;AASA,eAAS,oBAA2B;AAChC,8BAAsB,cAAc;AACpC,8BAAsB,YAAY;AAClC,8BAAsB,gBAAgB;AAEtC,iBAAS,KAAK,iBAAkB,aAAa,uBAAwB;AACrE,iBAAS,KAAK,iBAAkB,cAAc,wBAAyB;AAAA,MAC3E;AAEA,eAAS,wBAAyB,GAAuB;AACrD,YAAK,CAAC,iCAAiC,CAAC,0BAA0B,eAAe,qBAAsB;AACnG,0BAAgB,aAAa;AAC7B,0CAAgC;AAChC,mCAAyB,EAAE,QAAQ,gBAAgB;AACnD,mCAAyB,EAAE,QAAQ,gBAAgB;AACnD,4CAAkC,gBAAgB;AAClD,4CAAkC,gBAAgB;AAAA,QACtD;AAAA,MACJ;AAEA,eAAS,wBAA+B;AACpC,YAAK,+BAAgC;AACjC,0CAAgC;AAChC,4CAAkC;AAClC,4CAAkC;AAClC,0BAAgB,YAAY;AAAA,QAChC;AAAA,MACJ;AAEA,eAAS,wBAAyB,GAAuB;AACrD,YAAK,+BAAgC;AACjC,0BAAgB,MAAM,OAAS,EAAE,QAAQ,yBAA2B;AACpE,0BAAgB,MAAM,MAAQ,EAAE,QAAQ,yBAA2B;AAAA,QACvE;AAAA,MACJ;AAEA,eAAS,2BAAkC;AACvC,YAAK,+BAAgC;AACjC,0BAAgB,MAAM,OAAO,kCAAkC;AAC/D,0BAAgB,MAAM,MAAM,kCAAkC;AAE9D,0CAAgC;AAChC,4CAAkC;AAClC,4CAAkC;AAClC,0BAAgB,YAAY;AAAA,QAChC;AAAA,MACJ;AASA,eAAS,gBAAuB;AAC5B,YAAK,CAAC,GAAG,QAAS,gBAAiB,GAAI;AACnC,6BAAmB,WAAW,OAAQ,OAAO,oBAAqB;AAClE,2BAAiB,MAAM,UAAU;AAEjC,mBAAS,KAAK,YAAa,gBAAiB;AAE5C,mBAAS,KAAK,iBAAkB,aAAa,MAAM;AAC/C,wBAAY;AAAA,UAChB,CAAE;AAEF,mBAAS,iBAAkB,UAAU,MAAM;AACvC,wBAAY;AAAA,UAChB,CAAE;AAAA,QACN;AAAA,MACJ;AAEA,eAAS,WAAY,SAAsB,MAAsB;AAC7D,YAAK,YAAY,MAAO;AACpB,kBAAQ,cAAc,CAAE,MAAmB;AACvC,wBAAa,GAAG,IAAK;AAAA,UACzB;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,YAAa,GAAQ,MAAsB;AAChD,mBAAW,aAAc,CAAE;AAC3B,oBAAY;AAEZ,iCAAyB,WAAY,MAAM;AACvC,2BAAiB,YAAY;AAC7B,2BAAiB,MAAM,UAAU;AAEjC,qBAAW,2BAA4B,GAAG,gBAAiB;AAAA,QAC/D,GAAG,eAAe,YAAa;AAAA,MACnC;AAEA,eAAS,cAAqB;AAC1B,YAAK,GAAG,QAAS,gBAAiB,GAAI;AAClC,cAAK,2BAA2B,GAAI;AAChC,yBAAc,sBAAuB;AACrC,qCAAyB;AAAA,UAC7B;AAEA,cAAK,iBAAiB,MAAM,YAAY,SAAU;AAC9C,6BAAiB,MAAM,UAAU;AAAA,UACrC;AAAA,QACJ;AAAA,MACJ;AASA,eAAS,cAAqB;AAC1B,cAAM,WAAqB,eAAe;AAC1C,cAAM,iBAAyB,SAAS;AAExC,iBAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,gBAAM,cAAyC,SAAS,qBAAsB,SAAU,YAAa,CAAE;AACvG,gBAAM,WAA0B,CAAC,EAAE,MAAM,KAAM,WAAY;AAC3D,gBAAM,iBAAyB,SAAS;AAExC,mBAAU,eAAuB,GAAG,eAAe,gBAAgB,gBAAiB;AAChF,gBAAK,CAAC,WAAY,SAAU,YAAa,CAAE,GAAI;AAC3C;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAEA,gBAAS,eAAgB,EAAE,KAAK,KAAK;AAAA,MACzC;AAEA,eAAS,WAAY,SAAiC;AAClD,YAAID,UAAkB;AAEtB,YAAK,GAAG,QAAS,OAAQ,KAAK,QAAQ,aAAc,UAAU,yBAA0B,GAAI;AACxF,gBAAM,qBAA6B,QAAQ,aAAc,UAAU,yBAA0B;AAE7F,cAAK,GAAG,cAAe,kBAAmB,GAAI;AAC1C,kBAAM,iBAA+B,oBAAqB,kBAAmB;AAE7E,gBAAK,eAAe,UAAU,GAAG,cAAe,eAAe,MAAO,GAAI;AACtE,2BAAc,SAAS,sBAAuB,eAAe,MAAO,CAAE;AAAA,YAE1E,OAAO;AACH,kBAAK,CAAC,eAAe,UAAW;AAC5B,wBAAQ,MAAO,eAAe,2BAA4B,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC/H,gBAAAA,UAAS;AAAA,cACb;AAAA,YACJ;AAAA,UAEJ,OAAO;AACH,gBAAK,CAAC,eAAe,UAAW;AAC5B,sBAAQ,MAAO,eAAe,yBAA0B,QAAS,sBAAsB,UAAU,yBAA0B,CAAE;AAC7H,cAAAA,UAAS;AAAA,YACb;AAAA,UACJ;AAAA,QACJ;AAEA,eAAOA;AAAA,MACX;AAEA,eAAS,aAAc,SAAsB,gBAAwC;AACjF,uBAAe,eAAe,CAAC;AAC/B,uBAAe,aAAa,UAAU;AAEtC,YAAK,GAAG,cAAe,eAAe,KAAM,MAAO,GAAG,cAAe,eAAe,KAAM,KAAK,GAAG,cAAe,eAAe,WAAY,IAAM;AAC9I,kBAAQ,gBAAiB,UAAU,yBAA0B;AAE7D,cAAK,CAAC,eAAe,QAAS;AAC1B,0BAAe,eAAe,KAAO;AAErC,oBAAS,eAAe,KAAO,EAAE,KAAM,eAAe,KAAO,IAAI;AACjE,oBAAS,eAAe,KAAO,EAAE,KAAK,KAAM,eAAe,KAAO;AAElE,mCAAwB,eAAe,OAAQ,WAAW,OAAQ;AAAA,UAEtE,OAAO;AACH,uBAAY,cAAe;AAAA,UAC/B;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,WAAY,gBAAwC;AACzD,cAAM,gBAAwB,WAAW,oBAAqB,eAAe,aAAa,SAAS,UAAW;AAE9G,YAAK,oCAAgC,cAAc,YAAY,MAAM,UAAW;AAC5E,yBAAe,aAAa,QAAQ,MAAM,WAAW;AAAA,QACzD;AAEA,cAAM,OAAoB,WAAW,OAAQ,OAAO,iBAAkB;AACtE,uBAAe,aAAa,QAAQ,YAAa,IAAK;AAEtD,aAAK,UAAU,CAAE,MAAmB;AAChC,qBAAW,aAAc,CAAE;AAE3B,6CAAmC,MAAM,UAAU;AACnD,uCAA6B,MAAM,UAAU;AAC7C,sCAA4B,MAAM,UAAU;AAC5C,kCAAwB,MAAM,UAAU;AACxC,+CAAqC;AAErC,wBAAe,cAAe;AAC9B,4BAAmB,GAAG,cAAe;AAErC,cAAK,eAAe,sBAAuB;AACvC,uBAAW,yBAA0B,eAAe,aAAa,SAAS,iBAAkB;AAAA,UAChG;AAAA,QACJ;AAAA,MACJ;AASA,eAAS,oBAAqB,YAAqB,MAAc;AAC7D,cAAM,eAAyB,YAAY,SAAS,mBAAmB,SAAS;AAChF,cAAM,aAAuB,YAAY,OAAO,mBAAmB,OAAO;AAE1E,YAAK,eAAe,qBAAsB;AACtC,uBAAc,WAAW,eAAgB;AAAA,QAC7C;AAEA,mBAAY,UAAU,cAAe;AAAA,MACzC;AAEA,eAAS,gBAAiB,GAA0B;AAChD,YAAK,QAAQ,OAAO,KAAK,eAAe,qBAAsB;AAC1D,cAAK,EAAE,gCAA0B;AAC7B,cAAE,eAAe;AACjB,0BAAc;AAAA,UAClB,OAAO;AAEH,gBAAK,oCAAqC;AACtC,kBAAK,EAAE,iCAAwB;AAC3B,kBAAE,eAAe;AACjB,6BAAa;AAAA,cAEjB,WAAY,EAAE,mCAAyB;AACnC,kBAAE,eAAe;AACjB,6BAAa;AAAA,cAEjB,WAAY,EAAE,6BAAsB;AAChC,kBAAE,eAAe;AACjB,kCAAkB;AAAA,cAEtB,WAAY,EAAE,iCAAwB;AAClC,kBAAE,eAAe;AACjB,oCAAoB;AAAA,cACxB;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,eAAS,iBAAwB;AAC7B,YAAK,QAAQ,OAAO,GAAI;AACpB,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,oBAA2B;AAChC,YAAK,QAAS,eAAgB,EAAE,aAAa,GAAI;AAC7C,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE,WAAW;AAEtC,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AAEA,eAAS,sBAA6B;AAClC,YAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,0CAAgC;AAEhC,kBAAS,eAAgB,EAAE,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS;AAE/E,mCAAyB;AAAA,QAC7B;AAAA,MACJ;AASA,eAAS,sBAAuB,YAAkB;AAC9C,YAAI,UAA0B,KAAK,iBAAkB,YAAY,CAAC,CAAoB;AACtF,gBAAQ,QAAQ,KAAK,iBAAkB,QAAQ,OAAO,CAAE;AACxD,gBAAQ,SAAS,KAAK,kBAAmB,QAAQ,QAAQ,IAAK;AAC9D,gBAAQ,YAAY,KAAK,kBAAmB,QAAQ,WAAW,KAAM;AACrE,gBAAQ,WAAW,KAAK,kBAAmB,QAAQ,UAAU,KAAM;AACnE,gBAAQ,aAAa,KAAK,kBAAmB,QAAQ,YAAY,KAAM;AACvE,gBAAQ,SAAS,KAAK,kBAAmB,QAAQ,QAAQ,KAAM;AAC/D,gBAAQ,2BAA2B,KAAK,kBAAmB,QAAQ,0BAA0B,KAAM;AACnG,gBAAQ,yBAAyB,KAAK,kBAAmB,QAAQ,wBAAwB,IAAK;AAC9F,gBAAQ,uBAAuB,KAAK,kBAAmB,QAAQ,sBAAsB,KAAM;AAC3F,gBAAQ,QAAQ,KAAK,iBAAkB,QAAQ,OAAO,eAAgB;AAEtE,kBAAU,4BAA6B,OAAQ;AAE/C,eAAO,mCAAoC,OAAQ;AAAA,MACvD;AAEA,eAAS,4BAA6B,SAA2C;AAC7E,gBAAQ,QAAQ,KAAK,iBAAkB,QAAQ,qBAAkB;AACjE,gBAAQ,cAAc,KAAK,iBAAkB,QAAQ,2BAAwB;AAC7E,gBAAQ,UAAU,KAAK,iBAAkB,QAAQ,uBAAoB;AAErE,eAAO;AAAA,MACX;AAEA,eAAS,mCAAoC,SAA2C;AACpF,gBAAQ,SAAS,KAAK,iBAAkB,QAAQ,QAAQ,CAAC,CAAY;AACrE,gBAAQ,OAAQ,UAAU,KAAK,mBAAoB,QAAQ,OAAQ,SAAS,IAAK;AACjF,gBAAQ,OAAQ,UAAU,KAAK,mBAAoB,QAAQ,OAAQ,SAAS,IAAK;AACjF,gBAAQ,OAAQ,UAAU,KAAK,mBAAoB,QAAQ,OAAQ,SAAS,IAAK;AACjF,gBAAQ,OAAQ,WAAW,KAAK,mBAAoB,QAAQ,OAAQ,UAAU,IAAK;AACnF,gBAAQ,OAAQ,SAAS,KAAK,mBAAoB,QAAQ,OAAQ,QAAQ,IAAK;AAC/E,gBAAQ,OAAQ,UAAU,KAAK,mBAAoB,QAAQ,OAAQ,SAAS,IAAK;AACjF,gBAAQ,OAAQ,YAAY,KAAK,mBAAoB,QAAQ,OAAQ,WAAW,IAAK;AACrF,gBAAQ,OAAQ,eAAe,KAAK,mBAAoB,QAAQ,OAAQ,cAAc,IAAK;AAE3F,eAAO;AAAA,MACX;AASA,eAAS,uBAAwB,oBAAyB,MAAsB;AAC5E,YAAK,GAAG,gBAAiB,eAAgB,GAAI;AACzC,0BAAgB,MAAO,MAAM,CAAC,EAAE,MAAM,KAAM,MAAM,CAAE,CAAE;AAAA,QAC1D;AAAA,MACJ;AASA,eAAS,0BAAoC;AACzC,YAAI,OAAgB;AAEpB,YAAK,eAAe,6BAA8B;AAC9C,gBAAM,MAAc,OAAO,SAAS;AACpC,gBAAM,eAAoB,uBAAwB,GAAI;AAEtD,cAAK,GAAG,QAAS,aAAa,SAAU,GAAI;AACxC,kBAAM,UAAkB,SAAU,aAAa,WAAW,EAAG;AAE7D,gBAAK,CAAC,MAAO,OAAQ,KAAK,WAAW,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AAC9E,sBAAS,eAAgB,EAAE,WAAW;AAAA,YAC1C;AAAA,UACJ;AAEA,cAAK,GAAG,QAAS,aAAa,MAAO,GAAI;AACrC,mBAAO,aAAa,WAAW;AAAA,UACnC;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AAEA,eAAS,uBAAwB,KAAoB;AACjD,cAAM,eAAoB,CAAC;AAC3B,cAAM,eAAyB,IAAI,MAAO,GAAI;AAE9C,YAAK,aAAa,SAAS,GAAI;AAC3B,gBAAM,aAAuB,aAAc,CAAE,EAAE,MAAO,GAAI;AAC1D,gBAAM,mBAA2B,WAAW;AAE5C,mBAAU,kBAA0B,GAAG,kBAAkB,kBAAkB,mBAAoB;AAC3F,kBAAM,YAAsB,WAAY,eAAgB,EAAE,MAAO,GAAI;AAErE,yBAAc,UAAW,CAAE,CAAE,IAAI,UAAW,CAAE;AAAA,UAClD;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AASA,eAAS,oBAAqB,cAAmC;AAC7D,cAAM,SAAuB;AAAA,UACzB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACZ;AAEA,YAAI;AACA,cAAK,GAAG,cAAe,YAAa,GAAI;AACpC,mBAAO,SAAS,KAAK,MAAO,YAAa;AAAA,UAC7C;AAAA,QAEJ,SAAU,IAAU;AAChB,cAAI;AACA,mBAAO,SAAS,KAAM,MAAM,eAAe,GAAI;AAE/C,gBAAK,GAAG,gBAAiB,OAAO,MAAO,GAAI;AACvC,qBAAO,SAAS,OAAO,OAAO;AAAA,YAClC;AAAA,UAEJ,SAAU,IAAU;AAChB,gBAAK,CAAC,eAAe,UAAW;AAC5B,sBAAQ,MAAO,eAAe,gBAAiB,QAAS,eAAgB,GAAG,OAAQ,EAAE,QAAS,eAAgB,GAAG,OAAQ,CAAE;AAC3H,qBAAO,SAAS;AAAA,YACpB;AAEA,mBAAO,SAAS;AAAA,UACpB;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AASA,eAAS,sBAA6B;AAClC,YAAK,QAAQ,OAAO,GAAI;AACpB,wBAAe,KAAM;AAErB,kBAAS,eAAgB,EAAE,WAAW;AAAA,QAC1C;AAAA,MACJ;AASA,eAAS,0BAA2B,mBAAkC,CAAC,GAAW;AAC9E,yBAAiB,KAAK,iBAAkB,kBAAkB,CAAC,CAAmB;AAC9E,uBAAe,WAAW,KAAK,kBAAmB,eAAe,UAAU,IAAK;AAChF,uBAAe,kBAAkB,KAAK,wBAAyB,eAAe,iBAAiB,CAAE,GAAI,CAAE;AACvG,uBAAe,kBAAkB,KAAK,kBAAmB,eAAe,iBAAiB,IAAK;AAC9F,uBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,IAAK;AACtG,uBAAe,mBAAmB,KAAK,kBAAmB,eAAe,kBAAkB,IAAK;AAChG,uBAAe,8BAA8B,KAAK,kBAAmB,eAAe,6BAA6B,IAAK;AACtH,uBAAe,yBAAyB,KAAK,kBAAmB,eAAe,wBAAwB,KAAM;AAC7G,uBAAe,cAAc,KAAK,kBAAmB,eAAe,aAAa,IAAK;AACtF,uBAAe,qBAAqB,KAAK,kBAAmB,eAAe,oBAAoB,KAAM;AACrG,uBAAe,eAAe,KAAK,iBAAkB,eAAe,cAAc,GAAI;AACtF,uBAAe,0BAA0B,KAAK,kBAAmB,eAAe,yBAAyB,IAAK;AAC9G,uBAAe,uCAAuC,KAAK,kBAAmB,eAAe,sCAAsC,KAAM;AACzI,uBAAe,kBAAkB,KAAK,kBAAmB,eAAe,iBAAiB,KAAM;AAC/F,uBAAe,mBAAmB,KAAK,kBAAmB,eAAe,kBAAkB,KAAM;AACjG,uBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,KAAM;AACvG,uBAAe,sBAAsB,KAAK,kBAAmB,eAAe,qBAAqB,KAAM;AAEvG,yCAAiC;AACjC,gDAAwC;AAAA,MAC5C;AAEA,eAAS,mCAA0C;AAC/C,uBAAe,iBAAiB,KAAK,oBAAqB,eAAe,gBAAgB,MAAO;AAChG,uBAAe,iBAAiB,KAAK,oBAAqB,eAAe,gBAAgB,MAAO;AAChG,uBAAe,mBAAmB,KAAK,oBAAqB,eAAe,kBAAkB,QAAS;AACtG,uBAAe,yBAAyB,KAAK,oBAAqB,eAAe,wBAAwB,OAAQ;AACjH,uBAAe,qBAAqB,KAAK,oBAAqB,eAAe,oBAAoB,mBAAoB;AACrH,uBAAe,kBAAkB,KAAK,oBAAqB,eAAe,iBAAiB,4CAA6C;AACxI,uBAAe,6BAA6B,KAAK,oBAAqB,eAAe,4BAA4B,2DAA4D;AAC7K,uBAAe,2BAA2B,KAAK,oBAAqB,eAAe,0BAA0B,gEAAiE;AAC9K,uBAAe,8BAA8B,KAAK,oBAAqB,eAAe,2CAAwC;AAAA,MAClI;AAEA,eAAS,0CAAiD;AACtD,uBAAe,yBAAyB,KAAK,mBAAoB,eAAe,wBAAwB,IAAK;AAAA,MACjH;AASA,YAAM,UAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOvB,OAAO,SAAW,wBAAyC;AACvD,cAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,8BAAkB,KAAK,iBAAkB,OAAO,eAAgB;AAEhE,gBAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,sBAAS,eAAgB,EAAE,WAAW;AAEtC,uCAAyB;AAAA,YAC7B;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,MAAM,SAAW,wBAAyC;AACtD,cAAK,CAAC,QAAQ,OAAO,GAAI;AACrB,8BAAkB,KAAK,iBAAkB,OAAO,eAAgB;AAEhE,gBAAK,QAAQ,eAAgB,eAAgB,GAAI;AAC7C,kBAAK,QAAS,eAAgB,EAAE,aAAa,QAAS,eAAgB,EAAE,KAAK,SAAS,GAAI;AACtF,wBAAS,eAAgB,EAAE,WAAW;AAAA,cAC1C;AAEA,uCAAyB;AAAA,YAC7B;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,MAAM,WAAwB;AAC1B,cAAK,QAAQ,OAAO,GAAI;AACpB,0BAAc;AAAA,UAClB;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,QAAQ,WAAsB;AAC1B,iBAAO,GAAG,QAAS,eAAgB,KAAK,gBAAgB,MAAM,YAAY;AAAA,QAC9E;AAAA,QAEA,YAAY,WAAsB;AAC9B,iBAAO,QAAS,eAAgB,EAAE,YAAY,QAAS,eAAgB,EAAE,KAAK,SAAS;AAAA,QAC3F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,kBAAkB,WAAwB;AACtC,sBAAY;AAEZ,iBAAO;AAAA,QACX;AAAA,QAEA,SAAS,SAAW,SAAsB,SAAsC;AAC5E,cAAK,GAAG,cAAe,OAAQ,KAAK,GAAG,cAAe,OAAQ,GAAI;AAC9D,yBAAc,SAAS,sBAAuB,OAAQ,CAAE;AAExD,oBAAS,eAAgB,EAAE,KAAK,KAAK;AAErC,gCAAoB;AAAA,UACxB;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,SAAW,SAAmC;AACtD,cAAK,GAAG,cAAe,OAAQ,GAAI;AAC/B,gBAAI,UAAmB;AAEvB,qBAAU,SAAS,SAAU;AACzB,kBAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,yBAAU,SAAS,QAAS,KAAM,EAAE,MAAO;AACvC,sBAAK,QAAS,KAAM,EAAE,KAAK,eAAgB,KAAM,GAAI;AACjD,0BAAM,iBAAiC,QAAS,KAAM,EAAE,KAAM,KAAM;AAEpE,wBAAK,eAAe,aAAa,YAAY,SAAU;AACnD,6CAAwB,eAAe,OAAQ,cAAc,eAAe,aAAa,OAAQ;AAEjG,8BAAS,KAAM,EAAE,KAAK,OAAQ,QAAS,KAAM,EAAE,KAAK,QAAS,eAAe,KAAO,GAAG,CAAE;AAExF,6BAAO,QAAS,KAAM,EAAE,KAAM,eAAe,KAAO;AAEpD,8BAAS,KAAM,EAAE,KAAK,KAAK;AAE3B,gCAAU;AACV;AAAA,oBACJ;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAEA,gBAAK,CAAC,SAAU;AACZ,yBAAW,yBAA0B,SAAS,iBAAkB;AAAA,YACpE,OAAO;AACH,kCAAoB;AAAA,YACxB;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,SAAW,wBAAyC;AAC5D,8BAAoB;AAEpB,mBAAU,aAAa,SAAU;AAC7B,gBAAK,QAAQ,eAAgB,SAAU,GAAI;AACvC,kBAAK,CAAC,GAAG,cAAe,KAAM,KAAK,UAAU,WAAY;AACrD,yBAAU,SAAS,QAAS,SAAU,EAAE,MAAO;AAC3C,sBAAK,QAAS,SAAU,EAAE,KAAK,eAAgB,KAAM,GAAI;AACrD,0BAAM,iBAAiC,QAAS,SAAU,EAAE,KAAM,KAAM;AAExE,2CAAwB,eAAe,OAAQ,cAAc,eAAe,aAAa,OAAQ;AAAA,kBACrG;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAEA,cAAK,GAAG,cAAe,KAAM,GAAI;AAC7B,gBAAK,QAAQ,eAAgB,KAAM,GAAI;AACnC,qBAAO,QAAS,KAAM;AAAA,YAC1B;AAAA,UAEJ,OAAO;AACH,sBAAU,CAAC;AAAA,UACf;AAEA,cAAK,CAAC,GAAG,cAAe,KAAM,KAAK,UAAU,iBAAkB;AAC3D,8BAAmB,OAAQ;AAAA,UAC/B;AAEA,iBAAO;AAAA,QACX;AAAA,QAEA,YAAY,WAAwB;AAChC,qBAAW,yBAA0B,SAAS,MAAM,iBAAkB;AAEtE,iBAAO;AAAA,QACX;AAAA,QAEA,kBAAkB,WAAwB;AACtC,kBAAS,eAAgB,EAAE,KAAK,QAAQ;AAExC,8BAAoB;AAEpB,iBAAO;AAAA,QACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,kBAAkB,SAAW,kBAAoC;AAC7D,cAAK,GAAG,cAAe,gBAAiB,GAAI;AACxC,gBAAI,0BAAmC;AACvC,kBAAM,2BAAgC;AAEtC,qBAAU,gBAAgB,kBAAmB;AACzC,kBAAK,iBAAiB,eAAgB,YAAa,KAAK,eAAe,eAAgB,YAAa,KAAK,yBAA0B,YAAa,MAAM,iBAAkB,YAAa,GAAI;AACrL,yCAA0B,YAAa,IAAI,iBAAkB,YAAa;AAC1E,0CAA0B;AAAA,cAC9B;AAAA,YACJ;AAEA,gBAAK,yBAA0B;AAC3B,wCAA2B,wBAAyB;AAAA,YACxD;AAAA,UACJ;AAEA,iBAAO;AAAA,QACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASA,YAAY,WAAoB;AAC5B,iBAAO;AAAA,QACX;AAAA,MACJ;AASA,OAAE,MAAM;AACJ,kCAA0B;AAE1B,iBAAS,iBAAkB,oBAAoB,MAAM;AACjD,4BAAkB;AAClB,mCAAyB;AACzB,uBAAa;AACb,wBAAc;AACd,sBAAY;AACZ,8BAAoB;AAEpB,cAAK,wBAAwB,GAAI;AAC7B,oBAAQ,KAAK;AAAA,UACjB;AAAA,QACJ,CAAE;AAEF,YAAK,CAAC,GAAG,QAAS,OAAO,QAAS,GAAI;AAClC,iBAAO,WAAW;AAAA,QACtB;AAAA,MACJ,GAAK;AAAA,IACT,GAAK;AAAA;AAAA","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView!.getComputedStyle! ) {\n value = document.defaultView!.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode!.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/enum.ts","../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport const enum Char {\n empty = \"\",\n space = \" \",\n}\n\nexport const enum KeyCode {\n escape = \"Escape\",\n left = \"ArrowLeft\",\n up = \"ArrowUp\",\n right = \"ArrowRight\",\n down = \"ArrowDown\",\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const documentElement: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: documentElement.scrollLeft - ( documentElement.clientLeft || 0 ),\n top: documentElement.scrollTop - ( documentElement.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView!.getComputedStyle! ) {\n value = document.defaultView!.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode!.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.js b/dist/journey.js index 01880dc..ecbbe9f 100644 --- a/dist/journey.js +++ b/dist/journey.js @@ -116,8 +116,8 @@ var DomElement; function n() { const e = document.documentElement; const t = { - left: (window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0), - top: (window.pageYOffset || e.scrollTop) - (e.clientTop || 0) + left: e.scrollLeft - (e.clientLeft || 0), + top: e.scrollTop - (e.clientTop || 0) }; return t; } diff --git a/dist/journey.js.map b/dist/journey.js.map index f17d4c6..f83e5cf 100644 --- a/dist/journey.js.map +++ b/dist/journey.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const doc: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ),\n top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView!.getComputedStyle! ) {\n value = document.defaultView!.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode!.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file +{"version":3,"sources":["../src/ts/constant.ts","../src/ts/is.ts","../src/ts/data.ts","../src/ts/dom.ts","../src/journey.ts"],"names":["Constants","Is","Data","result","DomElement"],"mappings":"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","sourcesContent":["/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nexport namespace Constants {\n export const JOURNEY_JS_ATTRIBUTE_NAME = \"data-journey-js\";\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\n\n\nexport namespace Is {\n export function defined( value: any ) : boolean {\n return value !== null && value !== undefined && value !== Char.empty;\n }\n\n export function definedObject( object: any ) : boolean {\n return defined( object ) && typeof object === \"object\";\n }\n\n export function definedBoolean( object: any ) : boolean {\n return defined( object ) && typeof object === \"boolean\";\n }\n\n export function definedString( object: any ) : boolean {\n return defined( object ) && typeof object === \"string\";\n }\n\n export function definedFunction( object: any ) : boolean {\n return defined( object ) && typeof object === \"function\";\n }\n\n export function definedNumber( object: any ) : boolean {\n return defined( object ) && typeof object === \"number\";\n }\n\n export function definedArray( object: any ) : boolean {\n return definedObject( object ) && object instanceof Array;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\nimport { Is } from \"./is\";\n\n\nexport namespace Data {\n export function getDefaultAnyString( value: any, defaultValue: string ) : string {\n return typeof value === \"string\" ? value : defaultValue;\n }\n\n export function getDefaultString( value: any, defaultValue: string ) : string {\n return Is.definedString( value ) ? value : defaultValue;\n }\n\n export function getDefaultBoolean( value: any, defaultValue: boolean ) : boolean {\n return Is.definedBoolean( value ) ? value : defaultValue;\n }\n\n export function getDefaultNumber( value: any, defaultValue: number ) : number {\n return Is.definedNumber( value ) ? value : defaultValue;\n }\n\n export function getDefaultFunction( value: any, defaultValue: any ) : any {\n return Is.definedFunction( value ) ? value : defaultValue;\n }\n\n export function getDefaultObject( value: any, defaultValue: any ) : any {\n return Is.definedObject( value ) ? value : defaultValue;\n }\n\n export function getDefaultArray( value: any, defaultValue: any[] ) : any[] {\n return Is.definedArray( value ) ? value : defaultValue;\n }\n\n export function getDefaultStringOrArray( value: any, defaultValue: any[] ) : any[] {\n let result: any[] = defaultValue;\n\n if ( Is.definedString( value ) ) {\n const values: string[] = value.toString().split( Char.space );\n\n if ( values.length === 0 ) {\n value = defaultValue;\n } else {\n result = values;\n }\n\n } else {\n result = getDefaultArray( value, defaultValue );\n }\n\n return result;\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport { Char } from \"./enum\";\nimport { Is } from \"./is\";\nimport { type Position } from \"./type\";\n\n\nexport namespace DomElement {\n export function create( type: string, className: string = Char.empty ) : HTMLElement {\n const nodeType: string = type.toLowerCase();\n const isText: boolean = nodeType === \"text\";\n\n let result: any = isText ? document.createTextNode( Char.empty ) : document.createElement( nodeType );\n\n if ( Is.defined( className ) ) {\n result.className = className;\n }\n\n return result;\n }\n\n export function getOffset( element: HTMLElement ) : Position {\n const result: Position = {\n left: 0,\n top: 0\n } as Position;\n\n while ( element && !isNaN( element.offsetLeft ) && !isNaN( element.offsetTop ) ) {\n result.left += element.offsetLeft - element.scrollLeft;\n result.top += element.offsetTop - element.scrollTop;\n\n element = element.offsetParent as HTMLElement;\n }\n\n return result;\n }\n\n export function getScrollPosition() : Position {\n const documentElement: HTMLElement = document.documentElement;\n\n const result: Position = {\n left: documentElement.scrollLeft - ( documentElement.clientLeft || 0 ),\n top: documentElement.scrollTop - ( documentElement.clientTop || 0 )\n } as Position;\n\n return result;\n }\n\n export function getStyleValueByName( element: any, stylePropertyName: string ) : any {\n let value: any = null;\n \n if ( document.defaultView!.getComputedStyle! ) {\n value = document.defaultView!.getComputedStyle( element, null ).getPropertyValue( stylePropertyName ); \n } else if ( element.currentStyle ) {\n value = element.currentStyle[ stylePropertyName ];\n } \n\n return value;\n }\n\n export function addNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( !parent.contains( node ) ) {\n parent.appendChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function removeNode( parent: HTMLElement, node: HTMLElement ) : void {\n try {\n if ( parent.contains( node ) ) {\n parent.removeChild( node );\n }\n } catch ( e: any ) {\n console.warn( e.message );\n }\n }\n\n export function cancelBubble( e: any ) : void {\n e.preventDefault();\n e.cancelBubble = true;\n }\n\n export function showElementAtMousePosition( e: MouseEvent, element: HTMLElement ) : void {\n let left: number = e.pageX;\n let top: number = e.pageY;\n const scrollPosition: Position = getScrollPosition();\n\n element.style.display = \"block\";\n\n if ( left + element.offsetWidth > window.innerWidth ) {\n left -= element.offsetWidth;\n } else {\n left++;\n }\n\n if ( top + element.offsetHeight > window.innerHeight ) {\n top -= element.offsetHeight;\n } else {\n top++;\n }\n\n if ( left < scrollPosition.left ) {\n left = e.pageX + 1;\n }\n\n if ( top < scrollPosition.top ) {\n top = e.pageY + 1;\n }\n \n element.style.left = left + \"px\";\n element.style.top = top + \"px\";\n }\n\n export function showElementBasedOnCondition( element: HTMLElement, condition: boolean ) : void {\n if ( condition ) {\n if ( element.style.display !== \"block\" ) {\n element.style.display = \"block\";\n }\n \n } else {\n if ( element.style.display !== \"none\" ) {\n element.style.display = \"none\";\n }\n }\n }\n\n export function createCheckBox( container: HTMLElement, labelText: string ) : HTMLInputElement {\n const lineContainer: HTMLElement = create( \"div\" );\n const label: HTMLElement = create( \"label\", \"checkbox\" );\n const input: HTMLInputElement = create( \"input\" ) as HTMLInputElement;\n\n container.appendChild( lineContainer );\n lineContainer.appendChild( label );\n label.appendChild( input );\n\n input.type = \"checkbox\";\n\n const checkMark: HTMLElement = create( \"span\", \"check-mark\" );\n const text: HTMLElement = create( \"span\", \"text\" );\n\n text.innerHTML = labelText;\n \n label.appendChild( checkMark );\n label.appendChild( text );\n\n return input;\n }\n\n export function clearElementsByClassName( container: HTMLElement, className: string ) : void {\n let elements: HTMLCollectionOf = container.getElementsByClassName( className );\n\n while ( elements[ 0 ] ) {\n elements[ 0 ].parentNode!.removeChild( elements[ 0 ] );\n }\n }\n}","/**\n * Journey.js\n * \n * A lightweight, easy-to-use JavaScript library to create interactive, customizable, accessible guided tours across your websites or web apps!\n * \n * @file journey.js\n * @version v2.0.0\n * @author Bunoon\n * @license MIT License\n * @copyright Bunoon 2024\n */\n\n\nimport {\n type Configuration,\n type BindingOptions,\n type Events, \n type CurrentView, \n type Position} from \"./ts/type\";\n\nimport { Char, KeyCode } from \"./ts/enum\";\nimport { Constants } from \"./ts/constant\";\nimport { PublicApi } from \"./ts/api\";\nimport { Is } from \"./ts/is\";\nimport { Data } from \"./ts/data\";\nimport { DomElement } from \"./ts/dom\";\n\n\ntype StringToJson = {\n parsed: boolean;\n object: any;\n};\n\ntype Groups = Record;\n keys: number[];\n position: number;\n}>;\n\n\n( () => {\n // Variables: Configuration\n let _configuration: Configuration = {} as Configuration;\n\n // Variables: Configuration (overrides)\n let _configuration_ShortcutKeysEnabled: boolean = true;\n\n // Variables: Groups\n const _groups_Default: string = \"default\";\n let _groups_Current: string = _groups_Default;\n let _groups: Groups = {} as Groups;\n\n // Variables: Focus Element\n let _element_Focus_Element_PositionStyle: string = Char.empty;\n\n // Variables: Disabled Background\n let _element_Disabled_Background: HTMLElement;\n\n // Variables: Dialog\n let _element_Dialog: HTMLElement;\n let _element_Dialog_Close_Button: HTMLElement;\n let _element_Dialog_Title: HTMLElement;\n let _element_Dialog_Description: HTMLElement;\n let _element_Dialog_CheckBox_Container: HTMLElement;\n let _element_Dialog_CheckBox_Input: HTMLInputElement;\n let _element_Dialog_ProgressDots: HTMLElement;\n let _element_Dialog_ProgressBar: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage: HTMLElement;\n let _element_Dialog_ProgressBar_Percentage_Text: HTMLElement;\n let _element_Dialog_Buttons: HTMLElement;\n let _element_Dialog_Buttons_Back_Button: HTMLInputElement;\n let _element_Dialog_Buttons_Next_Button: HTMLInputElement;\n let _element_Dialog_IsHint: boolean = false;\n\n // Variables: Dialog - Move\n let _element_Dialog_Move_Original_X: number = 0;\n let _element_Dialog_Move_Original_Y: number = 0;\n let _element_Dialog_Move_IsMoving: boolean = false;\n let _element_Dialog_Move_X: number = 0;\n let _element_Dialog_Move_Y: number = 0;\n\n // Variables: Dialog\n let _element_ToolTip: HTMLElement;\n let _element_ToolTip_Timer: number = 0;\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Groups\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function setupDefaultGroup( groups: any = null ) : void {\n _groups = Data.getDefaultObject( groups, {} as Groups );\n\n _groups[ _groups_Default ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n\n function setupNewGroup( group: string ) : void {\n if ( !_groups.hasOwnProperty( group ) ) {\n _groups[ group ] = {\n json: {} as BindingOptions,\n keys: [],\n position: 0\n };\n }\n }\n\n function getGroupBindingOptions() : BindingOptions {\n return _groups[ _groups_Current ].json[ _groups[ _groups_Current ].keys[ _groups[ _groups_Current ].position ] ];\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Disabled Background\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDisabledBackground() : void {\n _element_Disabled_Background = DomElement.create( \"div\", \"journey-js-disabled-background\" );\n\n _element_Disabled_Background.onclick = () => {\n if ( _configuration.closeDialogOnDisabledBackgroundClick ) {\n onDialogClose();\n }\n };\n }\n\n function showDisabledBackground() : void {\n DomElement.addNode( document.body, _element_Disabled_Background );\n }\n\n function hideDisabledBackground() : void {\n DomElement.removeNode( document.body, _element_Disabled_Background );\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderDialog() : void {\n _element_Dialog = DomElement.create( \"div\", \"journey-js-dialog\" );\n _element_Dialog.style.display = \"none\";\n document.body.appendChild( _element_Dialog );\n\n _element_Dialog_Close_Button = DomElement.create( \"button\", \"close\" );\n _element_Dialog.appendChild( _element_Dialog_Close_Button );\n\n _element_Dialog_Close_Button.onclick = () => {\n onDialogClose();\n };\n\n addToolTip( _element_Dialog_Close_Button, _configuration.closeButtonToolTipText! );\n\n _element_Dialog_Title = DomElement.create( \"div\", \"title\" );\n _element_Dialog.appendChild( _element_Dialog_Title );\n\n _element_Dialog_Description = DomElement.create( \"div\", \"description\" );\n _element_Dialog.appendChild( _element_Dialog_Description );\n\n _element_Dialog_CheckBox_Container = DomElement.create( \"div\", \"checkbox-container\" );\n _element_Dialog.appendChild( _element_Dialog_CheckBox_Container );\n\n _element_Dialog_CheckBox_Input = DomElement.createCheckBox( _element_Dialog_CheckBox_Container, _configuration.doNotShowAgainText! );\n \n _element_Dialog_CheckBox_Input.onchange = () => {\n if ( _configuration.showDoNotShowAgain ) {\n fireCustomTriggerEvent( _configuration.onDoNotShowAgainChange, _element_Dialog_CheckBox_Input.checked );\n }\n };\n\n _element_Dialog_ProgressDots = DomElement.create( \"div\", \"progress-dots\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressDots );\n\n _element_Dialog_ProgressBar = DomElement.create( \"div\", \"progress-bar\" );\n _element_Dialog.appendChild( _element_Dialog_ProgressBar );\n\n _element_Dialog_ProgressBar_Percentage = DomElement.create( \"div\", \"progress-bar-percentage\" );\n _element_Dialog_ProgressBar.appendChild( _element_Dialog_ProgressBar_Percentage );\n\n _element_Dialog_ProgressBar_Percentage_Text = DomElement.create( \"p\", \"progress-bar-percentage-text\" );\n _element_Dialog_ProgressBar_Percentage.appendChild( _element_Dialog_ProgressBar_Percentage_Text );\n\n _element_Dialog_Buttons = DomElement.create( \"div\", \"buttons\" );\n _element_Dialog.appendChild( _element_Dialog_Buttons );\n\n _element_Dialog_Buttons_Back_Button = DomElement.create( \"button\", \"back\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Back_Button.onclick = onDialogBack;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Back_Button );\n\n _element_Dialog_Buttons_Next_Button = DomElement.create( \"button\", \"next\" ) as HTMLInputElement;\n _element_Dialog_Buttons_Next_Button.onclick = onDialogNext;\n _element_Dialog_Buttons.appendChild( _element_Dialog_Buttons_Next_Button );\n\n makeDialogMovable();\n }\n\n function onDialogClose( showConfirmationBox: boolean = true ) : void {\n let confirmed: boolean = false;\n\n if ( Is.definedString( _configuration.closeDialogConfirmationText ) && showConfirmationBox ) {\n confirmed = confirm( _configuration.closeDialogConfirmationText );\n } else {\n confirmed = true;\n }\n\n if ( confirmed ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n fireCustomTriggerEvent( bindingOptions.events!.onClose!, bindingOptions._currentView.element );\n }\n \n removeFocusClassFromLastElement( false );\n hideDisabledBackground();\n hideToolTip();\n \n _element_Dialog.style.display = \"none\";\n }\n }\n\n function onDialogBack() : void {\n if ( _groups[ _groups_Current ].position > 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position--;\n\n showDialogAndSetPosition();\n } \n }\n\n function onDialogNext() : void {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n onDialogClose( false );\n fireCustomTriggerEvent( bindingOptions.events!.onFinish, bindingOptions._currentView.element );\n\n } else {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position++;\n\n showDialogAndSetPosition();\n }\n }\n\n function showDialogAndSetPosition() : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n if ( bindingOptions.showDisabledBackground ) {\n showDisabledBackground();\n } else {\n hideDisabledBackground();\n }\n\n hideToolTip();\n \n _element_Dialog_Close_Button.style.display = _configuration.showCloseButton ? \"block\": \"none\";\n _configuration_ShortcutKeysEnabled = true;\n \n bindingOptions._currentView.element.className += Char.space + \"journey-js-element-focus\";\n\n if ( _configuration.scrollToElements ) {\n bindingOptions._currentView.element.scrollIntoView();\n }\n\n const lastPositionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( lastPositionStyle !== Char.empty && lastPositionStyle.toLowerCase() === \"static\" ) {\n _element_Focus_Element_PositionStyle = lastPositionStyle;\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n DomElement.showElementBasedOnCondition( _element_Dialog_CheckBox_Container, _configuration.showDoNotShowAgain as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressDots, _configuration.showProgressDots as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar, _configuration.showProgressBar as boolean && _groups[ _groups_Current ].keys.length > 1 );\n DomElement.showElementBasedOnCondition( _element_Dialog_ProgressBar_Percentage_Text, _configuration.showProgressBarText as boolean );\n DomElement.showElementBasedOnCondition( _element_Dialog_Buttons, _configuration.showButtons as boolean );\n\n _element_Dialog_Buttons_Back_Button.innerHTML = _configuration.backButtonText!;\n _element_Dialog_Buttons_Back_Button.disabled = _groups[ _groups_Current ].position === 0;\n \n if ( _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1 ) {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.finishButtonText!;\n } else {\n _element_Dialog_Buttons_Next_Button.innerHTML = _configuration.nextButtonText!;\n }\n\n setDialogText( bindingOptions );\n setDialogPosition( null, bindingOptions );\n buildProcessDots();\n setProgressBarPosition();\n fireCustomTriggerEvent( bindingOptions.events!.onEnter, bindingOptions._currentView.element );\n\n if ( bindingOptions.sendClick ) {\n bindingOptions._currentView.element.click();\n }\n }\n }\n\n function setDialogText( bindingOptions: BindingOptions ) : void {\n if ( Is.definedString( bindingOptions.title ) ) {\n _element_Dialog_Title.innerHTML = bindingOptions.title!;\n } else {\n _element_Dialog_Title.innerHTML = Char.empty;\n }\n\n if ( Is.definedString( bindingOptions.description ) ) {\n _element_Dialog_Description.innerHTML = bindingOptions.description!;\n } else {\n _element_Dialog_Description.innerHTML = Char.empty;\n }\n }\n\n function setDialogPosition( e: any, bindingOptions: BindingOptions ) : void {\n if ( _element_Dialog.style.display !== \"block\" ) {\n _element_Dialog.style.display = \"block\";\n\n fireCustomTriggerEvent( bindingOptions.events!.onOpen, bindingOptions._currentView.element );\n }\n\n if ( _groups[ _groups_Current ].position === 0 ) {\n fireCustomTriggerEvent( bindingOptions.events!.onStart, bindingOptions._currentView.element );\n }\n\n _element_Dialog_IsHint = bindingOptions.isHint === true;\n\n if ( bindingOptions.attach || bindingOptions.isHint ) {\n if ( bindingOptions.isHint && bindingOptions.alignHintToClickPosition ) {\n DomElement.showElementAtMousePosition( e, _element_Dialog );\n\n } else {\n const offset: Position = DomElement.getOffset( bindingOptions._currentView.element );\n let top: number = ( offset.top ) + bindingOptions._currentView.element.offsetHeight;\n let left: number = ( offset.left );\n\n if ( left + _element_Dialog.offsetWidth > window.innerWidth || bindingOptions.alignRight ) {\n left -= _element_Dialog.offsetWidth;\n left += bindingOptions._currentView.element.offsetWidth;\n }\n \n if ( top + _element_Dialog.offsetHeight > window.innerHeight || bindingOptions.alignTop ) {\n top -= ( _element_Dialog.offsetHeight + bindingOptions._currentView.element.offsetHeight );\n }\n\n _element_Dialog.style.top = top + \"px\";\n _element_Dialog.style.left = left + \"px\";\n }\n\n } else {\n const scrollPosition: Position = DomElement.getScrollPosition();\n const centerLeft: number = Math.max( 0, ( ( window.innerWidth - _element_Dialog.offsetWidth ) / 2 ) + scrollPosition.left );\n const centerTop: number = Math.max( 0, ( ( window.innerHeight - _element_Dialog.offsetHeight ) / 2 ) + scrollPosition.top );\n\n _element_Dialog.style.left = centerLeft + \"px\";\n _element_Dialog.style.top = centerTop + \"px\";\n }\n }\n\n function removeFocusClassFromLastElement( callCustomTrigger: boolean = true ) : void {\n const bindingOptions: BindingOptions = getGroupBindingOptions();\n\n if ( Is.defined( bindingOptions ) && Is.defined( bindingOptions._currentView.element ) ) {\n bindingOptions._currentView.element.className = bindingOptions._currentView.element.className.replace( Char.space + \"journey-js-element-focus\", Char.empty );\n\n if ( Is.defined( _element_Focus_Element_PositionStyle ) ) {\n bindingOptions._currentView.element.style.position = _element_Focus_Element_PositionStyle;\n }\n\n if ( callCustomTrigger ) {\n fireCustomTriggerEvent( bindingOptions.events!.onLeave, bindingOptions._currentView.element );\n }\n }\n }\n\n function buildProcessDots() : void {\n _element_Dialog_ProgressDots.innerHTML = Char.empty;\n\n if ( _configuration.showProgressDots ) {\n const keysLength: number = _groups[ _groups_Current ].keys.length;\n\n for ( let keyIndex: number = 0; keyIndex < keysLength; keyIndex++ ) {\n buildProgressDot( keyIndex, _groups[ _groups_Current ].keys[ keyIndex ] );\n }\n }\n }\n\n function buildProgressDot( keyIndex: number, order: number ) : void {\n const bindingOptions: BindingOptions = _groups[ _groups_Current ].json[ order ];\n let dot: HTMLElement;\n\n if ( keyIndex === _groups[ _groups_Current ].position ) {\n dot = DomElement.create( \"div\", \"dot-active\" );\n } else {\n \n dot = DomElement.create( \"div\", \"dot\" );\n \n dot.onclick = () => {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = keyIndex;\n\n showDialogAndSetPosition();\n };\n }\n\n _element_Dialog_ProgressDots.appendChild( dot );\n\n if ( _configuration.showProgressDotToolTips ) {\n if ( Is.definedString( bindingOptions.tooltip ) ) {\n addToolTip( dot, bindingOptions.tooltip! );\n } else {\n addToolTip( dot, bindingOptions.title! );\n }\n }\n\n if ( _configuration.showProgressDotNumbers ) {\n dot.className += \" dot-number\";\n dot.innerHTML = ( keyIndex + 1 ).toString();\n }\n }\n\n function setProgressBarPosition() : void {\n if ( _configuration.showProgressBar ) {\n const pixelsPerStage: number = _element_Dialog_ProgressBar.offsetWidth / _groups[ _groups_Current ].keys.length;\n const width: number = ( _groups[ _groups_Current ].position + 1 ) * pixelsPerStage;\n const percentageComplete: number = Math.ceil( ( ( _groups[ _groups_Current ].position + 1 ) / _groups[ _groups_Current ].keys.length ) * 100 );\n\n _element_Dialog_ProgressBar_Percentage.style.width = width + \"px\";\n _element_Dialog_ProgressBar_Percentage_Text.innerHTML = percentageComplete + \"%\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: Dialog - Move\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function makeDialogMovable() : void {\n _element_Dialog_Title.onmousedown = onMoveTitleBarMouseDown;\n _element_Dialog_Title.onmouseup = onMoveTitleBarMouseUp;\n _element_Dialog_Title.oncontextmenu = onMoveTitleBarMouseUp;\n\n document.body.addEventListener( \"mousemove\", onMoveDocumentMouseMove );\n document.body.addEventListener( \"mouseleave\", onMoveDocumentMouseLeave );\n }\n\n function onMoveTitleBarMouseDown( e: MouseEvent ) : void {\n if ( !_element_Dialog_Move_IsMoving && !_element_Dialog_IsHint && _configuration.dialogMovingEnabled ) {\n _element_Dialog.className += \" journey-js-dialog-moving\";\n _element_Dialog_Move_IsMoving = true;\n _element_Dialog_Move_X = e.pageX - _element_Dialog.offsetLeft;\n _element_Dialog_Move_Y = e.pageY - _element_Dialog.offsetTop;\n _element_Dialog_Move_Original_X = _element_Dialog.offsetLeft;\n _element_Dialog_Move_Original_Y = _element_Dialog.offsetTop;\n }\n }\n\n function onMoveTitleBarMouseUp() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n function onMoveDocumentMouseMove( e: MouseEvent ) : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = ( e.pageX - _element_Dialog_Move_X ) + \"px\";\n _element_Dialog.style.top = ( e.pageY - _element_Dialog_Move_Y ) + \"px\";\n }\n }\n\n function onMoveDocumentMouseLeave() : void {\n if ( _element_Dialog_Move_IsMoving ) {\n _element_Dialog.style.left = _element_Dialog_Move_Original_X + \"px\";\n _element_Dialog.style.top = _element_Dialog_Move_Original_Y + \"px\";\n\n _element_Dialog_Move_IsMoving = false;\n _element_Dialog_Move_Original_X = 0;\n _element_Dialog_Move_Original_Y = 0;\n _element_Dialog.className = \"journey-js-dialog\";\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Render: ToolTip\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function renderToolTip() : void {\n if ( !Is.defined( _element_ToolTip ) ) {\n _element_ToolTip = DomElement.create( \"div\", \"journey-js-tooltip\" );\n _element_ToolTip.style.display = \"none\";\n\n document.body.appendChild( _element_ToolTip );\n \n document.body.addEventListener( \"mousemove\", () => {\n hideToolTip();\n } );\n \n document.addEventListener( \"scroll\", () => {\n hideToolTip();\n } );\n }\n }\n\n function addToolTip( element: HTMLElement, text: string ) : void {\n if ( element !== null ) {\n element.onmousemove = ( e: MouseEvent ) => {\n showToolTip( e, text );\n };\n }\n }\n\n function showToolTip( e: any, text: string ) : void {\n DomElement.cancelBubble( e );\n hideToolTip();\n\n _element_ToolTip_Timer = setTimeout( () => {\n _element_ToolTip.innerHTML = text;\n _element_ToolTip.style.display = \"block\";\n\n DomElement.showElementAtMousePosition( e, _element_ToolTip );\n }, _configuration.tooltipDelay );\n }\n\n function hideToolTip() : void {\n if ( Is.defined( _element_ToolTip ) ) {\n if ( _element_ToolTip_Timer !== 0 ) {\n clearTimeout( _element_ToolTip_Timer );\n _element_ToolTip_Timer = 0;\n }\n \n if ( _element_ToolTip.style.display === \"block\" ) {\n _element_ToolTip.style.display = \"none\";\n }\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Rendering\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getElements() : void {\n const tagTypes: string[] = _configuration.domElementTypes as string[];\n const tagTypesLength: number = tagTypes.length;\n\n for ( let tagTypeIndex: number = 0; tagTypeIndex < tagTypesLength; tagTypeIndex++ ) {\n const domElements: HTMLCollectionOf = document.getElementsByTagName( tagTypes[ tagTypeIndex ] );\n const elements: HTMLElement[] = [].slice.call( domElements );\n const elementsLength: number = elements.length;\n\n for ( let elementIndex: number = 0; elementIndex < elementsLength; elementIndex++ ) {\n if ( !getElement( elements[ elementIndex ] ) ) {\n break;\n }\n }\n }\n\n _groups[ _groups_Current ].keys.sort();\n }\n\n function getElement( element: HTMLElement ) : boolean {\n let result: boolean = true;\n\n if ( Is.defined( element ) && element.hasAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME ) ) {\n const bindingOptionsData: string = element.getAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME )!;\n\n if ( Is.definedString( bindingOptionsData ) ) {\n const bindingOptions: StringToJson = getObjectFromString( bindingOptionsData );\n\n if ( bindingOptions.parsed && Is.definedObject( bindingOptions.object ) ) {\n setupElement( element, buildAttributeOptions( bindingOptions.object ) );\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotValidErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n\n } else {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.attributeNotSetErrorText!.replace( \"{{attribute_name}}\", Constants.JOURNEY_JS_ATTRIBUTE_NAME ) );\n result = false;\n }\n }\n }\n\n return result;\n }\n\n function setupElement( element: HTMLElement, bindingOptions: BindingOptions ) : void {\n bindingOptions._currentView = {} as CurrentView;\n bindingOptions._currentView.element = element;\n\n if ( Is.definedNumber( bindingOptions.order ) && ( Is.definedString( bindingOptions.title ) || Is.definedString( bindingOptions.description ) ) ) {\n element.removeAttribute( Constants.JOURNEY_JS_ATTRIBUTE_NAME );\n \n if ( !bindingOptions.isHint ) {\n setupNewGroup( bindingOptions.group! );\n\n _groups[ bindingOptions.group! ].json[ bindingOptions.order! ] = bindingOptions;\n _groups[ bindingOptions.group! ].keys.push( bindingOptions.order! );\n\n fireCustomTriggerEvent( bindingOptions.events!.onAddStep, element );\n\n } else {\n renderHint( bindingOptions );\n }\n }\n }\n\n function renderHint( bindingOptions: BindingOptions ) : void {\n const positionStyle: string = DomElement.getStyleValueByName( bindingOptions._currentView.element, \"position\" );\n\n if ( positionStyle !== Char.empty && positionStyle.toLowerCase() === \"static\" ) {\n bindingOptions._currentView.element.style.position = \"relative\";\n }\n\n const hint: HTMLElement = DomElement.create( \"div\", \"journey-js-hint\" );\n bindingOptions._currentView.element.appendChild( hint );\n\n hint.onclick = ( e: MouseEvent ) => {\n DomElement.cancelBubble( e );\n\n _element_Dialog_CheckBox_Container.style.display = \"none\";\n _element_Dialog_ProgressDots.style.display = \"none\";\n _element_Dialog_ProgressBar.style.display = \"none\";\n _element_Dialog_Buttons.style.display = \"none\";\n _configuration_ShortcutKeysEnabled = false;\n\n setDialogText( bindingOptions );\n setDialogPosition( e, bindingOptions );\n\n if ( bindingOptions.removeHintWhenViewed ) {\n DomElement.clearElementsByClassName( bindingOptions._currentView.element, \"journey-js-hint\" );\n }\n };\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Document Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildDocumentEvents( addEvents: boolean = true ) : void {\n const documentFunc: Function = addEvents ? document.addEventListener : document.removeEventListener;\n const windowFunc: Function = addEvents ? window.addEventListener : window.removeEventListener;\n\n if ( _configuration.shortcutKeysEnabled ) {\n documentFunc( \"keydown\", onWindowKeyDown );\n }\n\n windowFunc( \"resize\", onWindowResize );\n }\n\n function onWindowKeyDown( e: KeyboardEvent ) : void {\n if ( _public.isOpen() && _configuration.shortcutKeysEnabled ) {\n if ( e.code === KeyCode.escape ) {\n e.preventDefault();\n onDialogClose();\n } else {\n\n if ( _configuration_ShortcutKeysEnabled ) {\n if ( e.code === KeyCode.left ) {\n e.preventDefault();\n onDialogBack();\n \n } else if ( e.code === KeyCode.right ) {\n e.preventDefault();\n onDialogNext();\n \n } else if ( e.code === KeyCode.up ) {\n e.preventDefault();\n onWindowKeyCodeUp();\n \n } else if ( e.code === KeyCode.down ) {\n e.preventDefault();\n onWindowKeyCodeDown();\n }\n }\n }\n }\n }\n\n function onWindowResize() : void {\n if ( _public.isOpen() ) {\n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeUp() : void {\n if ( _groups[ _groups_Current ].position !== 0 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n\n function onWindowKeyCodeDown() : void {\n if ( _groups[ _groups_Current ].position !== _groups[ _groups_Current ].keys.length - 1 ) {\n removeFocusClassFromLastElement();\n\n _groups[ _groups_Current ].position = _groups[ _groups_Current ].keys.length - 1;\n \n showDialogAndSetPosition();\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Options\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function buildAttributeOptions( newOptions: any ) {\n let options: BindingOptions = Data.getDefaultObject( newOptions, {} as BindingOptions );\n options.order = Data.getDefaultNumber( options.order, 0 );\n options.attach = Data.getDefaultBoolean( options.attach, true );\n options.sendClick = Data.getDefaultBoolean( options.sendClick, false );\n options.alignTop = Data.getDefaultBoolean( options.alignTop, false );\n options.alignRight = Data.getDefaultBoolean( options.alignRight, false );\n options.isHint = Data.getDefaultBoolean( options.isHint, false );\n options.alignHintToClickPosition = Data.getDefaultBoolean( options.alignHintToClickPosition, false );\n options.showDisabledBackground = Data.getDefaultBoolean( options.showDisabledBackground, true );\n options.removeHintWhenViewed = Data.getDefaultBoolean( options.removeHintWhenViewed, false );\n options.group = Data.getDefaultString( options.group, _groups_Default );\n\n options = buildAttributeOptionStrings( options );\n\n return buildAttributeOptionCustomTriggers( options );\n }\n\n function buildAttributeOptionStrings( options: BindingOptions ) : BindingOptions {\n options.title = Data.getDefaultString( options.title, Char.empty );\n options.description = Data.getDefaultString( options.description, Char.empty );\n options.tooltip = Data.getDefaultString( options.tooltip, Char.empty );\n\n return options;\n }\n\n function buildAttributeOptionCustomTriggers( options: BindingOptions ) : BindingOptions {\n options.events = Data.getDefaultObject( options.events, {} as Events );\n options.events!.onEnter = Data.getDefaultFunction( options.events!.onEnter, null );\n options.events!.onLeave = Data.getDefaultFunction( options.events!.onLeave, null );\n options.events!.onClose = Data.getDefaultFunction( options.events!.onClose, null );\n options.events!.onFinish = Data.getDefaultFunction( options.events!.onFinish, null );\n options.events!.onOpen = Data.getDefaultFunction( options.events!.onOpen, null );\n options.events!.onStart = Data.getDefaultFunction( options.events!.onStart, null );\n options.events!.onAddStep = Data.getDefaultFunction( options.events!.onAddStep, null );\n options.events!.onRemoveStep = Data.getDefaultFunction( options.events!.onRemoveStep, null );\n\n return options;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Triggering Custom Events\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function fireCustomTriggerEvent( triggerFunction: any, ...args : any[] ) : void {\n if ( Is.definedFunction( triggerFunction ) ) {\n triggerFunction.apply( null, [].slice.call( args, 0 ) );\n }\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Browser URL Parameters\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getBrowserUrlParameters() : boolean {\n let show: boolean = false;\n\n if ( _configuration.browserUrlParametersEnabled ) {\n const url: string = window.location.href;\n const urlArguments: any = getBrowserUrlArguments( url );\n\n if ( Is.defined( urlArguments.sjOrderId ) ) {\n const orderId: number = parseInt( urlArguments.sjOrderId, 10 );\n\n if ( !isNaN( orderId ) && orderId <= _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = orderId;\n }\n }\n\n if ( Is.defined( urlArguments.sjShow ) ) {\n show = urlArguments.sjShow === \"true\";\n }\n }\n\n return show;\n }\n\n function getBrowserUrlArguments( url: string ) : any {\n const urlArguments: any = {};\n const urlDataParts: string[] = url.split( \"?\" );\n\n if ( urlDataParts.length > 1 ) {\n const parsedArgs: string[] = urlDataParts[ 1 ].split( \"&\" );\n const parsedArgsLength: number = parsedArgs.length;\n\n for ( let parsedArgsIndex: number = 0; parsedArgsIndex < parsedArgsLength; parsedArgsIndex++ ) {\n const parsedArg: string[] = parsedArgs[ parsedArgsIndex ].split( \"=\" );\n\n urlArguments[ parsedArg[ 0 ] ] = parsedArg[ 1 ];\n }\n }\n\n return urlArguments;\n }\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Default Parameter/Option Handling\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n function getObjectFromString( objectString: any ) : StringToJson {\n const result: StringToJson = {\n parsed: true,\n object: null\n } as StringToJson;\n\n try {\n if ( Is.definedString( objectString ) ) {\n result.object = JSON.parse( objectString );\n }\n\n } catch ( e1: any ) {\n try {\n result.object = eval( \"(\" + objectString + \")\" );\n\n if ( Is.definedFunction( result.object ) ) {\n result.object = result.object();\n }\n \n } catch ( e2: any ) {\n if ( !_configuration.safeMode ) {\n console.error( _configuration.objectErrorText!.replace( \"{{error_1}}\", e1.message ).replace( \"{{error_2}}\", e2.message ) );\n result.parsed = false;\n }\n \n result.object = null;\n }\n }\n\n return result;\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Managing Steps\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function resetDialogPosition() : void {\n if ( _public.isOpen() ) {\n onDialogClose( false );\n\n _groups[ _groups_Current ].position = 0;\n }\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions: Helpers: Configuration\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n function buildDefaultConfiguration( newConfiguration: Configuration = {} ) : void {\n _configuration = Data.getDefaultObject( newConfiguration, {} as Configuration );\n _configuration.safeMode = Data.getDefaultBoolean( _configuration.safeMode, true );\n _configuration.domElementTypes = Data.getDefaultStringOrArray( _configuration.domElementTypes, [ \"*\" ] );\n _configuration.showCloseButton = Data.getDefaultBoolean( _configuration.showCloseButton, true );\n _configuration.shortcutKeysEnabled = Data.getDefaultBoolean( _configuration.shortcutKeysEnabled, true );\n _configuration.showProgressDots = Data.getDefaultBoolean( _configuration.showProgressDots, true );\n _configuration.browserUrlParametersEnabled = Data.getDefaultBoolean( _configuration.browserUrlParametersEnabled, true );\n _configuration.showProgressDotNumbers = Data.getDefaultBoolean( _configuration.showProgressDotNumbers, false );\n _configuration.showButtons = Data.getDefaultBoolean( _configuration.showButtons, true );\n _configuration.showDoNotShowAgain = Data.getDefaultBoolean( _configuration.showDoNotShowAgain, false );\n _configuration.tooltipDelay = Data.getDefaultNumber( _configuration.tooltipDelay, 750 );\n _configuration.showProgressDotToolTips = Data.getDefaultBoolean( _configuration.showProgressDotToolTips, true );\n _configuration.closeDialogOnDisabledBackgroundClick = Data.getDefaultBoolean( _configuration.closeDialogOnDisabledBackgroundClick, false );\n _configuration.showProgressBar = Data.getDefaultBoolean( _configuration.showProgressBar, false );\n _configuration.scrollToElements = Data.getDefaultBoolean( _configuration.scrollToElements, false );\n _configuration.dialogMovingEnabled = Data.getDefaultBoolean( _configuration.dialogMovingEnabled, false );\n _configuration.showProgressBarText = Data.getDefaultBoolean( _configuration.showProgressBarText, false );\n\n buildDefaultConfigurationStrings();\n buildDefaultConfigurationCustomTriggers();\n }\n\n function buildDefaultConfigurationStrings() : void {\n _configuration.backButtonText = Data.getDefaultAnyString( _configuration.backButtonText, \"Back\" );\n _configuration.nextButtonText = Data.getDefaultAnyString( _configuration.nextButtonText, \"Next\" );\n _configuration.finishButtonText = Data.getDefaultAnyString( _configuration.finishButtonText, \"Finish\" );\n _configuration.closeButtonToolTipText = Data.getDefaultAnyString( _configuration.closeButtonToolTipText, \"Close\" );\n _configuration.doNotShowAgainText = Data.getDefaultAnyString( _configuration.doNotShowAgainText, \"Do not show again\" );\n _configuration.objectErrorText = Data.getDefaultAnyString( _configuration.objectErrorText, \"Errors in object: {{error_1}}, {{error_2}}\" );\n _configuration.attributeNotValidErrorText = Data.getDefaultAnyString( _configuration.attributeNotValidErrorText, \"The attribute '{{attribute_name}}' is not a valid object.\" );\n _configuration.attributeNotSetErrorText = Data.getDefaultAnyString( _configuration.attributeNotSetErrorText, \"The attribute '{{attribute_name}}' has not been set correctly.\" );\n _configuration.closeDialogConfirmationText = Data.getDefaultAnyString( _configuration.closeDialogConfirmationText, Char.empty );\n }\n\n function buildDefaultConfigurationCustomTriggers() : void {\n _configuration.onDoNotShowAgainChange = Data.getDefaultFunction( _configuration.onDoNotShowAgainChange, null );\n }\n\n\n\t/*\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t * Public API Functions:\n\t * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t */\n\n const _public: PublicApi = {\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Show/Hide\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n start: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Default );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n _groups[ _groups_Current ].position = 0;\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n show: function ( group: string = Char.empty ) : PublicApi {\n if ( !_public.isOpen() ) {\n _groups_Current = Data.getDefaultString( group, _groups_Current );\n \n if ( _groups.hasOwnProperty( _groups_Current ) ) {\n if ( _groups[ _groups_Current ].position === _groups[ _groups_Current ].keys.length - 1 ) {\n _groups[ _groups_Current ].position = 0;\n }\n \n showDialogAndSetPosition();\n }\n }\n \n return _public;\n },\n\n hide: function () : PublicApi {\n if ( _public.isOpen() ) {\n onDialogClose();\n }\n \n return _public;\n },\n\n isOpen: function () : boolean {\n return Is.defined( _element_Dialog ) && _element_Dialog.style.display === \"block\";\n },\n\n isComplete: function () : boolean {\n return _groups[ _groups_Current ].position >= _groups[ _groups_Current ].keys.length - 1;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Managing Steps\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n addDocumentSteps: function () : PublicApi {\n getElements();\n\n return _public;\n },\n\n addStep: function ( element: HTMLElement, options: BindingOptions ) : PublicApi {\n if ( Is.definedObject( element ) && Is.definedObject( options ) ) {\n setupElement( element, buildAttributeOptions( options ) );\n \n _groups[ _groups_Current ].keys.sort();\n \n resetDialogPosition();\n }\n \n return _public;\n },\n\n removeStep: function ( element: HTMLElement ) : PublicApi {\n if ( Is.definedObject( element ) ) {\n let removed: boolean = false;\n \n for ( let group in _groups ) {\n if ( _groups.hasOwnProperty( group ) ) {\n for ( let order in _groups[ group ].json ) {\n if ( _groups[ group ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ group ].json[ order ];\n \n if ( bindingOptions._currentView.element === element ) {\n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n \n _groups[ group ].keys.splice( _groups[ group ].keys.indexOf( bindingOptions.order! ), 1 );\n \n delete _groups[ group ].json[ bindingOptions.order! ];\n \n _groups[ group ].keys.sort();\n \n removed = true;\n break;\n }\n }\n }\n }\n }\n \n if ( !removed ) {\n DomElement.clearElementsByClassName( element, \"journey-js-hint\" );\n } else {\n resetDialogPosition();\n }\n }\n \n return _public;\n },\n\n clearSteps: function ( group: string = Char.empty ) : PublicApi {\n resetDialogPosition();\n\n for ( let groupName in _groups ) {\n if ( _groups.hasOwnProperty( groupName ) ) {\n if ( !Is.definedString( group ) || group === groupName ) {\n for ( let order in _groups[ groupName ].json ) {\n if ( _groups[ groupName ].json.hasOwnProperty( order ) ) {\n const bindingOptions: BindingOptions = _groups[ groupName ].json[ order ];\n \n fireCustomTriggerEvent( bindingOptions.events!.onRemoveStep, bindingOptions._currentView.element );\n }\n }\n }\n }\n }\n \n if ( Is.definedString( group ) ) {\n if ( _groups.hasOwnProperty( group ) ) {\n delete _groups[ group ];\n }\n \n } else {\n _groups = {} as Groups;\n }\n \n if ( !Is.definedString( group ) || group === _groups_Default ) {\n setupDefaultGroup( _groups );\n }\n \n return _public;\n },\n\n clearHints: function () : PublicApi {\n DomElement.clearElementsByClassName( document.body, \"journey-js-hint\" );\n\n return _public;\n },\n\n reverseStepOrder: function () : PublicApi {\n _groups[ _groups_Current ].keys.reverse();\n\n resetDialogPosition();\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Configuration\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n setConfiguration: function ( newConfiguration: any ) : PublicApi {\n if ( Is.definedObject( newConfiguration ) ) {\n let configurationHasChanged: boolean = false;\n const newInternalConfiguration: any = _configuration;\n\n for ( let propertyName in newConfiguration ) {\n if ( newConfiguration.hasOwnProperty( propertyName ) && _configuration.hasOwnProperty( propertyName ) && newInternalConfiguration[ propertyName ] !== newConfiguration[ propertyName ] ) {\n newInternalConfiguration[ propertyName ] = newConfiguration[ propertyName ];\n configurationHasChanged = true;\n }\n }\n \n if ( configurationHasChanged ) {\n buildDefaultConfiguration( newInternalConfiguration );\n }\n }\n \n return _public;\n },\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Public API Functions: Additional Data\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n getVersion: function (): string {\n return \"2.0.0\";\n }\n };\n\n\n /*\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n * Initialize Journey.js\n * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n */\n\n ( () => {\n buildDefaultConfiguration();\n\n document.addEventListener( \"DOMContentLoaded\", () => {\n setupDefaultGroup();\n renderDisabledBackground();\n renderDialog();\n renderToolTip();\n getElements();\n buildDocumentEvents();\n\n if ( getBrowserUrlParameters() ) {\n _public.show();\n }\n } );\n\n if ( !Is.defined( window.$journey ) ) {\n window.$journey = _public;\n }\n } ) ();\n} ) ();"]} \ No newline at end of file diff --git a/dist/journey.min.js b/dist/journey.min.js index 111bb49..470a58c 100644 --- a/dist/journey.min.js +++ b/dist/journey.min.js @@ -1 +1 @@ -"use strict";var Constants,Is,Data,DomElement;(Constants||(Constants={})).JOURNEY_JS_ATTRIBUTE_NAME="data-journey-js",(e=>{function t(e){return null!=e&&""!==e}function o(e){return t(e)&&"object"==typeof e}e.defined=t,e.definedObject=o,e.definedBoolean=function(e){return t(e)&&"boolean"==typeof e},e.definedString=function(e){return t(e)&&"string"==typeof e},e.definedFunction=function(e){return t(e)&&"function"==typeof e},e.definedNumber=function(e){return t(e)&&"number"==typeof e},e.definedArray=function(e){return o(e)&&e instanceof Array}})(Is||(Is={})),(e=>{function t(e,t){return Is.definedArray(e)?e:t}e.getDefaultAnyString=function(e,t){return"string"==typeof e?e:t},e.getDefaultString=function(e,t){return Is.definedString(e)?e:t},e.getDefaultBoolean=function(e,t){return Is.definedBoolean(e)?e:t},e.getDefaultNumber=function(e,t){return Is.definedNumber(e)?e:t},e.getDefaultFunction=function(e,t){return Is.definedFunction(e)?e:t},e.getDefaultObject=function(e,t){return Is.definedObject(e)?e:t},e.getDefaultArray=t,e.getDefaultStringOrArray=function(e,o){let n=o;if(Is.definedString(e)){const t=e.toString().split(" ");0===t.length?e=o:n=t}else n=t(e,o);return n}})(Data||(Data={})),(e=>{function t(e,t=""){const o=e.toLowerCase();let n="text"===o?document.createTextNode(""):document.createElement(o);return Is.defined(t)&&(n.className=t),n}function o(){const e=document.documentElement;return{left:(window.pageXOffset||e.scrollLeft)-(e.clientLeft||0),top:(window.pageYOffset||e.scrollTop)-(e.clientTop||0)}}e.create=t,e.getOffset=function(e){const t={left:0,top:0};for(;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t.left+=e.offsetLeft-e.scrollLeft,t.top+=e.offsetTop-e.scrollTop,e=e.offsetParent;return t},e.getScrollPosition=o,e.getStyleValueByName=function(e,t){let o=null;return document.defaultView.getComputedStyle?o=document.defaultView.getComputedStyle(e,null).getPropertyValue(t):e.currentStyle&&(o=e.currentStyle[t]),o},e.addNode=function(e,t){try{e.contains(t)||e.appendChild(t)}catch(e){console.warn(e.message)}},e.removeNode=function(e,t){try{e.contains(t)&&e.removeChild(t)}catch(e){console.warn(e.message)}},e.cancelBubble=function(e){e.preventDefault(),e.cancelBubble=!0},e.showElementAtMousePosition=function(e,t){let n=e.pageX,i=e.pageY;const r=o();t.style.display="block",n+t.offsetWidth>window.innerWidth?n-=t.offsetWidth:n++,i+t.offsetHeight>window.innerHeight?i-=t.offsetHeight:i++,n{let _configuration={},_configuration_ShortcutKeysEnabled=!0;const _groups_Default="default";let _groups_Current=_groups_Default,_groups={},_element_Focus_Element_PositionStyle="",_element_Disabled_Background,_element_Dialog,_element_Dialog_Close_Button,_element_Dialog_Title,_element_Dialog_Description,_element_Dialog_CheckBox_Container,_element_Dialog_CheckBox_Input,_element_Dialog_ProgressDots,_element_Dialog_ProgressBar,_element_Dialog_ProgressBar_Percentage,_element_Dialog_ProgressBar_Percentage_Text,_element_Dialog_Buttons,_element_Dialog_Buttons_Back_Button,_element_Dialog_Buttons_Next_Button,_element_Dialog_IsHint=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_X=0,_element_Dialog_Move_Y=0,_element_ToolTip,_element_ToolTip_Timer=0;function setupDefaultGroup(e=null){_groups=Data.getDefaultObject(e,{}),_groups[_groups_Default]={json:{},keys:[],position:0}}function setupNewGroup(e){_groups.hasOwnProperty(e)||(_groups[e]={json:{},keys:[],position:0})}function getGroupBindingOptions(){return _groups[_groups_Current].json[_groups[_groups_Current].keys[_groups[_groups_Current].position]]}function renderDisabledBackground(){_element_Disabled_Background=DomElement.create("div","journey-js-disabled-background"),_element_Disabled_Background.onclick=()=>{_configuration.closeDialogOnDisabledBackgroundClick&&onDialogClose()}}function showDisabledBackground(){DomElement.addNode(document.body,_element_Disabled_Background)}function hideDisabledBackground(){DomElement.removeNode(document.body,_element_Disabled_Background)}function renderDialog(){_element_Dialog=DomElement.create("div","journey-js-dialog"),_element_Dialog.style.display="none",document.body.appendChild(_element_Dialog),_element_Dialog_Close_Button=DomElement.create("button","close"),_element_Dialog.appendChild(_element_Dialog_Close_Button),_element_Dialog_Close_Button.onclick=()=>{onDialogClose()},addToolTip(_element_Dialog_Close_Button,_configuration.closeButtonToolTipText),_element_Dialog_Title=DomElement.create("div","title"),_element_Dialog.appendChild(_element_Dialog_Title),_element_Dialog_Description=DomElement.create("div","description"),_element_Dialog.appendChild(_element_Dialog_Description),_element_Dialog_CheckBox_Container=DomElement.create("div","checkbox-container"),_element_Dialog.appendChild(_element_Dialog_CheckBox_Container),_element_Dialog_CheckBox_Input=DomElement.createCheckBox(_element_Dialog_CheckBox_Container,_configuration.doNotShowAgainText),_element_Dialog_CheckBox_Input.onchange=()=>{_configuration.showDoNotShowAgain&&fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange,_element_Dialog_CheckBox_Input.checked)},_element_Dialog_ProgressDots=DomElement.create("div","progress-dots"),_element_Dialog.appendChild(_element_Dialog_ProgressDots),_element_Dialog_ProgressBar=DomElement.create("div","progress-bar"),_element_Dialog.appendChild(_element_Dialog_ProgressBar),_element_Dialog_ProgressBar_Percentage=DomElement.create("div","progress-bar-percentage"),_element_Dialog_ProgressBar.appendChild(_element_Dialog_ProgressBar_Percentage),_element_Dialog_ProgressBar_Percentage_Text=DomElement.create("p","progress-bar-percentage-text"),_element_Dialog_ProgressBar_Percentage.appendChild(_element_Dialog_ProgressBar_Percentage_Text),_element_Dialog_Buttons=DomElement.create("div","buttons"),_element_Dialog.appendChild(_element_Dialog_Buttons),_element_Dialog_Buttons_Back_Button=DomElement.create("button","back"),_element_Dialog_Buttons_Back_Button.onclick=onDialogBack,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Back_Button),_element_Dialog_Buttons_Next_Button=DomElement.create("button","next"),_element_Dialog_Buttons_Next_Button.onclick=onDialogNext,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Next_Button),makeDialogMovable()}function onDialogClose(e=!0){let t=!1;if(t=!Is.definedString(_configuration.closeDialogConfirmationText)||!e||confirm(_configuration.closeDialogConfirmationText),t){const e=getGroupBindingOptions();Is.defined(e)&&Is.defined(e._currentView.element)&&fireCustomTriggerEvent(e.events.onClose,e._currentView.element),removeFocusClassFromLastElement(!1),hideDisabledBackground(),hideToolTip(),_element_Dialog.style.display="none"}}function onDialogBack(){_groups[_groups_Current].position>0&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position--,showDialogAndSetPosition())}function onDialogNext(){if(_groups[_groups_Current].position===_groups[_groups_Current].keys.length-1){const e=getGroupBindingOptions();onDialogClose(!1),fireCustomTriggerEvent(e.events.onFinish,e._currentView.element)}else removeFocusClassFromLastElement(),_groups[_groups_Current].position++,showDialogAndSetPosition()}function showDialogAndSetPosition(){const e=getGroupBindingOptions();if(Is.defined(e)&&Is.defined(e._currentView.element)){e.showDisabledBackground?showDisabledBackground():hideDisabledBackground(),hideToolTip(),_element_Dialog_Close_Button.style.display=_configuration.showCloseButton?"block":"none",_configuration_ShortcutKeysEnabled=!0,e._currentView.element.className+=" journey-js-element-focus",_configuration.scrollToElements&&e._currentView.element.scrollIntoView();const t=DomElement.getStyleValueByName(e._currentView.element,"position");""!==t&&"static"===t.toLowerCase()&&(_element_Focus_Element_PositionStyle=t,e._currentView.element.style.position="relative"),DomElement.showElementBasedOnCondition(_element_Dialog_CheckBox_Container,_configuration.showDoNotShowAgain),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressDots,_configuration.showProgressDots&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar,_configuration.showProgressBar&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text,_configuration.showProgressBarText),DomElement.showElementBasedOnCondition(_element_Dialog_Buttons,_configuration.showButtons),_element_Dialog_Buttons_Back_Button.innerHTML=_configuration.backButtonText,_element_Dialog_Buttons_Back_Button.disabled=0===_groups[_groups_Current].position,_groups[_groups_Current].position>=_groups[_groups_Current].keys.length-1?_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.finishButtonText:_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.nextButtonText,setDialogText(e),setDialogPosition(null,e),buildProcessDots(),setProgressBarPosition(),fireCustomTriggerEvent(e.events.onEnter,e._currentView.element),e.sendClick&&e._currentView.element.click()}}function setDialogText(e){Is.definedString(e.title)?_element_Dialog_Title.innerHTML=e.title:_element_Dialog_Title.innerHTML="",Is.definedString(e.description)?_element_Dialog_Description.innerHTML=e.description:_element_Dialog_Description.innerHTML=""}function setDialogPosition(e,t){if("block"!==_element_Dialog.style.display&&(_element_Dialog.style.display="block",fireCustomTriggerEvent(t.events.onOpen,t._currentView.element)),0===_groups[_groups_Current].position&&fireCustomTriggerEvent(t.events.onStart,t._currentView.element),_element_Dialog_IsHint=!0===t.isHint,t.attach||t.isHint)if(t.isHint&&t.alignHintToClickPosition)DomElement.showElementAtMousePosition(e,_element_Dialog);else{const e=DomElement.getOffset(t._currentView.element);let o=e.top+t._currentView.element.offsetHeight,n=e.left;(n+_element_Dialog.offsetWidth>window.innerWidth||t.alignRight)&&(n-=_element_Dialog.offsetWidth,n+=t._currentView.element.offsetWidth),(o+_element_Dialog.offsetHeight>window.innerHeight||t.alignTop)&&(o-=_element_Dialog.offsetHeight+t._currentView.element.offsetHeight),_element_Dialog.style.top=o+"px",_element_Dialog.style.left=n+"px"}else{const e=DomElement.getScrollPosition(),t=Math.max(0,(window.innerWidth-_element_Dialog.offsetWidth)/2+e.left),o=Math.max(0,(window.innerHeight-_element_Dialog.offsetHeight)/2+e.top);_element_Dialog.style.left=t+"px",_element_Dialog.style.top=o+"px"}}function removeFocusClassFromLastElement(e=!0){const t=getGroupBindingOptions();Is.defined(t)&&Is.defined(t._currentView.element)&&(t._currentView.element.className=t._currentView.element.className.replace(" journey-js-element-focus",""),Is.defined(_element_Focus_Element_PositionStyle)&&(t._currentView.element.style.position=_element_Focus_Element_PositionStyle),e&&fireCustomTriggerEvent(t.events.onLeave,t._currentView.element))}function buildProcessDots(){if(_element_Dialog_ProgressDots.innerHTML="",_configuration.showProgressDots){const e=_groups[_groups_Current].keys.length;for(let t=0;t{removeFocusClassFromLastElement(),_groups[_groups_Current].position=e,showDialogAndSetPosition()}),_element_Dialog_ProgressDots.appendChild(n),_configuration.showProgressDotToolTips&&(Is.definedString(o.tooltip)?addToolTip(n,o.tooltip):addToolTip(n,o.title)),_configuration.showProgressDotNumbers&&(n.className+=" dot-number",n.innerHTML=(e+1).toString())}function setProgressBarPosition(){if(_configuration.showProgressBar){const e=_element_Dialog_ProgressBar.offsetWidth/_groups[_groups_Current].keys.length,t=(_groups[_groups_Current].position+1)*e,o=Math.ceil((_groups[_groups_Current].position+1)/_groups[_groups_Current].keys.length*100);_element_Dialog_ProgressBar_Percentage.style.width=t+"px",_element_Dialog_ProgressBar_Percentage_Text.innerHTML=o+"%"}}function makeDialogMovable(){_element_Dialog_Title.onmousedown=onMoveTitleBarMouseDown,_element_Dialog_Title.onmouseup=onMoveTitleBarMouseUp,_element_Dialog_Title.oncontextmenu=onMoveTitleBarMouseUp,document.body.addEventListener("mousemove",onMoveDocumentMouseMove),document.body.addEventListener("mouseleave",onMoveDocumentMouseLeave)}function onMoveTitleBarMouseDown(e){_element_Dialog_Move_IsMoving||_element_Dialog_IsHint||!_configuration.dialogMovingEnabled||(_element_Dialog.className+=" journey-js-dialog-moving",_element_Dialog_Move_IsMoving=!0,_element_Dialog_Move_X=e.pageX-_element_Dialog.offsetLeft,_element_Dialog_Move_Y=e.pageY-_element_Dialog.offsetTop,_element_Dialog_Move_Original_X=_element_Dialog.offsetLeft,_element_Dialog_Move_Original_Y=_element_Dialog.offsetTop)}function onMoveTitleBarMouseUp(){_element_Dialog_Move_IsMoving&&(_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function onMoveDocumentMouseMove(e){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=e.pageX-_element_Dialog_Move_X+"px",_element_Dialog.style.top=e.pageY-_element_Dialog_Move_Y+"px")}function onMoveDocumentMouseLeave(){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=_element_Dialog_Move_Original_X+"px",_element_Dialog.style.top=_element_Dialog_Move_Original_Y+"px",_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function renderToolTip(){Is.defined(_element_ToolTip)||(_element_ToolTip=DomElement.create("div","journey-js-tooltip"),_element_ToolTip.style.display="none",document.body.appendChild(_element_ToolTip),document.body.addEventListener("mousemove",(()=>{hideToolTip()})),document.addEventListener("scroll",(()=>{hideToolTip()})))}function addToolTip(e,t){null!==e&&(e.onmousemove=e=>{showToolTip(e,t)})}function showToolTip(e,t){DomElement.cancelBubble(e),hideToolTip(),_element_ToolTip_Timer=setTimeout((()=>{_element_ToolTip.innerHTML=t,_element_ToolTip.style.display="block",DomElement.showElementAtMousePosition(e,_element_ToolTip)}),_configuration.tooltipDelay)}function hideToolTip(){Is.defined(_element_ToolTip)&&(0!==_element_ToolTip_Timer&&(clearTimeout(_element_ToolTip_Timer),_element_ToolTip_Timer=0),"block"===_element_ToolTip.style.display&&(_element_ToolTip.style.display="none"))}function getElements(){const e=_configuration.domElementTypes,t=e.length;for(let o=0;o{DomElement.cancelBubble(t),_element_Dialog_CheckBox_Container.style.display="none",_element_Dialog_ProgressDots.style.display="none",_element_Dialog_ProgressBar.style.display="none",_element_Dialog_Buttons.style.display="none",_configuration_ShortcutKeysEnabled=!1,setDialogText(e),setDialogPosition(t,e),e.removeHintWhenViewed&&DomElement.clearElementsByClassName(e._currentView.element,"journey-js-hint")}}function buildDocumentEvents(e=!0){const t=e?document.addEventListener:document.removeEventListener,o=e?window.addEventListener:window.removeEventListener;_configuration.shortcutKeysEnabled&&t("keydown",onWindowKeyDown),o("resize",onWindowResize)}function onWindowKeyDown(e){_public.isOpen()&&_configuration.shortcutKeysEnabled&&("Escape"===e.code?(e.preventDefault(),onDialogClose()):_configuration_ShortcutKeysEnabled&&("ArrowLeft"===e.code?(e.preventDefault(),onDialogBack()):"ArrowRight"===e.code?(e.preventDefault(),onDialogNext()):"ArrowUp"===e.code?(e.preventDefault(),onWindowKeyCodeUp()):"ArrowDown"===e.code&&(e.preventDefault(),onWindowKeyCodeDown())))}function onWindowResize(){_public.isOpen()&&showDialogAndSetPosition()}function onWindowKeyCodeUp(){0!==_groups[_groups_Current].position&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=0,showDialogAndSetPosition())}function onWindowKeyCodeDown(){_groups[_groups_Current].position!==_groups[_groups_Current].keys.length-1&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=_groups[_groups_Current].keys.length-1,showDialogAndSetPosition())}function buildAttributeOptions(e){let t=Data.getDefaultObject(e,{});return t.order=Data.getDefaultNumber(t.order,0),t.attach=Data.getDefaultBoolean(t.attach,!0),t.sendClick=Data.getDefaultBoolean(t.sendClick,!1),t.alignTop=Data.getDefaultBoolean(t.alignTop,!1),t.alignRight=Data.getDefaultBoolean(t.alignRight,!1),t.isHint=Data.getDefaultBoolean(t.isHint,!1),t.alignHintToClickPosition=Data.getDefaultBoolean(t.alignHintToClickPosition,!1),t.showDisabledBackground=Data.getDefaultBoolean(t.showDisabledBackground,!0),t.removeHintWhenViewed=Data.getDefaultBoolean(t.removeHintWhenViewed,!1),t.group=Data.getDefaultString(t.group,_groups_Default),t=buildAttributeOptionStrings(t),buildAttributeOptionCustomTriggers(t)}function buildAttributeOptionStrings(e){return e.title=Data.getDefaultString(e.title,""),e.description=Data.getDefaultString(e.description,""),e.tooltip=Data.getDefaultString(e.tooltip,""),e}function buildAttributeOptionCustomTriggers(e){return e.events=Data.getDefaultObject(e.events,{}),e.events.onEnter=Data.getDefaultFunction(e.events.onEnter,null),e.events.onLeave=Data.getDefaultFunction(e.events.onLeave,null),e.events.onClose=Data.getDefaultFunction(e.events.onClose,null),e.events.onFinish=Data.getDefaultFunction(e.events.onFinish,null),e.events.onOpen=Data.getDefaultFunction(e.events.onOpen,null),e.events.onStart=Data.getDefaultFunction(e.events.onStart,null),e.events.onAddStep=Data.getDefaultFunction(e.events.onAddStep,null),e.events.onRemoveStep=Data.getDefaultFunction(e.events.onRemoveStep,null),e}function fireCustomTriggerEvent(e,...t){Is.definedFunction(e)&&e.apply(null,[].slice.call(t,0))}function getBrowserUrlParameters(){let e=!1;if(_configuration.browserUrlParametersEnabled){const t=getBrowserUrlArguments(window.location.href);if(Is.defined(t.sjOrderId)){const e=parseInt(t.sjOrderId,10);!isNaN(e)&&e<=_groups[_groups_Current].keys.length-1&&(_groups[_groups_Current].position=e)}Is.defined(t.sjShow)&&(e="true"===t.sjShow)}return e}function getBrowserUrlArguments(e){const t={},o=e.split("?");if(o.length>1){const e=o[1].split("&"),n=e.length;for(let o=0;o=_groups[_groups_Current].keys.length-1},addDocumentSteps:function(){return getElements(),_public},addStep:function(e,t){return Is.definedObject(e)&&Is.definedObject(t)&&(setupElement(e,buildAttributeOptions(t)),_groups[_groups_Current].keys.sort(),resetDialogPosition()),_public},removeStep:function(e){if(Is.definedObject(e)){let t=!1;for(let o in _groups)if(_groups.hasOwnProperty(o))for(let n in _groups[o].json)if(_groups[o].json.hasOwnProperty(n)){const i=_groups[o].json[n];if(i._currentView.element===e){fireCustomTriggerEvent(i.events.onRemoveStep,i._currentView.element),_groups[o].keys.splice(_groups[o].keys.indexOf(i.order),1),delete _groups[o].json[i.order],_groups[o].keys.sort(),t=!0;break}}t?resetDialogPosition():DomElement.clearElementsByClassName(e,"journey-js-hint")}return _public},clearSteps:function(e=""){resetDialogPosition();for(let t in _groups)if(_groups.hasOwnProperty(t)&&(!Is.definedString(e)||e===t))for(let e in _groups[t].json)if(_groups[t].json.hasOwnProperty(e)){const o=_groups[t].json[e];fireCustomTriggerEvent(o.events.onRemoveStep,o._currentView.element)}return Is.definedString(e)?_groups.hasOwnProperty(e)&&delete _groups[e]:_groups={},Is.definedString(e)&&e!==_groups_Default||setupDefaultGroup(_groups),_public},clearHints:function(){return DomElement.clearElementsByClassName(document.body,"journey-js-hint"),_public},reverseStepOrder:function(){return _groups[_groups_Current].keys.reverse(),resetDialogPosition(),_public},setConfiguration:function(e){if(Is.definedObject(e)){let t=!1;const o=_configuration;for(let n in e)e.hasOwnProperty(n)&&_configuration.hasOwnProperty(n)&&o[n]!==e[n]&&(o[n]=e[n],t=!0);t&&buildDefaultConfiguration(o)}return _public},getVersion:function(){return"2.0.0"}};buildDefaultConfiguration(),document.addEventListener("DOMContentLoaded",(()=>{setupDefaultGroup(),renderDisabledBackground(),renderDialog(),renderToolTip(),getElements(),buildDocumentEvents(),getBrowserUrlParameters()&&_public.show()})),Is.defined(window.$journey)||(window.$journey=_public)})(); \ No newline at end of file +"use strict";var Constants,Is,Data,DomElement;(Constants||(Constants={})).JOURNEY_JS_ATTRIBUTE_NAME="data-journey-js",(e=>{function t(e){return null!=e&&""!==e}function o(e){return t(e)&&"object"==typeof e}e.defined=t,e.definedObject=o,e.definedBoolean=function(e){return t(e)&&"boolean"==typeof e},e.definedString=function(e){return t(e)&&"string"==typeof e},e.definedFunction=function(e){return t(e)&&"function"==typeof e},e.definedNumber=function(e){return t(e)&&"number"==typeof e},e.definedArray=function(e){return o(e)&&e instanceof Array}})(Is||(Is={})),(e=>{function t(e,t){return Is.definedArray(e)?e:t}e.getDefaultAnyString=function(e,t){return"string"==typeof e?e:t},e.getDefaultString=function(e,t){return Is.definedString(e)?e:t},e.getDefaultBoolean=function(e,t){return Is.definedBoolean(e)?e:t},e.getDefaultNumber=function(e,t){return Is.definedNumber(e)?e:t},e.getDefaultFunction=function(e,t){return Is.definedFunction(e)?e:t},e.getDefaultObject=function(e,t){return Is.definedObject(e)?e:t},e.getDefaultArray=t,e.getDefaultStringOrArray=function(e,o){let n=o;if(Is.definedString(e)){const t=e.toString().split(" ");0===t.length?e=o:n=t}else n=t(e,o);return n}})(Data||(Data={})),(e=>{function t(e,t=""){const o=e.toLowerCase();let n="text"===o?document.createTextNode(""):document.createElement(o);return Is.defined(t)&&(n.className=t),n}function o(){const e=document.documentElement;return{left:e.scrollLeft-(e.clientLeft||0),top:e.scrollTop-(e.clientTop||0)}}e.create=t,e.getOffset=function(e){const t={left:0,top:0};for(;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t.left+=e.offsetLeft-e.scrollLeft,t.top+=e.offsetTop-e.scrollTop,e=e.offsetParent;return t},e.getScrollPosition=o,e.getStyleValueByName=function(e,t){let o=null;return document.defaultView.getComputedStyle?o=document.defaultView.getComputedStyle(e,null).getPropertyValue(t):e.currentStyle&&(o=e.currentStyle[t]),o},e.addNode=function(e,t){try{e.contains(t)||e.appendChild(t)}catch(e){console.warn(e.message)}},e.removeNode=function(e,t){try{e.contains(t)&&e.removeChild(t)}catch(e){console.warn(e.message)}},e.cancelBubble=function(e){e.preventDefault(),e.cancelBubble=!0},e.showElementAtMousePosition=function(e,t){let n=e.pageX,i=e.pageY;const r=o();t.style.display="block",n+t.offsetWidth>window.innerWidth?n-=t.offsetWidth:n++,i+t.offsetHeight>window.innerHeight?i-=t.offsetHeight:i++,n{let _configuration={},_configuration_ShortcutKeysEnabled=!0;const _groups_Default="default";let _groups_Current=_groups_Default,_groups={},_element_Focus_Element_PositionStyle="",_element_Disabled_Background,_element_Dialog,_element_Dialog_Close_Button,_element_Dialog_Title,_element_Dialog_Description,_element_Dialog_CheckBox_Container,_element_Dialog_CheckBox_Input,_element_Dialog_ProgressDots,_element_Dialog_ProgressBar,_element_Dialog_ProgressBar_Percentage,_element_Dialog_ProgressBar_Percentage_Text,_element_Dialog_Buttons,_element_Dialog_Buttons_Back_Button,_element_Dialog_Buttons_Next_Button,_element_Dialog_IsHint=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_X=0,_element_Dialog_Move_Y=0,_element_ToolTip,_element_ToolTip_Timer=0;function setupDefaultGroup(e=null){_groups=Data.getDefaultObject(e,{}),_groups[_groups_Default]={json:{},keys:[],position:0}}function setupNewGroup(e){_groups.hasOwnProperty(e)||(_groups[e]={json:{},keys:[],position:0})}function getGroupBindingOptions(){return _groups[_groups_Current].json[_groups[_groups_Current].keys[_groups[_groups_Current].position]]}function renderDisabledBackground(){_element_Disabled_Background=DomElement.create("div","journey-js-disabled-background"),_element_Disabled_Background.onclick=()=>{_configuration.closeDialogOnDisabledBackgroundClick&&onDialogClose()}}function showDisabledBackground(){DomElement.addNode(document.body,_element_Disabled_Background)}function hideDisabledBackground(){DomElement.removeNode(document.body,_element_Disabled_Background)}function renderDialog(){_element_Dialog=DomElement.create("div","journey-js-dialog"),_element_Dialog.style.display="none",document.body.appendChild(_element_Dialog),_element_Dialog_Close_Button=DomElement.create("button","close"),_element_Dialog.appendChild(_element_Dialog_Close_Button),_element_Dialog_Close_Button.onclick=()=>{onDialogClose()},addToolTip(_element_Dialog_Close_Button,_configuration.closeButtonToolTipText),_element_Dialog_Title=DomElement.create("div","title"),_element_Dialog.appendChild(_element_Dialog_Title),_element_Dialog_Description=DomElement.create("div","description"),_element_Dialog.appendChild(_element_Dialog_Description),_element_Dialog_CheckBox_Container=DomElement.create("div","checkbox-container"),_element_Dialog.appendChild(_element_Dialog_CheckBox_Container),_element_Dialog_CheckBox_Input=DomElement.createCheckBox(_element_Dialog_CheckBox_Container,_configuration.doNotShowAgainText),_element_Dialog_CheckBox_Input.onchange=()=>{_configuration.showDoNotShowAgain&&fireCustomTriggerEvent(_configuration.onDoNotShowAgainChange,_element_Dialog_CheckBox_Input.checked)},_element_Dialog_ProgressDots=DomElement.create("div","progress-dots"),_element_Dialog.appendChild(_element_Dialog_ProgressDots),_element_Dialog_ProgressBar=DomElement.create("div","progress-bar"),_element_Dialog.appendChild(_element_Dialog_ProgressBar),_element_Dialog_ProgressBar_Percentage=DomElement.create("div","progress-bar-percentage"),_element_Dialog_ProgressBar.appendChild(_element_Dialog_ProgressBar_Percentage),_element_Dialog_ProgressBar_Percentage_Text=DomElement.create("p","progress-bar-percentage-text"),_element_Dialog_ProgressBar_Percentage.appendChild(_element_Dialog_ProgressBar_Percentage_Text),_element_Dialog_Buttons=DomElement.create("div","buttons"),_element_Dialog.appendChild(_element_Dialog_Buttons),_element_Dialog_Buttons_Back_Button=DomElement.create("button","back"),_element_Dialog_Buttons_Back_Button.onclick=onDialogBack,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Back_Button),_element_Dialog_Buttons_Next_Button=DomElement.create("button","next"),_element_Dialog_Buttons_Next_Button.onclick=onDialogNext,_element_Dialog_Buttons.appendChild(_element_Dialog_Buttons_Next_Button),makeDialogMovable()}function onDialogClose(e=!0){let t=!1;if(t=!Is.definedString(_configuration.closeDialogConfirmationText)||!e||confirm(_configuration.closeDialogConfirmationText),t){const e=getGroupBindingOptions();Is.defined(e)&&Is.defined(e._currentView.element)&&fireCustomTriggerEvent(e.events.onClose,e._currentView.element),removeFocusClassFromLastElement(!1),hideDisabledBackground(),hideToolTip(),_element_Dialog.style.display="none"}}function onDialogBack(){_groups[_groups_Current].position>0&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position--,showDialogAndSetPosition())}function onDialogNext(){if(_groups[_groups_Current].position===_groups[_groups_Current].keys.length-1){const e=getGroupBindingOptions();onDialogClose(!1),fireCustomTriggerEvent(e.events.onFinish,e._currentView.element)}else removeFocusClassFromLastElement(),_groups[_groups_Current].position++,showDialogAndSetPosition()}function showDialogAndSetPosition(){const e=getGroupBindingOptions();if(Is.defined(e)&&Is.defined(e._currentView.element)){e.showDisabledBackground?showDisabledBackground():hideDisabledBackground(),hideToolTip(),_element_Dialog_Close_Button.style.display=_configuration.showCloseButton?"block":"none",_configuration_ShortcutKeysEnabled=!0,e._currentView.element.className+=" journey-js-element-focus",_configuration.scrollToElements&&e._currentView.element.scrollIntoView();const t=DomElement.getStyleValueByName(e._currentView.element,"position");""!==t&&"static"===t.toLowerCase()&&(_element_Focus_Element_PositionStyle=t,e._currentView.element.style.position="relative"),DomElement.showElementBasedOnCondition(_element_Dialog_CheckBox_Container,_configuration.showDoNotShowAgain),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressDots,_configuration.showProgressDots&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar,_configuration.showProgressBar&&_groups[_groups_Current].keys.length>1),DomElement.showElementBasedOnCondition(_element_Dialog_ProgressBar_Percentage_Text,_configuration.showProgressBarText),DomElement.showElementBasedOnCondition(_element_Dialog_Buttons,_configuration.showButtons),_element_Dialog_Buttons_Back_Button.innerHTML=_configuration.backButtonText,_element_Dialog_Buttons_Back_Button.disabled=0===_groups[_groups_Current].position,_groups[_groups_Current].position>=_groups[_groups_Current].keys.length-1?_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.finishButtonText:_element_Dialog_Buttons_Next_Button.innerHTML=_configuration.nextButtonText,setDialogText(e),setDialogPosition(null,e),buildProcessDots(),setProgressBarPosition(),fireCustomTriggerEvent(e.events.onEnter,e._currentView.element),e.sendClick&&e._currentView.element.click()}}function setDialogText(e){Is.definedString(e.title)?_element_Dialog_Title.innerHTML=e.title:_element_Dialog_Title.innerHTML="",Is.definedString(e.description)?_element_Dialog_Description.innerHTML=e.description:_element_Dialog_Description.innerHTML=""}function setDialogPosition(e,t){if("block"!==_element_Dialog.style.display&&(_element_Dialog.style.display="block",fireCustomTriggerEvent(t.events.onOpen,t._currentView.element)),0===_groups[_groups_Current].position&&fireCustomTriggerEvent(t.events.onStart,t._currentView.element),_element_Dialog_IsHint=!0===t.isHint,t.attach||t.isHint)if(t.isHint&&t.alignHintToClickPosition)DomElement.showElementAtMousePosition(e,_element_Dialog);else{const e=DomElement.getOffset(t._currentView.element);let o=e.top+t._currentView.element.offsetHeight,n=e.left;(n+_element_Dialog.offsetWidth>window.innerWidth||t.alignRight)&&(n-=_element_Dialog.offsetWidth,n+=t._currentView.element.offsetWidth),(o+_element_Dialog.offsetHeight>window.innerHeight||t.alignTop)&&(o-=_element_Dialog.offsetHeight+t._currentView.element.offsetHeight),_element_Dialog.style.top=o+"px",_element_Dialog.style.left=n+"px"}else{const e=DomElement.getScrollPosition(),t=Math.max(0,(window.innerWidth-_element_Dialog.offsetWidth)/2+e.left),o=Math.max(0,(window.innerHeight-_element_Dialog.offsetHeight)/2+e.top);_element_Dialog.style.left=t+"px",_element_Dialog.style.top=o+"px"}}function removeFocusClassFromLastElement(e=!0){const t=getGroupBindingOptions();Is.defined(t)&&Is.defined(t._currentView.element)&&(t._currentView.element.className=t._currentView.element.className.replace(" journey-js-element-focus",""),Is.defined(_element_Focus_Element_PositionStyle)&&(t._currentView.element.style.position=_element_Focus_Element_PositionStyle),e&&fireCustomTriggerEvent(t.events.onLeave,t._currentView.element))}function buildProcessDots(){if(_element_Dialog_ProgressDots.innerHTML="",_configuration.showProgressDots){const e=_groups[_groups_Current].keys.length;for(let t=0;t{removeFocusClassFromLastElement(),_groups[_groups_Current].position=e,showDialogAndSetPosition()}),_element_Dialog_ProgressDots.appendChild(n),_configuration.showProgressDotToolTips&&(Is.definedString(o.tooltip)?addToolTip(n,o.tooltip):addToolTip(n,o.title)),_configuration.showProgressDotNumbers&&(n.className+=" dot-number",n.innerHTML=(e+1).toString())}function setProgressBarPosition(){if(_configuration.showProgressBar){const e=_element_Dialog_ProgressBar.offsetWidth/_groups[_groups_Current].keys.length,t=(_groups[_groups_Current].position+1)*e,o=Math.ceil((_groups[_groups_Current].position+1)/_groups[_groups_Current].keys.length*100);_element_Dialog_ProgressBar_Percentage.style.width=t+"px",_element_Dialog_ProgressBar_Percentage_Text.innerHTML=o+"%"}}function makeDialogMovable(){_element_Dialog_Title.onmousedown=onMoveTitleBarMouseDown,_element_Dialog_Title.onmouseup=onMoveTitleBarMouseUp,_element_Dialog_Title.oncontextmenu=onMoveTitleBarMouseUp,document.body.addEventListener("mousemove",onMoveDocumentMouseMove),document.body.addEventListener("mouseleave",onMoveDocumentMouseLeave)}function onMoveTitleBarMouseDown(e){_element_Dialog_Move_IsMoving||_element_Dialog_IsHint||!_configuration.dialogMovingEnabled||(_element_Dialog.className+=" journey-js-dialog-moving",_element_Dialog_Move_IsMoving=!0,_element_Dialog_Move_X=e.pageX-_element_Dialog.offsetLeft,_element_Dialog_Move_Y=e.pageY-_element_Dialog.offsetTop,_element_Dialog_Move_Original_X=_element_Dialog.offsetLeft,_element_Dialog_Move_Original_Y=_element_Dialog.offsetTop)}function onMoveTitleBarMouseUp(){_element_Dialog_Move_IsMoving&&(_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function onMoveDocumentMouseMove(e){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=e.pageX-_element_Dialog_Move_X+"px",_element_Dialog.style.top=e.pageY-_element_Dialog_Move_Y+"px")}function onMoveDocumentMouseLeave(){_element_Dialog_Move_IsMoving&&(_element_Dialog.style.left=_element_Dialog_Move_Original_X+"px",_element_Dialog.style.top=_element_Dialog_Move_Original_Y+"px",_element_Dialog_Move_IsMoving=!1,_element_Dialog_Move_Original_X=0,_element_Dialog_Move_Original_Y=0,_element_Dialog.className="journey-js-dialog")}function renderToolTip(){Is.defined(_element_ToolTip)||(_element_ToolTip=DomElement.create("div","journey-js-tooltip"),_element_ToolTip.style.display="none",document.body.appendChild(_element_ToolTip),document.body.addEventListener("mousemove",(()=>{hideToolTip()})),document.addEventListener("scroll",(()=>{hideToolTip()})))}function addToolTip(e,t){null!==e&&(e.onmousemove=e=>{showToolTip(e,t)})}function showToolTip(e,t){DomElement.cancelBubble(e),hideToolTip(),_element_ToolTip_Timer=setTimeout((()=>{_element_ToolTip.innerHTML=t,_element_ToolTip.style.display="block",DomElement.showElementAtMousePosition(e,_element_ToolTip)}),_configuration.tooltipDelay)}function hideToolTip(){Is.defined(_element_ToolTip)&&(0!==_element_ToolTip_Timer&&(clearTimeout(_element_ToolTip_Timer),_element_ToolTip_Timer=0),"block"===_element_ToolTip.style.display&&(_element_ToolTip.style.display="none"))}function getElements(){const e=_configuration.domElementTypes,t=e.length;for(let o=0;o{DomElement.cancelBubble(t),_element_Dialog_CheckBox_Container.style.display="none",_element_Dialog_ProgressDots.style.display="none",_element_Dialog_ProgressBar.style.display="none",_element_Dialog_Buttons.style.display="none",_configuration_ShortcutKeysEnabled=!1,setDialogText(e),setDialogPosition(t,e),e.removeHintWhenViewed&&DomElement.clearElementsByClassName(e._currentView.element,"journey-js-hint")}}function buildDocumentEvents(e=!0){const t=e?document.addEventListener:document.removeEventListener,o=e?window.addEventListener:window.removeEventListener;_configuration.shortcutKeysEnabled&&t("keydown",onWindowKeyDown),o("resize",onWindowResize)}function onWindowKeyDown(e){_public.isOpen()&&_configuration.shortcutKeysEnabled&&("Escape"===e.code?(e.preventDefault(),onDialogClose()):_configuration_ShortcutKeysEnabled&&("ArrowLeft"===e.code?(e.preventDefault(),onDialogBack()):"ArrowRight"===e.code?(e.preventDefault(),onDialogNext()):"ArrowUp"===e.code?(e.preventDefault(),onWindowKeyCodeUp()):"ArrowDown"===e.code&&(e.preventDefault(),onWindowKeyCodeDown())))}function onWindowResize(){_public.isOpen()&&showDialogAndSetPosition()}function onWindowKeyCodeUp(){0!==_groups[_groups_Current].position&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=0,showDialogAndSetPosition())}function onWindowKeyCodeDown(){_groups[_groups_Current].position!==_groups[_groups_Current].keys.length-1&&(removeFocusClassFromLastElement(),_groups[_groups_Current].position=_groups[_groups_Current].keys.length-1,showDialogAndSetPosition())}function buildAttributeOptions(e){let t=Data.getDefaultObject(e,{});return t.order=Data.getDefaultNumber(t.order,0),t.attach=Data.getDefaultBoolean(t.attach,!0),t.sendClick=Data.getDefaultBoolean(t.sendClick,!1),t.alignTop=Data.getDefaultBoolean(t.alignTop,!1),t.alignRight=Data.getDefaultBoolean(t.alignRight,!1),t.isHint=Data.getDefaultBoolean(t.isHint,!1),t.alignHintToClickPosition=Data.getDefaultBoolean(t.alignHintToClickPosition,!1),t.showDisabledBackground=Data.getDefaultBoolean(t.showDisabledBackground,!0),t.removeHintWhenViewed=Data.getDefaultBoolean(t.removeHintWhenViewed,!1),t.group=Data.getDefaultString(t.group,_groups_Default),t=buildAttributeOptionStrings(t),buildAttributeOptionCustomTriggers(t)}function buildAttributeOptionStrings(e){return e.title=Data.getDefaultString(e.title,""),e.description=Data.getDefaultString(e.description,""),e.tooltip=Data.getDefaultString(e.tooltip,""),e}function buildAttributeOptionCustomTriggers(e){return e.events=Data.getDefaultObject(e.events,{}),e.events.onEnter=Data.getDefaultFunction(e.events.onEnter,null),e.events.onLeave=Data.getDefaultFunction(e.events.onLeave,null),e.events.onClose=Data.getDefaultFunction(e.events.onClose,null),e.events.onFinish=Data.getDefaultFunction(e.events.onFinish,null),e.events.onOpen=Data.getDefaultFunction(e.events.onOpen,null),e.events.onStart=Data.getDefaultFunction(e.events.onStart,null),e.events.onAddStep=Data.getDefaultFunction(e.events.onAddStep,null),e.events.onRemoveStep=Data.getDefaultFunction(e.events.onRemoveStep,null),e}function fireCustomTriggerEvent(e,...t){Is.definedFunction(e)&&e.apply(null,[].slice.call(t,0))}function getBrowserUrlParameters(){let e=!1;if(_configuration.browserUrlParametersEnabled){const t=getBrowserUrlArguments(window.location.href);if(Is.defined(t.sjOrderId)){const e=parseInt(t.sjOrderId,10);!isNaN(e)&&e<=_groups[_groups_Current].keys.length-1&&(_groups[_groups_Current].position=e)}Is.defined(t.sjShow)&&(e="true"===t.sjShow)}return e}function getBrowserUrlArguments(e){const t={},o=e.split("?");if(o.length>1){const e=o[1].split("&"),n=e.length;for(let o=0;o=_groups[_groups_Current].keys.length-1},addDocumentSteps:function(){return getElements(),_public},addStep:function(e,t){return Is.definedObject(e)&&Is.definedObject(t)&&(setupElement(e,buildAttributeOptions(t)),_groups[_groups_Current].keys.sort(),resetDialogPosition()),_public},removeStep:function(e){if(Is.definedObject(e)){let t=!1;for(let o in _groups)if(_groups.hasOwnProperty(o))for(let n in _groups[o].json)if(_groups[o].json.hasOwnProperty(n)){const i=_groups[o].json[n];if(i._currentView.element===e){fireCustomTriggerEvent(i.events.onRemoveStep,i._currentView.element),_groups[o].keys.splice(_groups[o].keys.indexOf(i.order),1),delete _groups[o].json[i.order],_groups[o].keys.sort(),t=!0;break}}t?resetDialogPosition():DomElement.clearElementsByClassName(e,"journey-js-hint")}return _public},clearSteps:function(e=""){resetDialogPosition();for(let t in _groups)if(_groups.hasOwnProperty(t)&&(!Is.definedString(e)||e===t))for(let e in _groups[t].json)if(_groups[t].json.hasOwnProperty(e)){const o=_groups[t].json[e];fireCustomTriggerEvent(o.events.onRemoveStep,o._currentView.element)}return Is.definedString(e)?_groups.hasOwnProperty(e)&&delete _groups[e]:_groups={},Is.definedString(e)&&e!==_groups_Default||setupDefaultGroup(_groups),_public},clearHints:function(){return DomElement.clearElementsByClassName(document.body,"journey-js-hint"),_public},reverseStepOrder:function(){return _groups[_groups_Current].keys.reverse(),resetDialogPosition(),_public},setConfiguration:function(e){if(Is.definedObject(e)){let t=!1;const o=_configuration;for(let n in e)e.hasOwnProperty(n)&&_configuration.hasOwnProperty(n)&&o[n]!==e[n]&&(o[n]=e[n],t=!0);t&&buildDefaultConfiguration(o)}return _public},getVersion:function(){return"2.0.0"}};buildDefaultConfiguration(),document.addEventListener("DOMContentLoaded",(()=>{setupDefaultGroup(),renderDisabledBackground(),renderDialog(),renderToolTip(),getElements(),buildDocumentEvents(),getBrowserUrlParameters()&&_public.show()})),Is.defined(window.$journey)||(window.$journey=_public)})(); \ No newline at end of file diff --git a/src/ts/dom.ts b/src/ts/dom.ts index 67c6485..689e6b6 100644 --- a/src/ts/dom.ts +++ b/src/ts/dom.ts @@ -47,11 +47,11 @@ export namespace DomElement { } export function getScrollPosition() : Position { - const doc: HTMLElement = document.documentElement; + const documentElement: HTMLElement = document.documentElement; const result: Position = { - left: ( window.pageXOffset || doc.scrollLeft ) - ( doc.clientLeft || 0 ), - top: ( window.pageYOffset || doc.scrollTop ) - ( doc.clientTop || 0 ) + left: documentElement.scrollLeft - ( documentElement.clientLeft || 0 ), + top: documentElement.scrollTop - ( documentElement.clientTop || 0 ) } as Position; return result;