{"version":3,"sources":["layout.js","element.js","string.js","submitter.js","Cookies.js","DataTables.js","LocalStorage.js","Meters.js","Modal.js","Page.js","Utility.js","constructor.js","control_button.js","control_checkbox.js","control_confirmationpopover.js","control_datepicker.js","control_daterangepicker.js","control_editor.js","control_form.js","control_imagefile.js","control_number.js","control_select.js","control_tags.js","control_text.js","control_textarea.js","control_toggle.js","codeEditor.js","datatables.js","enableControls.js","enablePopovers.js","enableTooltips.js","fdAjax.js","init.js"],"names":["App","initBeforeLoad","$","addClass","initAfterLoad","removeClass","initSidebars","revertBottomMenus","find","children","hover","$this","this","navSubmenuReversedClass","filter","outerHeight","length","offset","top","document","body","clientHeight","hasClass","on","e","preventDefault","toggleClass","css","$sidebar","parents","sidebarFullscreenClass","bodyElem","initNavigations","navClass","navItemOpenClass","each","has","not","$target","$navSidebarMini","parent","slideUp","slideDown","data","siblings","off","stopPropagation","tab","initComponents","tooltip","demoTooltipSelector","is","setTimeout","_componentTooltip","popover","initCardActions","$cardCollapsedClass","block","closest","message","overlayCSS","backgroundColor","opacity","cursor","border","padding","window","unblock","nextAll","hide","slideToggle","duration","start","complete","remove","cardFullscreen","overflowHiddenClass","collapsedClass","fullscreenAttr","attr","removeAttr","initDropdownSubmenu","initHeaderElementsToggle","initCore","addEventListener","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","s","el","call","parentElement","parentNode","nodeType","String","endsWith","search","this_len","undefined","substring","startsWith","rawPos","pos","includes","RegExp","TypeError","indexOf","format","args","arguments","replace","match","number","lastBtn","target","canditates","activeElement","i","candidate","form","submitter","querySelector","Cookies","get","key","allCookies","cookie","split","current","trim","set","value","days","date","Date","setTime","getTime","expires","toUTCString","DataTables","buildButton","name","href","innerHtml","buildEditButton","condition","buildViewButton","buildTrendsButton","buildKpisButton","buildKnownButtons","_ref","dropButtons","trend","kpis","view","edit","others","buttons","renderedButtons","forEach","button","renderInnerButtons","renderDropButtons","buildTrendButton","resizeDataTable","index","element","DataTable","responsive","recalc","LocalStorage","storageIsSupported","test","localStorage","setItem","removeItem","error","checkLocalStorageIsSupported","getItem","Meters","customerId","buildingId","getCustomerId","val","reactivateMeter","fdAjax","url","callback","FD","Page","saveMeter","responseText","modal","getRateCodes","utilityProviderId","type","result","select","options","add","Option","x","id","prop","getAddMeterModal","parentId","html","parentid","ishtml","enableControls","getAddMeterModalSimple","append","getPrefilledAddMeterModal","meterId","getEditMeterModal","control_textarea","selectUtilityProvider","Number","selectCustomer","group","groupElement","concat","text","label","y","option","getBuildings","buildAccountNumberAjax","dataType","term","appendSelect","results","buildSummaryAccountNumberAjax","buildMeterUtilityProviderAjax","params","allowCreation","selectedMetric","empty","select2","trigger","list","map","Id","Name","unshift","Selected","control_select","defaultActivityId","buildUnitsAjax","child","getBuildingOptions","unitsAutocompleteRoute","selectBuilding","deleteMeter","reactivateMeterWithoutReadings","_typeof","obj","Symbol","iterator","constructor","Modal","defaultModalOptions","onShow","onShown","onHide","onHidden","modalLock","showModal","modalOptions","callbackBeforeShow","forceOpen","locked","extend","$modal","focus","dirtyForms","last","ajaxOptions","currentCallback","hideModal","isOpen","openModal","xhr","Utility","stopLadda","init","comingSoon","notify","info","dismissAllNotifications","createLadda","$button","Ladda","create","startLadda","$laddaButton","control_form","ladda","stop","toggleSiblingsDisplay","toggleChildrenDisplay","blockUI","elem","unblockUI","getControlValuesByContainer","container","lastElement","fldList","ctrlAR","fldName","pop","controlType","push","prev","onFailure","jqXhR","status","alert","getResponseHeader","resetForm","resetSequence","itemSelector","updateSequance","removeSequenceItem","$item","$itemRemoved","addSequenceItem","templateSelector","insertBeforeSelector","sequenceItemSelector","dataFdValue","inputDataFdValueSelector","item","clone","insertBefore","redirect","location","Notify","keyCodes","widget","disabled","stoppropagation","startladda","startLoading","_laddaInstance","stopLoading","toggleLoading","toggle","_create","_setEvents","_handleSubmit","event","self","which","_setOption","jQuery","uniform","checked","update","refresh","click","confirmPopoverButton","confirmcallback","confirmclass","confirmlabel","cancelcallback","cancelclass","cancellabel","passthrough","sanitize","_createPopover","popoverHTML","title","confirmcallback_RAW","cancelcallback_RAW","content","join","_popoverEventsAreSet","that","doAjaxPost","mindate","maxdate","formatsubmit","formatmoment","monthpicker","editable","showclearbutton","allownull","disabledays","datepickerOptions","disable","formatSubmit","onSet","context","clear","min","max","selectYears","selectMonths","onOpen","_setMonthPickerUI","highlight","h","Array","year","month","lastHighlightedDate","_datepickerInstance","pickadate","fdReset","_fdReset","bind","fdSetValue","_fdSetValue","momentFormat","$iconContainer","picker","inputDate","moment","isValid","toDate","open","$validator","show","$picker","$chooseButton","$yearSelect","$monthSelect","parseInt","close","datepicker","objContext","usetime","predefinedranges","_defaultDatepickerOptions","applyClass","cancelClass","autoApply","timePicker","singleDatePicker","locale","_formatCode","minDate","maxDate","autoUpdateInput","parentEl","ranges","Today","Yesterday","subtract","startOf","endOf","daterangepicker","_handleBlur","_handleKeyup","_handleHideDatepicker","_getValue","_handleApplyDatepicker","startDate","endDate","iskeyup","iskeyupdelay","maxlength","minlength","allowcodeview","inmodal","initial","viewToolbar","summernote","codeviewFilter","codeviewIframeFilter","dialogsInBody","toolbar","_handleFocus","clearTimeout","_keyupTimer","parentID","_destroy","onchange","changecallback","dirtyformsmessage","dirtyformstitle","validator","unobtrusive","parse","settings","ignore","focusInvalid","errorList","numberOfInvalids","scrollTo","scrollTop","appendTo","dirtyFormOptions","dialog","fieldSelector","helpers","isDirty","$node","_handleChange","$input","namespace","submit","_triggerElement","originalEvent","setClean","_handleReset","control_toggle","control_imagefile","documentElement","first","validate","successList","showErrors","reset","$self","valid","inputsAreValid","$validationElement","next","wrapAll","unwrap","rebuildValidate","unobtrusiveValidation","rules","elname","elrules","messages","rulename","serialize","popTriggerElement","triggerElement","getTriggerElement","div","originalFix","isAdvancedUpload","createElement","isMobile","fix","apply","clipboardData","currentSelection","eventsWired","choosefiletext","choosefileclass","choosefileicon","takepicturetext","takepictureclass","takepictureicon","unsupportedfiletypetext","unsupportedfilesizetext","maxsize","removebutton","removetext","removecssclass","removeicon","filenamecssclass","imagecssclass","urlcssclass","mobilecssclass","enablepreview","previewplacemnt","advancedupload","dragdroptitle","copypastetitle","forbidden","uploadbutton","uploadbuttontext","uploadbuttonclass","uploadicon","uploadmessage","_createUiElements","_tryLoadUrl","_remove","skipCallback","files","isRemove","$previewImage","$previewIcon","$removeButton","$uploadButton","$buttonGroup","$dropZoneTitle","$copyPasteTitle","$fileNameLabel","$removeUrl","$fileList","$fileListItem","_setValue","urlOrInputFile","fileElement","_showSelectionControls","tmpImg","Image","onload","_previewUrl","src","$container","insertAfter","$dropZone","$pictureButton","$browseButton","$uploadmessage","isUploading","dataTransfer","_handleImagePaste","_clearInputFile","tooltipText","fileItem","icon","toLowerCase","input","stopProccessing","idx","rejectFilter","invalidFileType","accept","acceptFilter","validFileType","validFileSize","size","isValidPreview","reader","FileReader","readAsDataURL","indexOfExtension","lastIndexOf","_formatBytes","bytes","decimals","dm","Math","floor","log","parseFloat","pow","toFixed","_setUploading","startUpload","stopUpload","precision","allowclear","_validate","_handleKeypress","fromCharCode","_handlePaste","pastedText","getData","newValue","placeholder","allowsearch","dropdownautowidth","unselectedvalue","minimuminputlength","dropdownParent","provider","ajaxbuilder","cascadeparentid","cascadeprovider","cascadeajaxbuilder","allowcustom","createtagcallback","matchercallback","templateresultcallback","templateselectioncallback","escapemarkupcallback","fieldset","ev","currentTarget","delay","select2Options","minimumInputLength","dropdownAutoWidth","allowClear","tags","createTag","matcher","templateResult","templateSelection","escapeMarkup","minimumResultsForSearch","Infinity","ajax","initiallyDisabled","fdUnselect","_unselect","fdResetSelectedItem","_resetSelectedItem","_createCascadeEffect","_applyOptionStyles","parentValue","getJSON","items","itemToSelectAfterCascade","_loadSelectItems","sourceUrl","timestamp","clearSelect","makeItems","outerHTML","selectedAttr","selected","cssClass","bgColor","$select2","_didSubmit","_handleSelect","param","blur","updateOption","newOption","replaceOptions","valueField","textField","selectedValue","rendertofield","tagstype","tagmaxcount","allownew","allowmultiple","select2OptionsAjax","$element","page","multiple","language","inputTooShort","createSearchChoice","localeCompare","_getNewTagId","_fdUnselect","_fdResetSelectedItem","maximumSelectionLength","selectOption","generatedId","_renderSelectedOptionsAsJson","jsonItems","selectItems","json","JSON","stringify","_runCallback","valueElement","repeat","autoresize","resize","autosize","style","overflowY","_resize","height","computed","getComputedStyle","getPropertyValue","scrollHeight","enable","_enable","_switcheryInstance","switcher","_disable","Switchery","changeTo","_changeSwitchery","_refresh","destroy","fn","codeEditor","ace","theme","readonly","mode","editor","setTheme","setReadOnly","session","setMode","searchDelayTimeout","dataTable","Api","register","milliseconds","table","nTableWrapper","draw","prefix","enableControl","$elem","attributes","specified","attributeName","parts","control","console","formQueue","enableTooltips","boundary","enablePopovers","tooltipSelector","onTooltipClicked","change","$selectParent","ajaxOutstanding","ajaxScheduled","progressBar","Mprogress","defaults","isloader","loadingButton","loadingButtonStyle","contentType","contentTypeHelper","cache","processData","cancelprevious","preventResubmit","preventSubmit","cleanupAfterAjax","laddaButton","end","handleAjax","ajaxCall","async","FormData","beforeSend","done","success","fail","textStatus","errorThrown","dataError","errorStatus","errorMsg","ajaxObj","readyState","abort","splice","handleAjaxQueue","opts","isNaN","timeout","handleAjaxSchedule","$pageHeader","sidebarOffset","setSidebarSticky","stick_in_parent","offset_top","unstickSidebar","propHooks","events","originalBind","onAnchorClick","autoWidth","dom","className","emptyTable","searchPlaceholder","lengthMenu","paginate","previous","fixedHeader","headerOffset","paging","details","Constructor","_enforceFocus","bsBreakpoints","currentbreakpoint","getCurrentBreakpoint","breakpoint","tables","visible","api","columns","adjust","handleStickySiderbar","$selection","one","Intl","DateTimeFormat","resolvedOptions","timeZone","setDefaults"],"mappings":"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","file":"FDJavaScript.min.js","sourcesContent":["/* ------------------------------------------------------------------------------\r\n *\r\n * # Template JS core\r\n *\r\n * Includes minimum required JS code for proper template functioning\r\n *\r\n * ---------------------------------------------------------------------------- */\r\n\r\n\r\n// Setup module\r\n// ------------------------------\r\n\r\nvar App = function () {\r\n\r\n\r\n //\r\n // Setup module components\r\n //\r\n\r\n // Transitions\r\n // -------------------------\r\n\r\n // Disable all transitions\r\n var _transitionsDisabled = function () {\r\n $('body').addClass('no-transitions');\r\n };\r\n\r\n // Enable all transitions\r\n var _transitionsEnabled = function () {\r\n $('body').removeClass('no-transitions');\r\n };\r\n\r\n\r\n // Sidebars\r\n // -------------------------\r\n\r\n //\r\n // On desktop\r\n //\r\n\r\n // Resize main sidebar\r\n var _sidebarMainResize = function () {\r\n\r\n // Flip 2nd level if menu overflows\r\n // bottom edge of browser window\r\n var revertBottomMenus = function () {\r\n $('.sidebar-main').find('.nav-sidebar').children('.nav-item-submenu').hover(function () {\r\n var totalHeight = 0,\r\n $this = $(this),\r\n navSubmenuClass = 'nav-group-sub',\r\n navSubmenuReversedClass = 'nav-item-submenu-reversed';\r\n\r\n totalHeight += $this.find('.' + navSubmenuClass).filter(':visible').outerHeight();\r\n if ($this.children('.' + navSubmenuClass).length) {\r\n if (($this.children('.' + navSubmenuClass).offset().top + $this.find('.' + navSubmenuClass).filter(':visible').outerHeight()) > document.body.clientHeight) {\r\n $this.addClass(navSubmenuReversedClass)\r\n }\r\n else {\r\n $this.removeClass(navSubmenuReversedClass)\r\n }\r\n }\r\n });\r\n }\r\n\r\n // If sidebar is resized by default\r\n if ($('body').hasClass('sidebar-xs')) {\r\n revertBottomMenus();\r\n }\r\n\r\n // Toggle min sidebar class\r\n $('.sidebar-main-toggle').on('click', function (e) {\r\n e.preventDefault();\r\n\r\n $('body').toggleClass('sidebar-xs').removeClass('sidebar-mobile-main');\r\n revertBottomMenus();\r\n });\r\n };\r\n\r\n // Toggle main sidebar\r\n var _sidebarMainToggle = function () {\r\n $(document).on('click', '.sidebar-main-hide', function (e) {\r\n e.preventDefault();\r\n $('body').toggleClass('sidebar-main-hidden');\r\n });\r\n };\r\n\r\n // Toggle secondary sidebar\r\n var _sidebarSecondaryToggle = function () {\r\n $(document).on('click', '.sidebar-secondary-toggle', function (e) {\r\n e.preventDefault();\r\n $('body').toggleClass('sidebar-secondary-hidden');\r\n });\r\n };\r\n\r\n\r\n // Show right, resize main\r\n var _sidebarRightMainToggle = function () {\r\n $(document).on('click', '.sidebar-right-main-toggle', function (e) {\r\n e.preventDefault();\r\n\r\n // Right sidebar visibility\r\n $('body').toggleClass('sidebar-right-visible');\r\n\r\n // If visible\r\n if ($('body').hasClass('sidebar-right-visible')) {\r\n\r\n // Make main sidebar mini\r\n $('body').addClass('sidebar-xs');\r\n\r\n // Hide children lists if they are opened, since sliding animation adds inline CSS\r\n $('.sidebar-main .nav-sidebar').children('.nav-item').children('.nav-group-sub').css('display', '');\r\n }\r\n else {\r\n $('body').removeClass('sidebar-xs');\r\n }\r\n });\r\n };\r\n\r\n // Show right, hide main\r\n var _sidebarRightMainHide = function () {\r\n $(document).on('click', '.sidebar-right-main-hide', function (e) {\r\n e.preventDefault();\r\n\r\n // Opposite sidebar visibility\r\n $('body').toggleClass('sidebar-right-visible');\r\n\r\n // If visible\r\n if ($('body').hasClass('sidebar-right-visible')) {\r\n $('body').addClass('sidebar-main-hidden');\r\n }\r\n else {\r\n $('body').removeClass('sidebar-main-hidden');\r\n }\r\n });\r\n };\r\n\r\n // Toggle right sidebar\r\n var _sidebarRightToggle = function () {\r\n $(document).on('click', '.sidebar-right-toggle', function (e) {\r\n e.preventDefault();\r\n\r\n $('body').toggleClass('sidebar-right-visible');\r\n });\r\n };\r\n\r\n // Show right, hide secondary\r\n var _sidebarRightSecondaryToggle = function () {\r\n $(document).on('click', '.sidebar-right-secondary-toggle', function (e) {\r\n e.preventDefault();\r\n\r\n // Opposite sidebar visibility\r\n $('body').toggleClass('sidebar-right-visible');\r\n\r\n // If visible\r\n if ($('body').hasClass('sidebar-right-visible')) {\r\n $('body').addClass('sidebar-secondary-hidden');\r\n }\r\n else {\r\n $('body').removeClass('sidebar-secondary-hidden');\r\n }\r\n });\r\n };\r\n\r\n\r\n // Toggle content sidebar\r\n var _sidebarComponentToggle = function () {\r\n $(document).on('click', '.sidebar-component-toggle', function (e) {\r\n e.preventDefault();\r\n $('body').toggleClass('sidebar-component-hidden');\r\n });\r\n };\r\n\r\n\r\n //\r\n // On mobile\r\n //\r\n\r\n // Expand sidebar to full screen on mobile\r\n var _sidebarMobileFullscreen = function () {\r\n $('.sidebar-mobile-expand').on('click', function (e) {\r\n e.preventDefault();\r\n var $sidebar = $(this).parents('.sidebar'),\r\n sidebarFullscreenClass = 'sidebar-fullscreen'\r\n\r\n if (!$sidebar.hasClass(sidebarFullscreenClass)) {\r\n $sidebar.addClass(sidebarFullscreenClass);\r\n }\r\n else {\r\n $sidebar.removeClass(sidebarFullscreenClass);\r\n }\r\n });\r\n };\r\n\r\n // Toggle main sidebar on mobile\r\n var _sidebarMobileMainToggle = function () {\r\n $('.sidebar-mobile-main-toggle').on('click', function (e) {\r\n var bodyElem = $('body');\r\n e.preventDefault();\r\n bodyElem.toggleClass('sidebar-mobile-main').removeClass('sidebar-mobile-secondary sidebar-mobile-right');\r\n\r\n if ($('.sidebar-main').hasClass('sidebar-fullscreen')) {\r\n $('.sidebar-main').removeClass('sidebar-fullscreen');\r\n }\r\n });\r\n };\r\n\r\n // Toggle secondary sidebar on mobile\r\n var _sidebarMobileSecondaryToggle = function () {\r\n $('.sidebar-mobile-secondary-toggle').on('click', function (e) {\r\n e.preventDefault();\r\n $('body').toggleClass('sidebar-mobile-secondary').removeClass('sidebar-mobile-main sidebar-mobile-right');\r\n\r\n // Fullscreen mode\r\n if ($('.sidebar-secondary').hasClass('sidebar-fullscreen')) {\r\n $('.sidebar-secondary').removeClass('sidebar-fullscreen');\r\n }\r\n });\r\n };\r\n\r\n // Toggle right sidebar on mobile\r\n var _sidebarMobileRightToggle = function () {\r\n $('.sidebar-mobile-right-toggle').on('click', function (e) {\r\n e.preventDefault();\r\n $('body').toggleClass('sidebar-mobile-right').removeClass('sidebar-mobile-main sidebar-mobile-secondary');\r\n\r\n // Hide sidebar if in fullscreen mode on mobile\r\n if ($('.sidebar-right').hasClass('sidebar-fullscreen')) {\r\n $('.sidebar-right').removeClass('sidebar-fullscreen');\r\n }\r\n });\r\n };\r\n\r\n // Toggle component sidebar on mobile\r\n var _sidebarMobileComponentToggle = function () {\r\n $('.sidebar-mobile-component-toggle').on('click', function (e) {\r\n e.preventDefault();\r\n $('body').toggleClass('sidebar-mobile-component');\r\n });\r\n };\r\n\r\n\r\n // Navigations\r\n // -------------------------\r\n\r\n // Sidebar navigation\r\n var _navigationSidebar = function () {\r\n\r\n // Define default class names and options\r\n var navClass = 'nav-sidebar',\r\n navItemClass = 'nav-item',\r\n navItemOpenClass = 'nav-item-open',\r\n navLinkClass = 'nav-link',\r\n navSubmenuClass = 'nav-group-sub',\r\n navSlidingSpeed = 250;\r\n\r\n // Configure collapsible functionality\r\n $('.' + navClass).each(function () {\r\n $(this).find('.' + navItemClass).has('.' + navSubmenuClass).children('.' + navItemClass + ' > ' + '.' + navLinkClass).not('.disabled').on('click', function (e) {\r\n e.preventDefault();\r\n\r\n // Simplify stuff\r\n var $target = $(this),\r\n $navSidebarMini = $('.sidebar-xs').not('.sidebar-mobile-main').find('.sidebar-main .' + navClass).children('.' + navItemClass);\r\n\r\n // Collapsible\r\n if ($target.parent('.' + navItemClass).hasClass(navItemOpenClass)) {\r\n $target.parent('.' + navItemClass).not($navSidebarMini).removeClass(navItemOpenClass).children('.' + navSubmenuClass).slideUp(navSlidingSpeed);\r\n }\r\n else {\r\n $target.parent('.' + navItemClass).not($navSidebarMini).addClass(navItemOpenClass).children('.' + navSubmenuClass).slideDown(navSlidingSpeed);\r\n }\r\n\r\n // Accordion\r\n if ($target.parents('.' + navClass).data('nav-type') == 'accordion') {\r\n $target.parent('.' + navItemClass).not($navSidebarMini).siblings(':has(.' + navSubmenuClass + ')').removeClass(navItemOpenClass).children('.' + navSubmenuClass).slideUp(navSlidingSpeed);\r\n }\r\n });\r\n });\r\n\r\n // Disable click in disabled navigation items\r\n $(document).on('click', '.' + navClass + ' .disabled', function (e) {\r\n e.preventDefault();\r\n });\r\n\r\n // Scrollspy navigation\r\n $('.nav-scrollspy').find('.' + navItemClass).has('.' + navSubmenuClass).children('.' + navItemClass + ' > ' + '.' + navLinkClass).off('click');\r\n };\r\n\r\n // Navbar navigation\r\n var _navigationNavbar = function () {\r\n\r\n // Prevent dropdown from closing on click\r\n $(document).on('click', '.dropdown-content', function (e) {\r\n e.stopPropagation();\r\n });\r\n\r\n // Disabled links\r\n $('.navbar-nav .disabled a, .nav-item-levels .disabled').on('click', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n // Show tabs inside dropdowns\r\n $('.dropdown-content a[data-toggle=\"tab\"]').on('click', function (e) {\r\n $(this).tab('show');\r\n });\r\n };\r\n\r\n\r\n // Components\r\n // -------------------------\r\n\r\n // Tooltip\r\n var _componentTooltip = function () {\r\n\r\n // Initialize\r\n $('[data-popup=\"tooltip\"]').tooltip();\r\n\r\n // Demo tooltips, remove in production\r\n var demoTooltipSelector = '[data-popup=\"tooltip-demo\"]';\r\n if ($(demoTooltipSelector).is(':visible')) {\r\n $(demoTooltipSelector).tooltip('show');\r\n setTimeout(function () {\r\n $(demoTooltipSelector).tooltip('hide');\r\n }, 2000);\r\n }\r\n };\r\n\r\n // Popover\r\n var _componentPopover = function () {\r\n $('[data-popup=\"popover\"]').popover();\r\n };\r\n\r\n // Slinky\r\n var _componentSlinky = function () {\r\n return;\r\n if (!$().slinky) {\r\n console.warn('Warning - slinky.min.js is not loaded.');\r\n return;\r\n };\r\n\r\n // Attach drill down menu to menu list with child levels\r\n $('.nav-item-levels').one('shown.bs.dropdown', function () {\r\n $('.dropdown-item-group').each(function () {\r\n $(this).slinky({\r\n title: true,\r\n speed: 200\r\n });\r\n });\r\n });\r\n };\r\n\r\n\r\n // Card actions\r\n // -------------------------\r\n\r\n // Reload card (uses BlockUI extension)\r\n var _cardActionReload = function () {\r\n $('.card [data-action=reload]:not(.disabled)').on('click', function (e) {\r\n e.preventDefault();\r\n var $target = $(this),\r\n block = $target.closest('.card');\r\n\r\n // Block card\r\n $(block).block({\r\n message: '',\r\n overlayCSS: {\r\n backgroundColor: '#fff',\r\n opacity: 0.8,\r\n cursor: 'wait',\r\n 'box-shadow': '0 0 0 1px #ddd'\r\n },\r\n css: {\r\n border: 0,\r\n padding: 0,\r\n backgroundColor: 'none'\r\n }\r\n });\r\n\r\n // For demo purposes\r\n window.setTimeout(function () {\r\n $(block).unblock();\r\n }, 2000);\r\n });\r\n };\r\n\r\n // Collapse card\r\n var _cardActionCollapse = function () {\r\n var $cardCollapsedClass = $('.card-collapsed');\r\n\r\n // Hide if collapsed by default\r\n $cardCollapsedClass.children('.card-header').nextAll().hide();\r\n\r\n // Rotate icon if collapsed by default\r\n $cardCollapsedClass.find('[data-action=collapse]').addClass('rotate-180');\r\n\r\n // Collapse on click\r\n $('.card [data-action=collapse]:not(.disabled)').on('click', function (e) {\r\n var $target = $(this),\r\n slidingSpeed = 150;\r\n\r\n e.preventDefault();\r\n $target.parents('.card').toggleClass('card-collapsed');\r\n $target.toggleClass('rotate-180');\r\n $target.closest('.card').children('.card-header').nextAll().slideToggle(slidingSpeed);\r\n });\r\n };\r\n\r\n // Remove card\r\n var _cardActionRemove = function () {\r\n $('.card [data-action=remove]').on('click', function (e) {\r\n e.preventDefault();\r\n var $target = $(this),\r\n slidingSpeed = 150;\r\n\r\n // If not disabled\r\n if (!$target.hasClass('disabled')) {\r\n $target.closest('.card').slideUp({\r\n duration: slidingSpeed,\r\n start: function () {\r\n $target.addClass('d-block');\r\n },\r\n complete: function () {\r\n $target.remove();\r\n }\r\n });\r\n }\r\n });\r\n };\r\n\r\n // Card fullscreen mode\r\n var _cardActionFullscreen = function () {\r\n $('.card [data-action=fullscreen]').on('click', function (e) {\r\n e.preventDefault();\r\n\r\n // Define vars\r\n var $target = $(this),\r\n cardFullscreen = $target.closest('.card'),\r\n overflowHiddenClass = 'overflow-hidden',\r\n collapsedClass = 'collapsed-in-fullscreen',\r\n fullscreenAttr = 'data-fullscreen';\r\n\r\n // Toggle classes on card\r\n cardFullscreen.toggleClass('fixed-top h-100 rounded-0');\r\n\r\n // Configure\r\n if (!cardFullscreen.hasClass('fixed-top')) {\r\n $target.removeAttr(fullscreenAttr);\r\n cardFullscreen.children('.' + collapsedClass).removeClass('show');\r\n $('body').removeClass(overflowHiddenClass);\r\n $target.siblings('[data-action=move], [data-action=remove], [data-action=collapse]').removeClass('d-none');\r\n }\r\n else {\r\n $target.attr(fullscreenAttr, 'active');\r\n cardFullscreen.removeAttr('style').children('.collapse:not(.show)').addClass('show ' + collapsedClass);\r\n $('body').addClass(overflowHiddenClass);\r\n $target.siblings('[data-action=move], [data-action=remove], [data-action=collapse]').addClass('d-none');\r\n }\r\n });\r\n };\r\n\r\n\r\n // Misc\r\n // -------------------------\r\n\r\n // Dropdown submenus. Trigger on click\r\n var _dropdownSubmenu = function () {\r\n\r\n // All parent levels require .dropdown-toggle class\r\n $('.dropdown-menu').find('.dropdown-submenu').not('.disabled').find('.dropdown-toggle').on('click', function (e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n\r\n // Remove \"show\" class in all siblings\r\n $(this).parent().siblings().removeClass('show').find('.show').removeClass('show');\r\n\r\n // Toggle submenu\r\n $(this).parent().toggleClass('show').children('.dropdown-menu').toggleClass('show');\r\n\r\n // Hide all levels when parent dropdown is closed\r\n $(this).parents('.show').on('hidden.bs.dropdown', function (e) {\r\n $('.dropdown-submenu .show, .dropdown-submenu.show').removeClass('show');\r\n });\r\n });\r\n };\r\n\r\n // Header elements toggler\r\n var _headerElements = function () {\r\n\r\n // Toggle visible state of header elements\r\n $('.header-elements-toggle').on('click', function (e) {\r\n e.preventDefault();\r\n $(this).parents('[class*=header-elements-]').find('.header-elements').toggleClass('d-none');\r\n });\r\n\r\n // Toggle visible state of footer elements\r\n $('.footer-elements-toggle').on('click', function (e) {\r\n e.preventDefault();\r\n $(this).parents('.card-footer').find('.footer-elements').toggleClass('d-none');\r\n });\r\n };\r\n\r\n\r\n //\r\n // Return objects assigned to module\r\n //\r\n\r\n return {\r\n\r\n // Disable transitions before page is fully loaded\r\n initBeforeLoad: function () {\r\n _transitionsDisabled();\r\n },\r\n\r\n // Enable transitions when page is fully loaded\r\n initAfterLoad: function () {\r\n _transitionsEnabled();\r\n },\r\n\r\n // Initialize all sidebars\r\n initSidebars: function () {\r\n\r\n // On desktop\r\n _sidebarMainResize();\r\n _sidebarMainToggle();\r\n _sidebarSecondaryToggle();\r\n _sidebarRightMainToggle();\r\n _sidebarRightMainHide();\r\n _sidebarRightToggle();\r\n _sidebarRightSecondaryToggle();\r\n _sidebarComponentToggle();\r\n\r\n // On mobile\r\n _sidebarMobileFullscreen();\r\n _sidebarMobileMainToggle();\r\n _sidebarMobileSecondaryToggle();\r\n _sidebarMobileRightToggle();\r\n _sidebarMobileComponentToggle();\r\n },\r\n\r\n // Initialize all navigations\r\n initNavigations: function () {\r\n _navigationSidebar();\r\n _navigationNavbar();\r\n },\r\n\r\n // Initialize all components\r\n initComponents: function () {\r\n _componentTooltip();\r\n _componentPopover();\r\n _componentSlinky();\r\n },\r\n\r\n // Initialize all card actions\r\n initCardActions: function () {\r\n _cardActionReload();\r\n _cardActionCollapse();\r\n _cardActionRemove();\r\n _cardActionFullscreen();\r\n },\r\n\r\n // Dropdown submenu\r\n initDropdownSubmenu: function () {\r\n _dropdownSubmenu();\r\n },\r\n\r\n initHeaderElementsToggle: function () {\r\n _headerElements();\r\n },\r\n\r\n // Initialize core\r\n initCore: function () {\r\n App.initSidebars();\r\n App.initNavigations();\r\n App.initComponents();\r\n App.initCardActions();\r\n App.initDropdownSubmenu();\r\n App.initHeaderElementsToggle();\r\n }\r\n }\r\n}();\r\n\r\n\r\n// Initialize module\r\n// ------------------------------\r\n\r\n// When content is loaded\r\ndocument.addEventListener('DOMContentLoaded', function () {\r\n App.initBeforeLoad();\r\n App.initCore();\r\n});\r\n\r\n// When page is fully loaded\r\nwindow.addEventListener('load', function () {\r\n App.initAfterLoad();\r\n});\r\n","if (!Element.prototype.matches) {\r\n Element.prototype.matches = Element.prototype.msMatchesSelector ||\r\n Element.prototype.webkitMatchesSelector;\r\n}\r\n\r\nif (!Element.prototype.closest) {\r\n Element.prototype.closest = function (s) {\r\n let el = this;\r\n\r\n do {\r\n if (Element.prototype.matches.call(el, s)) {\r\n return el;\r\n }\r\n el = el.parentElement || el.parentNode;\r\n } while (el !== null && el.nodeType === 1);\r\n return null;\r\n };\r\n}","if (!String.prototype.endsWith) {\r\n String.prototype.endsWith = function (search, this_len) {\r\n if (this_len === undefined || this_len > this.length) {\r\n this_len = this.length;\r\n }\r\n return this.substring(this_len - search.length, this_len) === search;\r\n };\r\n}\r\nif (!String.prototype.startsWith) {\r\n String.prototype.startsWith = function (search, rawPos) {\r\n var pos = rawPos > 0 ? rawPos | 0 : 0;\r\n return this.substring(pos, pos + search.length) === search;\r\n };\r\n}\r\nif (!String.prototype.includes) {\r\n String.prototype.includes = function (search, start) {\r\n 'use strict';\r\n\r\n if (search instanceof RegExp) {\r\n throw TypeError('first argument must not be a RegExp');\r\n }\r\n if (start === undefined) { \r\n start = 0; \r\n }\r\n return this.indexOf(search, start) !== -1;\r\n };\r\n}\r\nif (!String.prototype.format) {\r\n String.prototype.format = function () {\r\n const args = arguments;\r\n return this.replace(/{(\\d+)}/g, function (match, number) {\r\n return typeof args[number] != 'undefined'\r\n ? args[number]\r\n : match\r\n ;\r\n });\r\n };\r\n}","// polyfill for browsers not supporting submitter event\r\n!function () {\r\n let lastBtn = null;\r\n document.addEventListener('click', function (e) {\r\n if (!e.target.closest) {\r\n return;\r\n }\r\n lastBtn = e.target.closest('button, input[type=submit]');\r\n }, true);\r\n document.addEventListener('submit', function (e) {\r\n if ('submitter' in e) {\r\n return;\r\n }\r\n const canditates = [document.activeElement, lastBtn];\r\n for (var i = 0; i < canditates.length; i++) {\r\n var candidate = canditates[i];\r\n if (!candidate || !candidate.form || !candidate.matches('button, input[type=button], input[type=submit], input[type=image]')) {\r\n continue;\r\n }\r\n e.submitter = candidate;\r\n return;\r\n }\r\n e.submitter = e.target.querySelector('button, input[type=button], input[type=submit], input[type=image]');\r\n }, true);\r\n}();","var Cookies = function () { // eslint-disable-line no-unused-vars\r\n 'use strict';\r\n\r\n /* ========================================================================\r\n * Private Variables\r\n * ========================================================================\r\n */\r\n\r\n\r\n /* ========================================================================\r\n * Private Methods\r\n * ========================================================================\r\n */\r\n\r\n\r\n /* ========================================================================\r\n * Public Methods\r\n * ========================================================================\r\n */\r\n\r\n return {\r\n /**\r\n * Get a cookie value by key.\r\n * @param {string} key\r\n */\r\n get: function (key) {\r\n key += '=';\r\n const allCookies = document.cookie.split(';');\r\n for (let i = 0; i < allCookies.length; i++) {\r\n let current = allCookies[i].trim();\r\n if (current.indexOf(key) === 0) {\r\n return current.substring(key.length, current.length);\r\n }\r\n }\r\n return null;\r\n },\r\n\r\n /**\r\n * Set a cookie value\r\n * @param {string} key\r\n * @param {any} value This will be converted to a string\r\n * @param {number} days Days until the cookie should expire. Defaults to 31.\r\n */\r\n set: function (key, value, days) {\r\n let date = new Date();\r\n days = days || 31;\r\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\r\n const expires = \"; expires=\" + date.toUTCString();\r\n document.cookie = key + \"=\" + value + expires + \"; path=/\";\r\n }\r\n };\r\n}();","var DataTables = function () { // eslint-disable-line no-unused-vars\r\n 'use strict';\r\n\r\n /* ========================================================================\r\n * Private Variables\r\n * ========================================================================\r\n */\r\n\r\n\r\n /* ========================================================================\r\n * Private Methods\r\n * ========================================================================\r\n */\r\n\r\n function buildButton(name, href, innerHtml) {\r\n return \"\" + innerHtml\r\n + \"\";\r\n };\r\n\r\n function buildDropButton(name, href, innerHtml) {\r\n return \"\" + innerHtml\r\n + \"\";\r\n };\r\n\r\n\r\n function buildEditButton(href, condition) {\r\n condition = condition == null ? true : condition;\r\n return condition ? buildButton(\"Edit\", href, \"\") : \"\";\r\n }\r\n\r\n function buildViewButton(href, condition) {\r\n condition = condition == null ? true : condition;\r\n return condition ? buildButton(\"View\", href, \"\") : \"\";\r\n }\r\n\r\n function buildDeleteButton(callback, passThrough, condition) {\r\n condition = condition == null ? true : condition;\r\n return condition\r\n ? \" \" +\r\n \"\"\r\n : \"\";\r\n }\r\n\r\n function buildTrendsButton(href, condition) {\r\n condition = condition == null ? true : condition;\r\n return condition ? buildButton(\"Trends\", href, \"\") : \"\";\r\n }\r\n\r\n\r\n function buildKpisButton(href, condition) {\r\n condition = condition == null ? true : condition;\r\n return condition ? buildButton(\"Kpis\", href, \"\") : \"\";\r\n }\r\n\r\n function renderInnerButtons(buttons) {\r\n let renderedButtons = \"\";\r\n buttons.forEach(function (button) {\r\n button.condition = button.condition == null ? true : button.condition;\r\n if (button.condition) {\r\n renderedButtons += buildButton(button.name, button.href, button.innerHtml);\r\n }\r\n });\r\n\r\n return renderedButtons;\r\n }\r\n\r\n function renderDropButtons(buttons) {\r\n let renderedButtons = \"\";\r\n return renderedButtons;\r\n }\r\n\r\n function buildKnownButtons({ trend, kpis, view, edit, others }, dropButtons) {\r\n const buttons = \"
\" +\r\n (trend ? buildTrendsButton(trend.href, trend.condition) : \"\") +\r\n (kpis ? buildKpisButton(kpis.href, kpis.condition) : \"\") +\r\n (view ? buildViewButton(view.href, view.condition) : \"\") +\r\n (edit ? buildEditButton(edit.href, edit.condition) : \"\") +\r\n (others ? renderInnerButtons(others) : \"\") +\r\n (dropButtons ? renderDropButtons(dropButtons) : \"\") +\r\n \"
\";\r\n return buttons;\r\n };\r\n\r\n\r\n\r\n /* ========================================================================\r\n * Public Methods\r\n * ========================================================================\r\n */\r\n\r\n\r\n return {\r\n buildKnownButtons: buildKnownButtons,\r\n buildButton: buildButton,\r\n buildTrendButton: buildTrendsButton,\r\n buildKpisButton: buildKpisButton,\r\n buildViewButton: buildViewButton,\r\n buildEditButton: buildEditButton,\r\n resizeDataTable: function () {\r\n $('.dataTable').each(function (index, element) {\r\n $(element).DataTable().responsive.recalc();\r\n });\r\n }\r\n };\r\n}();","var LocalStorage = function () { // eslint-disable-line no-unused-vars\r\n 'use strict';\r\n\r\n /* ========================================================================\r\n * Private Variables\r\n * ========================================================================\r\n */\r\n\r\n let storageIsSupported = checkLocalStorageIsSupported();\r\n\r\n /* ========================================================================\r\n * Private Methods\r\n * ========================================================================\r\n */\r\n\r\n function checkLocalStorageIsSupported() {\r\n const test = 'testlocalstorage';\r\n try {\r\n localStorage.setItem(test, test);\r\n localStorage.removeItem(test);\r\n return true;\r\n } catch (error) {\r\n return false;\r\n }\r\n }\r\n\r\n /* ========================================================================\r\n * Public Methods\r\n * ========================================================================\r\n */\r\n\r\n return {\r\n /**\r\n * Set a key value pair to local storage.\r\n * @param {string} key\r\n * @param {string} value\r\n */\r\n set: function (key, value) {\r\n if (storageIsSupported) {\r\n localStorage.setItem(key, value);\r\n }\r\n },\r\n\r\n /**\r\n * Get a value from local storage using a specified key.\r\n * @param {string} key\r\n * @returns {string|null}\r\n */\r\n get: function (key) {\r\n return storageIsSupported ? localStorage.getItem(key) : null;\r\n },\r\n\r\n /**\r\n * Remove a value from local storage using a specified key.\r\n * @param {string} key\r\n */\r\n remove: function (key) {\r\n if (storageIsSupported) {\r\n localStorage.removeItem(key);\r\n }\r\n }\r\n };\r\n}();","var Meters = function () { // eslint-disable-line no-unused-vars\r\n 'use strict';\r\n /* ========================================================================\r\n * Private Variables\r\n * ========================================================================\r\n */\r\n\r\n let customerId, buildingId;\r\n\r\n\r\n /* ========================================================================\r\n * Private Methods\r\n * ========================================================================\r\n */\r\n\r\n function getCustomerId() {\r\n if (customerId) {\r\n return customerId;\r\n }\r\n\r\n customerId = $('[name=CustomerId]').val();\r\n return customerId;\r\n }\r\n\r\n function getBuildingId() {\r\n if (buildingId) {\r\n return buildingId;\r\n }\r\n\r\n buildingId = $('[name=BuildingId]').val();\r\n return buildingId;\r\n }\r\n\r\n function reactivateMeter() {\r\n $.fdAjax({\r\n url: $(\"#REACTIVATE_METER_BUTTON\").data(\"url\"),\r\n callback: function () {\r\n if (FD.Page && FD.Page.saveMeter) {\r\n FD.Page.saveMeter({ responseText: '-1' });\r\n } else {\r\n $(\"#MeterModal\").modal('hide');\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getRateCodes(utilityProviderId) {\r\n $.fdAjax({\r\n url: \"/UtilityProviders/\" + utilityProviderId + '/RateCode',\r\n type: \"GET\",\r\n callback: function (result) {\r\n var select = $('#RateCodeId')[0];\r\n select.options.length = 0;\r\n select.options.add(new Option(\"N/A\", \"\", true));\r\n for (var x = 0; x < result.data.length; x++) {\r\n select.options.add(new Option(result.data[x].name, result.data[x].id));\r\n }\r\n $(select).prop('disabled', false);\r\n }\r\n });\r\n }\r\n\r\n function getBuildings(customerId) {\r\n $.fdAjax({\r\n url: \"/Admin/Customers/\" + customerId + \"/Buildings\",\r\n type: \"GET\",\r\n callback: function (result) {\r\n let select = $('#BuildingId');\r\n select.children().remove();\r\n for (var x = 0; x < result.data.length; x++) {\r\n let group = result.data[x];\r\n let groupElement = $(``);\r\n groupElement.label = group.text;\r\n\r\n for (var y = 0; y < group.children.length; y++) {\r\n let option = group.children[y];\r\n groupElement.append(new Option(option.text, option.value));\r\n }\r\n select.append(groupElement);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /* ========================================================================\r\n * Public Methods and Variables\r\n * ========================================================================\r\n */\r\n\r\n return {\r\n getRateCodes: getRateCodes,\r\n\r\n getAddMeterModal: function (data) {\r\n buildingId = data.parentId;\r\n $('#MeterModal').html(null);\r\n $.fdAjax({\r\n url: '/Buildings/' + data.parentid + '/Meters/Add',\r\n ishtml: true,\r\n type: 'GET',\r\n callback: function (result) {\r\n if (result.data) {\r\n $('#MeterModal').html(result.data).enableControls().modal('show');\r\n }\r\n }\r\n })\r\n },\r\n\r\n getAddMeterModalSimple: function (data) {\r\n $('#MeterModal').html(null);\r\n var utilityProviderId = this.element.data('utilityproviderid');\r\n var append = utilityProviderId ? '/' + utilityProviderId + '/' + this.element.data('accountnumber') : '';\r\n $.fdAjax({\r\n url: '/Invoices/' + data.parentid + '/Meters/Add' + append,\r\n ishtml: true,\r\n type: 'GET',\r\n callback: function (result) {\r\n if (result.data) {\r\n $('#MeterModal').html(result.data).enableControls().modal('show');\r\n }\r\n }\r\n })\r\n },\r\n\r\n getPrefilledAddMeterModal: function (data) {\r\n var meterId = data.parentid;\r\n $('#MeterModal').html(null);\r\n $.fdAjax({\r\n url: '/Admin/MissingMeter/Add/' + meterId,\r\n ishtml: true,\r\n type: 'GET',\r\n callback: function (result) {\r\n if (result.data) {\r\n $('#MeterModal').html(result.data).enableControls().modal('show');\r\n }\r\n }\r\n })\r\n },\r\n\r\n getEditMeterModal: function (data) {\r\n $.fdAjax({\r\n url: '/Meters/' + data.parentid + '/Edit',\r\n ishtml: true,\r\n type: 'GET',\r\n callback: function (result) {\r\n if (result.data) {\r\n $('#MeterModal').html(result.data).enableControls().modal('show');\r\n $('textarea', '#MeterModal').control_textarea('resize');\r\n\r\n }\r\n }\r\n })\r\n },\r\n\r\n selectUtilityProvider: function (data) {\r\n if (data.value && Number(data.value) > 0) {\r\n $('#AccountNumber').prop('disabled', false);\r\n if ($('#RateCodeId').length) {\r\n getRateCodes(Number(data.value));\r\n }\r\n }\r\n },\r\n\r\n selectCustomer: function (data) {\r\n $('#BuildingId').prop('disabled', false);\r\n getBuildings(data.value);\r\n },\r\n\r\n buildAccountNumberAjax: function () {\r\n const url = '/Commons/Autocomplete/AccountNumbers';\r\n return {\r\n url: url,\r\n dataType: \"json\",\r\n data: function (data) {\r\n return {\r\n customerId: getCustomerId(),\r\n utilityProviderId: $('#UtilityProviderId').val(),\r\n term: data.term,\r\n appendSelect: true\r\n };\r\n },\r\n results: function (data) {\r\n return {\r\n results: data\r\n };\r\n }\r\n };\r\n },\r\n\r\n buildSummaryAccountNumberAjax: function () {\r\n const url = '/Commons/Autocomplete/SummaryAccountNumbers';\r\n return {\r\n url: url,\r\n dataType: \"json\",\r\n data: function (data) {\r\n return {\r\n customerId: getCustomerId(),\r\n utilityProviderId: $('#UtilityProviderId').val(),\r\n term: data.term,\r\n appendSelect: true\r\n };\r\n },\r\n results: function (data) {\r\n return {\r\n results: data\r\n };\r\n }\r\n };\r\n },\r\n\r\n buildMeterUtilityProviderAjax: function () {\r\n return {\r\n url: \"/Commons/Autocomplete/UtilityProviders\",\r\n data: function (params) {\r\n var query = {\r\n term: params.term,\r\n allowCreation: false\r\n };\r\n return query;\r\n }\r\n };\r\n },\r\n\r\n selectedMetric: function (data) {\r\n $.fdAjax({\r\n url: \"/Commons/Autocomplete/metric-units/\" + data.value + \"?utilityProviderId=\" + $('#UtilityProviderId').val(),\r\n callback: function (result) {\r\n $('[name$=UnitId]').empty().select2({\r\n data: result.data.results\r\n }).trigger('change');\r\n\r\n let list = result.data.results.map(x => ({ Id: x.id, Name: x.text }));\r\n list.unshift({ Id: \"\", Name: \"N/A\", Selected: true});\r\n $('select[name$=UndefinedUnitReplacementId]').control_select('replaceOptions', list).trigger('change');\r\n $(\"input[name$=ActivityId]\").attr('placeholder', result.data.defaultActivityId)\r\n }\r\n });\r\n $(\"[data-show-metricid]\").addClass(\"d-none\");\r\n $(\"[data-show-metricid=\" + data.value + \"]\").removeClass('d-none');\r\n },\r\n\r\n buildUnitsAjax: function (parentId) {\r\n var options = child.getBuildingOptions();\r\n var utilityProviderId = $('#UtilityProviderId').val();\r\n var url = options.unitsAutocompleteRoute + \"/\" +\r\n parentId +\r\n \"?utilityproviderid=\" +\r\n utilityProviderId;\r\n\r\n return {\r\n url: url\r\n };\r\n },\r\n\r\n selectBuilding: function (data) {\r\n buildingId = data.value;\r\n $(\"#sitesControl\").toggleClass(\"d-none\", Number(buildingId) > 0);\r\n },\r\n\r\n deleteMeter: function () {\r\n $.fdAjax({\r\n url: $(\"#DELETE_METER_BUTTON\").data(\"url\") + '&inactiveReason=' + $(\"input[name=InactiveReason]\").val(),\r\n callback: function () {\r\n if (FD.Page && FD.Page.saveMeter) {\r\n FD.Page.saveMeter({ responseText: '-1' });\r\n } else {\r\n $(\"#MeterModal\").modal('hide');\r\n }\r\n }\r\n });\r\n },\r\n\r\n reactivateMeter: function () {\r\n return reactivateMeter();\r\n },\r\n\r\n reactivateMeterWithoutReadings: function () {\r\n let url = $(\"#REACTIVATE_METER_BUTTON\").data(\"url\");\r\n $(\"#REACTIVATE_METER_BUTTON\").data(\"url\", url + \"&restoreReadings=false\");\r\n return reactivateMeter()\r\n },\r\n };\r\n}();","/** @typedef {{\r\n * onShow: (JQLite, any) => void,\r\n * onShown: (JQLite, any) => void,\r\n * onHide: (JQLite, any) => void,\r\n * onHidden: (JQLite, any) => void,\r\n * options: string,\r\n * modal: string\r\n * }} ModalOptions */\r\n\r\nvar Modal = function () { // eslint-disable-line no-unused-vars\r\n 'use strict';\r\n\r\n /* ========================================================================\r\n * Private Variables\r\n * ========================================================================\r\n */\r\n\r\n const defaultModalOptions = {\r\n onShow: function () { },\r\n onShown: function () { },\r\n onHide: function () { },\r\n onHidden: function () { },\r\n options: \"show\",\r\n modal: '#FD_MODAL'\r\n };\r\n let modalLock = false;\r\n\r\n /* ========================================================================\r\n * Private Methods\r\n * ========================================================================\r\n */\r\n\r\n /**\r\n * @callback AjaxCallback\r\n * @param {any} result\r\n * @param {JQLite} $modal\r\n */\r\n\r\n /**\r\n * @param {string} html\r\n * @param {ModalOptions} modalOptions\r\n * @param {any} result The ajax result object that led to showing the modal\r\n * @param {AjaxCallback} callbackBeforeShow The callback to execute before showing the modal\r\n * @param {boolean} forceOpen If another modal is open and this is set to true, this modal will open anyway.\r\n * @returns {JQLite}\r\n */\r\n function showModal(html, modalOptions, result, callbackBeforeShow, forceOpen) {\r\n let locked = modalLock;\r\n if (locked && !forceOpen) {\r\n return null;\r\n }\r\n modalLock = true;\r\n modalOptions = $.extend({}, defaultModalOptions, modalOptions);\r\n\r\n /** @type JQLite */\r\n const $modal = $(modalOptions.modal)\r\n .html(html)\r\n .enableControls()\r\n .on('show.bs.modal', function () {\r\n if (modalOptions.onShow) {\r\n modalOptions.onShow($modal, result);\r\n }\r\n $modal.off('show.bs.modal');\r\n })\r\n .on('shown.bs.modal', function () {\r\n if ($(\".modal:visible\").length > 1) {\r\n $(\".modal:visible\").not($modal).addClass('modal-disabled');\r\n }\r\n $('[data-fd-control=\"textarea\"]', $modal).control_textarea('resize');\r\n $('[autofocus]', $modal).focus();\r\n\r\n if (modalOptions.onShown) {\r\n modalOptions.onShown($modal, result);\r\n }\r\n $modal.off('shown.bs.modal');\r\n })\r\n .on('hide.bs.modal', function () {\r\n $('form', $modal).dirtyForms('setClean');\r\n\r\n if (modalOptions.onHide) {\r\n modalOptions.onHide($modal, result);\r\n }\r\n $modal.off('hide.bs.modal');\r\n })\r\n .on('hidden.bs.modal', function () {\r\n if ($(\".modal:visible\").length > 0) {\r\n $(\".modal:visible\").not($modal).last().removeClass('modal-disabled');\r\n $('body').addClass('modal-open');\r\n } else {\r\n modalLock = false; // release lock before onHidden in order to open another modal on callback if wanted\r\n }\r\n if (modalOptions.onHidden) {\r\n modalOptions.onHidden($modal, result);\r\n }\r\n $modal.off('hidden.bs.modal');\r\n });\r\n\r\n if (callbackBeforeShow) {\r\n callbackBeforeShow(result, $modal);\r\n }\r\n\r\n if (locked && !forceOpen) {\r\n return $modal;\r\n }\r\n\r\n return modalOptions.options ? $modal.modal(modalOptions.options) : $modal.modal(\"show\");\r\n }\r\n\r\n /* ========================================================================\r\n * Public Members\r\n * ========================================================================\r\n */\r\n\r\n return {\r\n /**\r\n * @param {AjaxOptions} ajaxOptions\r\n * @param {ModalOptions} modalOptions\r\n * @param {boolean} forceOpen\r\n */\r\n fdAjax: function (ajaxOptions, modalOptions, forceOpen) {\r\n if (modalLock) {\r\n return;\r\n }\r\n modalLock = true;\r\n\r\n const currentCallback = ajaxOptions.callback;\r\n ajaxOptions.callback = function (result) {\r\n if (result.data) {\r\n modalLock = false;\r\n showModal(result.data, modalOptions, result, currentCallback, forceOpen);\r\n } else {\r\n modalLock = false; // release lock before onHidden in order to open another modal on callback if wanted\r\n if (currentCallback) {\r\n currentCallback(result);\r\n }\r\n }\r\n };\r\n\r\n $.fdAjax(ajaxOptions);\r\n },\r\n\r\n\r\n /**\r\n * @param {string} html\r\n * @param {ModalOptions} modalOptions\r\n * @param {boolean} forceOpen\r\n */\r\n showModal: function (html, modalOptions, forceOpen) {\r\n return showModal(html, modalOptions, null, null, forceOpen);\r\n },\r\n\r\n hideModal: function () {\r\n if (Modal.isOpen()) {\r\n $(this).closest('.modal').modal('hide');\r\n }\r\n },\r\n\r\n isOpen: function isOpen() {\r\n return modalLock;\r\n },\r\n\r\n /**\r\n * @param {{ responseText: string }} xhr\r\n */\r\n openModal: function (xhr, modalOptions) {\r\n FD.Utility.stopLadda.call(this);\r\n return showModal(typeof xhr == \"string\" ? xhr : xhr.responseText, typeof (modalOptions) == 'object' ? modalOptions : undefined);\r\n }\r\n };\r\n}();","var Page = function () { // eslint-disable-line no-unused-vars\r\n 'use strict';\r\n\r\n /* ========================================================================\r\n * Private Variables\r\n * ========================================================================\r\n */\r\n\r\n\r\n /* ========================================================================\r\n * Private Methods\r\n * ========================================================================\r\n */\r\n\r\n\r\n /* ========================================================================\r\n * Public Methods and Variables\r\n * ========================================================================\r\n */\r\n\r\n return {\r\n init: function () { }\r\n };\r\n}();","var Utility = function () { // eslint-disable-line no-unused-vars\r\n 'use strict';\r\n\r\n /* ========================================================================\r\n * Private Variables\r\n * ========================================================================\r\n */\r\n\r\n\r\n /* ========================================================================\r\n * Private Methods\r\n * ========================================================================\r\n */\r\n\r\n\r\n /* ========================================================================\r\n * Public Methods and Variables\r\n * ========================================================================\r\n */\r\n\r\n return {\r\n /**\r\n * Displays an info toast with the message \"This functionality is coming soon :)\"\r\n */\r\n comingSoon: function () {\r\n const message = \"This functionality is coming soon :)\";\r\n FD.notify.info(message, null, null, { dismissAllNotifications: true });\r\n },\r\n\r\n /**\r\n * Create a Ladda button.\r\n * @param {JQLite} $button\r\n */\r\n createLadda: function ($button) {\r\n if (!$button.hasClass(\"ladda-button\")) {\r\n $button.addClass('ladda-button').attr('data-style', 'expand-right').append('');\r\n }\r\n\r\n // start Ladda and save to data\r\n return Ladda.create($button[0]);\r\n },\r\n\r\n /**\r\n * Starts a Ladda button (this function will create it if it isn't already a Ladda button).\r\n * \"this\" should be a control_form, a button, or an anchor\r\n */\r\n startLadda: function () {\r\n let $laddaButton;\r\n if ($(this).is(\"[data-fd-control=form]\")) {\r\n $laddaButton = $(this).control_form(\"popTriggerElement\"); // if we are using an FD form control, the trigger element is what we want\r\n } else if (this.element && this.element.is(\"[data-fd-control=form]\")) {\r\n if (this.element.control_form(\"valid\")) {\r\n $laddaButton = this.element.control_form(\"popTriggerElement\"); // if we are using an FD form control, the trigger element is what we want\r\n }\r\n } else {\r\n $laddaButton = $(\"[type=submit]:visible,button:not([type]):visible\", this) // find any submit buttons with the \"this\" as the parent context\r\n .add($(this).filter(\"a,button\")); // add this if it is an anchor or a button\r\n }\r\n\r\n if (!$laddaButton.length) {\r\n return null; // invalid \"this\"\r\n }\r\n\r\n // create and start Ladda\r\n const ladda = Utility.createLadda($laddaButton).start();\r\n $laddaButton.data(\"fd-ladda\", ladda);\r\n return ladda;\r\n },\r\n\r\n\r\n /**\r\n * Stops a Ladda button\r\n * \"this\" should be a or a parent of a Ladda button\r\n */\r\n stopLadda: function () {\r\n const $laddaButton = $(\".ladda-button\", this) // find all Laddas from the context of \"this\"\r\n .add($(this).filter(\".ladda-button\")); // include this in case it is an anchor or button \r\n\r\n $laddaButton.each(function () {\r\n const ladda = $(this).data(\"fd-ladda\");\r\n if (ladda) {\r\n $(this).prop(\"disabled\", false);\r\n ladda.stop();\r\n }\r\n });\r\n },\r\n\r\n /**\r\n * Toggles d-none on all siblings of \"this\"\r\n */\r\n toggleSiblingsDisplay: function () {\r\n $(this).siblings().add(this).toggleClass(\"d-none\");\r\n },\r\n\r\n /**\r\n * Toggles d-none on all children of \"this\"\r\n */\r\n toggleChildrenDisplay: function () {\r\n $(this).children().toggleClass(\"d-none\");\r\n },\r\n\r\n /**\r\n * TODO: not implemented (missing js library possibly...)\r\n */\r\n blockUI: function (elem) {\r\n if (elem) {\r\n $(elem).block({\r\n message: '',\r\n overlayCSS: {\r\n backgroundColor: '#fff',\r\n opacity: 0.8,\r\n cursor: 'wait'\r\n },\r\n css: {\r\n border: 0,\r\n padding: 0,\r\n backgroundColor: 'transparent'\r\n }\r\n });\r\n } else {\r\n $.blockUI({\r\n message: '',\r\n overlayCSS: {\r\n backgroundColor: '#fff',\r\n opacity: 0.8,\r\n cursor: 'wait'\r\n },\r\n css: {\r\n border: 0,\r\n padding: 0,\r\n backgroundColor: 'transparent'\r\n }\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * TODO: not implemented (missing js library possibly...)\r\n */\r\n unblockUI: function (elem) {\r\n if (elem) {\r\n $(elem).unblock();\r\n } else {\r\n $.unblockUI();\r\n }\r\n },\r\n\r\n /**\r\n * Uses the selector ':input,[data-name]' to collect all values into an object where the names of the elements are properties.\r\n * All property names are parsed so that if a \".\" exists, the property name will only be everything up after that point.\r\n * fd-control types that are supported are: select, number, checkbox, toggle, and datepicker.\r\n * Other elements that are supported are: toggle buttons, non-inputs (the .text() will be the value), inputs with data-value, and inputs\r\n * @param {string|JQLite} container An optional parameter that should be a selector or a jQuery object\r\n */\r\n getControlValuesByContainer: function (container) {\r\n const fldList = container ? $(container).find(':input,[data-name]') : $(':input,[data-name]');\r\n let ctrlAR = {},\r\n lastElement;\r\n\r\n fldList.each(function () {\r\n var elem = $(this);\r\n var fldName = (elem.data('name') ? elem.data('name') : this.name).split('.').pop();\r\n var controlType = elem.data('fd-control');\r\n var val;\r\n\r\n if (controlType === 'select') {\r\n val = elem.val();\r\n } else if (controlType === 'number') {\r\n val = elem.val();\r\n } else if (controlType === 'checkbox' || controlType === 'toggle') {\r\n if (elem.is(\".checkbox-group\")) {\r\n val = ctrlAR[fldName] || [];\r\n if (elem.is(':checked')) {\r\n val.push(elem.prev().val());\r\n }\r\n } else {\r\n val = elem.is(':checked');\r\n }\r\n } else if (controlType === 'datepicker') {\r\n if (elem.data(\"type\") === 'range') {\r\n val = elem.val().split('-');\r\n if (val.length > 0) {\r\n ctrlAR[fldName + \"Start\"] = val[0].trim();\r\n ctrlAR[fldName + \"End\"] = val[1].trim();\r\n return;\r\n }\r\n }\r\n val = elem.val();\r\n } else if (elem.hasClass(\"btn-group\") && elem.data(\"toggle\") === \"buttons\") {\r\n val = $(\"label.btn-primary.active\", elem).children()[0].id;\r\n } else if (controlType === 'button') {\r\n return;\r\n } else if (elem.is(':not(:input)')) {\r\n val = elem.text().trim();\r\n } else {\r\n if (lastElement != null && lastElement.is('[data-fd-control=checkbox],[data-fd-control=toggle]') && lastElement.attr('name') == elem.attr('name')) {\r\n return;\r\n }\r\n if (elem.data('value')) {\r\n val = elem.data('value');\r\n } else {\r\n val = elem.val();\r\n }\r\n }\r\n\r\n ctrlAR[fldName] = val;\r\n lastElement = elem;\r\n });\r\n\r\n return ctrlAR;\r\n },\r\n\r\n /**\r\n * The common function executed when an ajax-unobtrusive fails\r\n * @param {{status: number, getResponseHeader: function(string): string }} jqXhR\r\n */\r\n onFailure: function (jqXhR) {\r\n Utility.stopLadda.call(this); // in case ladda is running, we will want the user to be able to resubmit\r\n\r\n switch (jqXhR.status) {\r\n case 400:\r\n FD.notify.alert(jqXhR.getResponseHeader('error-message'));\r\n break;\r\n case 401:\r\n FD.notify.alert(\"Unauthorized. Please refresh this page.\");\r\n break;\r\n default:\r\n FD.notify.alert(\"An error has occurred. Please try to hard refresh your page.\");\r\n break;\r\n }\r\n },\r\n\r\n /**\r\n * \"this\" should have a data-ajaxUpdate attribute that is set to a selector.\r\n * That selector will have it's jQuery object's FD controls enabled.\r\n */\r\n enableControls: function () {\r\n var self = $($(this).data(\"ajaxUpdate\"));\r\n self.enableControls();\r\n },\r\n\r\n /**\r\n * \"this\" should be a control_form. It will be reset.\r\n */\r\n resetForm: function () {\r\n $(this).control_form('reset');\r\n },\r\n\r\n\r\n /**\r\n * Resets a list typically used for posting back to the server.\r\n * It sequentially updates all indexes.\r\n * @param {string} itemSelector\r\n */\r\n resetSequence: function (itemSelector) {\r\n let index = 0;\r\n $(this).children(itemSelector).each(function () {\r\n $('[name],[data-valmsg-for]', this).each(function () {\r\n updateSequance($(this), \"name\");\r\n updateSequance($(this), \"data-valmsg-for\");\r\n });\r\n index++;\r\n });\r\n\r\n function updateSequance($this, name) {\r\n if ($this.is('[' + name + ']')) {\r\n $this.attr(name, $this.attr(name).replace(/\\[\\d*\\]/, '[' + index + ']'));\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Removes an item of a sequence and gracefully handles resetting the sequence.\r\n * The sequence is a list used typically for posting back to the server.\r\n * The sequence item removed is returned.\r\n * @param {string|JQLite} itemSelector\r\n * @returns {JQLite}\r\n */\r\n removeSequenceItem: function (itemSelector) {\r\n const $item = $(this).closest(itemSelector);\r\n let parent = $item.parent();\r\n $(this).popover('dispose');\r\n $item.find(\"[title]\").tooltip(\"dispose\");\r\n $(this).closest(\"form\").addClass(\"dirty\");\r\n const $itemRemoved = $(this).closest(itemSelector).remove();\r\n\r\n Utility.resetSequence.call(parent, itemSelector);\r\n\r\n return $itemRemoved;\r\n },\r\n\r\n /**\r\n * Adds an item of a sequence and gracefully handles resetting the sequence.\r\n * The sequence is a list used typically for posting back to the server.\r\n * The sequence item added is returned.\r\n * @param {string|JQLite} templateSelector\r\n * @param {string|JQLite} insertBeforeSelector\r\n * @param {string|JQLite} sequenceItemSelector\r\n * @param {any} dataFdValue the value to set onto inputDataFdValueSelector\r\n * @param {string|JQLite} inputDataFdValueSelector\r\n * @returns {JQLite}\r\n */\r\n addSequenceItem: function (templateSelector, insertBeforeSelector, sequenceItemSelector, dataFdValue, inputDataFdValueSelector) {\r\n const item = (typeof templateSelector === \"string\" ? $(templateSelector) : templateSelector)\r\n .clone()\r\n .attr('data-fd-value', dataFdValue)\r\n .removeAttr('id')\r\n .insertBefore(insertBeforeSelector)\r\n .removeClass('d-none')\r\n .enableControls();\r\n if (inputDataFdValueSelector) {\r\n item.find(inputDataFdValueSelector).prop(\"disabled\", false).val(dataFdValue); // if this is a sequence item, there should be a hidden input for form to post the sequence\r\n }\r\n item.closest(\"form\").addClass(\"dirty\"); // the form should be marked as dirty\r\n Utility.resetSequence.call(item.parent(), sequenceItemSelector);\r\n return item; // return the item for any other page specific updates\r\n },\r\n\r\n /**\r\n * JS redirect that also gracefully handles dirty forms.\r\n * @param {string} url\r\n */\r\n redirect: function (url) {\r\n // persist state and clean dirty form\r\n $(\".d-clean-none:visible\").removeClass(\"d-clean-none\");\r\n $(\".d-dirty-none:not(:visible)\").addClass(\"d-none\");\r\n $(\"form\").dirtyForms(\"setClean\").removeClass('force-dirty');\r\n\r\n window.location = url;\r\n }\r\n };\r\n}();","/* global Cookies, LocalStorage, Modal, Notify, Page, Utility, Meters, DataTables */\r\n\r\n/** @typedef {import('./namespaces/Cookies') Cookies */\r\n/** @typedef {import('./namespaces/LocalStorage') LocalStorage */\r\n/** @typedef {import('./namespaces/Modal') Modal */\r\n/** @typedef {import('../Scripts/notifications/notify') Notify */\r\n/** @typedef {import('./namespaces/Page') Page */\r\n/** @typedef {import('./namespaces/Utility') Utility */\r\n/** @typedef {import('./namespaces/Meters') Meters */\r\n/** @typedef {import('./namespaces/DataTables') Meters */\r\n\r\nvar FD = { // eslint-disable-line no-unused-vars\r\n // Public Properties \r\n notify: new Notify(),\r\n\r\n // Public Functions\r\n init: function () { },\r\n\r\n // Namespaces (Speical Public Properties)\r\n Cookies: Cookies,\r\n LocalStorage: LocalStorage,\r\n Modal: Modal,\r\n Utility: Utility,\r\n Page: Page,\r\n\r\n // App Specific Namespaces\r\n Meters: Meters,\r\n DataTables: DataTables,\r\n};","/* global Ladda */\r\n(function ($) {\r\n 'use strict';\r\n const keyCodes = {\r\n Enter: 13\r\n };\r\n $.widget(\"fd.control_button\", {\r\n options: {\r\n parentid: null,\r\n value: null,\r\n disabled: false,\r\n stoppropagation: false,\r\n startladda: false,\r\n callback: function () {}\r\n },\r\n startLoading: function () {\r\n if (!this._laddaInstance) {\r\n this.element.addClass('ladda-button').attr('data-style', 'expand-right').append('');\r\n }\r\n this._laddaInstance = Ladda.create(this.element[0]);\r\n this._laddaInstance.start();\r\n },\r\n stopLoading: function () {\r\n if (this._laddaInstance) {\r\n this._laddaInstance.stop();\r\n }\r\n },\r\n toggleLoading: function () {\r\n if (this._laddaInstance) {\r\n this._laddaInstance.toggle();\r\n } else {\r\n this.startLoading();\r\n }\r\n },\r\n _create: function () {\r\n if (!this.options.parentid) {\r\n this.options.parentid = this.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n this._setEvents();\r\n },\r\n _handleSubmit: function (event) {\r\n if (!this.options.disabled) {\r\n if (this.options.startladda) {\r\n this.startLoading();\r\n }\r\n this.options.callback.call(this, { parentid: this.options.parentid, value: this.options.value }, event);\r\n }\r\n },\r\n _laddaInstance: null,\r\n _setEvents: function () {\r\n const self = this;\r\n this.element.off('click.fdcontrol keydown.fdcontrol')\r\n .on('click.fdcontrol', function (event) {\r\n self._handleSubmit(event);\r\n if (self.options.stoppropagation) {\r\n event.stopPropagation();\r\n }\r\n })\r\n .on('keydown.fdcontrol', function (event) {\r\n if (event.which === keyCodes.Enter) {\r\n self._handleSubmit(event);\r\n if (self.options.stoppropagation) {\r\n event.stopPropagation();\r\n }\r\n }\r\n });\r\n },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n }\r\n });\r\n}(jQuery));","(function ($) {\r\n 'use strict';\r\n $.widget(\"fd.control_checkbox\", {\r\n options: {\r\n parentid: null,\r\n callback: function () { },\r\n group: null\r\n },\r\n _create: function () {\r\n if (!this.options.parentid) {\r\n this.options.parentid = this.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n this.element.removeClass('d-none').removeAttr('data-fouc').uniform();\r\n this.element.val(this.element[0].checked ? 'true' : 'false');\r\n this._setEvents();\r\n this.element.addClass(\"initialized\");\r\n },\r\n _handleSubmit: function (event) {\r\n const self = event.data;\r\n // Fix to post true/false instead of on/off for c# models.\r\n self.element.val(self.element[0].checked ? 'true' : 'false');\r\n // Fix for radio groups that have different name's OptionList[0].Selected\r\n if (self.element.attr('type') === 'radio' && self.options.group) {\r\n $.uniform.update(self.element.closest('form').find('[data-fd-group=\"' + self.options.group + '\"]').not(self.element).prop('checked', false));\r\n }\r\n self.options.callback.call(self, { parentid: self.options.parentid, value: self.element[0].checked }, event);\r\n },\r\n _setEvents: function () {\r\n this.element.off('change.fdcontrol').on('change.fdcontrol', null, this, this._handleSubmit);\r\n },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n },\r\n refresh: function () {\r\n $.uniform.update(this.element);\r\n },\r\n update: function (value) {\r\n const checked = this.element.is(\":checked\");\r\n if (checked !== value) {\r\n this.element.click();\r\n }\r\n }\r\n });\r\n}(jQuery));","(function ($) {\r\n 'use strict';\r\n const confirmPopoverButton = \"FD_CONFIRM_POPOVER_BUTTON\";\r\n $.widget(\"fd.control_confirmationpopover\", {\r\n options: {\r\n confirmcallback: null,\r\n confirmclass: 'btn-primary',\r\n confirmlabel: 'Yes',\r\n cancelcallback: null,\r\n cancelclass: 'btn-link',\r\n cancellabel: 'Cancel',\r\n message: 'Are you sure?',\r\n container: 'body',\r\n parentid: null,\r\n passthrough: null,\r\n sanitize: false // set to true if this popover displays any user-generated information\r\n },\r\n _create: function () {\r\n if (!this.options.parentid) {\r\n this.options.parentid = this.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n if (this.element.attr('tabindex') === undefined) { // Dismiss on next click doesn't work without tabindex value\r\n this.element.attr('tabindex', 0);\r\n }\r\n\r\n this._createPopover();\r\n },\r\n _createPopover: function () {\r\n if (this.element.popover) {\r\n this.element.popover('dispose');\r\n }\r\n const popoverHTML = [],\r\n options = {\r\n container: this.options.container,\r\n title: this.options.message,\r\n html: true,\r\n sanitize: this.options.sanitize,\r\n trigger: 'manual'\r\n };\r\n\r\n // confirm button\r\n popoverHTML.push(\"\");\r\n\r\n // cancel button\r\n if (this.options.cancelcallback) {\r\n popoverHTML.push(\"\");\r\n } else {\r\n popoverHTML.push(\"\");\r\n }\r\n\r\n options.content = popoverHTML.join('');\r\n this.element.popover(options);\r\n this._setEvents();\r\n },\r\n _popoverEventsAreSet: false,\r\n _setEvents: function () {\r\n var that = this;\r\n this.element.off('click.fdcontrol shown.bs.popover hidden.bs.popover').on('click.fdcontrol', function (event, doAjaxPost) {\r\n if (doAjaxPost) {\r\n return;\r\n }\r\n\r\n if ($(\"#\" + confirmPopoverButton).length) {\r\n return false; // only allow one popover open at a time\r\n }\r\n\r\n if (that.options.parentid != that.element.closest('[data-fd-parentid]').data('fd-parentid')) {\r\n that.options.parentid = that.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n that._createPopover();\r\n }\r\n\r\n that.element.popover('show');\r\n that.element.addClass('fd-opacity-50');\r\n return false;\r\n }).on('shown.bs.popover', function () {\r\n $(window).click(function () {\r\n that.element.popover('hide');\r\n $(window).off('click');\r\n });\r\n\r\n $('.popover').enableControls().off('click').on('click', function (event) {\r\n if (!$(event.target).is('button')) {\r\n event.stopPropagation();\r\n }\r\n\r\n // Trigger a new click on the original link to automaticaly run data-ajax code.\r\n if (that.element.is('[data-ajax=true]') && $(event.target).closest('button').is('#FD_CONFIRM_POPOVER_BUTTON')) {\r\n that.element.trigger('click', true);\r\n }\r\n });\r\n }).on('hidden.bs.popover', function () {\r\n that.element.removeClass('fd-opacity-50');\r\n });\r\n },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n if (key === 'parentid' || key === 'passthrough') {\r\n this._createPopover();\r\n }\r\n }\r\n });\r\n}(jQuery));","/* global moment */\r\n(function ($) {\r\n 'use strict';\r\n $.widget(\"fd.control_datepicker\", {\r\n options: {\r\n parentid: null,\r\n callback: function () { },\r\n mindate: null,\r\n maxdate: null,\r\n format: 'm/d/yy',\r\n formatsubmit: 'yyyy-mm-dd',\r\n formatmoment: 'M/D/YY',\r\n monthpicker: false,\r\n editable: true,\r\n showclearbutton: true,\r\n allownull: false,\r\n disabledays: [] // Array of days of the week, numbered 1 - 7.\r\n },\r\n _create: function () {\r\n var that = this;\r\n if (!this.options.parentid) {\r\n this.options.parentid = this.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n const datepickerOptions = {\r\n disable: this.options.disabledays,\r\n format: this.options.format,\r\n formatSubmit: this.options.formatsubmit,\r\n editable: this.options.editable,\r\n onSet: function (context) {\r\n that._handleSubmit(this, context);\r\n }\r\n };\r\n\r\n // pickadate plugin expects a text for clear button or false to hide it\r\n datepickerOptions.clear = this.options.showclearbutton ? 'Clear' : false;\r\n\r\n if (this.options.mindate) {\r\n datepickerOptions.min = new Date(this.options.mindate);\r\n }\r\n if (this.options.maxdate) {\r\n datepickerOptions.max = new Date(this.options.maxdate);\r\n }\r\n if (this.options.monthpicker) {\r\n datepickerOptions.selectYears = true;\r\n datepickerOptions.selectMonths = true;\r\n datepickerOptions.onOpen = function () {\r\n that._setMonthPickerUI();\r\n };\r\n datepickerOptions.onSet = function (e) {\r\n if (e.highlight) {\r\n var h = e.highlight instanceof Array ? e.highlight : [e.highlight.year, e.highlight.month, 1];\r\n that.lastHighlightedDate = h;\r\n that._setMonthPickerUI();\r\n }\r\n };\r\n }\r\n\r\n this._datepickerInstance = this.element.pickadate(datepickerOptions);\r\n if (this.options.editable) {\r\n this._datepickerInstance.off('click focus');\r\n }\r\n this.element[0].fdReset = this._fdReset.bind(this);\r\n this.element[0].fdSetValue = this._fdSetValue.bind(this);\r\n this._setEvents();\r\n },\r\n _setEvents: function () {\r\n const element = this.element;\r\n const momentFormat = this.options.formatmoment;\r\n var $iconContainer = this.element.parent().find(\".form-control-feedback\");\r\n if ($iconContainer.length === 1) {\r\n var picker = element.pickadate('picker');\r\n $iconContainer.click(function () {\r\n let date = new Date();\r\n const inputDate = element.val();\r\n\r\n if (moment(inputDate, momentFormat, true).isValid()) {\r\n date = moment(inputDate, momentFormat, true).toDate();\r\n }\r\n\r\n if (!picker.get('open')) {\r\n picker.set('select', date);\r\n picker.open();\r\n }\r\n });\r\n }\r\n\r\n const $validator = this.element.parent().find(\".pickadate-validator\");\r\n\r\n if (this.options.editable) {\r\n const momentFormat = this.options.formatmoment;\r\n const allownull = this.options.allownull;\r\n element.on('change',\r\n function (event) {\r\n const value = $(event.target).val();\r\n const validDate = value && (\r\n moment(value, momentFormat, true).isValid());\r\n if (validDate || (!value && allownull)) {\r\n $validator.hide();\r\n } else {\r\n $validator.show();\r\n $validator.html(\"Invalid date. Valid format is m/d/yy\");\r\n }\r\n });\r\n\r\n $(\"form\").on(\"submit\",\r\n function (event) {\r\n const value = $(element).val();\r\n if (!value && allownull) {\r\n return true;\r\n }\r\n const validDate = value && (\r\n moment(value, momentFormat, true).isValid());\r\n if (validDate || (!value && allownull)) {\r\n return true;\r\n }\r\n\r\n event.preventDefault();\r\n return false;\r\n });\r\n }\r\n\r\n },\r\n _setMonthPickerUI: function () {\r\n var that = this;\r\n var $picker = this.element.parent()\r\n .find(\".picker\");\r\n\r\n if (!$picker.hasClass('month-only-picker')) {\r\n $picker.addClass('month-only-picker');\r\n }\r\n\r\n var $chooseButton = $picker.find(\".picker__button--choose-month\");\r\n if ($chooseButton.length === 0) {\r\n $chooseButton = $('');\r\n }\r\n\r\n var $yearSelect = $picker.find(\".picker__select--year\");\r\n var $monthSelect = $picker.find(\".picker__select--month\");\r\n\r\n $picker.find(\".picker__nav--next\")\r\n .off('click')\r\n .on('click', function () {\r\n var year = parseInt($yearSelect.val());\r\n var month = parseInt($monthSelect.val());\r\n if (month === 11) {\r\n year += 1;\r\n month = -1;\r\n }\r\n that.lastHighlightedDate = [year, (month + 1), 1];\r\n });\r\n\r\n $picker.find(\".picker__nav--prev\")\r\n .off('click')\r\n .on('click', function () {\r\n var year = parseInt($yearSelect.val());\r\n var month = parseInt($monthSelect.val());\r\n if (month === 0) {\r\n year -= 1;\r\n month = 1;\r\n }\r\n that.lastHighlightedDate = [year, (month - 1), 1];\r\n });\r\n\r\n var $pickerFooter = $picker.find(\".picker__footer\");\r\n $pickerFooter.append($chooseButton);\r\n $chooseButton.click(function () {\r\n var picker = that.element.pickadate('picker');\r\n if (that.lastHighlightedDate) {\r\n that.lastHighlightedDate[2] = 1;\r\n picker.set('select', that.lastHighlightedDate, { format: that.options.format });\r\n }\r\n picker.close();\r\n });\r\n },\r\n _fdSetValue: function (value) {\r\n this.element.val(value);\r\n this._fdReset();\r\n },\r\n _fdReset: function () {\r\n let val = this.element.val();\r\n this.element.pickadate('picker').set('select', val, { format: this.options.format });\r\n },\r\n _handleSubmit: function (datepicker, context) {\r\n var objContext = context.highlight || context.select; // gets highlighted date during clicking 'next' and 'previous' arrows \r\n var date = objContext?.obj || new Date(context.select); // fixes a bug when a date is picked using 'enter' key in keyboard\r\n this.options.callback.call(this, { parentid: this.options.parentid, value: moment(date).format(this.options.formatmoment) }, datepicker);\r\n },\r\n _datepickerInstance: null,\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n }\r\n });\r\n}(jQuery));","/* global moment */\r\n(function ($) {\r\n 'use strict';\r\n const keyCodes = {\r\n Backspace: 8,\r\n Tab: 9,\r\n Enter: 13,\r\n Esc: 27,\r\n Delete: 46\r\n };\r\n $.widget(\"fd.control_daterangepicker\", {\r\n options: {\r\n parentid: null,\r\n callback: function () { },\r\n mindate: null,\r\n maxdate: null,\r\n type: 'single',\r\n usetime: false,\r\n predefinedranges: null,\r\n allownull: false\r\n },\r\n _defaultDatepickerOptions: {\r\n applyClass: 'bg-slate-600',\r\n cancelClass: 'btn-light',\r\n autoApply: false\r\n },\r\n _create: function () {\r\n if (!this.options.parentid) {\r\n this.options.parentid = this.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n const datepickerOptions = $.extend({}, this._defaultDatepickerOptions, {\r\n timePicker: this.options.usetime,\r\n singleDatePicker: this.options.type === 'single' || false,\r\n locale: {\r\n format: this._formatCode()\r\n },\r\n minDate: this.options.mindate || null,\r\n maxDate: this.options.maxdate || null,\r\n autoUpdateInput: !this.options.allownull,\r\n parentEl: this.element.parent()\r\n });\r\n if (this.options.predefinedranges) {\r\n datepickerOptions.ranges = {\r\n 'Today': [moment(), moment()],\r\n 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],\r\n 'Last 7 Days': [moment().subtract(6, 'days'), moment()],\r\n 'Last 30 Days': [moment().subtract(29, 'days'), moment()],\r\n 'This Month': [moment().startOf('month'), moment().endOf('month')],\r\n 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]\r\n };\r\n }\r\n this.element.daterangepicker(datepickerOptions);\r\n this._setEvents();\r\n },\r\n _handleBlur: function (event) {\r\n const self = event.data;\r\n if (self.options.allownull && !self.element.val().trim()) {\r\n self._handleSubmit(null, event);\r\n }\r\n },\r\n _handleKeyup: function (event) {\r\n const self = event.data;\r\n if (event.which === keyCodes.Enter) {\r\n self._handleSubmit(null, event);\r\n }\r\n },\r\n _handleHideDatepicker: function (event, datepicker) {\r\n const self = event.data;\r\n if (!self.options.autoUpdateInput) {\r\n self.element.val(self._getValue(datepicker));\r\n }\r\n self._handleSubmit(datepicker, event);\r\n },\r\n _handleApplyDatepicker: function (event, datepicker) {\r\n const self = event.data;\r\n if (!self.options.autoUpdateInput) {\r\n self.element.val(self._getValue(datepicker));\r\n }\r\n self._handleSubmit(datepicker, event);\r\n },\r\n _handleSubmit: function (datepicker, event) {\r\n if (datepicker) {\r\n this.options.callback.call(this, {\r\n parentid: this.options.parentid,\r\n value: this._getValue(datepicker),\r\n startDate: datepicker.startDate.format(this._formatCode()),\r\n endDate: datepicker.endDate.format(this._formatCode())\r\n }, event);\r\n } else {\r\n this.options.callback.call(this, { parentid: this.options.parentid }, event);\r\n }\r\n },\r\n _setEvents: function () {\r\n this.element.off('blur.fdcontrol, keyup.fdcontrol, hide.daterangepicker, apply.daterangepicker')\r\n .on('blur.fdcontrol', null, this, this._handleBlur)\r\n .on('keyup.fdcontrol', null, this, this._handleKeyup)\r\n .on('hide.daterangepicker', null, this, this._handleHideDatepicker)\r\n .on('apply.daterangepicker', null, this, this._handleApplyDatepicker);\r\n },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n },\r\n _formatCode: function () {\r\n return this.options.usetime ? \"MM/DD/YYYY h:mm a\" : \"MM/DD/YYYY\";\r\n },\r\n _getValue: function (datepicker) {\r\n if (this.options.type === 'single') {\r\n return datepicker.startDate.format(this._formatCode());\r\n }\r\n\r\n return datepicker.startDate.format(this._formatCode()) + '-' + datepicker.endDate.format(this._formatCode());\r\n }\r\n });\r\n}(jQuery));","(function ($) {\r\n 'use strict';\r\n\r\n $.widget(\"fd.control_editor\", {\r\n options: {\r\n callback: function () { },\r\n iskeyup: false,\r\n iskeyupdelay: 250,\r\n maxlength: null,\r\n minlength: 0,\r\n parentid: null,\r\n allowcodeview: false, // Set to true to allow the HTML button to be shown\r\n inmodal: false // Set to true if editor is inside a modal\r\n },\r\n initial: function (value) {\r\n if (value === undefined) {\r\n return this.options.initial;\r\n }\r\n\r\n this.options.initial = value;\r\n this.element.data('initial', value).attr('data-initial', value);\r\n\r\n return this;\r\n },\r\n _create: function () {\r\n if (!this.options.parentid) {\r\n this.options.parentid = this.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n\r\n // Convert numeric options\r\n this.options.iskeyupdelay = Number(this.options.iskeyupdelay);\r\n this.options.minlength = Number(this.options.minlength);\r\n this.options.maxlength = this.options.maxlength ? Number(this.options.maxlength) : null;\r\n if (this.options.maxlength) {\r\n this.element.attr('maxlength', this.options.maxlength);\r\n }\r\n\r\n const viewToolbar = this.options.allowcodeview ? ['fullscreen', 'codeview', 'help'] : ['fullscreen', 'help'];\r\n this.element.summernote({\r\n codeviewFilter: true,\r\n codeviewIframeFilter: true,\r\n dialogsInBody: !this.options.inmodal,\r\n toolbar: [\r\n ['style', ['style']],\r\n ['font', ['bold', 'underline', 'clear']],\r\n ['fontname', ['fontname']],\r\n ['color', ['color']],\r\n ['para', ['ul', 'ol', 'paragraph']],\r\n ['table', ['table']],\r\n ['insert', ['link', 'picture', 'video']],\r\n ['view', viewToolbar]\r\n ]\r\n });\r\n\r\n this.initial(this.options.initial || this.element.val());\r\n this._setEvents();\r\n },\r\n _handleBlur: function (event) {\r\n const self = event.data;\r\n if (self.element.val() === self.options.initial) {\r\n return false;\r\n }\r\n self._handleSubmit(event);\r\n return true;\r\n },\r\n _handleFocus: function (event) {\r\n const self = event.data;\r\n self.initial(self.element.val());\r\n },\r\n _handleKeyup: function (event) {\r\n const self = event.data;\r\n if (self.options.iskeyup) {\r\n clearTimeout(self._keyupTimer);\r\n self._keyupTimer = setTimeout(function () {\r\n self._handleSubmit(event);\r\n }, self.options.iskeyupdelay);\r\n }\r\n },\r\n _handleSubmit: function (event) {\r\n if (this._keyupTimer) {\r\n clearTimeout(this._keyupTimer);\r\n this._keyupTimer = null;\r\n }\r\n\r\n this.options.callback.call(this, { parentID: this.options.parentid, value: this.element.val().trim() }, event);\r\n },\r\n _keyupTimer: null,\r\n _setEvents: function () {\r\n this.element.off('blur.fdcontrol keyup.fdcontrol focus.fdcontrol')\r\n .on('blur.fdcontrol', null, this, this._handleBlur)\r\n .on('focus.fdcontrol', null, this, this._handleFocus)\r\n .on('keyup.fdcontrol', null, this, this._handleKeyup);\r\n },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n },\r\n _destroy: function () {\r\n this.element.off('blur.fdcontrol keyup.fdcontrol focus.fdcontrol');\r\n }\r\n });\r\n}(jQuery));","(function ($) {\r\n 'use strict';\r\n $.widget(\"fd.control_form\", {\r\n options: {\r\n parentid: null,\r\n callback: function () { },\r\n onchange: true, // If true, the form will submit on any :input change (input, textarea, button, or select)\r\n changecallback: null, // If no change callback is provided, control will automatically pass to the submit callback\r\n dirtyformsmessage: 'You have unsaved changes that may be lost if you leave this page. Are you sure you wish to proceed?',\r\n dirtyformstitle: 'Unsaved Changes'\r\n },\r\n _create: function () {\r\n if (!this.options.parentid) {\r\n this.options.parentid = this.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n if (this.element.is('form')) {\r\n $.validator.unobtrusive.parse(this.element);\r\n const validator = this.element.data(\"validator\");\r\n if (validator) {\r\n validator.settings.ignore = \".select2-search__field,.ignore-validators\";\r\n validator.settings.focusInvalid = false;\r\n }\r\n // Custom scrolling on invalid form to support header overlay and hidden elements.\r\n $(\"form\").bind(\"invalid-form.validate\", function (event, validator) {\r\n let target = $(validator.errorList[0].element).is('.picker__input') ?\r\n $(validator.errorList[0].element).siblings('input').closest(\":visible\")\r\n : $(validator.errorList[0].element).closest(\":visible\");\r\n\r\n if (!validator.numberOfInvalids()) {\r\n return;\r\n }\r\n\r\n const controlOffset = 35;\r\n const scrollTo = target.offset().top\r\n - parseInt($('.page-content').css('padding-top'))\r\n - parseInt($('body').css('padding-top'))\r\n - controlOffset;\r\n if ($('html,body').scrollTop() > scrollTo) {\r\n $('html,body').scrollTop(scrollTo);\r\n }\r\n target.focus();\r\n });\r\n\r\n this.form = this.element;\r\n } else {\r\n this.form = $(\"
\").appendTo(this.element);\r\n }\r\n\r\n const dirtyFormOptions = {\r\n message: this.options.dirtyformsmessage,\r\n dialog: {\r\n title: this.options.dirtyformstitle\r\n },\r\n fieldSelector: \"input:not([type='button'],[type='image'],[type='submit'],[type='reset'],[type='search']),select,textarea\",\r\n helpers: [\r\n {\r\n isDirty: function ($node, index) {\r\n if ($node.is('form')) {\r\n return $node.hasClass('force-dirty');\r\n }\r\n }\r\n }\r\n ]\r\n };\r\n\r\n this.form.dirtyForms(dirtyFormOptions);\r\n\r\n this._setEvents();\r\n },\r\n _handleChange: function (event) {\r\n event.stopPropagation();\r\n const form = event.data;\r\n const $input = $(this);\r\n\r\n if ($input.is(\":focus\") && event.namespace !== 'onenter') {\r\n $input.off('blur').on('blur', null, event.data, form._handleChange);\r\n return; // don't fire change event until the input loses focus\r\n }\r\n\r\n if (form.options.onchange && !form.element.is('[disabled]') && !$input.is(\".ignore-onchange\")) {\r\n if (form.options.changecallback && typeof (form.options.changecallback) === 'function') {\r\n form.options.changecallback.call(form, { parentid: form.options.parentid, elem: $input }, event);\r\n } else {\r\n form.element.submit();\r\n }\r\n }\r\n if (!form.element.is('form')) {\r\n form.form.addClass('dirty');\r\n }\r\n },\r\n _handleSubmit: function (event) {\r\n const self = event.data;\r\n\r\n if (self._triggerElement === undefined) {\r\n self._triggerElement = event.originalEvent ? $(event.originalEvent.submitter) : null;\r\n }\r\n\r\n self.options.callback.call(self, { parentid: self.options.parentid }, event);\r\n\r\n // An unobtrusive form will post on its own so don't cancel the event.\r\n if (!self.element.data('ajax')) {\r\n event.stopPropagation();\r\n }\r\n\r\n self.setClean();\r\n },\r\n _handleReset: function (event) {\r\n const self = event.data;\r\n setTimeout(function () {\r\n $('[data-fd-control=toggle]', self.element).control_toggle('destroy').control_toggle();\r\n $('[data-fd-control=select]', self.element).trigger('change');\r\n $('[data-fd-control=imagefile]', self.element).control_imagefile('reset');\r\n if (!(\"ontouchstart\" in document.documentElement)) {\r\n $(\"input:visible,textarea:visible,select:visible\", self.element).first().focus();\r\n }\r\n\r\n // Clear current errors.\r\n const validator = self.element.validate();\r\n $(\":input\", self.element).each(function () {\r\n validator.successList.push(this);\r\n });\r\n validator.showErrors();\r\n validator.resetForm();\r\n validator.reset();\r\n }, 1);\r\n },\r\n _setEvents: function () {\r\n const $self = this.element;\r\n $self.off('submit.fdcontrol reset.fdcontrol')\r\n .on('submit.fdcontrol', null, this, this._handleSubmit)\r\n .on('reset.fdcontrol', null, this, this._handleReset);\r\n\r\n if (this.options.onchange || !$self.is('form')) {\r\n $self.off('change.fdformcontrol')\r\n .on('change.fdformcontrol change.onenter', ':input', this, this._handleChange);\r\n }\r\n },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n },\r\n setClean: function () {\r\n this.form.removeClass('dirty force-dirty').dirtyForms('setClean');\r\n },\r\n valid: function () {\r\n const $self = this.element;\r\n\r\n if (this.element.is('form')) {\r\n return this.element.valid();\r\n }\r\n\r\n let inputsAreValid = true;\r\n this.element.find('[name][name!=\"\"]:input').filter(function () {\r\n return $(this).closest('[data-fd-control=form]')[0] === $self[0];\r\n }).each(function () {\r\n const $input = $(this);\r\n const $validationElement = $input.add($input.next('[data-valmsg-for]'));\r\n $.validator.unobtrusive.parse($validationElement.wrapAll('
').parent().first());\r\n inputsAreValid = $input.parent().valid() && inputsAreValid;\r\n $validationElement.unwrap();\r\n });\r\n return inputsAreValid;\r\n },\r\n rebuildValidate: function () {\r\n $.validator.unobtrusive.parse(this.element);\r\n\r\n var unobtrusiveValidation = this.element.data('unobtrusiveValidation');\r\n var validator = this.element.validate();\r\n\r\n $.each(unobtrusiveValidation.options.rules, function (elname, elrules) {\r\n if (validator.settings.rules[elname] === undefined) {\r\n var args = {};\r\n $.extend(args, elrules);\r\n args.messages = unobtrusiveValidation.options.messages[elname];\r\n $(\"[name='\" + elname + \"']\").rules(\"add\", args);\r\n } else {\r\n $.each(elrules, function (rulename, data) {\r\n if (validator.settings.rules[elname][rulename] === undefined) {\r\n var args = {};\r\n args[rulename] = data;\r\n args.messages = unobtrusiveValidation.options.messages[elname][rulename];\r\n $(\"[name='\" + elname + \"']\").rules(\"add\", args);\r\n }\r\n });\r\n }\r\n });\r\n },\r\n serialize: function () {\r\n const $self = this.element;\r\n\r\n if (this.element.is('form')) {\r\n return this.element.serialize();\r\n }\r\n\r\n return this.element.find('[name][name!=\"\"]:input').filter(function () {\r\n return $(this).closest('[data-fd-control=form]')[0] === $self[0];\r\n }).serialize();\r\n },\r\n reset: function () {\r\n // This will reset the controlls of a form to the default page-load state. If called on a non-form it will rest all child forms but not affect input's not contained in a form.\r\n if (!this.element.is('form')) {\r\n $(\"form[data-fd-control=form]\", this.element).control_form('reset');\r\n } else {\r\n this.element.trigger(\"reset\");\r\n }\r\n },\r\n popTriggerElement: function () {\r\n const triggerElement = this.getTriggerElement();\r\n this._triggerElement = undefined;\r\n return triggerElement;\r\n },\r\n getTriggerElement: function () {\r\n return this._triggerElement || $();\r\n }\r\n });\r\n}(jQuery));","(function ($) {\r\n 'use strict';\r\n const isAdvancedUpload = function () {\r\n var div = document.createElement('div');\r\n return (('draggable' in div) || ('ondragstart' in div && 'ondrop' in div)) && 'FormData' in window && 'FileReader' in window;\r\n }();\r\n const isMobile = function () {\r\n return \"ontouchstart\" in document.documentElement;\r\n }();\r\n $.event.fix = (function (originalFix) {\r\n return function (event) {\r\n event = originalFix.apply(this, arguments);\r\n if (event.type.indexOf(\"copy\") === 0 || event.type.indexOf(\"paste\") === 0) {\r\n event.clipboardData = event.originalEvent.clipboardData;\r\n }\r\n return event;\r\n };\r\n })($.event.fix);\r\n\r\n var eventsWired = false;\r\n var currentSelection;\r\n\r\n $.widget(\"fd.control_imagefile\", {\r\n options: {\r\n callback: function () { }, // on remove, returning false will override remove functionality. Otherwise this is in addition to removing or selecting a file\r\n choosefiletext: 'Choose File',\r\n choosefileclass: 'btn btn-info',\r\n choosefileicon: \"\",\r\n takepicturetext: 'Take Picture',\r\n takepictureclass: 'btn btn-info',\r\n takepictureicon: \"\",\r\n unsupportedfiletypetext: 'Unsupported File Type', // supported file types are indicated by the accept attribute\r\n unsupportedfilesizetext: 'Unsupported File Size',\r\n maxsize: 29360128, // default 28 MB (this is the default max file upload size, approximately, for asp.net core)\r\n removebutton: true,\r\n removetext: 'Remove',\r\n removecssclass: 'btn btn-danger',\r\n removeicon: \"\",\r\n filenamecssclass: 'file-caption-info',\r\n imagecssclass: 'file-thumbnail my-2',\r\n urlcssclass: 'fd-margin-top-10',\r\n mobilecssclass: \"fas fa-cloud-upload-alt\",\r\n enablepreview: true,\r\n previewplacemnt: 'above', // above, below\r\n advancedupload: true,\r\n dragdroptitle: 'Drag & drop files here …',\r\n copypastetitle: 'or click here and press [Ctrl-V].',\r\n forbidden: \"application/x-msdownload,*.bat,*.cmd,*.scr,*.bash\",\r\n uploadbutton: false,\r\n uploadbuttontext: 'Upload File(s)',\r\n uploadbuttonclass: 'btn btn-success',\r\n uploadicon: \"\",\r\n uploadmessage: 'Files are uploading'\r\n },\r\n initial: function (value) {\r\n if (value === undefined) {\r\n return this.options.initial;\r\n }\r\n\r\n this.options.initial = value;\r\n this.element.data('initial', value).attr('data-initial', value);\r\n return this;\r\n },\r\n _create: function () {\r\n var self = this;\r\n if (!this.options.parentid) {\r\n this.options.parentid = this.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n\r\n this._createUiElements();\r\n this._tryLoadUrl(this.element.attr('value'));\r\n this._setEvents();\r\n },\r\n _remove: function (event, skipCallback) {\r\n // Note that element[0].files will still existing in this callback.\r\n if (!skipCallback && !this.options.uploadbutton && this.options.callback.call(this, { parentID: this.options.parentid, value: this.element.attr('multiple') ? this.element[0].files : this.element[0].files[0], isRemove: true }, event) === false) {\r\n return false;\r\n }\r\n\r\n this.$previewImage.addClass('d-none');\r\n this.$previewIcon.addClass('d-none');\r\n if (this.options.removebutton) {\r\n this.$removeButton.addClass('d-none');\r\n }\r\n if (this.options.uploadbutton) {\r\n this.$uploadButton.addClass('d-none');\r\n }\r\n this.$buttonGroup.toggleClass('btn-group', this.$buttonGroup.children(':visible').length > 1);\r\n if (this.options.advancedupload && isAdvancedUpload) {\r\n this.$dropZoneTitle.removeClass('d-none');\r\n if (!isMobile) {\r\n this.$copyPasteTitle.removeClass('d-none');\r\n }\r\n }\r\n this.$fileNameLabel.text('');\r\n this.element[0].value = '';\r\n this.element.trigger('change');\r\n if (!skipCallback) {\r\n this.element.valid();\r\n }\r\n if (!this.options.enablepreview && this.url) {\r\n this.$fileNameLabel.removeClass('d-none');\r\n }\r\n if (this.element.data('val')) {\r\n this.element.rules('add', 'required');\r\n }\r\n if (this.element.attr('value')) {\r\n this.$removeUrl.val(true);\r\n }\r\n if (this.element.attr('multiple')) {\r\n this.$fileList.children().not(this.$fileListItem).remove();\r\n }\r\n\r\n return false;\r\n },\r\n _setValue: function (urlOrInputFile) {\r\n if (urlOrInputFile && urlOrInputFile.files && urlOrInputFile.files[0]) {\r\n var fileElement = urlOrInputFile.files[0];\r\n this._showSelectionControls(fileElement.name, this.$fileListItem);\r\n } else {\r\n this._tryLoadUrl(urlOrInputFile);\r\n this.reset();\r\n }\r\n },\r\n reset: function () {\r\n this._remove(null, true);\r\n },\r\n _tryLoadUrl: function (url) {\r\n if (!url)\r\n return;\r\n\r\n this.$fileNameLabel.text(url.split('/').pop()).removeClass(\"d-none\");\r\n\r\n this.element.rules('remove', 'required');\r\n\r\n this._showSelectionControls(url.split('/').pop(), this.$fileListItem);\r\n\r\n var self = this;\r\n var tmpImg = new Image();\r\n tmpImg.onload = function () {\r\n self._previewUrl(url, true, url.split('/').pop(), self.$fileListItem);\r\n };\r\n tmpImg.src = url;\r\n },\r\n _createUiElements: function () {\r\n\r\n this.$container = $('
').insertAfter(this.element);\r\n this.$dropZone = $('
').appendTo(this.$container);\r\n this.$dropZoneTitle = $('
' + (isMobile ? '' : this.options.dragdroptitle) + '
').appendTo(this.$dropZone);\r\n this.$copyPasteTitle = $('
' + this.options.copypastetitle + '
').appendTo(this.$dropZone);\r\n\r\n this.$fileList = $(\"
\").appendTo(this.$dropZone);\r\n this.$fileListItem = $(\"
\").appendTo(this.$fileList);\r\n this.$previewImage = $(\"\").appendTo(this.$fileListItem);\r\n this.$previewIcon = $(\"\").appendTo(this.$fileListItem);\r\n if (this.options.enablepreview && this.element.attr('multiple')) {\r\n $(\"
\").appendTo(this.$fileListItem);\r\n }\r\n this.$fileNameLabel = $(\"\").appendTo(this.$fileListItem);\r\n\r\n if (this.element.attr('value')) {\r\n\r\n this.$removeUrl = $(\"\").appendTo(this.$container);\r\n }\r\n\r\n this.$buttonGroup = $('
').appendTo(this.$dropZone);\r\n if (isMobile && (this.element.not('[accept]') || this.element.attr('accept').indexOf('image/*') > -1)) {\r\n this.$pictureButton = $(\"\").appendTo(this.$buttonGroup);\r\n }\r\n this.$browseButton = $(\"\").appendTo(this.$buttonGroup);\r\n if (this.options.removebutton) {\r\n this.$removeButton = $(\"\").appendTo(this.$buttonGroup);\r\n }\r\n if (this.options.uploadbutton) {\r\n this.$uploadButton = $(\"\").appendTo(this.$buttonGroup);\r\n }\r\n this.$buttonGroup.toggleClass('btn-group', this.$buttonGroup.children(':visible').length > 1);\r\n this.$uploadmessage = $('
' + this.options.uploadmessage + '
').appendTo(this.$dropZone);\r\n this._laddaInstance = Ladda.create($('.ladda-button', this.$uploadmessage)[0]);\r\n this.element.addClass('d-none');\r\n },\r\n _setEvents: function () {\r\n const self = this;\r\n\r\n this.element[0].fdSetValue = this._setValue.bind(this);\r\n\r\n this.$browseButton.click(function (e) {\r\n self.element.trigger('click');\r\n return false;\r\n });\r\n if (this.$pictureButton) {\r\n this.$pictureButton.click(function (e) {\r\n self.element.attr('capture', 'camera');\r\n self.element.trigger('click');\r\n self.element.removeAttr('capture');\r\n return false;\r\n });\r\n }\r\n\r\n if (this.options.removebutton) {\r\n this.$removeButton.click(this._remove.bind(this));\r\n }\r\n if (this.options.uploadbutton) {\r\n this.$uploadButton.click(this._handleSubmit.bind(this));\r\n }\r\n\r\n this.element.off('change.fdcontrol')\r\n .on('change.fdcontrol', null, this, this._handleChange.bind(this));\r\n\r\n if (this.options.advancedupload && isAdvancedUpload) {\r\n this.$container.on('drag dragstart dragend dragover dragenter dragleave drop', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n })\r\n .on('dragover dragenter', function () {\r\n if (self.isUploading) {\r\n return;\r\n }\r\n self.$container.addClass('is-dragover');\r\n })\r\n .on('dragleave dragend drop', function () {\r\n if (self.isUploading) {\r\n return;\r\n }\r\n self.$container.removeClass('is-dragover');\r\n })\r\n .on('drop', function (e) {\r\n if (self.isUploading) {\r\n return;\r\n }\r\n self.element[0].files = e.originalEvent.dataTransfer.files;\r\n self._handleChange();\r\n });\r\n\r\n if (!eventsWired) {\r\n $(\"html\").bind(\"paste\", this._handleImagePaste);\r\n eventsWired = true;\r\n }\r\n this.$container.on('click', function () {\r\n if (!currentSelection || currentSelection.element != self) {\r\n if (currentSelection) {\r\n currentSelection.$container.removeClass('is-selected');\r\n }\r\n self.$container.addClass('is-selected');\r\n currentSelection = self;\r\n }\r\n });\r\n }\r\n },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n },\r\n _handleImagePaste: function (event) {\r\n var self = currentSelection;\r\n if (self === undefined && $('.file-advanced:visible').length === 1) {\r\n self = $('.file-advanced:visible').prev().data('fdControl_imagefile');\r\n }\r\n if (self) {\r\n if (self.isUploading) {\r\n return;\r\n }\r\n self.element[0].files = event.clipboardData.files;\r\n self._handleChange();\r\n }\r\n },\r\n _clearInputFile: function (element) {\r\n element.value = '';\r\n this.element.valid();\r\n },\r\n _previewUrl: function (url, isValid, tooltipText, fileItem) {\r\n if (this.options.enablepreview) {\r\n if (isValid) {\r\n fileItem.find('img').attr('src', url).removeClass('d-none');\r\n fileItem.find('span').addClass('d-none');\r\n } else {\r\n var icon;\r\n switch (tooltipText.split('.').pop().toLowerCase()) {\r\n case 'csv': case 'tab':\r\n icon = ' fas fa-file-csv';\r\n break;\r\n case 'zip': case '7z': case 'rar': case 'gz':\r\n icon = ' fas fa-file-archive';\r\n break;\r\n case 'avi': case 'mts': case 'm2ts': case 'ts': case 'mov': case 'qs': case 'wmv':\r\n icon = ' fas fa-file-video';\r\n break;\r\n case 'docx': case 'docm': case 'dotx': case 'dotm': case 'docb':\r\n icon = ' fas fa-file-word';\r\n break;\r\n case 'xsl': case 'xlsx': case 'xlsb': case 'xlms':\r\n icon = ' fas fa-file-excel';\r\n break;\r\n case 'ppt':\r\n icon = ' fas fa-file-powerpoint';\r\n break;\r\n case 'pdf': case 'ps':\r\n icon = ' fas fa-file-pdf';\r\n break;\r\n case 'text':\r\n icon = ' fase fa-file-alt';\r\n break;\r\n case 'xml': case 'json': case 'config':\r\n icon = ' fas fa-file-code';\r\n break;\r\n default:\r\n icon = ' fas fa-file';\r\n }\r\n fileItem.find('img').addClass('d-none');\r\n fileItem.find('span').attr('class', this.options.imagecssclass + icon);\r\n }\r\n } else {\r\n fileItem.find('label').val(url).removeClass('d-none');\r\n }\r\n },\r\n _handleChange: function (event) {\r\n var input = this.element[0];\r\n var self = this;\r\n var stopProccessing = false;\r\n\r\n if (!input.files || !input.files[0])\r\n return;\r\n\r\n if (this.element.attr('multiple')) {\r\n this.$fileList.children().not(this.$fileListItem).remove();\r\n }\r\n\r\n $.each(input.files, function (idx) {\r\n if (stopProccessing) {\r\n return;\r\n }\r\n var fileElement = this;\r\n var rejectFilter = self.options.forbidden;\r\n var invalidFileType = (!rejectFilter || rejectFilter.replace(/\\s/g, '').split(',').filter(function (accept) {\r\n return new RegExp(accept.replace('*', '.*')).test(fileElement.type) || new RegExp(accept.replace('*', '.*')).test(fileElement.name);\r\n }).length > 0);\r\n var acceptFilter = self.element.attr('accept');\r\n var validFileType = (!acceptFilter || acceptFilter.replace(/\\s/g, '').split(',').filter(function (accept) {\r\n return new RegExp(accept.replace('*', '.*')).test(fileElement.type);\r\n }).length > 0);\r\n var validFileSize = self.options.maxsize < 0 || fileElement.size <= self.options.maxsize\r\n\r\n if (validFileType && validFileSize && !invalidFileType) {\r\n const isValidPreview = self.options.enablepreview && fileElement.type.includes('image');\r\n var fileItem = self.element.attr('multiple') && idx ? self.$fileListItem.clone().appendTo(self.$fileList) : self.$fileListItem;\r\n\r\n if (self.options.enablepreview) {\r\n var reader = new FileReader();\r\n reader.onload = function (e) {\r\n if (stopProccessing) {\r\n return;\r\n }\r\n self._previewUrl(e.target.result, isValidPreview, fileElement.name, fileItem);\r\n };\r\n reader.readAsDataURL(fileElement);\r\n }\r\n\r\n self._showSelectionControls(fileElement.name, fileItem);\r\n if (self.element.attr('multiple') && idx + 1 == input.files.length && !self.options.uploadbutton) {\r\n self.options.callback.call(self, { parentID: self.options.parentid, value: input.files }, event);\r\n self.element.valid();\r\n }\r\n if (self.element.attr('multiple') && idx + 1 == input.files.length) {\r\n self.element.closest('form').dirtyForms('rescan');\r\n }\r\n } else {\r\n self._remove(event, true);\r\n stopProccessing = true;\r\n self.$fileNameLabel.addClass('text-danger');\r\n if (!validFileType || invalidFileType) {\r\n if (self.options.unsupportedfiletypetext) {\r\n var indexOfExtension = fileElement.name.lastIndexOf('.');\r\n self.$fileNameLabel.text(self.options.unsupportedfiletypetext + (indexOfExtension > -1 ? ' (' + fileElement.name.substring(indexOfExtension) + ')' : ''));\r\n }\r\n } else if (!validFileSize) {\r\n if (self.options.unsupportedfilesizetext) {\r\n self.$fileNameLabel.text(self.options.unsupportedfilesizetext + ' (' + self._formatBytes(fileElement.size) + ' > ' + self._formatBytes(self.options.maxsize) + ')');\r\n }\r\n }\r\n }\r\n if (!self.element.attr('multiple') && !self.options.uploadbutton) {\r\n self.options.callback.call(self, { parentID: self.options.parentid, value: fileElement, validFileType: validFileType, validFileSize: validFileSize }, event);\r\n self.element.valid();\r\n }\r\n if (!self.element.attr('multiple') && validFileType && validFileSize && !invalidFileType) {\r\n self.element.closest('form').dirtyForms('rescan');\r\n }\r\n });\r\n },\r\n _handleSubmit: function (event) {\r\n this.options.callback.call(this, { parentID: this.options.parentid, value: this.element.attr('multiple') ? this.element[0].files : this.element[0].files[0] }, event);\r\n this.reset();\r\n return false;\r\n },\r\n _formatBytes: function (bytes, decimals) {\r\n if (decimals === undefined) {\r\n decimals = 2;\r\n }\r\n if (bytes === 0) {\r\n return '0 B';\r\n }\r\n\r\n const k = 1024;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\r\n },\r\n _showSelectionControls: function (name, fileItem) {\r\n fileItem.find('label').removeClass('text-danger').text(name);\r\n if (this.options.removebutton) {\r\n this.$removeButton.removeClass('d-none');\r\n }\r\n if (this.options.uploadbutton && this.element[0].files.length) {\r\n this.$uploadButton.removeClass('d-none');\r\n }\r\n this.$buttonGroup.toggleClass('btn-group', this.$buttonGroup.children(':visible').length > 1);\r\n if (this.options.advancedupload) {\r\n this.$dropZoneTitle.addClass('d-none');\r\n if (!isMobile) {\r\n this.$copyPasteTitle.addClass('d-none');\r\n }\r\n }\r\n },\r\n _setUploading: function (isUploading) {\r\n this.isUploading = isUploading;\r\n this.$buttonGroup.toggleClass('d-none', isUploading).toggleClass('d-flex', !isUploading);\r\n this.$container.toggleClass('disabled', isUploading);\r\n this.$uploadmessage.toggleClass('d-none', !isUploading);\r\n },\r\n startUpload: function () {\r\n this._setUploading(true);\r\n this._laddaInstance.start();\r\n },\r\n stopUpload: function () {\r\n this._setUploading(false);\r\n this._laddaInstance.stop();\r\n },\r\n });\r\n}(jQuery));","(function ($) {\r\n 'use strict';\r\n const keyCodes = {\r\n Backspace: 8,\r\n Tab: 9,\r\n Enter: 13,\r\n Esc: 27,\r\n Delete: 46\r\n };\r\n $.widget(\"fd.control_number\", {\r\n options: {\r\n parentid: null,\r\n callback: function () { },\r\n precision: 0,\r\n allowclear: false,\r\n min: null,\r\n max: null\r\n },\r\n initial: function (value) {\r\n if (value === undefined) {\r\n return this.options.initial;\r\n }\r\n\r\n this.options.initial = value;\r\n this.element.data('initial', value).attr('data-initial', value);\r\n\r\n return this;\r\n },\r\n _create: function () {\r\n if (!this.options.parentid) {\r\n this.options.parentid = this.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n\r\n // Convert numeric options\r\n this.options.min = this.options.min !== null ? Number(this.options.min) : null;\r\n this.options.max = this.options.max !== null ? Number(this.options.max) : null;\r\n\r\n this._validate().initial(this.element.val())._setEvents();\r\n },\r\n _handleFocus: function (event) {\r\n const self = event.data;\r\n self.initial(self.element.val());\r\n },\r\n _handleBlur: function (event) {\r\n const self = event.data;\r\n self._handleSubmit(event);\r\n },\r\n _handleKeypress: function (event) {\r\n const self = event.data;\r\n if (event.which === keyCodes.Esc) {\r\n self.element.val(self.options.initial).focus();\r\n return;\r\n }\r\n if (event.which === keyCodes.Enter) {\r\n self._handleSubmit(event);\r\n return;\r\n }\r\n\r\n if (!String.fromCharCode(event.which).match(/^\\-?[0-9]*\\.?[0-9]*$/)) {\r\n event.preventDefault();\r\n return false;\r\n }\r\n },\r\n _handlePaste: function (event) {\r\n const self = event.data;\r\n event.preventDefault();\r\n\r\n let clipboardData = event.originalEvent.clipboardData || window.clipboardData;\r\n const pastedText = clipboardData.getData('Text');\r\n\r\n self._validate(pastedText);\r\n },\r\n _handleSubmit: function (event) {\r\n this._validate();\r\n if (Number(this.options.initial) !== Number(this.element.val()) && this.options.callback && typeof (this.options.callback) === 'function') {\r\n this.options.callback.call(this, { parentid: this.options.parentid, value: this.element.val() }, event);\r\n }\r\n },\r\n _setEvents: function () {\r\n this.element.off('focus.fdcontrol blur.fdcontrol keyup.fdcontrol paste.fdcontrol')\r\n .on('focus.fdcontrol', null, this, this._handleFocus)\r\n .on('blur.fdcontrol', null, this, this._handleBlur)\r\n .on('keypress.fdcontrol', null, this, this._handleKeypress)\r\n .on('paste.fdcontrol', null, this, this._handlePaste);\r\n },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n },\r\n _validate: function (newValue) {\r\n let value;\r\n if (newValue) {\r\n value = newValue.replace(/\\,/g, '');\r\n } else {\r\n value = this.element.val().replace(/\\,/g, '');\r\n }\r\n\r\n if (this.options.allowclear && (value === \"\" || value === undefined || value === null)) {\r\n this.element.val(null);\r\n return this;\r\n }\r\n\r\n if (!value.match(/^\\-?[0-9]*\\.?[0-9]*$/)) {\r\n this.element.val(this.initial());\r\n return this;\r\n }\r\n value = Number(value);\r\n\r\n if (this.options.min !== null && value < Number(this.options.min)) {\r\n value = Number(this.options.min);\r\n } else if (this.options.max !== null && value > Number(this.options.max)) {\r\n value = Number(this.options.max);\r\n }\r\n\r\n if (this.options.precision !== undefined) {\r\n this.element.val(value.toFixed(this.options.precision));\r\n } else {\r\n this.element.val(value);\r\n }\r\n\r\n return this;\r\n }\r\n });\r\n}(jQuery));","(function ($) {\r\n 'use strict';\r\n $.widget(\"fd.control_select\", {\r\n options: {\r\n parentid: null,\r\n callback: function () { },\r\n initial: null,\r\n placeholder: 'Select',\r\n allowsearch: true,\r\n allowclear: false,\r\n dropdownautowidth: true,\r\n unselectedvalue: \"0\",\r\n minimuminputlength: 2, // Only used with ajax\r\n dropdownParent: 'body', // Override with something more specific if you're running into display issues\r\n provider: null, // Ajax url if default settings are acceptable (param = \"term\", returns object with fields ID and Text)\r\n ajaxbuilder: null, // Provide function that will return a custom object to be passed in the select2 ajax field (ignored if provider has a value)\r\n namespace: 'Page', // Used for the ajaxbuilder and callback functions\r\n cascadeparentid: null, // Used when this select element should be reset/reloaded when other select changes\r\n cascadeprovider: null, // Ajax url used when reset/reload is triggered by cascade \r\n cascadeajaxbuilder: null, // Provider function to build cascade ajax\r\n allowcustom: false, // Used to allow the custom options to be entered into a multi-select\r\n createtagcallback: null,\r\n matchercallback: null, // do a custom search via a function, (params, data) => { return data; }\r\n\r\n // these three for custom HTML\r\n templateresultcallback: null,\r\n templateselectioncallback: null,\r\n escapemarkupcallback: null\r\n },\r\n initial: function (value) {\r\n if (value === undefined) {\r\n return this.options.initial;\r\n }\r\n this.options.initial = value;\r\n this.element.data('initial', value).attr('data-initial', value);\r\n },\r\n _create: function () {\r\n const self = this;\r\n if (!self.options.parentid) {\r\n self.options.parentid = self.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n // work-around to disabled select2 element when fieldset ancestor is disabled. \r\n const fieldset = self.element.closest('fieldset');\r\n if (fieldset.length) {\r\n if (fieldset.prop('disabled')) {\r\n // need to check that fieldset is disabled because if we don't we may override the select's prop on page load\r\n self.element.prop('disabled', fieldset.prop('disabled'));\r\n }\r\n fieldset.on('disabled', function (ev) {\r\n if (ev.target === ev.currentTarget) {\r\n self.element.prop('disabled', true);\r\n }\r\n }).on('enabled', function (ev) {\r\n if (ev.target === ev.currentTarget) {\r\n self.element.prop('disabled', false);\r\n }\r\n });\r\n }\r\n this.initial(this.element.val());\r\n\r\n // Convert numeric options\r\n this.options.delay = Number(this.options.minlength);\r\n this.options.minimuminputlength = Number(this.options.minimuminputlength);\r\n\r\n const select2Options = {\r\n minimumInputLength: this.options.ajaxbuilder || this.options.provider ? this.options.minimuminputlength : 0,\r\n placeholder: this.options.placeholder,\r\n dropdownParent: this.options.dropdownParent,\r\n dropdownAutoWidth: this.options.dropdownautowidth,\r\n allowClear: this.options.allowclear,\r\n tags: this.options.allowcustom\r\n };\r\n if (this.options.createtagcallback) {\r\n select2Options.createTag = this.options.createtagcallback;\r\n }\r\n if (this.options.matchercallback) {\r\n select2Options.matcher = this.options.matchercallback;\r\n }\r\n if (this.options.templateresultcallback) {\r\n select2Options.templateResult = this.options.templateresultcallback;\r\n }\r\n if (this.options.templateselectioncallback) {\r\n select2Options.templateSelection = this.options.templateselectioncallback;\r\n }\r\n if (this.options.escapemarkupcallback) {\r\n select2Options.escapeMarkup = this.options.escapemarkupcallback;\r\n }\r\n if (this.options.allowsearch === \"false\" || !this.options.allowsearch) {\r\n select2Options.minimumResultsForSearch = Infinity;\r\n }\r\n if (this.options.provider) {\r\n select2Options.ajax = {\r\n url: this.options.provider,\r\n dataType: 'json'\r\n };\r\n } else if (this.options.ajaxbuilder && typeof (FD[this.options.namespace][this.options.ajaxbuilder]) === 'function') {\r\n select2Options.ajax = FD[this.options.namespace][this.options.ajaxbuilder].call(this);\r\n }\r\n\r\n this.element[0].initiallyDisabled = this.element[0].disabled;\r\n this.element[0].fdUnselect = function () {\r\n self._unselect(select2Options);\r\n };\r\n this.element[0].fdResetSelectedItem = function (item) {\r\n self._resetSelectedItem(select2Options, item);\r\n };\r\n\r\n this._createCascadeEffect(select2Options);\r\n this.element.select2(select2Options);\r\n if (this.element.attr('multiple')) {\r\n this._applyOptionStyles();\r\n }\r\n this._setEvents();\r\n this.select2Options = select2Options;\r\n },\r\n _createCascadeEffect: function (select2Options) {\r\n if (!this.options.cascadeparentid || !(this.options.cascadeprovider || this.options.cascadeajaxbuilder)) {\r\n return;\r\n }\r\n\r\n var self = this;\r\n $('#' + self.options.cascadeparentid).on('change', function (e) {\r\n var parentValue = $(this).val();\r\n var url = null;\r\n if (self.options.cascadeajaxbuilder) {\r\n var callback = FD[self.options.namespace][self.options.cascadeajaxbuilder];\r\n url = callback(parentValue, self.options.cascadeprovider + \"?\");\r\n } else {\r\n url = self.options.cascadeprovider + \"?id=\" + parentValue;\r\n }\r\n\r\n if (!parentValue || parentValue === self.options.unselectedvalue) {\r\n self._loadSelectItems(url, select2Options, []);\r\n } else {\r\n $.getJSON(url, function (items) {\r\n self.itemToSelectAfterCascade = items.results.find(s => s.id == self.element.val());\r\n self._loadSelectItems(url, select2Options, items);\r\n });\r\n }\r\n });\r\n },\r\n _unselect: function (select2Options) {\r\n this.element.val(this.options.unselectedvalue).trigger('change');\r\n if (this.element[0].initiallyDisabled) {\r\n select2Options.disabled = true;\r\n }\r\n\r\n this.element.select2(select2Options);\r\n },\r\n _loadSelectItems: function (sourceUrl, select2Options, items) {\r\n const self = this;\r\n items = items.results ? items.results : items;\r\n items = items instanceof Array ? items : [items];\r\n this.items = items;\r\n this.items.timestamp = new Date();\r\n let clearSelect = this.options.allowclear\r\n\r\n function makeItems(data) {\r\n let html = ''\r\n self.element.find('[data-persistant=true]').each((idx, item) => html += $(item)[0].outerHTML);\r\n for (var i = 0; i < data.length; i++) {\r\n const item = data[i];\r\n\r\n if (item.children) {\r\n html += '' + makeItems(item.children) + '';\r\n } else {\r\n let selectedAttr = \"\";\r\n const isSelected = item.selected || (self.itemToSelectAfterCascade && self.itemToSelectAfterCascade.id === item.id);\r\n if (isSelected) {\r\n selectedAttr = \"selected\";\r\n clearSelect = false;\r\n self.itemToSelectAfterCascade = null;\r\n }\r\n html += '';\r\n }\r\n }\r\n return html\r\n }\r\n\r\n select2Options.disabled = false;\r\n this.element\r\n .select2('destroy')\r\n .html(makeItems(items))\r\n .select2(select2Options);\r\n\r\n if (clearSelect) {\r\n this.element.val(null).trigger('change')\r\n }\r\n },\r\n _resetSelectedItem: function (select2Options, item) {\r\n var isAjax = this.options.ajaxbuilder || this.options.provider;\r\n if (isAjax) {\r\n this.element\r\n .select2('trigger', 'select', { data: item });\r\n return;\r\n }\r\n\r\n if (this.options.cascadeprovider || this.options.cascadeajaxbuilder) {\r\n this.itemToSelectAfterCascade = item;\r\n return;\r\n }\r\n },\r\n _applyOptionStyles: function () {\r\n var self = this.element;\r\n this.element.children(\"[class|=bg]:not(.bg-none)\").each(function () {\r\n let cssClass = $(this).attr('class');\r\n let bgColor = $(\"
\").appendTo(\"body\").addClass(cssClass).css(\"background-color\");\r\n self.next().find(\".select2-selection__choice[title='\" + $(this).text() + \"'],.select2-selection__choice[data-original-title='\" + $(this).text() + \"']\").css(\"background-color\", bgColor);\r\n });\r\n $(\"body>.color-working\").remove();\r\n },\r\n _handleChange: function (event) {\r\n const self = event.data;\r\n\r\n if (!self.element.val()) {\r\n // select2 doesn't change the original title on clear\r\n const $select2 = self.element.next();\r\n $select2.find('[data-original-title]').attr('data-original-title', '').tooltip('hide');\r\n $select2.find(\".select2-selection__clear\").tooltip('hide');\r\n }\r\n\r\n self._didSubmit = false;\r\n setTimeout(() => {\r\n if (!self._didSubmit) {\r\n self._handleSubmit(event);\r\n }\r\n })\r\n },\r\n _handleSelect: function (event) {\r\n const self = event.data;\r\n self._didSubmit = true;\r\n self._handleSubmit(event);\r\n },\r\n _handleSubmit: function (event) {\r\n this.options.callback.call(this, {\r\n parentid: this.options.parentid,\r\n value: this.element.val(),\r\n param: event.params ? event.params.data : null\r\n }, event);\r\n this.element.blur();\r\n if (this.element.attr('multiple')) {\r\n this._applyOptionStyles();\r\n }\r\n },\r\n _setEvents: function () {\r\n this.element.off('change.fdcontrol').on('change.fdcontrol', null, this, this._handleChange);\r\n this.element.off('select2:select').on('select2:select', null, this, this._handleSelect);\r\n },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n if (key == 'allowcustom') {\r\n this.select2Options.tags = this.options.allowcustom;\r\n this.element.select2(this.select2Options);\r\n }\r\n },\r\n _destroy: function () {\r\n this.element.select2('destroy');\r\n },\r\n updateOption: function (value, text, disabled) {\r\n const option = this.element.find('option[value=' + value + ']');\r\n if (option.length) {\r\n if (text && option.val() !== text) {\r\n option.text(text);\r\n this.element.control_select('destroy').control_select(this.options);\r\n }\r\n if (disabled === true || disabled === false) {\r\n option.attr('disabled', disabled);\r\n }\r\n } else {\r\n const newOption = new Option(text, value, false, true);\r\n if (disabled === true || disabled === false) {\r\n $(newOption).attr('disabled', disabled);\r\n }\r\n this.element.append(newOption).trigger('change');\r\n }\r\n },\r\n replaceOptions: function (options, valueField, textField, selectedValue) {\r\n valueField = !valueField ? 'Id' : valueField;\r\n textField = !textField ? 'Name' : textField;\r\n this.element.find('option:not([data-persistant=true])').remove();\r\n for (let i = 0; i < options.length; i++) {\r\n this.element.append(``);\r\n }\r\n if (typeof selectedValue !== 'undefined') {\r\n this.element.val(selectedValue);\r\n }\r\n },\r\n reset: function () {\r\n if (this.options.ajaxbuilder || this.options.provider) {\r\n this.element.find('option:not([data-persistant=true])').remove();\r\n }\r\n },\r\n });\r\n}(jQuery));","/* global Ladda */\r\n(function ($) {\r\n 'use strict';\r\n const keyCodes = {\r\n Enter: 13\r\n };\r\n $.widget(\"fd.control_tags\", {\r\n options: {\r\n parentid: null,\r\n callback: function () { },\r\n rendertofield: null,\r\n provider: null,\r\n tagstype: null,\r\n ajaxbuilder: null,\r\n namespace: 'Page',\r\n tagmaxcount: null,\r\n allownew: true,\r\n allowmultiple: true,\r\n minimuminputlength: 1\r\n },\r\n _create: function () {\r\n if (!this.options.parentid) {\r\n this.options.parentid = this.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n var $element = this.element;\r\n var options = this.options;\r\n var self = this;\r\n var select2OptionsAjax;\r\n\r\n if (this.options.provider) {\r\n select2OptionsAjax = {\r\n delay: 350,\r\n url: options.provider,\r\n dataType: \"json\",\r\n data: function (data, page) {\r\n return {\r\n term: data.term\r\n };\r\n },\r\n results: function (data, page) {\r\n return {\r\n results: data\r\n };\r\n }\r\n };\r\n } else if (this.options.ajaxbuilder && typeof (FD[this.options.namespace][this.options.ajaxbuilder]) === 'function') {\r\n select2OptionsAjax = FD[this.options.namespace][this.options.ajaxbuilder].call(this);\r\n }\r\n var select2Options = {\r\n multiple: this.options.allowmultiple,\r\n tags: true,\r\n minimumInputLength: this.options.minimuminputlength,\r\n language: {\r\n inputTooShort: function () {\r\n return (+self.options.minimuminputlength) + ' characters needed';\r\n }\r\n },\r\n createSearchChoice: function (term, data) {\r\n if ($(data).filter(function () {\r\n return this.text.localeCompare(term) === 0;\r\n }).length === 0) {\r\n return {\r\n id: term,\r\n text: term\r\n };\r\n }\r\n\r\n return {\r\n id: \"\",\r\n text: \"\"\r\n };\r\n },\r\n createTag: function (params) {\r\n if (!self.options.allownew)\r\n return undefined;\r\n\r\n var term = $.trim(params.term);\r\n\r\n if (term === '') {\r\n return null;\r\n }\r\n\r\n return {\r\n id: self._getNewTagId(term),\r\n text: term + '*'\r\n };\r\n },\r\n ajax: select2OptionsAjax\r\n };\r\n\r\n this.element[0].fdUnselect = function () {\r\n self._fdUnselect(select2Options);\r\n };\r\n\r\n this.element[0].fdResetSelectedItem = function (item) {\r\n self._fdResetSelectedItem(select2Options, item);\r\n };\r\n\r\n if (options.tagmaxcount)\r\n select2Options.maximumSelectionLength = options.tagmaxcount;\r\n\r\n $element.select2(select2Options);\r\n\r\n this._setEvents();\r\n this.element.trigger('change');\r\n },\r\n _fdResetSelectedItem: function (select2Options, item) {\r\n item = typeof item === 'string' ? { id: item, text: item } : item;\r\n var html = item ? '' : '';\r\n\r\n this.element\r\n .select2('destroy')\r\n .html(html)\r\n .select2(select2Options)\r\n .trigger('change');\r\n },\r\n _fdUnselect: function (select2Options) {\r\n const selectOption = select2Options.multiple ?\r\n \"\" :\r\n '';\r\n this.element\r\n .select2('destroy')\r\n .html(selectOption)\r\n .select2(select2Options)\r\n .trigger('change');\r\n },\r\n _getNewTagId: function (term) {\r\n if (this.options.tagstype === 'text')\r\n return term;\r\n\r\n this.generatedId = this.generatedId === null || this.generatedId === undefined ? 0 : this.generatedId;\r\n this.generatedId -= 1;\r\n return this.generatedId;\r\n },\r\n _setEvents: function () {\r\n this.element.off('change.fdcontrol').on('change.fdcontrol', this._handleChange.bind(this));\r\n },\r\n _renderSelectedOptionsAsJson(element) {\r\n const options = this.options;\r\n const jsonItems = [];\r\n var selectItems = $(element).find(\"option\");\r\n for (let i = 0; i < selectItems.length; i++) {\r\n const item = selectItems[i];\r\n if (item.selected)\r\n jsonItems.push({ id: item.value, name: item.text });\r\n }\r\n const json = JSON.stringify(jsonItems);\r\n $(\"#\" + options.rendertofield).val(json);\r\n },\r\n _handleChange: function (event) {\r\n this._renderSelectedOptionsAsJson(event.target);\r\n this._runCallback(event);\r\n },\r\n _runCallback: function (event) {\r\n this.options.callback.call(this, {\r\n parentid: this.options.parentid,\r\n value: this.element.val(),\r\n valueElement: this.element.find('option:selected')\r\n }, event);\r\n },\r\n });\r\n}(jQuery));","(function ($) {\r\n 'use strict';\r\n\r\n var ELEM = '[data-fd=\"text\"]';\r\n var keyCodes = {\r\n Backspace: 8,\r\n Tab: 9,\r\n Enter: 13,\r\n Esc: 27,\r\n Delete: 46\r\n };\r\n\r\n $.widget(\"fd.control_text\", {\r\n options: {\r\n callback: function () { },\r\n iskeyup: false,\r\n iskeyupdelay: 250,\r\n maxlength: null,\r\n minlength: 0,\r\n repeat: false,\r\n initial: '',\r\n parentid: null\r\n },\r\n initial: function (value) {\r\n if (value === undefined) {\r\n return this.options.initial;\r\n }\r\n\r\n this.options.initial = value;\r\n this.element.data('initial', value).attr('data-initial', value);\r\n\r\n return this;\r\n },\r\n _create: function () {\r\n if (!this.options.parentid) {\r\n this.options.parentid = this.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n\r\n // Convert numeric options\r\n this.options.iskeyupdelay = Number(this.options.iskeyupdelay);\r\n this.options.minlength = Number(this.options.minlength);\r\n this.options.maxlength = this.options.maxlength ? Number(this.options.maxlength) : null;\r\n if (this.options.maxlength) {\r\n this.element.attr('maxlength', this.options.maxlength);\r\n }\r\n\r\n this.initial(this.options.initial || this.element.val());\r\n this._setEvents();\r\n },\r\n _handleBlur: function (event) {\r\n const self = event.data;\r\n if (self.element.val() === self.options.initial) {\r\n return false;\r\n }\r\n self._handleSubmit(event);\r\n return true;\r\n },\r\n _handleFocus: function (event) {\r\n const self = event.data;\r\n self.initial(self.element.val());\r\n },\r\n _handleKeyup: function (event) {\r\n const self = event.data;\r\n if (event.which === keyCodes.Esc) {\r\n self.element.val(self.options.initial).focus();\r\n return;\r\n }\r\n\r\n if (event.which === keyCodes.Enter) {\r\n self._handleSubmit(event);\r\n return;\r\n }\r\n\r\n if (self.options.iskeyup) {\r\n clearTimeout(self._keyupTimer);\r\n self._keyupTimer = setTimeout(function () {\r\n self._handleSubmit(event);\r\n }, self.options.iskeyupdelay);\r\n }\r\n },\r\n _handleSubmit: function (event) {\r\n if (this._keyupTimer) {\r\n clearTimeout(this._keyupTimer);\r\n this._keyupTimer = null;\r\n }\r\n\r\n this.options.callback.call(this, { parentID: this.options.parentid, value: this.element.val().trim() }, event);\r\n\r\n if (this.options.repeat) {\r\n this.element.val(null).initial(null).focus();\r\n }\r\n },\r\n _keyupTimer: null,\r\n _setEvents: function () {\r\n this.element.off('blur.fdcontrol keyup.fdcontrol focus.fdcontrol')\r\n .on('blur.fdcontrol', null, this, this._handleBlur)\r\n .on('focus.fdcontrol', null, this, this._handleFocus)\r\n .on('keyup.fdcontrol', null, this, this._handleKeyup);\r\n },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n },\r\n _destroy: function () {\r\n this.element.off('blur.fdcontrol keyup.fdcontrol focus.fdcontrol');\r\n }\r\n });\r\n}(jQuery));","/* global autosize */\r\n(function ($) {\r\n 'use strict';\r\n var keyCodes = {\r\n Backspace: 8,\r\n Tab: 9,\r\n Enter: 13,\r\n Esc: 27,\r\n Delete: 46\r\n };\r\n $.widget(\"fd.control_textarea\", {\r\n options: {\r\n parentid: null,\r\n callback: function () { },\r\n initial: null,\r\n autoresize: true,\r\n iskeyup: false,\r\n iskeyupdelay: 250\r\n },\r\n initial: function (value) {\r\n if (value === undefined) {\r\n return this.options.initial;\r\n }\r\n\r\n this.options.initial = value;\r\n this.element.data('initial', value).attr('data-initial', value);\r\n\r\n return this;\r\n },\r\n resize: function () {\r\n autosize.update(this.element);\r\n },\r\n _create: function () {\r\n if (!this.options.parentid) {\r\n this.options.parentid = this.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n // Convert numeric options\r\n this.options.iskeyupdelay = Number(this.options.iskeyupdelay);\r\n\r\n // Prevent scrollbar from constantly showing/hiding\r\n this.element[0].style.overflowY = 'hidden';\r\n\r\n this.initial(this.element.val())._resize()._setEvents();\r\n if (this.options.autoresize) {\r\n autosize(this.element);\r\n }\r\n },\r\n _handleFocus: function (event) {\r\n var self = event.data;\r\n self.initial(self.element.val());\r\n },\r\n _handleBlur: function (event) {\r\n var self = event.data;\r\n self._handleSubmit(event);\r\n },\r\n _handleKeyup: function (event) {\r\n var self = event.data;\r\n if (event.which === keyCodes.Esc) {\r\n self.element.val(self.options.initial).focus();\r\n\r\n return;\r\n }\r\n\r\n if (self.options.iskeyup) {\r\n if (self._keyupTimer) {\r\n clearTimeout(self._keyupTimer);\r\n }\r\n self._keyupTimer = setTimeout(function () {\r\n self._handleSubmit(event);\r\n }, self.options.iskeyupdelay);\r\n }\r\n },\r\n _handleSubmit: function (event) {\r\n if (this._keyupTimer) {\r\n clearTimeout(this._keyupTimer);\r\n this._keyupTimer = null;\r\n }\r\n this.options.callback.call(this, { parentid: this.options.parentid, value: this.element.val().trim() }, event);\r\n },\r\n _keyupTimer: null,\r\n _resize: function () {\r\n if (this.element.is(':visible')) {\r\n this.element[0].style.height = 'inherit';\r\n\r\n // Get the computed styles for the element\r\n const computed = window.getComputedStyle(this.element[0]);\r\n\r\n // Calculate the height\r\n const height = parseInt(computed.getPropertyValue('border-top-width'), 10)\r\n + parseInt(computed.getPropertyValue('padding-top'), 10)\r\n + this.element[0].scrollHeight\r\n + parseInt(computed.getPropertyValue('padding-bottom'), 10)\r\n + parseInt(computed.getPropertyValue('border-bottom-width'), 10);\r\n\r\n this.element[0].style.height = height + 'px';\r\n }\r\n\r\n return this;\r\n },\r\n _setEvents: function () {\r\n this.element.off('focus.fdcontrol blur.fdcontrol keyup.fdcontrol')\r\n .on('focus.fdcontrol', null, this, this._handleFocus)\r\n .on('blur.fdcontrol', null, this, this._handleBlur)\r\n .on('keyup.fdcontrol', null, this, this._handleKeyup);\r\n\r\n return this;\r\n },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n }\r\n });\r\n}(jQuery));","/* global Switchery */\r\n(function ($) {\r\n 'use strict';\r\n $.widget(\"fd.control_toggle\", {\r\n options: {\r\n parentid: null,\r\n callback: function () { },\r\n disabled: false,\r\n size: 'default'\r\n },\r\n enable: function () {\r\n this.options.disabled = false;\r\n this._enable();\r\n },\r\n _enable: function () {\r\n $(this._switcheryInstance.switcher).removeClass(\"disabled\");\r\n this._switcheryInstance.enable();\r\n this.element.control_toggle('destroy').control_toggle(this.options);\r\n },\r\n disable: function () {\r\n this.options.disabled = true;\r\n this._disable();\r\n },\r\n _disable: function () {\r\n $(this._switcheryInstance.switcher).addClass(\"disabled\");\r\n this._switcheryInstance.disable();\r\n },\r\n value: function (value) {\r\n if (value === undefined) {\r\n return this._switcheryInstance.element.checked;\r\n }\r\n if (value !== this._switcheryInstance.element.checked) {\r\n $(this._switcheryInstance.switcher).click();\r\n return value;\r\n }\r\n },\r\n _create: function () {\r\n const self = this;\r\n if (!self.options.parentid) {\r\n self.options.parentid = self.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n }\r\n self.element.addClass('js-switch');\r\n self._switcheryInstance = new Switchery(self.element[0], {\r\n size: self.options.size\r\n });\r\n\r\n // workaround to force toggle to respect disabled (like we do with select2's)\r\n const fieldset = self.element.closest('fieldset');\r\n if (self.options.disabled || fieldset.is('[disabled]')) {\r\n self._disable();\r\n }\r\n if (fieldset.length) {\r\n fieldset.on('disabled', function (ev) {\r\n if (ev.target === ev.currentTarget) {\r\n self._disable();\r\n }\r\n }).on('enabled', function (ev) {\r\n if (ev.target === ev.currentTarget) {\r\n self._enable();\r\n }\r\n });\r\n }\r\n self._setEvents();\r\n\r\n self.element[0].changeTo = function (checked) {\r\n self._changeSwitchery(self.element, checked);\r\n };\r\n },\r\n _changeSwitchery: function (element, checked) {\r\n if ((element.is(':checked') && checked === false) || (!element.is(':checked') && checked === true)) {\r\n element.parent().find('.switchery').trigger('click');\r\n }\r\n },\r\n _handleSubmit: function (event) {\r\n const self = event.data;\r\n if (self.options.disabled || self.element.closest('fieldset').is('[disabled]')) {\r\n return;\r\n }\r\n self.options.callback.call(self, { parentid: self.options.parentid, value: self.value() }, event);\r\n },\r\n _setEvents: function () {\r\n $(this.element).off('change.fdcontrol_toggle').on('change.fdcontrol_toggle', null, this, this._handleSubmit);\r\n },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n if (key === 'disabled') {\r\n this._refresh();\r\n }\r\n },\r\n _refresh: function () {\r\n if (this.options.disabled || this.element.closest('fieldset').is('[disabled]')) {\r\n this._disable();\r\n } else {\r\n this._enable();\r\n }\r\n },\r\n _destroy: function () {\r\n $(this.element).off('change.fdcontrol_toggle');\r\n this._switcheryInstance.switcher.remove();\r\n this._switcheryInstance.destroy();\r\n },\r\n _switcheryInstance: null\r\n });\r\n}(jQuery));","/* global ace */\r\n// Note: ace javascript source code needs to be included on each page where this functionality will be used\r\n// (it isn't included in pages by default)\r\n(function ($) { \r\n /* ========================================================================\r\n * Private Methods\r\n * ========================================================================\r\n */\r\n\r\n\r\n /* ========================================================================\r\n * Public Methods\r\n * ========================================================================\r\n */\r\n\r\n\r\n $.fn.codeEditor = function () {\r\n if (ace === undefined) {\r\n return this;\r\n }\r\n this.each(function () {\r\n const defaults = {\r\n height: 150,\r\n theme: 'twilight',\r\n readonly: true,\r\n mode: 'javascript'\r\n };\r\n const options = $.extend({}, defaults, $(this).data());\r\n this.style.height = options.height + \"px\";\r\n const editor = ace.edit(this);\r\n editor.setTheme('ace/theme/' + options.theme);\r\n editor.setReadOnly(options.readonly);\r\n editor.session.setMode('ace/mode/' + options.mode);\r\n });\r\n\r\n return this;\r\n };\r\n}(jQuery));","(function ($) {\r\n let searchDelayTimeout = null;\r\n\r\n /* ========================================================================\r\n * Private Methods\r\n * ========================================================================\r\n */\r\n\r\n\r\n /* ========================================================================\r\n * Public Methods\r\n * ========================================================================\r\n */\r\n\r\n $.fn.dataTable.Api.register('setSearchDebounce()', function (milliseconds) {\r\n const table = this;\r\n $('div.dataTables_filter input', table.context[0].nTableWrapper).off('keyup.DT search.DT input.DT paste.DT cut.DT')\r\n .on('keyup.DT search.DT input.DT paste.DT cut.DT', function () {\r\n const search = $('div.dataTables_filter input', table.context[0].nTableWrapper).val();\r\n clearTimeout(searchDelayTimeout);\r\n searchDelayTimeout = setTimeout(function () {\r\n table.search(search).draw();\r\n }, milliseconds);\r\n });\r\n return this;\r\n });\r\n\r\n}(jQuery));","(function ($) {\r\n const prefix = \"data-fd-\";\r\n\r\n\r\n /* ========================================================================\r\n * Private Methods\r\n * ========================================================================\r\n */\r\n\r\n /**\r\n * Loop through data-fd-* attributes to build the options object, then enable the control\r\n * Current restriction - all widgets can only accept functions in a parameter called 'callback'\r\n * @param {HTMLElement} elem\r\n */\r\n function enableControl(elem) {\r\n const $elem = $(elem),\r\n options = {};\r\n\r\n $.each(elem.attributes, function () {\r\n if (!this.specified) { // Skip empty attributes\r\n return true;\r\n }\r\n\r\n if (this.name.indexOf(prefix) === 0) { // Only pull options from data-fd-* attributes\r\n const attributeName = this.name.substring(prefix.length);\r\n if (attributeName.endsWith('callback')) {\r\n options[attributeName + \"_RAW\"] = this.value;\r\n if (this.value.startsWith(\"FD\")) {\r\n const parts = this.value.split('.');\r\n options[attributeName] = FD[parts[1]][parts[2]];\r\n } else {\r\n if (!options['namespace']) {\r\n options['namespace'] = $elem.attr('data-fd-namespace') || 'Page';\r\n }\r\n options[attributeName] = FD[options.namespace][this.value];\r\n }\r\n } else {\r\n options[attributeName] = $elem.data('fd-' + attributeName);\r\n }\r\n }\r\n\r\n return true;\r\n });\r\n if ($elem['control_' + options.control] === undefined) {\r\n console.error('\"data-fd-control=' + options.control + '\" is not a valid JavaScript control widget.');\r\n } else {\r\n $elem['control_' + options.control]($elem, options);\r\n }\r\n }\r\n\r\n\r\n /* ========================================================================\r\n * Public Methods\r\n * ========================================================================\r\n */\r\n\r\n\r\n $.fn.enableControls = function () {\r\n const formQueue = [];\r\n $.each($(\"[\" + prefix + \"control]\", this), function () {\r\n if ($(this).data('fd-control') === 'form') {\r\n formQueue.push(this);\r\n } else {\r\n enableControl(this);\r\n }\r\n });\r\n\r\n // Set form elements last so that control-specific events fire first\r\n for (var x = 0; x < formQueue.length; x++) {\r\n enableControl(formQueue[x]);\r\n }\r\n this.enableTooltips({ boundary: \"window\" });\r\n this.enablePopovers();\r\n\r\n return this;\r\n };\r\n}(jQuery));","(function ($) {\r\n const popoverSelector = '[data-toggle=popover]';\r\n\r\n /* ========================================================================\r\n * Public Methods\r\n * ========================================================================\r\n */\r\n\r\n $.fn.enablePopovers = function (options) {\r\n if (!options) {\r\n options = { trigger: 'focus' };\r\n }\r\n\r\n $(popoverSelector, this).popover(options);\r\n\r\n return this;\r\n };\r\n}(jQuery));","(function ($) {\r\n const tooltipSelector = '[title]:not(option)';\r\n const onTooltipClicked = function () {\r\n $(this).tooltip('hide');\r\n };\r\n\r\n /* ========================================================================\r\n * Public Methods\r\n * ========================================================================\r\n */\r\n\r\n $.fn.enableTooltips = function (options) {\r\n $(tooltipSelector, this).tooltip(options).click(onTooltipClicked);\r\n\r\n $('select', this).each(function () {\r\n $('.select2-selection__clear', $(this).parent()).tooltip('dispose'); // remove tooltips from clear buttons\r\n }).change(function () {\r\n const $selectParent = $(this).parent();\r\n $(tooltipSelector, $selectParent).tooltip('dispose').tooltip().click(onTooltipClicked);\r\n $('.select2-selection__clear', $selectParent).tooltip('dispose'); // remove tooltips from clear buttons\r\n });\r\n\r\n return this;\r\n };\r\n}(jQuery));","/** todo: accurately define these types\r\n * @typedef {Object} AjaxOptions\r\n * @property {any} params\r\n * @property {any} callback\r\n * @property {any} url\r\n * @property {any} ishtml\r\n * @property {any} isloader\r\n * @property {any} loadingButton\r\n * @property {any} loadingButtonStyle\r\n * @property {any} contentType\r\n * @property {any} contentTypeHelper\r\n * @property {any} cache\r\n * @property {any} processData\r\n * @property {any} cancelprevious\r\n * @property {any} delay\r\n * @property {any} preventResubmit\r\n */\r\n\r\n(function ($) {\r\n const ajaxOutstanding = [],\r\n ajaxScheduled = [],\r\n progressBar = new Mprogress(),\r\n /** @type {AjaxOptions} */\r\n defaults = {\r\n params: null,\r\n callback: null,\r\n url: \"\",\r\n ishtml: false,\r\n isloader: true,\r\n loadingButton: null, // jquery Object\r\n loadingButtonStyle: 'expand-right', // see: https://lab.hakim.se/ladda/\r\n contentType: 'application/json; charset=utf-8', // for form submits, we want to use 'application/x-www-form-urlencoded; charset=UTF-8'\r\n contentTypeHelper: null, // overrides contentType if provided. Current supported values are: \"json\", \"form\"\r\n type: \"POST\",\r\n\r\n // for file upload, set contentType: false and the following to false\r\n cache: true,\r\n processData: true,\r\n\r\n // code flow management\r\n cancelprevious: false, // Automatically cancel previous requests with the same signature\r\n delay: false, // Wait [delay] seconds before executing request. If multiple requests with the same signature are made within the delay window, the delay is reset\r\n preventResubmit: false // Prevent all future preventsubmit requests until this one is completed (note: non-preventsubmit requests can still go through)\r\n };\r\n let preventSubmit = false;\r\n\r\n $.fdAjax = function (opts) {\r\n const options = $.extend({}, defaults, opts);\r\n\r\n if (options.contentTypeHelper) {\r\n switch (options.contentTypeHelper.toLowerCase()) {\r\n case \"json\":\r\n options.contentType = 'application/json; charset=utf-8';\r\n break;\r\n case \"form\":\r\n options.contentType = 'application/x-www-form-urlencoded; charset=UTF-8';\r\n break;\r\n }\r\n }\r\n if (options.delay) {\r\n if (isNaN(options.delay)) {\r\n options.delay = 500;\r\n }\r\n handleAjaxSchedule(options);\r\n } else {\r\n handleAjax(options);\r\n }\r\n };\r\n\r\n function handleAjaxQueue(url, ajaxCall) {\r\n for (let i = ajaxOutstanding.length - 1; i >= 0; i--) {\r\n const ajaxObj = ajaxOutstanding[i];\r\n\r\n // remove any done calls\r\n if (ajaxObj.xhr.readyState === 4) {\r\n ajaxOutstanding.splice(i, 1);\r\n if (ajaxOutstanding.length === 0) {\r\n progressBar.end();\r\n }\r\n continue;\r\n }\r\n\r\n // if there's a repeat, kill the previous\r\n if (ajaxObj.url === url) {\r\n ajaxObj.xhr.abort();\r\n ajaxOutstanding.splice(i, 1);\r\n if (ajaxOutstanding.length === 0) {\r\n progressBar.end();\r\n }\r\n }\r\n }\r\n\r\n ajaxOutstanding.push({\r\n url: url,\r\n xhr: ajaxCall\r\n });\r\n }\r\n\r\n\r\n function handleAjaxSchedule(options) {\r\n for (let i = ajaxScheduled.length - 1; i >= 0; i--) {\r\n if (ajaxScheduled[i].name === options.url) {\r\n clearTimeout(ajaxScheduled[i].timeout);\r\n ajaxOutstanding.splice(i, 1);\r\n if (ajaxOutstanding.length === 0) {\r\n progressBar.end();\r\n }\r\n }\r\n }\r\n\r\n ajaxScheduled.push({\r\n name: options.url,\r\n timeout: setTimeout(function () {\r\n handleAjax(options);\r\n }, options.delay)\r\n });\r\n }\r\n\r\n\r\n function cleanupAfterAjax(options, laddaButton) {\r\n if (options.isloader) {\r\n progressBar.end();\r\n }\r\n if (laddaButton) {\r\n laddaButton.stop();\r\n laddaButton.remove();\r\n }\r\n if (options.preventResubmit) {\r\n preventSubmit = false;\r\n }\r\n }\r\n\r\n function handleAjax(options) {\r\n if (options.preventResubmit) {\r\n if (preventSubmit) {\r\n return;\r\n }\r\n\r\n preventSubmit = true;\r\n }\r\n let laddaButton;\r\n if (options.loadingButton) {\r\n if (!options.loadingButton.hasClass('ladda-button')) {\r\n options.loadingButton.addClass('ladda-button').attr('data-style', options.loadingButtonStyle).append('');\r\n }\r\n laddaButton = Ladda.create(options.loadingButton[0]);\r\n laddaButton.start();\r\n }\r\n\r\n var ajaxCall = $.ajax({\r\n url: options.url,\r\n async: options.async === undefined ? true : options.async,\r\n data: (options.contentType === 'application/json; charset=utf-8') ? JSON.stringify(options.params) : options.params,\r\n type: options.type,\r\n dataType: options.ishtml ? \"html\" : \"json\",\r\n contentType: options.params instanceof FormData ? false : options.contentType,\r\n cache: options.cache,\r\n processData: options.processData,\r\n beforeSend: function () {\r\n if (options.isloader) {\r\n progressBar.start();\r\n }\r\n }\r\n }).done(function (data, status, xhr) {\r\n cleanupAfterAjax(options, laddaButton);\r\n options.data = data;\r\n options.success = true;\r\n options.getResponseHeader = xhr.getResponseHeader;\r\n\r\n\r\n if (data === 'false') {\r\n FD.notify.options.delay = 2500;\r\n FD.notify.alert(\"Your request could not be completed. Please try again.\");\r\n }\r\n if (typeof options.callback === 'function') {\r\n options.callback(options);\r\n }\r\n }).fail(function (jqXhR, textStatus, errorThrown) {\r\n cleanupAfterAjax(options, laddaButton);\r\n options.dataError = jqXhR;\r\n options.errorStatus = textStatus;\r\n options.errorMsg = errorThrown;\r\n if (typeof options.callback === 'function' && errorThrown !== \"abort\") {\r\n options.callback.call(options, false);\r\n }\r\n if (typeof FD.Utility.onFailure === 'function') {\r\n if (jqXhR.status === 0) {\r\n return;\r\n }\r\n\r\n FD.Utility.onFailure(jqXhR, this, options);\r\n }\r\n });\r\n\r\n if (options.cancelprevious) {\r\n handleAjaxQueue(options.url, ajaxCall);\r\n }\r\n }\r\n}(jQuery));","FD.init = (function ($) {\r\n 'use strict';\r\n\r\n const $pageHeader = $(\"#PAGE_HEADER\");\r\n const sidebarOffset = 105 + ($pageHeader.length ? $pageHeader.height() : 0);\r\n\r\n /* ========================================================================\r\n * init\r\n * ========================================================================\r\n */\r\n\r\n function init() {\r\n setupCustom$Events();\r\n bindLoader();\r\n\r\n // Setting datatable defaults\r\n $.extend($.fn.dataTable.defaults, {\r\n autoWidth: false,\r\n dom: '<\"datatable-header\"fl><\"datatable-scroll-wrap\"t><\"datatable-footer\"ip>',\r\n buttons: {\r\n dom: {\r\n button: {\r\n className: 'btn btn-light'\r\n }\r\n },\r\n buttons: [\r\n 'copyHtml5',\r\n 'excelHtml5',\r\n 'csvHtml5'\r\n //'pdfHtml5' pdf doesn't work well with wide tables\r\n ]\r\n },\r\n language: {\r\n emptyTable: 'No results found :(',\r\n search: 'Filter: _INPUT_',\r\n searchPlaceholder: 'Type to filter...',\r\n lengthMenu: 'Show: _MENU_',\r\n paginate: { 'first': 'First', 'last': 'Last', 'next': $('html').attr('dir') === 'rtl' ? '←' : '→', 'previous': $('html').attr('dir') === 'rtl' ? '→' : '←' }\r\n },\r\n fixedHeader: {\r\n headerOffset: $('.fixed-top').height()\r\n },\r\n paging: false,\r\n responsive: {\r\n details: {\r\n type: 'column',\r\n target: -1\r\n }\r\n }\r\n });\r\n\r\n //fix select2 firefox issue -- https://select2.org/troubleshooting/common-problems\r\n $.fn.modal.Constructor.prototype._enforceFocus = function () { };\r\n\r\n $.fn.dataTable.moment('MM/DD/YYYY');\r\n $(document).enableControls();\r\n\r\n bsBreakpoints.init();\r\n if ($('#MAIN_SIDEBAR').length > 0) {\r\n handleStickySiderbar();\r\n }\r\n $('form').dirtyForms({ message: \"You have unsaved changes that may be lost if you leave this page. Are you sure you wish to proceed?\", dialog: { title: 'Unsaved Changes' } });\r\n window.addEventListener('resize.datatable', function () {\r\n $('.dataTable').each(function (index, element) {\r\n $(element).DataTable().responsive.recalc();\r\n });\r\n }, true);\r\n\r\n\r\n // on first focus (bubbles up to document), open the menu\r\n $(document).on('focus', '.select2-selection.select2-selection--single', function () {\r\n // Close any open datepickers\r\n $('.picker__input--active').each(function () {\r\n $(this).pickadate('picker').close();\r\n });\r\n $(this).closest(\".select2-container\").siblings('select:enabled').select2('open');\r\n });\r\n\r\n // steal focus during close - only capture once and stop propogation\r\n $('select.select2').on('select2:closing', function (e) {\r\n $(e.target).data(\"select2\").$selection.one('focus focusin', function (e) {\r\n e.stopPropagation();\r\n });\r\n });\r\n\r\n document.cookie = \"UserTimeZone=\" + Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n\r\n $(document).on('focus', '.select-all', function () {\r\n $(this).select();\r\n });\r\n\r\n function setupCustom$Events() { // originated from needing someway to trigger our custom loading animation for unobtrusive ajax\r\n $.each(['show', 'hide'], function (i, ev) {\r\n const el = $.fn[ev];\r\n $.fn[ev] = function () {\r\n const result = el.apply(this, arguments);\r\n this.trigger(ev, arguments);\r\n return result;\r\n };\r\n });\r\n\r\n $.propHooks.disabled = {\r\n set: function (el, value) {\r\n if (el.disabled !== value) {\r\n el.disabled = value;\r\n value && $(el).trigger('disabled');\r\n !value && $(el).trigger('enabled');\r\n }\r\n }\r\n };\r\n }\r\n\r\n function bindLoader() {\r\n const progressBar = new Mprogress();\r\n\r\n $('#LOADER').bind('show', function () {\r\n progressBar.start();\r\n }).bind('hide', function () {\r\n progressBar.end();\r\n });\r\n\r\n $(document).bind('bind.dirtyforms', function (ev, events) {\r\n const originalBind = events.bind;\r\n\r\n events.bind = function (window, document, data) {\r\n originalBind(window, document, data);\r\n $(document).on('click', '.check-dirty', data, events.onAnchorClick);\r\n };\r\n });\r\n }\r\n }\r\n\r\n /* ========================================================================\r\n * private methods\r\n * ========================================================================\r\n */\r\n\r\n function handleStickySiderbar() {\r\n const currentbreakpoint = bsBreakpoints.getCurrentBreakpoint();\r\n if (currentbreakpoint !== \"small\" && currentbreakpoint !== \"xSmall\") {\r\n setSidebarSticky();\r\n } else {\r\n unstickSidebar();\r\n }\r\n\r\n // set/unset sticky sidebar based on breakpoints... we want to unstick on small screens\r\n $(window).on('new.bs.breakpoint', function (e) {\r\n if (e.breakpoint !== \"small\" && e.breakpoint !== \"xSmall\") {\r\n setSidebarSticky();\r\n } else {\r\n if ($('body').hasClass('sidebar-xs')) {\r\n $('.sidebar-main-toggle').trigger('click');\r\n }\r\n unstickSidebar();\r\n }\r\n });\r\n\r\n // resize datatables when sidebar is hidden\r\n $('.sidebar-main-toggle').on('click', function () {\r\n $(window).trigger('resize');\r\n $.fn.dataTable\r\n .tables({ visible: true, api: true })\r\n .columns.adjust();\r\n });\r\n }\r\n\r\n\r\n function setSidebarSticky() {\r\n $('#MAIN_SIDEBAR').stick_in_parent({\r\n offset_top: sidebarOffset\r\n });\r\n $(\".sidebar-content\", '#MAIN_SIDEBAR').removeClass(\"position-absolute\");\r\n }\r\n\r\n\r\n function unstickSidebar() {\r\n $('#MAIN_SIDEBAR').trigger(\"sticky_kit:detach\");\r\n $(\".sidebar-content\", '#MAIN_SIDEBAR').addClass(\"position-absolute\");\r\n }\r\n\r\n /* ========================================================================\r\n * public methods\r\n * ========================================================================\r\n */\r\n\r\n /* ========================================================================\r\n * return\r\n * ========================================================================\r\n */\r\n\r\n return init;\r\n}(jQuery));\r\n\r\n// using to force validation of hidden inputs - does not work when in $(document).ready() -> https://stackoverflow.com/a/24752101/7328169\r\n$.validator.setDefaults({ ignore: \"\" });"]}