{"version":3,"sources":["layout.js","element.js","string.js","submitter.js","Cookies.js","LocalStorage.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_form.js","control_imagecropper.js","control_imagefile.js","control_number.js","control_scanner.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","templates","Map","updateSpacers","space","$","each","getComputedStyle","this","position","outerHeight","window","innerWidth","document","location","pathname","startsWith","length","body","style","setProperty","concat","on","e","$this","preventDefault","$input","siblings","val","attr","closest","submit","focus","_transitionsEnabled","removeClass","set","html","initBeforeLoad","addClass","initAfterLoad","initSidebars","revertBottomMenus","find","children","hover","filter","offset","top","clientHeight","hasClass","toggleClass","css","$sidebar","parents","bodyElem","initNavigations","has","not","$target","$navSidebarMini","parent","slideUp","slideDown","data","off","stopPropagation","tab","initComponents","$body","parseJsonAtt","tooltip","is","setTimeout","_componentTooltip","popover","className","documentElement","getPropertyValue","intOffset","Number","parseInt","isNaN","IntersectionObserver","records","intersectionRatio","threshold","rootMargin","observe","el","att","defaultValue","arguments","undefined","input","getAttribute","JSON","parse","name","hasAttribute","value","trigger","target","state","initCardActions","$cardCollapsedClass","block","message","overlayCSS","backgroundColor","opacity","cursor","box-shadow","border","padding","unblock","nextAll","hide","slideToggle","duration","start","complete","remove","cardFullscreen","removeAttr","initDropdownSubmenu","initHeaderElementsToggle","initCore","template","get","updateCityStateFromZip","$zip","$city","$state","update","city","Promise","resolve","valid","zip","fdAjax","url","param","method","callback","result","_result$data","error","description","charAt","toUpperCase","slice","toLowerCase","addEventListener","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","s","call","parentElement","parentNode","nodeType","String","endsWith","search","this_len","substring","rawPos","pos","includes","RegExp","TypeError","indexOf","lastBtn","canditates","activeElement","i","candidate","form","submitter","querySelector","Cookies","key","allCookies","cookie","split","current","trim","days","date","Date","setTime","getTime","expires","toUTCString","LocalStorage","storageIsSupported","test","localStorage","setItem","removeItem","checkLocalStorageIsSupported","getItem","_defineProperty","obj","Object","defineProperty","enumerable","configurable","writable","Modal","defaultModalOptions","onShow","onShown","onHide","onHidden","options","modal","modalLock","showModal","modalOptions","callbackBeforeShow","forceOpen","locked","extend","$modal","onCreate","enableControls","control_textarea","dirtyForms","last","ajaxOptions","currentCallback","hideModal","isOpen","openModal","xhr","FD","Utility","stopLadda","responseText","openImageModal","openInquireModal","_data$featureImageUrl","featureImageUrl","pattern","self","element","productId","featureImageSrc","getControlValuesByContainer","colors","map","_","toArray","join","ProductId","hasBorder","format","Page","colorVisualizerImageUrl","replaceAll","preselect","click","text","Constant","unitedStatesCode","change","blur","tradeStatus","prop","clone","appendTo","openPomRequestModal","init","comingSoon","notify","info","dismissAllNotifications","createLadda","$button","append","Ladda","create","startLadda","$laddaButton","control_form","add","ladda","stop","toggleSiblingsDisplay","toggleChildrenDisplay","blockUI","elem","unblockUI","container","lastElement","fldList","ctrlAR","fldName","pop","controlType","replace","push","prev","id","onFailure","jqXhR","errorMessage","getResponseHeader","errorException","status","alert","reload","resetForm","regexIndexOf","str","indexOfNthOccurrence","n","nthIndex","replaceAtNthOccurrence","resetSequence","itemSelector","listDepth","updateSequence","index","newName","item","forEach","attribute","removeSequenceItem","$itemRemoved","addSequenceItem","templateSelector","insertBeforeSelector","sequenceItemSelector","dataFdValue","inputDataFdValueSelector","$template","insertBefore","redirect","makeOverlay","_ref","_ref$id","_ref$content","content","setup","_ref$startOpen","startOpen","onStateChange","$content","_ref2","debounceAjax","cb","t","request","ms","_len","args","Array","_key","clearTimeout","abort","apply","Notify","keyCodes","widget","parentid","disabled","stoppropagation","startladda","startLoading","_laddaInstance","stopLoading","toggleLoading","toggle","_create","_setEvents","_handleSubmit","event","which","_setOption","jQuery","group","uniform","bluronchange","checked","refresh","confirmcallback","confirmclass","confirmlabel","cancelcallback","cancelclass","cancellabel","passthrough","_createPopover","popoverHTML","title","sanitize","confirmcallback_RAW","cancelcallback_RAW","_popoverEventsAreSet","that","doAjaxPost","mindate","maxdate","formatsubmit","formatmoment","hiddenName","disabledays","allowclear","selectYears","selectMonths","alignright","lastValue","pickadate","skipHandleSubmit","datepickerOptions","disable","formatSubmit","clear","onSet","context","highlight","select","min","max","_datepickerInstance","next","attributes","datepicker","moment","validate","currentElements","type","usetime","predefinedranges","allownull","_defaultDatepickerOptions","applyClass","cancelClass","autoApply","timePicker","singleDatePicker","locale","_formatCode","minDate","maxDate","autoUpdateInput","parentEl","ranges","Today","Yesterday","subtract","Last 7 Days","Last 30 Days","This Month","startOf","endOf","Last Month","daterangepicker","_handleBlur","_handleKeyup","_handleHideDatepicker","_getValue","_handleApplyDatepicker","startDate","endDate","onchange","changecallback","delay","dirtyformsmessage","dirtyformstitle","validator","unobtrusive","settings","ignore","focusInvalid","bind","errorList","numberOfInvalids","scrollTo","scrollTop","dirtyFormOptions","dialog","fieldSelector","helpers","isDirty","$node","_delayTimeout","_handleChange","handleChange","handleSubmit","_triggerElement","originalEvent","setClean","_handleReset","control_toggle","control_imagefile","first","successList","showErrors","reset","$self","inputsAreValid","$validationElement","wrapAll","unwrap","rebuildValidate","unobtrusiveValidation","rules","elname","elrules","messages","rulename","serialize","popTriggerElement","triggerElement","getTriggerElement","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","o","minLen","_arrayLikeToArray","toString","constructor","from","len","arr2","Symbol","iterator","_arr","_n","_d","_e","_s","_i","done","err","isArray","safeJsonParse","choosefiletext","choosefileclass","choosefileicon","unsupportedfiletypetext","unsupportedfilesizetext","maxsize","imagecssclass","croppedfilename","aspectratio","dragdroptitle","forbidden","_this$options$aspectr2","a","b","aspectRatio","parseFloat","_createUiElements","_tryLoadUrl","$croppedUrl","$fallbackUrl","$el","$mainContainer","$fileContainer","$cropContainer","$originalFile","$croppedFile","$originalUrl","$meta","$removed","detach","Error","$dropZone","$dropZonePlaceholder","$fileList","$fileListItem","$previewImage","$previewIcon","$errorMessage","$dropZoneButtonGroup","$browseButton","$mainActions","$cropButton","$removeButton","$cropActions","$cropAcceptButton","$cropCancelButton","_unsetImage","show","_showSelectionControls","_setValue","urlOrInputFile","files","_this","console","warn","tmpImg","Image","onload","_showPreview","src","_this2","fdSetValue","image","lastUploadedImage","fallback","_startCrop","_acceptCrop","_stopCrop","parentID","isRemove","isUploading","dataTransfer","uri","_this3","$cropImg","cropper","Cropper","viewMode","guides","center","rotatable","scalable","zoomable","zoomOnWheel","zoomOnTouch","cropBoxMovable","cropBoxResizable","toggleDragModeOnDblclick","_this4","stringify","getData","_this$cropper$getImag","getImageData","width","naturalWidth","height","getCroppedCanvas","minWidth","minHeight","fillColor","imageSmoothingEnabled","imageSmoothingQuality","toBlob","blob","_readData","xfr","DataTransfer","items","File","lastModified","destroy","_clearInputFile","skipRemove","stopProccessing","idx","fileElement","rejectFilter","invalidFileType","accept","acceptFilter","validFileType","validFileSize","size","indexOfExtension","lastIndexOf","_formatBytes","fileOrBlob","handler","reader","FileReader","readAsDataURL","onloadend","bytes","decimals","dm","Math","floor","log","pow","toFixed","div","originalFix","isAdvancedUpload","createElement","isMobile","fix","clipboardData","currentSelection","eventsWired","takepicturetext","takepictureclass","takepictureicon","removetext","removecssclass","removeicon","filenamecssclass","filename","urlcssclass","mobilecssclass","enablepreview","previewplacemnt","advancedupload","copypastetitle","uploadbutton","uploadbuttontext","uploadbuttonclass","uploadicon","uploadmessage","initial","_remove","skipCallback","$uploadButton","$buttonGroup","$dropZoneTitle","$copyPasteTitle","$fileNameLabel","$removeUrl","fileName","shift","_previewUrl","$container","insertAfter","$pictureButton","$uploadmessage","_handleImagePaste","isValid","tooltipText","fileItem","icon","isValidPreview","_setUploading","startUpload","stopUpload","precision","editfactor","_validate","_handleFocus","_handleKeypress","fromCharCode","match","_handlePaste","pastedText","newValue","factorOffset","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","iter","resolutionOptions","320px","640px","800px","1280px","1600px","1920px","resolution","patchsize","workers","torch","halfsample","facingmode","frequency","startonload","numbertoscan","samplingcount","samplingtimeout","showinvalidboxes","videoiniterrorcss","videoiniterrormessage","barcodeTypeOptions","Code 128","Code 39","Code 39 VIN","EAN","EAN-extended","UPC","UPC-E","Codabar","Interleaved 2 of 5","Standard 2 of 5","Code 93","patchSizeOptions","numberOfWorkerOptions","facingModeOptions","setOnProcessed","onProcessedCallback","Quagga","offProcessed","_onProcessed","onProcessed","_hasStopped","_activeCamera","deviceId","toggleTorch","setTurnedOn","_hasTorch","CameraAccess","getActiveTrack","applyConstraints","advanced","setCamera","_availableCameras","cameraToFind","camera","nextIndex","findIndex","getCanvas","canvas","dom","_numberScanned","_quaggaState","onDetected","_onDetected","patchSize","resolutionParts","inputStream","constraints","facingMode","locator","halfSample","numOfWorkers","decoder","readers","config","supplements","locate","resolutions","keys","replaceWith","_initCameraSelection","_checkCapabilities","track","getCapabilities","capabilities","streamLabel","getActiveStreamLabel","enumerateVideoDevices","then","devices","device","label","_reset","drawingCtx","ctx","overlay","drawingCanvas","boxes","clearRect","box","ImageDebug","drawPath","x","y","color","lineWidth","codeResult","code","line","lastResult","samplingTimeout","lastResultTimeout","samplings","sort","v","samplingSet","Set","numberScanned","placeholder","allowsearch","dropdownautowidth","unselectedvalue","minimuminputlength","dropdownParent","provider","ajaxbuilder","namespace","cascadeparentid","cascadeprovider","cascadeajaxbuilder","allowcustom","createtagcallback","templateresultcallback","templateselectioncallback","escapemarkupcallback","fieldset","ev","currentTarget","minlength","select2Options","minimumInputLength","dropdownAutoWidth","allowClear","tags","createTag","templateResult","templateSelection","escapeMarkup","minimumResultsForSearch","Infinity","ajax","dataType","initiallyDisabled","fdUnselect","_unselect","fdResetSelectedItem","_resetSelectedItem","_createCascadeEffect","select2","_applyOptionStyles","parentValue","getJSON","_loadSelectItems","sourceUrl","results","timestamp","newOptions","selectedAttr","selected","itemToSelectAfterCascade","cssClass","bgColor","$select2","callbackparam","assign","params","_destroy","updateOption","option","control_select","newOption","Option","rendertofield","$element","multiple","language","inputTooShort","createSearchChoice","term","localeCompare","page","jsonItems","selectItems","json","iskeyup","isblur","iskeyupdelay","maxlength","repeat","preventsubmit","keypress","_keyupTimer","autoresize","resize","autosize","overflowY","_resize","computed","scrollHeight","enable","_enable","_switcheryInstance","switcher","_disable","Switchery","changeTo","_changeSwitchery","_refresh","fn","codeEditor","ace","theme","readonly","mode","editor","edit","setTheme","setReadOnly","session","setMode","searchDelayTimeout","dataTable","Api","register","milliseconds","table","nTableWrapper","draw","enableControl","$elem","specified","attributeName","parts","control","formQueue","enableTooltips","enablePopovers","onTooltipClicked","$selectParent","ajaxOutstanding","ajaxScheduled","progressBar","Mprogress","defaults","ishtml","isloader","loadingButton","loadingButtonStyle","contentType","contentTypeHelper","cache","processData","cancelprevious","preventResubmit","preventSubmit","cleanupAfterAjax","laddaButton","end","handleAjax","ajaxCall","async","FormData","beforeSend","success","fail","textStatus","errorThrown","dataError","errorStatus","errorMsg","ajaxObj","readyState","splice","handleAjaxQueue","opts","timeout","handleAjaxSchedule","me","$pageHeader","sidebarOffset","propHooks","events","originalBind","onAnchorClick","identifyLoggedInCookie","FD_Data","Authenticated","updateLoggedInCookie","autoWidth","buttons","button","emptyTable","searchPlaceholder","lengthMenu","paginate","previous","paging","responsive","details","Constructor","_enforceFocus","bsBreakpoints","currentbreakpoint","getCurrentBreakpoint","setSidebarSticky","unstickSidebar","breakpoint","tables","visible","api","columns","adjust","handleStickySiderbar","close","$selection","one","Intl","DateTimeFormat","resolvedOptions","timeZone","stick_in_parent","offset_top","Env","Enum","AppEnvironment","Staging","Production","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\n\r\nvar App = function () {\r\n\r\n const templates = new Map()\r\n\r\n $('[data-fd-clear]').on('click', function (e) {\r\n const $this = $(this);\r\n e.preventDefault();\r\n const $input = $this.siblings('input,select');\r\n $input.val('');\r\n\r\n if ($this.attr('data-fd-clear') === 'submit') {\r\n $this.closest('form').submit();\r\n } else {\r\n $input.focus();\r\n }\r\n });\r\n \r\n function updateSpacers() {\r\n let space = 0;\r\n $('[data-fd-footer-spacing]').each(function() {\r\n if (getComputedStyle(this).position === 'fixed') {\r\n space = $(this).outerHeight();\r\n } \r\n });\r\n space += window.innerWidth < 1024 && document.location.pathname.startsWith('/Account/Cart') && $(\".cart-items\").length ? 70 : 0;\r\n document.body.style.setProperty('--fixed-footer-space', `${space}px`)\r\n }\r\n\r\n $(window).on('resize', updateSpacers);\r\n updateSpacers();\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 // Sticky\r\n var _componentSticky = function () {\r\n // Initialize\r\n $('[data-fd-sticky]').each(function() {\r\n var $this = $(this);\r\n var className = $this.attr('data-fd-sticky') || \"is-sticky\";\r\n \r\n const offset = getComputedStyle(document.documentElement).getPropertyValue('--vp-top');\r\n let intOffset = Number.parseInt(offset)\r\n if (Number.isNaN(intOffset)) intOffset = 0;\r\n \r\n (new IntersectionObserver(\r\n function(records) {\r\n $this.toggleClass(className, records[0].intersectionRatio < 1);\r\n },\r\n {\r\n threshold: 1,\r\n rootMargin: `${(intOffset +1) * -1}px 0px 0px 0px`\r\n }\r\n )).observe(this);\r\n });\r\n };\r\n\r\n var _componentToggle = function() {\r\n\r\n const $body = $(document.body);\r\n\r\n const parseJsonAtt = function(el, att, defaultValue = {}) {\r\n const input = el.getAttribute(att);\r\n if (input === undefined) return defaultValue;\r\n return JSON.parse(input); \r\n };\r\n\r\n\r\n $body.on('click', '[data-fd-toggle]',function(e) { \r\n const $this = $(this);\r\n const name = $this.attr('data-fd-toggle');\r\n const allowDefault = this.hasAttribute('data-fd-allow-default');\r\n if (!allowDefault) e.preventDefault();\r\n const value = $this.attr('data-fd-tab') || ! $this.hasClass('show');\r\n _transitionsEnabled(); // allow overlays to be used before the page finishes loading\r\n $body.trigger('fd:toggle-set', [ name, value, parseJsonAtt(this, 'data-fd-toggle-data')]);\r\n }).on('click', '[data-fd-toggle-target]',function(e) {\r\n if (e.target.hasAttribute('data-fd-backdrop')) {\r\n $body.trigger('fd:toggle-set', [ this.getAttribute('data-fd-toggle-target'), false]);\r\n }\r\n }).on('fd:toggle-set', function(e, name, state, data) {\r\n $('[data-fd-toggle=' + name +'],[data-fd-toggle-target=' + name +']').each(function() {\r\n const $this = $(this);\r\n const tab = $this.attr('data-fd-tab');\r\n\r\n if (tab) {\r\n $this.toggleClass('active', state === tab);\r\n } else {\r\n $this.toggleClass('show', state);\r\n }\r\n\r\n $this.trigger('fd:toggle', { state, data })\r\n\r\n if (this.hasAttribute('data-fd-toggle-target') && !this.hasAttribute('data-fd-toggle-allow-scroll')) {\r\n $(document.documentElement).toggleClass('no-scroll', state);\r\n }\r\n })\r\n .find('[data-fd-autofocus]').focus();\r\n })\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 $('template[data-fd-template]').each(function() {\r\n const $this = $(this)\r\n templates.set($this.attr('data-fd-template'), $this.html() );\r\n })\r\n\r\n //\r\n // Custom State/Zip logic\r\n //\r\n\r\n function updateCityStateFromZip($zip, $city, $state) {\r\n function update(city = \"\", state = \"\") {\r\n $city.val(city);\r\n $state.val(state);\r\n $city.removeClass(\"text-danger\");\r\n }\r\n\r\n return new Promise((resolve) => {\r\n if ($zip.valid()) {\r\n const zip = $zip.val();\r\n\r\n if (zip) {\r\n $.fdAjax({\r\n url: $zip.attr(\"data-fd-url\") + '?' + $.param({ zip }),\r\n method: \"GET\",\r\n callback: function (result) {\r\n if (result.data) {\r\n let { city, state } = result.data;\r\n\r\n if (result.data.error) {\r\n $state.addClass(\"text-danger\").val(result.data.error.description);\r\n $city.val('');\r\n } else {\r\n city = result.data.city.charAt(0).toUpperCase() + result.data.city.slice(1).toLowerCase();\r\n update(city, state);\r\n }\r\n }\r\n resolve();\r\n }\r\n });\r\n return;\r\n }\r\n }\r\n\r\n // when the zip is invalid, clear the city, state\r\n update();\r\n resolve();\r\n\r\n });\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 _componentSticky();\r\n _componentToggle();\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 template: function(name) {\r\n return templates.get(name) || \"\"\r\n },\r\n\r\n updateCityStateFromZip\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 var el = this;\r\n\r\n do {\r\n if (Element.prototype.matches.call(el, s)) return el;\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\tString.prototype.endsWith = function (search, this_len) {\r\n\t\tif (this_len === undefined || this_len > this.length) {\r\n\t\t\tthis_len = this.length;\r\n\t\t}\r\n\t\treturn this.substring(this_len - search.length, this_len) === search;\r\n\t};\r\n}\r\nif (!String.prototype.startsWith) {\r\n\tString.prototype.startsWith = function (search, rawPos) {\r\n\t\tvar pos = rawPos > 0 ? rawPos | 0 : 0;\r\n\t\treturn this.substring(pos, pos + search.length) === search;\r\n\t};\r\n}\r\nif (!String.prototype.includes) {\r\n\tString.prototype.includes = function (search, start) {\r\n\t\t'use strict';\r\n\r\n\t\tif (search instanceof RegExp) {\r\n\t\t\tthrow TypeError('first argument must not be a RegExp');\r\n\t\t}\r\n\t\tif (start === undefined) { start = 0; }\r\n\t\treturn this.indexOf(search, start) !== -1;\r\n\t};\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 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}();","/** @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).html(html)\r\n\r\n // Add onCreate hook so images can be inserted before modal starts fading in. Prevents FOUC\r\n if (modalOptions.onCreate) {\r\n modalOptions.onCreate($modal)\r\n }\r\n\r\n $modal.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(xhr.responseText || xhr, modalOptions);\r\n },\r\n\r\n /**\r\n * @param {{ value: string }} data\r\n */\r\n openImageModal: function (data) {\r\n return showModal($(\"#IMAGE_MODAL\").html(), {\r\n onShown: function ($modal) {\r\n $modal.find(\"img\").attr(\"src\", data.value);\r\n }\r\n })\r\n },\r\n\r\n openInquireModal: function () { \r\n let featureImageUrl = \"\";\r\n let pattern = \"\";\r\n let name = \"\";\r\n const self = this;\r\n const data = this.element.data();\r\n\r\n if (data.productId) {\r\n featureImageUrl = data.featureImageUrl ?? data.featureImageSrc;\r\n pattern = data.pattern;\r\n name = data.name;\r\n }\r\n // Customized product\r\n if (this.element.closest('.product-entry').find(\".product-image.semi-custom-customize\").length) {\r\n if ($(\".color-visualizer-customization\").is(\":visible\")) {\r\n const form = FD.Utility.getControlValuesByContainer(\"#FORM\");\r\n const colors = $('.palette-item .palette:visible .palette-color').map((_, s) => $(s).data('colorHex')).toArray().join('|')\r\n const data = {\r\n colors: colors,\r\n productId: form.ProductId,\r\n hasBorder: $(\"#FORM input[type=checkbox][name$=HasBorder]\").is(':checked'),\r\n format: 'svg'\r\n }\r\n featureImageUrl = FD.Page.colorVisualizerImageUrl + '?' + $.param(data).replaceAll(\"[]\", '');\r\n }\r\n } else {\r\n // Project Page\r\n let url = this.element.closest('.project-item').find(\".image img\").attr('src');\r\n if (url) {\r\n featureImageUrl = url;\r\n } else {\r\n // Product Page\r\n url = this.element.closest('.product-entry').find(\".product-image img\").attr('src');\r\n if (url) {\r\n featureImageUrl = url;\r\n }\r\n }\r\n }\r\n\r\n return showModal($(\"#INQUIRE_MODAL\").html(), {\r\n onShown: function ($modal) {\r\n $modal.find(`input[name$='${data.preselect}']:visible`).click();\r\n\r\n if (featureImageUrl && featureImageUrl != $(\"#FeatureImageUrl\").attr(\"src\")) {\r\n $(\"#FeatureImageUrl\").attr(\"src\", featureImageUrl);\r\n setTimeout(() => $(\"#FeatureImageUrl\").removeClass('d-none'), 100);\r\n } else {\r\n $(\"#FeatureImageUrl\").removeClass('d-none');\r\n }\r\n if (pattern) {\r\n $(\"#Pattern\").text(pattern);\r\n }\r\n if (name) {\r\n $(\"#Name\").text(name);\r\n }\r\n\r\n if ($(\"#Inquiry_Country\", $modal).val() == FD.Constant.unitedStatesCode) {\r\n App.updateCityStateFromZip($(\"#Inquiry_ZipCode\"), $(\"#Inquiry_City\", $modal), $(\"#Inquiry_State\", $modal));\r\n }\r\n\r\n $(\"#Inquiry_Country\", $modal).change(function () {\r\n $(\"#Inquiry_City\", $modal).val('').removeClass(\"text-danger\").attr('readonly', $(this).val() == FD.Constant.unitedStatesCode);\r\n $(\"#Inquiry_State\", $modal).val('').attr('readonly', $(this).val() == FD.Constant.unitedStatesCode);\r\n $(\"#Inquiry_ZipCode\", $modal).attr('type', $(this).val() == FD.Constant.unitedStatesCode ? 'number' : 'text').blur();\r\n\r\n\r\n if ($(this).val() == FD.Constant.unitedStatesCode) {\r\n App.updateCityStateFromZip($(\"#Inquiry_ZipCode\", $modal), $(\"#Inquiry_City\", $modal), $(\"#Inquiry_State\", $modal));\r\n }\r\n });\r\n\r\n $(\"[name$=TradeStatus]\", $modal).change(function () {\r\n const tradeStatus = $(this).val();\r\n const valid = tradeStatus == \"DesignerOrArchitect\" || tradeStatus == \"WorkingWithDesigner\";\r\n \r\n $(\".show-valid-trade-status\", $modal).toggleClass('d-none', !valid);\r\n $(\".hide-valid-trade-status\", $modal).toggleClass('d-none', valid);\r\n $(\"[type=submit]\", $modal).prop('disabled', !valid); \r\n })\r\n\r\n // Customized product\r\n if (self.element.closest('.product-entry').find(\".product-image.semi-custom-customize\").length) {\r\n if ($(\".color-visualizer-customization\").is(\":visible\")) {\r\n $(\"#FORM [name$=HasBorder]\").clone().appendTo(\"#INQUIRY_FORM\");\r\n $(\"#FORM [name$=ColorId]\").clone().appendTo(\"#INQUIRY_FORM\");\r\n }\r\n } else {\r\n // Project Page\r\n $(\"[name$=HasBorder]\", self.element.closest('.project-item')).clone().appendTo(\"#INQUIRY_FORM\");\r\n $(\"[name$=ColorId]\", self.element.closest('.project-item')).clone().appendTo(\"#INQUIRY_FORM\");\r\n $(\"#INQUIRY_FORM [name$=ProductId]\").val(data.productId);\r\n }\r\n }\r\n });\r\n },\r\n\r\n /** @param {{value: { preselect: string, productId?: number }}} data */\r\n openPomRequestModal: function (data) {\r\n return showModal($(\"#NEW_POM_MODAL\").html(), {\r\n onShown: function ($modal) {\r\n const form = $('#NEW_POM_FORM');\r\n if ($(\"select[name$=Country]\", form).val() == FD.Constant.unitedStatesCode) {\r\n App.updateCityStateFromZip($(\"#PomRequest_ZipCode\"), $(\"#PomRequest_City\"), $(\"#PomRequest_State\"), $(\"#CITY_STATE\"));\r\n }\r\n }\r\n });\r\n },\r\n\r\n /**\r\n * @param {{ value: string }} data\r\n */\r\n openImageModal: function (data) {\r\n return showModal($(\"#IMAGE_MODAL\").html(), {\r\n onShown: function ($modal) {\r\n $modal.find(\"img\").attr(\"src\", data.value);\r\n }\r\n })\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\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 (elem.parent().is(\"[data-fd-control=button]\") && elem.closest('.filter-group').length > 0) {\r\n fldName = fldName.replace('[]', '');\r\n val = ctrlAR[fldName] || [];\r\n if (elem.is(':not([disabled])')) {\r\n val.push(elem.val());\r\n }\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 if (elem.is('input') && elem.hasClass(\"number-group\")) {\r\n val = ctrlAR[fldName] || [];\r\n val.push(elem.val());\r\n } else {\r\n if (lastElement != null && lastElement.is('[data-fd-control=checkbox]') && 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 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 const errorMessage = jqXhR.getResponseHeader('error-message');\r\n const errorException = jqXhR.getResponseHeader('error-exception');\r\n\r\n if (jqXhR.status === 400 && errorMessage) {\r\n if (errorException) {\r\n FD.notify.alert(errorMessage + \"
(click to show exception)\", false, null, !errorException ? null : () => alert(errorException));\r\n } else {\r\n FD.notify.alert(errorMessage, true);\r\n }\r\n } else if (jqXhR.status === 401) {\r\n FD.notify.alert(\"Unauthorized. Click here to refresh this page.\", true, null, location.reload);\r\n } else {\r\n FD.notify.alert(\"An error has occurred. Please try to hard refresh your page.\", true);\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 * A RegExp variant for string.indexOf(). \r\n * @param {string} str Your string\r\n * @param {RegExp|string} pattern A pattern to search for. If using a string, str.indexOf(pattern, start) will be used.\r\n * @param {number} start An index position to start searching at. Defaults to 0.\r\n */\r\n regexIndexOf: function (str, pattern, start = 0) {\r\n if (start < 0) {\r\n return -1;\r\n }\r\n\r\n if (typeof pattern === \"string\") {\r\n // pattern is a simple string, we can use the built-in string.indexOf function instead\r\n return str.indexOf(pattern, start);\r\n }\r\n\r\n const indexOf = str.substring(start).search(pattern);\r\n\r\n if (indexOf === -1) {\r\n return indexOf;\r\n }\r\n\r\n return indexOf + start;\r\n },\r\n\r\n /**\r\n * Find the nth index of a pattern in a string.\r\n * @param {string} str Your string\r\n * @param {RegExp|string} pattern A pattern to search for.\r\n * @param {number} n The number of patterns to search for from the start of str.\r\n */\r\n indexOfNthOccurrence: function (str, pattern, n) {\r\n let nthIndex = -1;\r\n\r\n for (let i = 0; i < n; i++) {\r\n nthIndex = FD.Utility.regexIndexOf(str, pattern, nthIndex + 1);\r\n\r\n if (nthIndex === -1) {\r\n break;\r\n }\r\n }\r\n\r\n return nthIndex;\r\n },\r\n\r\n /**\r\n * Replaces the nth occurrence of a pattern in a string with a new value.\r\n * @param {string} str Your string\r\n * @param {RegExp|string} pattern A pattern to search for.\r\n * @param {number} n The number of patterns to search for from the start of str.\r\n * @param {string} replace The string to replace pattern with.\r\n */\r\n replaceAtNthOccurrence: function (str, pattern, n, replace) {\r\n if (n === 1) {\r\n // since n is 1, we can simply do a replace\r\n return str.replace(pattern, replace);\r\n }\r\n\r\n const nthIndex = FD.Utility.indexOfNthOccurrence(str, pattern, n);\r\n\r\n if (nthIndex === -1) {\r\n return str; // there wasn't an nth occurrence of pattern\r\n }\r\n\r\n return str.substring(0, nthIndex) + str.substring(nthIndex).replace(pattern, replace);\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|JQLite} itemSelector A JQuery selector \r\n * @param {number} listDepth How many \"lists\" deep is this sequence? Ex. Model.Parents[0].Children[0] - Children is at listDepth = 2\r\n */\r\n resetSequence: function (itemSelector, listDepth = 1) {\r\n // iterate over all items in sequence\r\n $(this).find(itemSelector).each((index, item) => ['name', 'data-valmsg-for'] // add more attributes to update here as we need them.\r\n // iterate over all attributes we want to update\r\n .forEach((attribute) => $(`[${attribute}]`, item)\r\n // iteratate over all elements with the attribute\r\n .each((_, element) => updateSequence($(element), attribute, index)))\r\n );\r\n\r\n /**\r\n * @param {JQLite} $this\r\n * @param {string} name\r\n */\r\n function updateSequence($this, name, index) {\r\n const pattern = /\\[\\d*\\]/;\r\n const replace = `[${index}]`;\r\n const newName = FD.Utility.replaceAtNthOccurrence($this.attr(name), pattern, listDepth, replace);\r\n\r\n $this.attr(name, newName);\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 let parent = $(this).closest(itemSelector).parent();\r\n $(this).popover('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 // Allow using an existing div or a template element (prevents early/duplicate instantiation of form controls like the image uploader)\r\n const $template = $(templateSelector);\r\n const item = $template.is('template') ? $($template.html()) : $template.clone();\r\n\r\n item.attr('data-fd-value', dataFdValue)\r\n .removeAttr('id')\r\n .insertBefore(insertBeforeSelector)\r\n .removeClass('d-none')\r\n .enableControls()\r\n .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 makeOverlay: function({\r\n id = 'custom-overlay',\r\n content = '',\r\n setup,\r\n startOpen = true,\r\n onStateChange\r\n } = {}) {\r\n const $content = $(`\r\n
\r\n
\r\n
${content}
\r\n
`);\r\n \r\n const $body = $(document.body);\r\n $body.append($content);\r\n $content.enableControls().find('form').control_form('rebuildValidate');\r\n if (setup) setup($content,id);\r\n \r\n if(startOpen) {\r\n setTimeout(() => {\r\n $body.trigger('fd:toggle-set', [ id, true ]);\r\n }, 16);\r\n }\r\n \r\n $(`[data-fd-toggle-target=\"${id}\"]`).on('fd:toggle', function(e, { state, data } = {}) {\r\n if (onStateChange) {\r\n onStateChange(state,data);\r\n } else {\r\n // if user doesn't handle the state change, automatically remove it when closing\r\n if (!state) {\r\n setTimeout(() => {\r\n $content.remove();\r\n }, 300);\r\n }\r\n }\r\n });\r\n },\r\n\r\n debounceAjax: function(cb, ms = 0) {\r\n let t, request;\r\n return (...args) => {\r\n clearTimeout(t)\r\n if (request) {\r\n request.abort();\r\n request = null;\r\n }\r\n t = setTimeout(() => {\r\n request = cb(...args);\r\n }, ms);\r\n }\r\n }\r\n };\r\n}();","/* global Cookies, LocalStorage, Modal, Notify, Page, Utility */\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\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};","/* 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 if (self.element.is(\".disabled\")) {\r\n event.stopPropagation();\r\n return false;\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 if (self.element.is(\".disabled\")) {\r\n event.stopPropagation();\r\n return false;\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 uniform: true, // use the uniform library to style the checkbox\r\n bluronchange: true, // to trigger auto form submits on checkbox click\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.element.removeClass('d-none').removeAttr('data-fouc');\r\n if (this.options.uniform) {\r\n this.element.uniform();\r\n }\r\n if (this.element.attr('type') !== 'radio') {\r\n this.element.val(this.element[0].checked ? 'true' : 'false');\r\n }\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 for radio groups that have different name's OptionList[0].Selected\r\n if (self.options.group) {\r\n if (self.options.uniform) {\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 }\r\n if (self.element.attr('type') !== 'radio') {\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 }\r\n self.options.callback.call(self, { parentid: self.options.parentid, value: self.element[0].checked }, event);\r\n if (self.options.bluronchange) {\r\n self.element.blur();\r\n }\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 if (this.options.uniform) {\r\n $.uniform.update(this.element);\r\n }\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 },\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: false,\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));","(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: 'mmmm d, yyyy',\r\n formatsubmit: 'yyyy-mm-dd',\r\n formatmoment: 'YYYY-MM-DD',\r\n hiddenName: true,\r\n disabledays: [], // Array of days of the week, numbered 1 - 7.\r\n allowclear: true,\r\n container: null,\r\n selectYears: true,\r\n selectMonths: true,\r\n alignright: false\r\n },\r\n _create: function () {\r\n const that = this;\r\n let lastValue;\r\n let pickadate;\r\n let skipHandleSubmit = false;\r\n\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 hiddenName: this.options.hiddenName,\r\n clear: this.options.allowclear ? 'Clear' : '',\r\n selectYears: this.options.selectYears,\r\n selectMonths: this.options.selectMonths,\r\n onSet: function (context) {\r\n if (context.highlight) {\r\n return; // control is just setting the highlight option, not setting any values\r\n }\r\n\r\n if ((context.clear !== undefined || context.select !== undefined && !context.select) && !that.options.allowclear) {\r\n skipHandleSubmit = true;\r\n pickadate.set('select', lastValue);\r\n } else if (skipHandleSubmit) {\r\n skipHandleSubmit = false;\r\n } else {\r\n lastValue = context.select;\r\n that._handleSubmit(this, context);\r\n }\r\n }\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.container) {\r\n datepickerOptions.container = this.options.container;\r\n }\r\n\r\n this._datepickerInstance = this.element.pickadate(datepickerOptions);\r\n if (this.options.alignright) {\r\n this.element.next().find(\".picker__holder\").css(\"right\", 0);\r\n }\r\n pickadate = this._datepickerInstance.data().pickadate;\r\n lastValue = pickadate.get();\r\n \r\n const target = this.element.parent().find('[type=hidden]');\r\n target.attr('class', this.element.attr('class'));\r\n this.element.addClass('ignore-validators');\r\n\r\n const attributes = this.element[0].attributes;\r\n for (let i = 0; i < attributes.length; i++) {\r\n if (attributes[i].name.startsWith('data-val')) {\r\n target.attr(attributes[i].name, attributes[i].value);\r\n }\r\n }\r\n\r\n // don't tab to the pickadate buttons\r\n (this.options.container ? $(this.options.container) : $(this.element).next()).find('button').attr('tabindex', -1);\r\n },\r\n _handleSubmit: function (datepicker, context) {\r\n this.options.callback.call(this, {\r\n parentid: this.options.parentid,\r\n value: context.select ? moment(context.select).format(this.options.formatmoment) : null // If select isn't defined, they pressed the clear button\r\n }, datepicker);\r\n if (this.element.closest('form').validate().currentElements.length > 0) {\r\n this.element.parent().find('[type=hidden]').valid();\r\n }\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 $.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 delay: 0, // use delay to wait and see if any newer submit requests come in to cut down on the amount of submit requests\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) {\r\n if ($node.is('form')) {\r\n return $node.hasClass('force-dirty');\r\n }\r\n return false;\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 _delayTimeout: null,\r\n _handleChange: function (event) {\r\n event.stopPropagation();\r\n const form = event.data;\r\n const $input = $(this);\r\n\r\n clearTimeout(form._delayTimeout);\r\n\r\n if (form.options.delay) {\r\n form._delayTimeout = setTimeout(handleChange, form.options.delay);\r\n } else {\r\n handleChange();\r\n } \r\n\r\n function handleChange() {\r\n if ($input.is(\":focus\")) {\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 }\r\n form.element.submit();\r\n }\r\n if (!form.element.is('form')) {\r\n form.form.addClass('dirty');\r\n }\r\n }\r\n },\r\n _handleSubmit: function (event) {\r\n const self = event.data;\r\n\r\n clearTimeout(self._delayTimeout);\r\n\r\n if (self.options.delay) {\r\n self._delayTimeout = setTimeout(handleSubmit, self.options.delay);\r\n } else {\r\n handleSubmit();\r\n } \r\n\r\n function handleSubmit() {\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 self.setClean();\r\n }\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', ':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));","/**\r\n * This is based on control_imagefile.js\r\n * 1. Only supports a single image (not multiple files)\r\n * 2. Provides a crop control using cropper.js\r\n * 3. Does not automatically map form fields. Explicit configuration is required\r\n * While it is initialized on the input with data-fd-control=\"imagecropper\"\r\n * it looks up to a parent data-image-cropper container, then locates the other inputs\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n */\r\n(function ($) {\r\n 'use strict';\r\n\r\n function safeJsonParse(input) {\r\n try {\r\n return JSON.parse(input);\r\n } catch (e) {\r\n // fail silently. caller will get undefined\r\n }\r\n }\r\n\r\n $.widget(\"fd.control_imagecropper\", {\r\n options: {\r\n callback: function () { },\r\n choosefiletext: 'Choose File',\r\n choosefileclass: 'btn btn-info',\r\n choosefileicon: \"\",\r\n unsupportedfiletypetext: 'Unsupported File Type',\r\n unsupportedfilesizetext: 'Unsupported File Size',\r\n maxsize: 29360128,\r\n imagecssclass: '',\r\n croppedfilename: 'image',\r\n aspectratio: '385:513',\r\n dragdroptitle: 'Drag & drop files here …',\r\n forbidden: \"application/x-msdownload,*.bat,*.cmd,*.scr,*.bash\",\r\n }, \r\n _create: function () { \r\n\r\n const [a,b] = this.options.aspectratio.split(':')\r\n this.aspectRatio = Number.parseFloat(a) / Number.parseFloat(b);\r\n\r\n this._createUiElements();\r\n this._tryLoadUrl(this.$croppedUrl.val() || this.$fallbackUrl.val());\r\n this._setEvents();\r\n },\r\n _createUiElements: function () {\r\n \r\n this.$el = this.element.closest('[data-image-cropper]').addClass('image-cropper-container')\r\n\r\n this.$mainContainer = $('
').appendTo(this.$el);\r\n this.$fileContainer = $('
').appendTo(this.$mainContainer);\r\n this.$cropContainer = $('
').hide().appendTo(this.$el);\r\n this.$originalFile = this.element.hide();\r\n this.$croppedFile = this.$el.find('[data-image-cropper-input=\"cropped-file\"]').hide();\r\n this.$originalUrl = this.$el.find('[data-image-cropper-input=\"original-url\"]');\r\n this.$croppedUrl = this.$el.find('[data-image-cropper-input=\"cropped-url\"]');\r\n this.$fallbackUrl = this.$el.find('[data-image-cropper-input=\"fallback-url\"]');\r\n this.$meta = this.$el.find('[data-image-cropper-input=\"meta\"]');\r\n this.$removed = this.$el.find('[data-image-cropper-input=\"removed\"]').detach();\r\n \r\n if (!this.$originalUrl.length) throw new Error('Image cropper missing original-url input');\r\n if (!this.$croppedUrl.length) throw new Error('Image cropper missing cropped-url input');\r\n if (!this.$meta.length) throw new Error('Image cropper missing meta input');\r\n if (!this.$removed.length) throw new Error('Image cropper missing removed input');\r\n\r\n this.$dropZone = $('
').appendTo(this.$fileContainer);\r\n this.$dropZonePlaceholder = $('
' + this.options.dragdroptitle + '
').appendTo(this.$dropZone);\r\n this.$fileList = $(\"
\").appendTo(this.$dropZone);\r\n this.$fileListItem = $(\"
\").appendTo(this.$fileList);\r\n this.$previewImage = $(\"\").hide().appendTo(this.$fileListItem);\r\n this.$previewIcon = $(\"\").hide().appendTo(this.$fileListItem);\r\n this.$errorMessage = $(\"\").hide().appendTo(this.$fileListItem);\r\n\r\n this.$dropZoneButtonGroup = $('
').appendTo(this.$dropZonePlaceholder);\r\n this.$browseButton = $(\"\").appendTo(this.$dropZoneButtonGroup);\r\n\r\n this.$mainActions = $('
').hide().appendTo(this.$mainContainer);\r\n this.$cropButton = $(\"\").appendTo(this.$mainActions);\r\n this.$removeButton = $(\"\").appendTo(this.$mainActions);\r\n\r\n this.$cropActions = $('
').appendTo(this.$cropContainer);\r\n this.$cropAcceptButton = $(\"\").appendTo(this.$cropActions);\r\n this.$cropCancelButton = $(\"\").appendTo(this.$cropActions);\r\n\r\n },\r\n _unsetImage: function() {\r\n this.$removed.val(true).appendTo(this.$fileContainer);\r\n this.$previewImage.hide();\r\n this.$previewIcon.hide();\r\n this.$mainActions.hide();\r\n this.$dropZonePlaceholder.show();\r\n this.$errorMessage.text('').hide();\r\n this.element[0].value = '';\r\n this.$croppedFile[0].value = '';\r\n this.element.trigger('change', true);\r\n },\r\n _showSelectionControls: function () {\r\n this.$removed.detach();\r\n this.$errorMessage.text('').hide();\r\n this.$mainActions.show();\r\n this.$dropZonePlaceholder.hide();\r\n },\r\n _setValue: function (urlOrInputFile) { \r\n if (urlOrInputFile && urlOrInputFile.files && urlOrInputFile.files[0]) {\r\n this._showSelectionControls();\r\n } else {\r\n this._tryLoadUrl(urlOrInputFile);\r\n this.reset();\r\n }\r\n },\r\n reset: function () {\r\n this._unsetImage();\r\n },\r\n _tryLoadUrl: function (url) {\r\n if (!url) return;\r\n\r\n try {\r\n this.element.rules('remove', 'required');\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n\r\n this._showSelectionControls();\r\n\r\n var tmpImg = new Image();\r\n tmpImg.onload = () => {\r\n this._showPreview(url);\r\n };\r\n tmpImg.src = url;\r\n },\r\n \r\n _setEvents: function () {\r\n this.element[0].fdSetValue = this._setValue.bind(this);\r\n\r\n this.$browseButton.click(() => {\r\n this.element.trigger('click');\r\n return false;\r\n });\r\n\r\n this.$cropButton.click(() => {\r\n let image = this.lastUploadedImage || this.$originalUrl.val();\r\n let fallback = this.$fallbackUrl.val()\r\n if (!image && fallback) {\r\n image = fallback;\r\n this.$originalUrl.val(this.$fallbackUrl.val());\r\n }\r\n this._startCrop(image);\r\n return false;\r\n });\r\n\r\n this.$cropAcceptButton.click(() => {\r\n this._acceptCrop();\r\n return false;\r\n });\r\n\r\n this.$cropCancelButton.click(() => {\r\n this._stopCrop();\r\n return false;\r\n });\r\n \r\n this.$removeButton.click((e) => {\r\n // Note that element[0].files will still existing in this callback.\r\n if (this.options.callback.call(this, { parentID: this.options.parentid, value: this.element[0].files[0], isRemove: true }, e) !== false) {\r\n this._unsetImage();\r\n }\r\n return false;\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 this.$fileContainer.on('drag dragstart dragend dragover dragenter dragleave drop', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }).on('dragover dragenter', () => {\r\n if (!this.isUploading) this.$fileContainer.addClass('is-dragover'); \r\n })\r\n .on('dragleave dragend drop', () => {\r\n if (!this.isUploading) this.$fileContainer.removeClass('is-dragover');\r\n })\r\n .on('drop', (e) => {\r\n if (!this.isUploading) {\r\n this.element[0].files = e.originalEvent.dataTransfer.files;\r\n this._handleChange();\r\n } \r\n }); \r\n },\r\n _startCrop: function(uri) {\r\n if (this.$cropImg) this.$cropImg.remove();\r\n this.$cropImg = $('').on('load', (e) => {\r\n this.$mainContainer.hide();\r\n this.$cropContainer.show();\r\n \r\n this.cropper = new Cropper(e.target, {\r\n data: safeJsonParse(this.$meta.val()), // attempt to restore last known crop position\r\n viewMode: 1,\r\n aspectRatio: this.aspectRatio,\r\n guides: true,\r\n center: false,\r\n highlight: false,\r\n rotatable: false,\r\n scalable: false,\r\n zoomable: false,\r\n zoomOnWheel: false,\r\n zoomOnTouch: false,\r\n cropBoxMovable: true,\r\n cropBoxResizable: true,\r\n toggleDragModeOnDblclick: false,\r\n });\r\n \r\n }).attr('src', uri).appendTo(this.$cropContainer);\r\n\r\n },\r\n _acceptCrop: function() {\r\n if (this.cropper) {\r\n this.$meta.val(JSON.stringify(this.cropper.getData()));\r\n\r\n const { aspectRatio, naturalWidth: width } = this.cropper.getImageData(); \r\n const height = width / aspectRatio;\r\n\r\n this.cropper.getCroppedCanvas({\r\n width,\r\n height,\r\n minWidth: width,\r\n minHeight: height,\r\n fillColor: '#fff',\r\n imageSmoothingEnabled: true,\r\n imageSmoothingQuality: 'high',\r\n }).toBlob((blob) => {\r\n this._readData(blob,(uri) => this._showPreview(uri));\r\n const xfr = new DataTransfer();\r\n xfr.items.add(new File([blob], `${this.options.croppedfilename}.jpg`,{type:\"image/jpeg\", lastModified:new Date().getTime()}))\r\n this.$croppedFile[0].files = xfr.files\r\n }, 'image/jpeg', 0.9)\r\n }\r\n this._stopCrop();\r\n },\r\n _stopCrop: function() {\r\n if (this.cropper) this.cropper.destroy();\r\n this.$mainContainer.show();\r\n this.$cropContainer.hide();\r\n },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n },\r\n _clearInputFile: function (element) {\r\n element.value = '';\r\n this.element.valid();\r\n },\r\n _showPreview: function (url) {\r\n this.$previewImage.attr('src', url).show();\r\n },\r\n _handleChange: function (event, skipRemove = false) {\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 if (!skipRemove) this._unsetImage(); \r\n return;\r\n }\r\n\r\n $.each(input.files, function (idx) {\r\n if (stopProccessing) 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 if (fileElement.type.includes('image')) {\r\n self._readData(fileElement, (result) => {\r\n if (!stopProccessing) {\r\n self.$meta.val('');\r\n self.lastUploadedImage = result;\r\n self._showPreview(self.lastUploadedImage)\r\n self._startCrop(result)\r\n }\r\n })\r\n } else {\r\n self.$previewImage.hide();\r\n }\r\n\r\n self._showSelectionControls();\r\n } else {\r\n self._unsetImage();\r\n \r\n stopProccessing = true;\r\n self.$errorMessage.show();\r\n if (!validFileType || invalidFileType) {\r\n if (self.options.unsupportedfiletypetext) {\r\n var indexOfExtension = fileElement.name.lastIndexOf('.');\r\n self.$errorMessage.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.$errorMessage.text(self.options.unsupportedfilesizetext + ' (' + self._formatBytes(fileElement.size) + ' > ' + self._formatBytes(self.options.maxsize) + ')');\r\n }\r\n }\r\n }\r\n \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 (validFileType && validFileSize && !invalidFileType) {\r\n self.element.closest('form').dirtyForms('rescan');\r\n }\r\n });\r\n },\r\n _readData(fileOrBlob, handler) {\r\n const reader = new FileReader();\r\n reader.readAsDataURL(fileOrBlob); \r\n reader.onloadend = function() {\r\n handler(reader.result);\r\n }\r\n },\r\n _handleSubmit: function (event) {\r\n this.options.callback.call(this, { parentID: this.options.parentid, value: 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 });\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 removetext: 'Remove',\r\n removecssclass: 'btn btn-danger',\r\n removeicon: \"\",\r\n filenamecssclass: 'file-caption-info',\r\n filename: '', // defaults to file name defined by url\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 this.$removeButton.addClass('d-none');\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', true);\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 \r\n const fileName = this.options.filename || url.split('/').pop().split('?').shift();\r\n this.$fileNameLabel.text(fileName).removeClass(\"d-none\");\r\n\r\n try {\r\n this.element.rules('remove', 'required');\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n\r\n this._showSelectionControls(fileName, 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, fileName, 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 this.$removeButton = $(\"\").appendTo(this.$buttonGroup);\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 this.$removeButton.click(this._remove.bind(this));\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, skipRemove = false) {\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 if (!skipRemove) { \r\n // webkit browsers actually remove the file when you hit cancel - so do the same here\r\n this._remove(null, true);\r\n }\r\n return;\r\n }\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, '').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 this.$removeButton.removeClass('d-none');\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 editfactor: 1 // If set(.01, 100) the value in the input would be adjusted by this factor when displayed and reverted when the form is posted. This min and max apply to the display value. This is useful for editing percentages for example.\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 if (this.options.editfactor != 1) {\r\n this.input = this.element.clone().removeAttr('name id data-fd-control').val(this.element.val() * this.options.editfactor).insertAfter(this.element);\r\n this.element.addClass('d-none');\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.initial(this.element.val())._validate(this.element.val(), false)._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 var element = self.options.editfactor != 1 ? self.input : self.element;\r\n if (event.which === keyCodes.Esc) {\r\n 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 if (self.element.closest('form').control_form('instance') && self.element.closest('form').control_form('option', 'onchange')) {\r\n self.element.trigger('change2.onenter');\r\n }\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 var element = this.options.editfactor != 1 ? this.input : this.element;\r\n 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, validate = true) {\r\n var element = this.options.editfactor != 1 ? this.input : this.element;\r\n\r\n let value;\r\n if (newValue) {\r\n value = newValue.replace(/\\,/g, '');\r\n } else {\r\n value = element.val().replace(/\\,/g, '');\r\n }\r\n\r\n if (this.options.allowclear && (value === \"\" || value === undefined || value === null)) {\r\n element.val(null);\r\n this.element.val(null);\r\n } else if (!value.match(/^\\-?[0-9]*\\.?[0-9]*$/)) {\r\n element.val(this.initial() * this.options.editfactor)\r\n this.element.val(this.initial());\r\n } else {\r\n value = Number(value);\r\n\r\n if (this.options.min !== null && value < Number(this.options.min)) {\r\n value = this.options.allowclear ? null : Number(this.options.min);\r\n } else if (this.options.max !== null && value > Number(this.options.max)) {\r\n value = this.options.allowclear ? null : Number(this.options.max);\r\n }\r\n\r\n if (value == null) {\r\n element.val(null);\r\n this.element.val(null);\r\n }\r\n else if (this.options.precision !== undefined) {\r\n element.val(value.toFixed(this.options.precision));\r\n\r\n if (this.options.editfactor != 1) {\r\n var factorOffset = this.options.editfactor < 1 ? (-1 * this.options.editfactor.toString().length + 1) : this.options.editfactor.toString().length;\r\n this.element.val((value / this.options.editfactor).toFixed(this.options.precision + factorOffset));\r\n }\r\n } else {\r\n element.val(value);\r\n this.element.val(value / this.options.editfactor);\r\n }\r\n }\r\n\r\n if (validate && this.element.valid) {\r\n this.element.valid(); // re-evaluate validatity \r\n }\r\n\r\n return this;\r\n }\r\n });\r\n}(jQuery));","/* global Quagga */\r\n\r\n// Uses device camera to read barcodes\r\n\r\n(function ($) {\r\n 'use strict';\r\n\r\n const barcodeTypeOptions = {\r\n 'Code 128': 'code_128_reader', \r\n 'Code 39': 'code_39_reader', \r\n 'Code 39 VIN': 'code_39_vin_reader', \r\n 'EAN': 'ean_reader', \r\n 'EAN-extended': 'ean_reader',\r\n 'UPC': 'upc_reader', \r\n 'UPC-E': 'upc_e_reader', \r\n 'Codabar': 'codabar_reader', \r\n 'Interleaved 2 of 5': 'i2of5_reader', \r\n 'Standard 2 of 5': '2of5_reader', \r\n 'Code 93': 'code_93_reader' \r\n };\r\n const defaultBarcodeType = 'Code 128';\r\n\r\n // these resolutionOptions should be added to this object in ascending order\r\n const resolutionOptions = {\r\n '320px': '320x240',\r\n '640px': '640x480',\r\n '800px': '800x600',\r\n '1280px': '1280x720',\r\n '1600px': '1600x960',\r\n '1920px': '1920x1080'\r\n };\r\n const defaultResolution = '1280px';\r\n\r\n // options to define how close barcodes are. Use x-small when far way and x-large when barcodes are very close\r\n const patchSizeOptions = [\r\n 'x-small',\r\n 'small',\r\n 'medium',\r\n 'large',\r\n 'x-large'\r\n ];\r\n const defaultPatchSize = 'medium';\r\n\r\n // the number of CPU cores to use \r\n const numberOfWorkerOptions = [\r\n 0,\r\n 1,\r\n 2,\r\n 4,\r\n 8\r\n ];\r\n const defaultNumberOfWorkers = 4;\r\n\r\n const facingModeOptions = [\r\n 'environment',\r\n 'user'\r\n ];\r\n const defaultFacingMode = 'environment';\r\n\r\n $.widget(\"fd.control_scanner\", {\r\n options: {\r\n // Quagga options\r\n type: defaultBarcodeType, // see `acceptedBarcodeTypes`\r\n resolution: defaultResolution, // see `acceptedResolutions`\r\n patchsize: defaultPatchSize, // see `acceptedPatchSizes`\r\n workers: defaultNumberOfWorkers, // see `acceptedNumberOfWorkers`\r\n torch: false, // the phone's \"flashlight\"\r\n halfsample: true, // this should be set to false when scanning very small barcodes and higher resolution scanning is needed\r\n facingmode: defaultFacingMode,\r\n frequency: 10, // number of scans per second\r\n // FD options\r\n startonload: false,\r\n numbertoscan: 0, // 0 = continuous scanning, greater than 0 indicates the number to scan until scanner closes (for instance, if your use-case is to scan a single barcode, supply `1` to this value)\r\n parentid: null,\r\n callback: function () { },\r\n samplingcount: 11, // sampling means to collect the last x results and return the result that occurred most frequently. This is a huge help to get consistent and valid scan results.\r\n samplingtimeout: 1000, // # milliseconds to restart the sampling process. \r\n showinvalidboxes: false, // in the video, show a green rectangle around boxes that are not valid barcodes. This is usually just visual noise.\r\n videoiniterrorcss: \"alert alert-danger text-center w-100 mb-0\",\r\n videoiniterrormessage: \"There was an error starting your camera. It may be that it is in use by another program.\"\r\n },\r\n\r\n // public properties and functions\r\n barcodeTypeOptions: barcodeTypeOptions,\r\n resolutionOptions: resolutionOptions,\r\n patchSizeOptions: patchSizeOptions,\r\n numberOfWorkerOptions: numberOfWorkerOptions,\r\n facingModeOptions: facingModeOptions,\r\n setOnProcessed: function (onProcessedCallback) {\r\n Quagga.offProcessed(this._onProcessed);\r\n this._onProcessed = onProcessedCallback;\r\n Quagga.onProcessed(this._onProcessed);\r\n },\r\n start: function () {\r\n if (!this._hasStopped) {\r\n Quagga.start();\r\n this.element.removeClass(\"d-none\");\r\n } else {\r\n this._setEvents(this._activeCamera.deviceId);\r\n }\r\n },\r\n stop: function () {\r\n Quagga.stop();\r\n this.element.addClass(\"d-none\");\r\n this._hasStopped = true;\r\n },\r\n toggleTorch: function (setTurnedOn) {\r\n if (this._hasTorch) {\r\n let track = Quagga.CameraAccess.getActiveTrack();\r\n track.applyConstraints({ advanced: [{ torch: setTurnedOn }] });\r\n }\r\n },\r\n setCamera: function (deviceId) {\r\n const self = this;\r\n\r\n if (self._availableCameras.length > 1) {\r\n if (deviceId) {\r\n const cameraToFind = self._availableCameras.find(camera => camera.deviceId === deviceId);\r\n if (cameraToFind) {\r\n self._activeCamera = cameraToFind;\r\n }\r\n } else {\r\n const nextIndex = self._availableCameras.findIndex(camera => camera === self._activeCamera) + 1;\r\n self._activeCamera = self._availableCameras[nextIndex === self._availableCameras.length ? 0 : nextIndex];\r\n }\r\n self.stop();\r\n self._setEvents(self._activeCamera.deviceId); \r\n }\r\n },\r\n getCanvas: function () {\r\n return Quagga.canvas.dom.image;\r\n },\r\n\r\n // private fields and functions\r\n _hasStopped: false,\r\n _numberScanned: 0,\r\n _hasTorch: false,\r\n _availableCameras: [],\r\n _activeCamera: null,\r\n _quaggaState: {},\r\n _create: function () {\r\n const self = this;\r\n\r\n if (!self.options.parentid) {\r\n self.options.parentid = self.element.closest('[data-fd-parentid]').data('fd-parentid');\r\n } \r\n \r\n self._setEvents(null);\r\n\r\n Quagga.onProcessed(self._onProcessed());\r\n Quagga.onDetected(self._onDetected());\r\n\r\n self.element.on(\"click.fdcontrol\", function () {\r\n self.setCamera();\r\n });\r\n },\r\n _setEvents: function (deviceId) {\r\n const self = this;\r\n\r\n // validate options\r\n if (!(this.options.type in this.barcodeTypeOptions)) {\r\n console.error(this.options.type + \" is not a valid barcode type option. Falling-back to \" + defaultBarcodeType);\r\n this.options.type = defaultBarcodeType;\r\n }\r\n if (!(this.options.resolution in this.resolutionOptions)) {\r\n console.error(this.options.resolution + \" is not a valid resolution option. Falling-back to \" + defaultResolution);\r\n this.options.resolution = defaultResolution;\r\n }\r\n if (!this.patchSizeOptions.includes(this.options.patchsize)) {\r\n console.error(this.options.patchsize + \" is not a valid patch size option. Falling-back to \" + defaultPatchSize);\r\n this.options.patchSize = defaultPatchSize;\r\n }\r\n if (!this.numberOfWorkerOptions.includes(this.options.workers)) {\r\n console.error(this.options.workers + \" is not a valid workers option. Falling-back to \" + defaultNumberOfWorkers);\r\n this.options.workers = defaultNumberOfWorkers;\r\n }\r\n if (!this.facingModeOptions.includes(this.options.facingmode)) {\r\n console.error(this.options.facingmode + \" is not a valid facing mode option. Falling-back to \" + defaultFacingMode);\r\n this.options.facingmode = defaultFacingMode;\r\n }\r\n\r\n this._hasStopped = false;\r\n this._numberScanned = 0;\r\n\r\n const resolutionParts = this.resolutionOptions[this.options.resolution].split('x');\r\n this._quaggaState = {\r\n inputStream: {\r\n target: this.element[0],\r\n type: \"LiveStream\",\r\n constraints: {\r\n width: { min: parseInt(resolutionParts[0]) },\r\n height: { min: parseInt(resolutionParts[1]) },\r\n aspectRatio: { min: 1, max: 1 },\r\n facingMode: deviceId ? undefined : this.options.facingmode,\r\n deviceId: deviceId ? deviceId : undefined\r\n }\r\n },\r\n locator: {\r\n patchSize: this.options.patchsize,\r\n halfSample: this.options.halfsample\r\n },\r\n numOfWorkers: this.options.workers,\r\n frequency: this.options.frequency,\r\n decoder: {\r\n readers: [{\r\n format: this.barcodeTypeOptions[this.options.type],\r\n config: (this.barcodeTypeOptions !== 'EAN-extended' ? {} : {\r\n supplements: [\r\n 'ean_5_reader', 'ean_2_reader'\r\n ]\r\n })\r\n }]\r\n },\r\n locate: true\r\n };\r\n\r\n Quagga.init(this._quaggaState, function (err) {\r\n if (err) {\r\n console.error(err);\r\n if (err.name === \"OverconstrainedError\") {\r\n // the widget was probably initialized with a resolution that is not supported by the device\r\n // automatically try a lower resolution\r\n const resolutions = Object.keys(resolutionOptions);\r\n const index = resolutions.findIndex(resolution => resolution === self.options.resolution);\r\n if (index > 0) {\r\n self.options.resolution = resolutions[index - 1];\r\n self._setEvents();\r\n return;\r\n }\r\n }\r\n if (self.options.videoiniterrormessage) {\r\n self.element.replaceWith(`
${self.options.videoiniterrormessage}
`);\r\n }\r\n return;\r\n }\r\n self._initCameraSelection();\r\n self._checkCapabilities();\r\n\r\n if (self.options.startonload) {\r\n self.start();\r\n self.toggleTorch(self.options.torch);\r\n }\r\n });\r\n },\r\n _checkCapabilities: function () {\r\n let track = Quagga.CameraAccess.getActiveTrack();\r\n if (typeof track.getCapabilities === 'function') {\r\n const capabilities = track.getCapabilities();\r\n this._hasTorch = capabilities.torch;\r\n }\r\n },\r\n _initCameraSelection: function () {\r\n const self = this;\r\n let streamLabel = Quagga.CameraAccess.getActiveStreamLabel();\r\n\r\n return Quagga.CameraAccess.enumerateVideoDevices()\r\n .then(function (devices) {\r\n self._availableCameras = devices;\r\n self._activeCamera = self._availableCameras.find(device => device.label === streamLabel) || devices.find(() => true);\r\n });\r\n },\r\n _reset: function () {\r\n this.stop();\r\n this._setEvents();\r\n },\r\n _onProcessed: function () {\r\n const self = this;\r\n\r\n return function (result) {\r\n const drawingCtx = Quagga.canvas.ctx.overlay,\r\n drawingCanvas = Quagga.canvas.dom.overlay;\r\n\r\n if (result) {\r\n if (result.boxes) {\r\n drawingCtx.clearRect(0, 0, parseInt(drawingCanvas.getAttribute(\"width\")), parseInt(drawingCanvas.getAttribute(\"height\")));\r\n if (self.options.showinvalidboxes) {\r\n result.boxes.filter((box) => box !== result.box).forEach(function (box) {\r\n Quagga.ImageDebug.drawPath(box, { x: 0, y: 1 }, drawingCtx, { color: \"green\", lineWidth: 2 });\r\n });\r\n }\r\n }\r\n\r\n if (result.box) {\r\n Quagga.ImageDebug.drawPath(result.box, { x: 0, y: 1 }, drawingCtx, { color: \"#00F\", lineWidth: 2 });\r\n }\r\n\r\n if (result.codeResult && result.codeResult.code) {\r\n Quagga.ImageDebug.drawPath(result.line, { x: 'x', y: 'y' }, drawingCtx, { color: 'red', lineWidth: 3 });\r\n }\r\n }\r\n };\r\n },\r\n _onDetected: function () {\r\n const self = this;\r\n\r\n let samplings = [],\r\n lastResult,\r\n samplingTimeout,\r\n lastResultTimeout;\r\n\r\n return function (result) {\r\n let code = result.codeResult.code;\r\n\r\n // if some time has passed, clear the samplings to restart the sampling process\r\n clearTimeout(samplingTimeout);\r\n samplingTimeout = setTimeout(function() {\r\n samplings = [];\r\n }, self.options.samplingtimeout);\r\n\r\n samplings.push(code);\r\n\r\n if (samplings.length >= self.options.samplingcount) {\r\n // get the most frequent barcode\r\n code = samplings.sort((a, b) => samplings.filter(v => v === a).length - samplings.filter(v => v === b).length).pop();\r\n const samplingSet = [...new Set(samplings)];\r\n samplings = [];\r\n\r\n if (lastResult !== code) {\r\n lastResult = code;\r\n\r\n // clear the lastResult after some time has passed in case the user wants to rescan it for any reason\r\n clearTimeout(lastResultTimeout);\r\n lastResultTimeout = setTimeout(function() {\r\n lastResult = null;\r\n }, self.options.samplingtimeout * 5);\r\n\r\n self.options.callback.call(self, {\r\n parentid: self.options.parentid,\r\n value: code,\r\n numberScanned: ++self._numberScanned,\r\n samplingSet // return the samplingSet in case the caller wants to analyze it further.\r\n });\r\n\r\n if (self.options.numbertoscan !== 0 && self.options.numbertoscan <= self.numberScanned) {\r\n self.stop();\r\n }\r\n }\r\n } \r\n };\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: null, // 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\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 || this.element.closest('.sgs-overlay-content, [data-fd-dropdown-parent], #SGS_ROOT'),\r\n dropdownAutoWidth: this.options.dropdownautowidth,\r\n allowClear: this.options.allowclear,\r\n tags: this.options.allowcustom\r\n };\r\n\r\n if (this.options.createtagcallback) {\r\n select2Options.createTag = this.options.createtagcallback;\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 },\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 var ajaxOptions = callback(parentValue);\r\n url = ajaxOptions.url;\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._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 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\r\n var newOptions = '';\r\n for (var i = 0; i < items.length; i++) {\r\n var item = items[i];\r\n var selectedAttr = \"\";\r\n var isSelected = item.selected || (this.itemToSelectAfterCascade && this.itemToSelectAfterCascade.id === item.id);\r\n if (isSelected) {\r\n selectedAttr = \"selected\";\r\n this.itemToSelectAfterCascade = null;\r\n }\r\n newOptions += '';\r\n }\r\n\r\n select2Options.disabled = false;\r\n this.element\r\n .select2('destroy')\r\n .html(newOptions)\r\n .select2(select2Options);\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._handleSubmit(event);\r\n },\r\n _handleSubmit: function (event) {\r\n var data = this.element.select2('data');\r\n var param = this.options.callbackparam;\r\n try {\r\n param = JSON.parse(this.options.callbackparam);\r\n } catch (e) {\r\n // do nothing\r\n }\r\n this.options.callback.call(this, {\r\n parentid: this.options.parentid,\r\n value: this.element.val(),\r\n param: Object.assign({}, event.params ? event.params.data : {}, data.length ? data[0].param : {})\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 },\r\n _setOption: function (key, value) {\r\n this.options[key] = value;\r\n },\r\n _destroy: function () {\r\n this.element.select2('destroy');\r\n },\r\n updateOption: function (value, text, disabled, selected) {\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, selected, selected);\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 });\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 rendertofield: null,\r\n provider: null\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 var $element = this.element;\r\n var options = this.options;\r\n $element.select2({\r\n tags: true,\r\n multiple: true,\r\n minimumInputLength: 1,\r\n language: {\r\n inputTooShort: function () {\r\n return '2 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 createTag: function (params) {\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: 0,\r\n text: term + '*'\r\n };\r\n },\r\n ajax: {\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 });\r\n\r\n this._setEvents();\r\n this.element.trigger('change');\r\n },\r\n _setEvents: function () {\r\n var options = this.options;\r\n this.element.on(\"change\", function (e) {\r\n var jsonItems = [];\r\n var selectItems = $(this).find(\"option\");\r\n for (var i = 0; i < selectItems.length; i++) {\r\n var item = selectItems[i];\r\n if (item.selected)\r\n jsonItems.push({ id: item.value, name: item.text });\r\n }\r\n var json = JSON.stringify(jsonItems);\r\n $(\"#\" + options.rendertofield).val(json);\r\n });\r\n },\r\n });\r\n}(jQuery));","(function ($) {\r\n 'use strict';\r\n\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 isblur: true,\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 preventsubmit: false\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\r\n if (this.options.preventsubmit) {\r\n this.element.keypress(e => e.which !== keyCodes.Enter);\r\n }\r\n\r\n this._setEvents();\r\n },\r\n _handleBlur: function (event) {\r\n const self = event.data;\r\n if (self.options.isblur) {\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 },\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 if (self.options.iskeyupdelay > 0) {\r\n clearTimeout(self._keyupTimer);\r\n self._keyupTimer = setTimeout(function () {\r\n self._handleSubmit(event);\r\n }, self.options.iskeyupdelay);\r\n } else {\r\n self._handleSubmit(event);\r\n }\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 });\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 if (self.element.val() === self.options.initial) {\r\n return false;\r\n }\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 color: undefined\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 color: self.options.color\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 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();\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][data-toggle!=popover]';\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));","/* global Mprogress, Notify, Ladda */\r\n(function ($) {\r\n const ajaxOutstanding = [],\r\n ajaxScheduled = [],\r\n notify = new Notify(),\r\n progressBar = new Mprogress(),\r\n defaults = {\r\n params: null,\r\n callback: null,\r\n url: \"\",\r\n ishtml: false,\r\n method: \"POST\",\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\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.method,\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) {\r\n cleanupAfterAjax(options, laddaButton);\r\n options.data = data;\r\n options.success = true;\r\n\r\n\r\n if (data === 'false') {\r\n notify.options.delay = 2500;\r\n 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\r\n}(jQuery));","/* global bsBreakpoints, Mprogress */\r\nFD = (function ($, me) {\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 me.notify = new Notify(); // use one global notify instance.\r\n\r\n function init() {\r\n setupCustom$Events();\r\n bindLoader();\r\n updateLoggedInCookie();\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 paging: true,\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 //handleStickySiderbar();\r\n handleDataTableLoading();\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 $('[title][data-toggle!=popover]').tooltip().click(function () {\r\n $(this).tooltip(\"hide\");\r\n });\r\n $('[data-toggle=popover').popover({ trigger: 'focus' });\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 /* ========================================================================\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 function handleDataTableLoading() {\r\n // DataTables: show loading spinner and gray out the datatable parent card\r\n $(document).on('preXhr.dt', function (e) {\r\n var parentCard = e.target.closest('.card');\r\n if (parentCard !== null) {\r\n\r\n // undone: ask Greg\r\n // me.blockUI(parentCard);\r\n }\r\n }).on('xhr.dt', function (e) {\r\n var parentCard = e.target.closest('.card');\r\n if (parentCard !== null) {\r\n // undone: ask Greg\r\n // me.unblockUI(parentCard);\r\n }\r\n });\r\n }\r\n\r\n function identifyLoggedInCookie() { \r\n switch (FD_Data.Env) {\r\n case FD.Constant.Enum.AppEnvironment.Staging:\r\n return 'SGSTRADESTAGE';\r\n case FD.Constant.Enum.AppEnvironment.Production:\r\n return 'SGSTRADEPROD';\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n // Set a cookie so the TBA site knows if the user is logged in or not\r\n function updateLoggedInCookie() {\r\n const cookieName = identifyLoggedInCookie();\r\n if (!cookieName) return;\r\n document.cookie = `${identifyLoggedInCookie()}=${FD_Data.Authenticated ? '1' : '0'}; domain=.scottgroupstudio.com; path=/; secure;`;\r\n }\r\n\r\n\r\n /* ========================================================================\r\n * public methods\r\n * ========================================================================\r\n */\r\n\r\n\r\n me.init = function () {\r\n init(); \r\n };\r\n\r\n\r\n /* ========================================================================\r\n * return\r\n * ========================================================================\r\n */\r\n return me;\r\n}(jQuery, FD));\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: \"\" }); "]}