{"version":3,"sources":["rtAPI_Init.js","rtAPI_Call.js","rtAPI_LoadingPanel.js","rtAPI_Messages.js","rtAPI_SysErrors.js","rtAPISecurity_Init.js","rtAPISecurity_Calls.js","rtAPISecurity_Handels.js","rtAPISecurity_ManagePanels.js","rtAPISecurity_HardwareKey.js","logicjs.cookiePolicy.js","AjaxTransfer.js","EnableScrollToTopFix.js","PasswordMeter.js","SessionTimer.js","Twitter.js","ValidationEx.js","ValidationEx_Display.js","ValidationEx_Summary.js","uploader.js","cbox.js","ReadMore.js","ScrollToView.js","SkipLinks.js","DOBControls.js","debug-panel.js","Selenium.js","Selenium-CPC.js","RocktimeInit.js","Misc.js","Help.js","TextArea.js","ControlBaseEx.js","RadGrid.js","RadEditor.js","RadCombobox.js","Extensions.js","DOMExtensions.js","TabIndex.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5kBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClBA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACTA;AACA;AACA;AACA;AACA;AACA;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"core.js","sourcesContent":["/// \r\nif (!rtAPI) var rtAPI = {};\r\n\r\n//#region Exe\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n rtAPI.init();\r\n});\r\n\r\n//#endregion\r\n\r\n//#region Vars\r\n\r\nrtAPI.query = {};\r\n\r\n//#endregion\r\n\r\n//#region Init\r\n\r\nrtAPI.init = function () {\r\n rtAPI.query.string = window.location.search.substring(1);\r\n rtAPI.query.params = new URLSearchParams(window.location.search); //The URLSearchParams API offers: has(), get() and getAll()\r\n}\r\n\r\nrtAPI.initElement = function (section, value, sid, className, requiredGroup) {\r\n var targetId = eval(`rtAPI.${section}.${value}`);\r\n if (targetId == false) return;\r\n if (!rtAPI.isString(targetId)) return;\r\n var targetElement = document.getElementById(targetId);\r\n if (!rtAPI.isValidElement(targetElement)) {\r\n this.sysError.write('Init', `Missing Element in rtAPI.${section}. ${value} is missing on this page`, `Looking for ${targetId}`);\r\n console.log(`Init - Missing Element in rtAPI.${section}. ${value} is missing on this page. Looking for ${targetId}`)\r\n }\r\n eval(`rtAPI.${section}.${value} = targetElement`);\r\n if (sid != undefined) targetElement.setAttribute(\"sid-key\", sid);\r\n if (className != null && className != undefined && (!targetElement.className || targetElement.className == '')) targetElement.className = className;\r\n rtAPI.markInputRequired(targetElement, requiredGroup, value);\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Is\r\n\r\nrtAPI.isNothing = function (element) {\r\n if (element == undefined) return true;\r\n if (element == null) return true;\r\n return false;\r\n}\r\nrtAPI.isValidElement = function (element) {\r\n if (rtAPI.isNothing(element)) return false;\r\n if (rtAPI.isString(element)) return false;\r\n if (element == false) return true;\r\n return true;\r\n}\r\n\r\nrtAPI.isString = function (element) {\r\n if (typeof element === 'string') return true;\r\n if (element instanceof String) return true;\r\n return false;\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Misc\r\n\r\nrtAPI.clickElement = function (element, event) {\r\n if (!rtAPI.isValidElement(element)) {\r\n this.sysError.write('Add Click', `Missing Element on this page`, `Looking for ${element.id}`);\r\n console.log(`Add Click - Missing Element on this page. Looking for ${element.id}`)\r\n return;\r\n }\r\n element.addEventListener('click', event);\r\n}\r\n\r\nrtAPI.displayElement = function (element, value, showValue) {\r\n if (!rtAPI.isValidElement(element)) return;\r\n //if (!showValue) showValue = 'inherit';\r\n if (value === true || value === false) value = (value === true) ? showValue : 'none';\r\n element.style.display = value;\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Validation\r\n\r\nrtAPI.markInputRequired = function (element, requiredGroup, value) {\r\n if (!rtAPI.isValidElement(element)) return;\r\n if (requiredGroup == '' || requiredGroup == undefined) return;\r\n var errorMessage = eval(`rtAPI.security.errorMessage.${value}`);\r\n element.setAttribute('requiredGroup', requiredGroup);\r\n element.setAttribute('requiredErrorMessage', errorMessage);\r\n element.removeAttribute('required');\r\n}\r\n\r\nrtAPI.resetRequired = function () {\r\n const requiredInputs = document.querySelectorAll(\"input[requiredGroup]\");\r\n requiredInputs.forEach(requiredInput => {\r\n requiredInput.removeAttribute('required');\r\n });\r\n}\r\n\r\nrtAPI.validateRequired = function (groupName) {\r\n var result = true;\r\n const requiredInputs = document.querySelectorAll(`input[requiredGroup='${groupName}']`);\r\n requiredInputs.forEach(requiredInput => {\r\n requiredInput.setAttribute('required', '');\r\n if (!requiredInput.validity.valueMissing) return;\r\n if (result) requiredInput.reportValidity(); //Focus and prompt first fail\r\n rtAPI.messages.addCritical(requiredInput.getAttribute('requirederrormessage'), true);\r\n result = false;\r\n });\r\n if (!result) rtAPI.messages.displayAddedMessages();\r\n return result;\r\n}\r\n\r\n//#endregion\r\n\r\n","/// \r\nif (!rtAPI) var rtAPI = {};\r\n\r\n//#region Init\r\n\r\nrtAPI.call = {};\r\n\r\n//#endregion\r\n\r\n//#region Call\r\n\r\nrtAPI.call.APIEndPoint = async function (module, command, data) {\r\n return await this.endPoint('/api', module, command, data);\r\n}\r\n\r\nrtAPI.call.endPoint = async function (rootURL, module, command, data) {\r\n try {\r\n rtAPI.loadingPanel.show();\r\n rtAPI.sysError.clear();\r\n const endPointURL = encodeURI(`${rootURL}/${module}/${command}/?${rtAPI.query.string}`);\r\n const options = {\r\n method: 'POST',\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(data),\r\n credentials: 'include',\r\n mode: 'cors', // no-cors, *cors, same-origin\r\n cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached\r\n redirect: 'follow', // manual, *follow, error\r\n referrerPolicy: 'no-referrer'// no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url\r\n }\r\n const response = await fetch(endPointURL, options)\r\n if (!response.ok) return rtAPI.sysError.write(response.status, response.statusText, response.url);\r\n const header = await response.json();\r\n if (!header.statusOk) {\r\n rtAPI.sysError.write(header.statusCode, header.errorName, header.errorMessage);\r\n return header;\r\n }\r\n if (header.redirectUrl != undefined) {\r\n rtAPI.loadingPanel.show();\r\n document.location = header.redirectUrl;\r\n return header;\r\n }\r\n if (header.reloadPage) {\r\n rtAPI.loadingPanel.show();\r\n document.location.reload();\r\n return header;\r\n }\r\n rtAPI.messages.renderMessages(header.messages);\r\n header.messages = null;\r\n rtAPI.loadingPanel.hide();\r\n return header;\r\n }\r\n catch (errorMessage) {\r\n rtAPI.loadingPanel.hide();\r\n rtAPI.sysError.write(\"JS\", \"Failed API Call\", errorMessage);\r\n }\r\n}\r\n\r\n//#endregion\r\n\r\n\r\n\r\n","/// \r\nif (!rtAPI) var rtAPI = {};\r\n\r\n//#region Init\r\n\r\nrtAPI.loadingPanel = {\r\n 'active': true,\r\n 'text': 'Loading. Please wait......'\r\n};\r\n\r\n//#endregion\r\n\r\n//#region Visibility\r\n\r\nrtAPI.loadingPanel.show = function () {\r\n if (!this.active) return;\r\n this.getDiv().style.display = \"flex\";\r\n document.body.classList.add(\"postback-lock\");\r\n}\r\n\r\nrtAPI.loadingPanel.hide = function () {\r\n if (!this.active) return;\r\n this.getDiv().style.display = \"none\";\r\n document.body.classList.remove(\"postback-lock\");\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Render\r\n\r\nrtAPI.loadingPanel.getDiv = function () {\r\n var loadingPanelDiv = document.getElementById('postback-content-overlay');\r\n if (!loadingPanelDiv) {\r\n loadingPanelDiv = document.createElement(\"div\");\r\n loadingPanelDiv.id = 'postback-content-overlay';\r\n loadingPanelDiv.className = 'rt-postback-content-overlay';\r\n loadingPanelDiv.style.display = 'none';\r\n document.body.insertBefore(loadingPanelDiv, document.body.firstChild);\r\n\r\n loadingPanelDivContent = document.createElement(\"div\");\r\n loadingPanelDivContent.className = 'rt-postback-content-overlay-message';\r\n loadingPanelDivContent.innerHTML = this.text;\r\n loadingPanelDiv.appendChild(loadingPanelDivContent);\r\n }\r\n return loadingPanelDiv\r\n}\r\n\r\n//#endregion\r\n\r\n","/// \r\nif (!rtAPI) var rtAPI = {};\r\n\r\n//#region Init\r\n\r\nrtAPI.messages = {\r\n store: [],\r\n targetSuffix: ''\r\n};\r\n\r\n//#endregion\r\n\r\n//#region Show\r\n\r\nrtAPI.messages.show = function (message) {\r\n if (!message || message == '') return\r\n this.renderMessages([{ 'text': message, 'type': 'none', 'icon': '' }]);\r\n}\r\n\r\nrtAPI.messages.showInformation = function (message) {\r\n if (!message || message == '') return\r\n this.renderMessages([{ 'text': message, 'type': 'information', 'icon': '/resource/icon-information.svg' }]);\r\n}\r\n\r\nrtAPI.messages.showWarning = function (message) {\r\n if (!message || message == '') return\r\n this.renderMessages([{ 'text': message, 'type': 'warning', 'icon': '/resource/icon-warning.svg' }]);\r\n}\r\n\r\nrtAPI.messages.showCritical = function (message) {\r\n if (!message || message == '') return\r\n this.renderMessages([{ 'text': message, 'type': 'critical', 'icon': '/resource/icon-critical.svg' }]);\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Add / Clear\r\n\r\nrtAPI.messages.add = function (message) {\r\n if (!message || message == '') return\r\n this.renderMessages([{ 'text': message, 'type': 'none', 'icon': '' }]);\r\n}\r\n\r\nrtAPI.messages.addInformation = function (message) {\r\n if (!message || message == '') return\r\n this.store.push({ 'text': message, 'type': 'information', 'icon': '/resource/icon-information.svg' });\r\n}\r\n\r\nrtAPI.messages.addWarning = function (message) {\r\n if (!message || message == '') return\r\n this.store.push({ 'text': message, 'type': 'warning', 'icon': '/resource/icon-warning.svg' });\r\n}\r\n\r\nrtAPI.messages.addCritical = function (message) {\r\n if (!message || message == '') return\r\n this.store.push({ 'text': message, 'type': 'critical', 'icon': '/resource/icon-critical.svg' });\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Misc\r\n\r\nrtAPI.messages.displayAddedMessages = function () {\r\n this.renderMessages(this.store);\r\n this.store = [];\r\n}\r\n\r\nrtAPI.messages.clear = function () {\r\n this.store = [];\r\n this.renderToDiv();\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Display / Render\r\n\r\nrtAPI.messages.renderMessages = function (messages) {\r\n this.clear();\r\n if (!messages) return;\r\n if (messages.length == 0) return;\r\n\r\n var text = '';\r\n var type = '';\r\n messages.forEach(function (message) {\r\n switch (message.type) {\r\n case 'critical':\r\n type = 'critical';\r\n break;\r\n\r\n case 'warning':\r\n if (type != 'critical') type = message.type;\r\n break;\r\n\r\n case 'information':\r\n if (type == '') type = message.type;\r\n break;\r\n\r\n default:\r\n break;\r\n\r\n }\r\n //
  • \r\n text += `
  • ${message.text}
  • `\r\n })\r\n this.renderToDiv(text, type);\r\n}\r\n\r\nrtAPI.messages.renderToDiv = function (message, type) {\r\n var messageDivTarget = 'rtAPIMessageDiv' + this.targetSuffix;\r\n var messageDiv = document.getElementById(messageDivTarget);\r\n if (!messageDiv) {\r\n messageDiv = document.createElement('div');\r\n messageDiv.id = messageDivTarget;\r\n document.body.appendChild(messageDiv);\r\n\r\n }\r\n\r\n var messageDivImageTarget = 'rtAPIMessageDivImage' + this.targetSuffix;\r\n var messageDivImage = document.getElementById(messageDivImageTarget);\r\n if (!messageDivImage) {\r\n messageDivImage = document.createElement('div');\r\n messageDivImage.id = messageDivImageTarget;\r\n messageDiv.appendChild(messageDivImage);\r\n }\r\n messageDivImage.className = 'error-componant__image image';\r\n\r\n var messageDivContentTarget = 'rtAPIMessageDivContent' + this.targetSuffix;\r\n var messageDivContent = document.getElementById(messageDivContentTarget);\r\n if (!messageDivContent) {\r\n messageDivContent = document.createElement(\"div\");\r\n messageDivContent.id = messageDivContentTarget;\r\n messageDiv.appendChild(messageDivContent);\r\n }\r\n messageDivContent.className = 'error-componant__text';\r\n\r\n messageDiv.style.display = 'none';\r\n messageDiv.classList.remove(\"error-componant__information\");\r\n messageDiv.classList.remove(\"error-componant__warning\");\r\n messageDiv.classList.remove(\"error-componant__critical\");\r\n messageDivContent.innerHTML = '';\r\n if (!message) return;\r\n\r\n messageDiv.style.display = 'block';\r\n var errorClass = \"error-componant\";\r\n if (type != '') errorClass = \"error-componant error-componant__\" + type;\r\n messageDiv.className = errorClass;\r\n\r\n var messageDivUl = document.createElement('ul');\r\n messageDivUl.innerHTML = message;\r\n messageDivContent.appendChild(messageDivUl);\r\n}\r\n\r\n//#endregion\r\n\r\n","/// \r\nif (!rtAPI) var rtAPI = {};\r\n\r\n//#region Init\r\n\r\nrtAPI.sysError = {};\r\n\r\n//#endregion\r\n\r\n//#region Update\r\n\r\nrtAPI.sysError.write = function (statusCode, errorName, errorMessage) {\r\n rtAPI.loadingPanel.hide();\r\n if (!errorName) errorName = 'Server Error';\r\n if (!errorMessage) errorMessage = '';\r\n var sysErrorDiv = this.getSysErrorDiv();\r\n sysErrorDiv.style.display = 'inline-block';\r\n if (!errorMessage.stack) sysErrorDiv.innerHTML = `Error Message
    ${statusCode}
    ${errorName}
    ${errorMessage.replace(/\\n/g, \"
    \")}`;\r\n else sysErrorDiv.innerHTML = `Error Message
    ${statusCode}
    ${errorName}
    ${errorMessage.message.replace(/\\n/g, \"
    \")}
    ${errorMessage.stack.replace(/\\n/g, \"
    \")}`;\r\n console.error('Error:', errorMessage);\r\n return { 'statusOk': false };\r\n}\r\n\r\nrtAPI.sysError.clear = function () {\r\n this.getSysErrorDiv().parentElement.style.display = 'none';\r\n return { 'statusOk': false };\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Render\r\n\r\nrtAPI.sysError.getSysErrorDiv = function () {\r\n\r\n var sysErrorWrapper = document.getElementById('rtAPIErrorWrapper');\r\n if (!sysErrorWrapper) {\r\n sysErrorWrapper = document.createElement(\"div\");\r\n sysErrorWrapper.id = 'rtAPIErrorWrapper';\r\n document.body.insertBefore(sysErrorWrapper, document.body.firstChild);\r\n }\r\n sysErrorWrapper.innerHTML = '';\r\n sysErrorWrapper.style.display = 'block';\r\n\r\n var sysErrorDiv = document.getElementById('rtAPIErrorDiv');\r\n if (!sysErrorDiv) {\r\n sysErrorDiv = document.createElement(\"div\");\r\n sysErrorDiv.id = 'rtAPIErrorDiv';\r\n sysErrorWrapper.appendChild(sysErrorDiv);\r\n }\r\n\r\n var sysErrorSpan = document.getElementById('rtAPIErrorSpan');\r\n if (!sysErrorSpan) {\r\n sysErrorSpan = document.createElement(\"div\");\r\n sysErrorSpan.id = 'rtAPIErrorSpan';\r\n sysErrorSpan.innerHTML = '[close]';\r\n sysErrorSpan.style.right = '8px';\r\n sysErrorSpan.style.position = 'absolute';\r\n sysErrorSpan.style.top = '4px';\r\n sysErrorSpan.style.cursor = 'pointer';\r\n sysErrorSpan.addEventListener('click', function () { sysErrorWrapper.style.display = 'none' });\r\n sysErrorWrapper.appendChild(sysErrorSpan);\r\n }\r\n return sysErrorDiv\r\n}\r\n\r\n//#endregion\r\n\r\n","if (!rtAPI) var rtAPI = {};\r\nif (!rtAPI.security) rtAPI.security = {};\r\n\r\n//#region Vars\r\n\r\nrtAPI.security.pnl = {\r\n login: 'pnlLogin',\r\n lostPassword: 'pnlLostPassword',\r\n lostUsername: 'pnlLostUsername',\r\n resendAuthEmail: 'pnlResendAuthEmail',\r\n tFASelect: 'pnl2FASelect',\r\n tFASelectOptions: 'pnl2FASelectOptions',\r\n tFACode: 'pnl2FACode',\r\n tFAMemorableData: 'pnl2FAMemorableData',\r\n tFAMemorableDataFields: 'pnl2FAMemorableDataFields',\r\n tFAHardwareKey: 'pnl2FAHardwareKey',\r\n dialog: 'pnlSecurityDialog_Overlay',\r\n dialogTitle: 'pnlSecurityDialog_Title',\r\n dialogFields: 'pnlSecurityDialog_Fields',\r\n dialogMessages: 'pnlSecurityDialog_Messages',\r\n dialogButtons: 'pnlSecurityDialog_Buttons',\r\n logout: 'pnlLogout',\r\n updatePassword: 'pnlUpdatePassword'\r\n};\r\n\r\nrtAPI.security.fd = {\r\n login: 'fdPWLogin',\r\n password: 'fdPWPassword',\r\n loginLost: 'fdPWLoginLost',\r\n loginLostEmail: 'fdPWLoginLostEmail',\r\n manageTFA: 'fdManageTFA',\r\n resendAuthEmail: 'fdResendAuthEmail',\r\n authenticationMethod: 'fdAuthenticationMethod',\r\n authenticationCode: 'fdAuthenticationCode',\r\n oldPassword: 'fdOldPassword',\r\n newPassword: 'fdNewPassword',\r\n retypeNewPassword: 'fdRetypeNewPassword'\r\n};\r\n\r\nrtAPI.security.errorMessage = {\r\n login: 'Please enter your login',\r\n password: 'Please enter your password',\r\n loginLostEmail: 'Please enter your registered email address',\r\n loginLost: 'Please enter your login',\r\n resendAuthEmail: 'Please enter the email address you are trying to authorise',\r\n authenticationCode: 'Please enter the authentication code from the email or SMS you were sent',\r\n oldPassword: 'Please enter your current password',\r\n newPassword: 'Please enter a new password',\r\n retypeNewPassword: 'Please retype you new password',\r\n retypeNewPasswordMustMatch: 'Your retyped new password must match your new password',\r\n weakPassword: 'Your new password does not meet the minimum password strength'\r\n};\r\n\r\nrtAPI.security.btn = {\r\n login: 'btnLogin',\r\n lostPassword: 'btnLostPassword',\r\n lostUsername: 'btnLostUsername',\r\n resendAuthEmail: 'btnResendAuthEmail',\r\n getPassword: 'btnGetPassword',\r\n getPasswordCancel: 'btnGetPasswordCancel',\r\n getUsername: 'btnGetUsername',\r\n getUsernameCancel: 'btnGetUsernameCancel',\r\n resendAuthEmailSend: 'btnResendAuthEmailSend',\r\n resendAuthEmailCancel: 'btnResendAuthEmailCancel',\r\n tFASelectCancel: 'btn2FASelectCancel',\r\n tFAAuthenticateCodeSend: 'btnAuthenticateCodeSend',\r\n tFAAuthenticateCodeCancel: 'btnAuthenticateCodeCancel',\r\n tFAHardwareKeyRegister: 'btnHardwareKeyRegister',\r\n tFAHardwareKeyRetry: 'btnHardwareKeyRetry',\r\n tFAHardwareKeyCancel: 'btnHardwareKeyCancel',\r\n tFAMemorableDataSend: 'btnMemorableDataSend',\r\n tFAMemorableDataCancel: 'btnMemorableDataCancel',\r\n //tFAManageHardwareKeyAdd: 'btn2FAManageHardwareKeyAdd',\r\n //tFAManageUpdate: 'btn2FAManageUpdate',\r\n //tFAManageBack: 'btn2FAManageBack',\r\n //tFAManageClose: 'btn2FAManageClose',\r\n logout: 'btnLogout',\r\n updatePassword: 'btnUpdatePassword',\r\n updatePasswordClose: 'btnUpdatePasswordClose',\r\n showUpdatePassword: 'btnShowUpdatePassword'\r\n};\r\n\r\nrtAPI.security.panelUpdateCallback = null;\r\nrtAPI.security.handle = {};\r\nrtAPI.security.call = {};\r\nrtAPI.security.tFASelectModeTriggered = false;\r\nrtAPI.security.showTFAManagement = false;\r\nrtAPI.security.renderedTFAOptions = '';\r\nrtAPI.security.tFAData = {};\r\nrtAPI.security.samePageLogin = true;\r\nrtAPI.security.enableTFAManagement = true;\r\nrtAPI.security.enableGetUsername = true;\r\nrtAPI.security.enableAccountActivation = true;\r\nrtAPI.security.enableGetPassword = true;\r\nrtAPI.security.fireTFAHardwareKeyLoginWhenSelected = true;\r\nrtAPI.security.dialogAutoClose = false;\r\n\r\n//#endregion\r\n\r\n//#region Init Login and MFA\r\n\r\nrtAPI.security.init = function () {\r\n if (rtAPI.security.initRun) return;\r\n rtAPI.security.initRun = true;\r\n\r\n //Login\r\n rtAPI.initElement('security.pnl', 'login', 'pnl-login', 'pnlSecurity');\r\n rtAPI.initElement('security.fd', 'login', 'cpc-pw-login-input', null, 'requiredGroupLogin');\r\n rtAPI.initElement('security.fd', 'password', 'cpc-pw-password-input', null, 'requiredGroupLogin');\r\n rtAPI.initElement('security.fd', 'manageTFA', 'cpc-manage-tfa-input');\r\n rtAPI.initElement('security.btn', 'login', 'btn-login', 'button');\r\n rtAPI.initElement('security.btn', 'lostPassword', 'btn-lost-password');\r\n rtAPI.initElement('security.btn', 'lostUsername', 'btn-lost-username');\r\n rtAPI.initElement('security.btn', 'resendAuthEmail', 'btn-resend-auth-email');\r\n rtAPI.clickElement(this.btn.login, this.handle.login);\r\n rtAPI.clickElement(this.btn.lostPassword, this.handle.showLostPassword);\r\n rtAPI.clickElement(this.btn.lostUsername, this.handle.showLostUsername);\r\n rtAPI.clickElement(this.btn.resendAuthEmail, this.handle.showResendAuthEmail);\r\n\r\n //Lost Password\r\n if (rtAPI.security.enableGetPassword) {\r\n rtAPI.initElement('security.pnl', 'lostPassword', 'pnl-lost-password', 'pnlSecurity');\r\n rtAPI.initElement('security.fd', 'loginLost', 'cpc-lost-password-input', null, 'requiredGroupLostPassword');\r\n rtAPI.initElement('security.btn', 'getPassword', 'btn-get-password', 'button');\r\n rtAPI.initElement('security.btn', 'getPasswordCancel', 'btn-get-password-cancel', 'button');\r\n rtAPI.clickElement(this.btn.getPassword, this.handle.getLostPassword);\r\n rtAPI.clickElement(this.btn.getPasswordCancel, this.handle.showLoginPanel);\r\n }\r\n\r\n //Lost Username\r\n if (rtAPI.security.enableGetUsername) {\r\n rtAPI.initElement('security.pnl', 'lostUsername', 'pnl-lost-username', 'pnlSecurity');\r\n rtAPI.initElement('security.fd', 'loginLostEmail', 'cpc-lost-username-input', null, 'requiredGroupLostUsername');\r\n rtAPI.initElement('security.btn', 'getUsername', 'btn-get-username', 'button');\r\n rtAPI.initElement('security.btn', 'getUsernameCancel', 'btn-get-username-cancel', 'button');\r\n rtAPI.clickElement(this.btn.getUsername, this.handle.getLostUsername);\r\n rtAPI.clickElement(this.btn.getUsernameCancel, this.handle.showLoginPanel);\r\n }\r\n\r\n //Resend Auth Email Panel\r\n if (rtAPI.security.enableAccountActivation) {\r\n rtAPI.initElement('security.pnl', 'resendAuthEmail', 'pnl-resend-auth-email', 'pnlSecurity');\r\n rtAPI.initElement('security.fd', 'resendAuthEmail', 'cpc-resend-auth-email-input', null, 'requiredGroupResendAuthEmail');\r\n rtAPI.initElement('security.btn', 'resendAuthEmailSend', 'btn-resend-auth-email-send', 'button');\r\n rtAPI.initElement('security.btn', 'resendAuthEmailCancel', 'btn-resend-auth-email-cancel', 'button');\r\n rtAPI.clickElement(this.btn.resendAuthEmailSend, this.handle.resendAuthEmailSend);\r\n rtAPI.clickElement(this.btn.resendAuthEmailCancel, this.handle.showLoginPanel);\r\n }\r\n\r\n //2FA Select Panel\r\n rtAPI.initElement('security.pnl', 'tFASelect', 'pnl-two-factor-authentication-select', 'pnlSecurity');\r\n rtAPI.initElement('security.pnl', 'tFASelectOptions', 'pnl-two-factor-authentication-select-options');\r\n rtAPI.initElement('security.btn', 'tFASelectCancel', 'btn-two-factor-authentication-select-cancel', 'button');\r\n rtAPI.clickElement(this.btn.tFASelectCancel, this.handle.tFAAuthenticateCancel);\r\n\r\n //2FA Code Panel\r\n rtAPI.initElement('security.pnl', 'tFACode', 'pnl-resend-auth-email', 'pnlSecurity');\r\n rtAPI.initElement('security.fd', 'authenticationCode', 'cpc-authentication-code-input', null, 'requiredGroupAuthCode');\r\n rtAPI.initElement('security.btn', 'tFAAuthenticateCodeSend', 'btn-authentication-code-send', 'button');\r\n rtAPI.initElement('security.btn', 'tFAAuthenticateCodeCancel', 'btn-authentication-method-code-cancel', 'button');\r\n rtAPI.clickElement(this.btn.tFAAuthenticateCodeSend, this.handle.tFAAuthenticateCodeSend);\r\n rtAPI.clickElement(this.btn.tFAAuthenticateCodeCancel, this.handle.tFAAuthenticateCancel);\r\n\r\n //2FA Memorable Data Panel\r\n rtAPI.initElement('security.pnl', 'tFAMemorableData', 'pnl-memorable-data', 'pnlSecurity');\r\n rtAPI.initElement('security.pnl', 'tFAMemorableDataFields', 'pnl-memorable-data-fields');\r\n rtAPI.initElement('security.btn', 'tFAMemorableDataSend', 'btn-authentication-code-send', 'button');\r\n rtAPI.initElement('security.btn', 'tFAMemorableDataCancel', 'btn-authentication-method-code-cancel', 'button');\r\n rtAPI.clickElement(this.btn.tFAMemorableDataSend, this.handle.tFAMemorableDataSend);\r\n rtAPI.clickElement(this.btn.tFAMemorableDataCancel, this.handle.tFAAuthenticateCancel);\r\n\r\n //2FA Hardware Key Panel\r\n rtAPI.initElement('security.pnl', 'tFAHardwareKey', 'pnl-hardware-key', 'pnlSecurity');\r\n rtAPI.initElement('security.btn', 'tFAHardwareKeyRegister', 'btn-hardware-key-register', 'button');\r\n rtAPI.initElement('security.btn', 'tFAHardwareKeyRetry', 'btn-hardware-key-retry', 'button');\r\n rtAPI.initElement('security.btn', 'tFAHardwareKeyCancel', 'btn-hardware-key-cancel', 'button');\r\n rtAPI.clickElement(this.btn.tFAHardwareKeyRegister, this.handle.tFAHardwareKeyRegister);\r\n rtAPI.clickElement(this.btn.tFAHardwareKeyRetry, this.handle.tFAHardwareKeyRetry);\r\n rtAPI.clickElement(this.btn.tFAHardwareKeyCancel, this.handle.tFAAuthenticateCancel);\r\n\r\n\r\n //Logged in\r\n rtAPI.initElement('security.pnl', 'logout', 'pnl-logout', 'pnlSecurity');\r\n rtAPI.initElement('security.btn', 'logout', 'btn-logout', 'button');\r\n rtAPI.clickElement(this.btn.logout, this.handle.logout);\r\n\r\n rtAPI.security.initSecurityDialog();\r\n //rtAPI.security.initUpdatePassword();\r\n\r\n //Update panels\r\n this.call.getCurrentUser()\r\n .then(result => this.updatePanels(result))\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Init Security Dialog\r\n\r\nrtAPI.security.initSecurityDialog = function (forceShow, autoClose, message) {\r\n //if (!rtAPI.security.enableTFAManagement) return\r\n\r\n if (rtAPI.security.initSecurityDialogRun) return;\r\n rtAPI.security.initSecurityDialogRun = true;\r\n rtAPI.security.createSecurityDialog();\r\n\r\n\r\n rtAPI.initElement('security.pnl', 'dialog', 'pnl-manage', 'rt-overlay-panel pnlSecurity');\r\n rtAPI.initElement('security.pnl', 'dialogFields', 'pnl-manage-fields', 'rt-overlay-panel-fields');\r\n rtAPI.initElement('security.pnl', 'dialogTitle', 'pnl-overlay-title', 'rt-overlay-panel-title');\r\n rtAPI.initElement('security.pnl', 'dialogMessages', 'pnl-overlay-messages', 'rt-overlay-panel-messages');\r\n rtAPI.initElement('security.pnl', 'dialogButtons', 'pnl-overlay-buttons', 'rt-overlay-panel-buttons');\r\n //rtAPI.initElement('security.btn', 'tFAManageHardwareKeyAdd', 'btn-manage-hardware-key-add', 'button');\r\n //rtAPI.initElement('security.btn', 'tFAManageUpdate', 'btn-manage-update', 'button');\r\n //rtAPI.initElement('security.btn', 'tFAManageBack', 'btn-manage-back', 'button');\r\n //rtAPI.initElement('security.btn', 'tFAManageClose', 'btn-manage-close', 'button');\r\n //rtAPI.clickElement(this.btn.tFAManageHardwareKeyAdd, this.handle.tFAManageHardwareKeyAdd);\r\n //rtAPI.clickElement(this.btn.tFAManageUpdate, this.handle.tFAManageUpdate);\r\n //rtAPI.clickElement(this.btn.tFAManageBack, this.handle.tFAManageBack);\r\n //rtAPI.clickElement(this.btn.tFAManageClose, this.handle.tFAManageClose);\r\n rtAPI.security.showSecurityDialog(forceShow, autoClose, message);\r\n\r\n}\r\n\r\nrtAPI.security.createSecurityDialog = function () {\r\n var dialog = document.getElementById('pnlSecurityDialog_Overlay');\r\n if (dialog) return;\r\n document.body.extendDOM();\r\n dialog = document.body.addDiv({ 'id': 'pnlSecurityDialog_Overlay', 'className': 'rt-postback-content-overlay' }, document.body.firstChild);\r\n //dialog.style.display = 'none';\r\n //document.insertBefore(dialog);\r\n\r\n var securityDialog = dialog.addDiv({ 'id': 'pnlSecurityDialog' });\r\n var securityDialogContent = securityDialog.addDiv({ 'className': 'rt-overlay-content' });\r\n securityDialogContent.addH2(null, null, 'pnlSecurityDialog_Title');\r\n securityDialogContent.addDiv({ 'id': 'pnlSecurityDialog_Fields' });\r\n securityDialogContent.addDiv({ 'id': 'pnlSecurityDialog_Messages' });\r\n securityDialogContent.addDiv({ 'id': 'pnlSecurityDialog_Buttons' });\r\n}\r\n\r\nrtAPI.security.showSecurityDialog = function (show, autoClose, message) {\r\n var cursor = 'inherit';\r\n if (!show) {\r\n autoClose = false;\r\n message = '';\r\n }\r\n if (autoClose) cursor = 'pointer';\r\n rtAPI.security.dialogAutoClose = autoClose;\r\n rtAPI.security.pnl.dialog.style.cursor = cursor;\r\n rtAPI.displayElement(rtAPI.security.pnl.dialog, show);\r\n\r\n rtAPI.displayElement(rtAPI.security.pnl.dialogMessages, (rtAPI.isNothing(message)));\r\n rtAPI.security.pnl.dialogMessages.textContent = message;\r\n}\r\n\r\n\r\n//#endregion\r\n\r\n//#region Update Password\r\n\r\nrtAPI.security.initUpdatePassword = function () {\r\n if (rtAPI.security.initUpdatePasswordRun) return;\r\n rtAPI.security.initUpdatePasswordRun = true;\r\n return;\r\n //rtAPI.initElement('security.pnl', 'updatePassword', 'pnl-update-password', 'pnlSecurity');\r\n //rtAPI.initElement('security.fd', 'oldPassword', 'cpc-pw-old-password-input', null, 'requiredGroupUpdatePassword');\r\n //rtAPI.initElement('security.fd', 'newPassword', 'cpc-pw-new-password-input', null, 'requiredGroupUpdatePassword');\r\n //rtAPI.initElement('security.fd', 'retypeNewPassword', 'cpc-pw-retype-new-password-input', null, 'requiredGroupUpdatePassword');\r\n //rtAPI.initElement('security.btn', 'updatePassword', 'btn-update-password', 'button');\r\n //rtAPI.initElement('security.btn', 'updatePasswordClose', 'btn-update-password-close', 'button');\r\n //rtAPI.initElement('security.btn', 'showUpdatePassword', 'btn-show-update-password', 'button');\r\n //rtAPI.clickElement(this.btn.updatePassword, this.handle.updatePassword);\r\n //rtAPI.clickElement(this.btn.updatePasswordClose, this.handle.updatePasswordClose);\r\n //rtAPI.clickElement(this.btn.showUpdatePassword, this.handle.showUpdatePassword);\r\n //rtAPI.security.fd.newPassword.addEventListener('input', this.handle.inputPasswordField);\r\n\r\n //rtAPI.security.call.getPasswordScoreInfo()\r\n // .then(result => {\r\n // var id = rtAPI.security.fd.newPassword.id;\r\n // globalThis.pass = {};\r\n // eval(`globalThis.pass.displayType_${id} = result.data.passDisplayType;`);\r\n // eval(`globalThis.pass.useHelp_${id} = result.data.passUseHelp;`);\r\n // eval(`globalThis.pass.showOk_${id} = result.data.passShowOk;`);\r\n // eval(`globalThis.pass.standards_${id} = result.data.passStandards;`);\r\n // eval(`globalThis.pass.complexities_${id} = result.data.passComplexities;`);\r\n // eval(`globalThis.pass.complexityThresholds_${id} = result.data.passComplexityThresholds;`);\r\n // eval(`globalThis.pass.mins_${id} = result.data.passMins;`);\r\n // })\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Misc\r\n\r\nrtAPI.security.clearFields = function () {\r\n\r\n for (const propertyName in rtAPI.security.fd) {\r\n var item = rtAPI.security.fd[propertyName];\r\n if (item == undefined) continue;\r\n switch (item.type) {\r\n case 'checkbox':\r\n item.checked = false;\r\n break;\r\n\r\n default:// text\r\n item.value = '';\r\n break;\r\n\r\n }\r\n }\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Buttons\r\n\r\nrtAPI.security.bindShowMFMButton = function (btn) {\r\n rtAPI.clickElement(btn, rtAPI.security.handle.showMFM);\r\n}\r\n\r\nrtAPI.security.bindShowMFMButtonById = function (btnId) {\r\n rtAPI.clickElement(document.getElementById(btnId), rtAPI.security.handle.showMFM);\r\n}\r\n\r\nrtAPI.security.bindshowUpdatePasswordButton = function (btn) {\r\n rtAPI.clickElement(btn, rtAPI.security.handle.showUpdatePassword);\r\n}\r\n\r\nrtAPI.security.bindshowUpdatePasswordButtonById = function (btnId) {\r\n rtAPI.clickElement(document.getElementById(btnId), rtAPI.security.handle.showUpdatePassword);\r\n}\r\n\r\n//#endregion\r\n\r\n//#region 2FAOption \r\n\r\nrtAPI.security.get2FAOption = function (method) {\r\n for (const option of rtAPI.security.tFAData.options) {\r\n if (option.method == method) return option;\r\n }\r\n console.error(`Cannot find 2FA method ${method}`);\r\n}\r\n\r\nrtAPI.security.get2FAOptionField = function (id) {\r\n if (rtAPI.security.tFAData.password.id == id) return rtAPI.security.tFAData.password;\r\n for (const option of rtAPI.security.tFAData.options) {\r\n for (const field of option.fields) {\r\n if (field.id == id) return field;\r\n }\r\n }\r\n console.error(`Cannot find 2FA field ${id}`);\r\n}\r\n\r\n//#endregion\r\n","if (!rtAPI) var rtAPI = {};\r\nif (!rtAPI.security) rtAPI.security = {};\r\n\r\n//#region Login Steps\r\n\r\nrtAPI.security.call.login = async function (userName, password, samePageLogin, manageTFA) {\r\n return await this.APIEndPoint('login', { 'userName': userName, 'password': password, 'samePageLogin': samePageLogin, 'manageTFA': manageTFA });\r\n}\r\n\r\nrtAPI.security.call.getLostPassword = async function (userName) {\r\n return await rtAPI.security.call.APIEndPoint('get-lost-password', { 'userName': userName });\r\n}\r\n\r\nrtAPI.security.call.getLostUsername = async function (email) {\r\n return await rtAPI.security.call.APIEndPoint('get-lost-username', { 'email': email });\r\n}\r\n\r\nrtAPI.security.call.resendAuthEmail = async function (userName) {\r\n return await rtAPI.security.call.APIEndPoint('resend-auth-email', { 'userName': userName });\r\n}\r\n\r\nrtAPI.security.call.sendSelectedMethod = async function (selectedMethod) {\r\n return await rtAPI.security.call.APIEndPoint('send-selected-method', { 'selectedMethod': selectedMethod });\r\n}\r\n\r\nrtAPI.security.call.sendAuthCode = async function (authCode) {\r\n return await rtAPI.security.call.APIEndPoint('send-auth-code', { 'authCode': authCode });\r\n}\r\n\r\nrtAPI.security.call.sendMemorableData = async function (memorableData1, memorableData2, memorableData3) {\r\n return await rtAPI.security.call.APIEndPoint('send-memorable-data', { 'memorableData1': memorableData1, 'memorableData2': memorableData2, 'memorableData3': memorableData3 });\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Logout and 2FA Management\r\n\r\nrtAPI.security.call.logout = async function () {\r\n return await rtAPI.security.call.APIEndPoint('logout');\r\n}\r\n\r\nrtAPI.security.call.tFAManageOptionsUpdate = async function (tFAData) {\r\n return await rtAPI.security.call.APIEndPoint('manage-tfa', tFAData);\r\n}\r\n\r\nrtAPI.security.call.cancelTFA = async function () {\r\n return await rtAPI.security.call.APIEndPoint('cancel-tfa');\r\n}\r\n\r\nrtAPI.security.call.tFAManageOptionsClose = async function () {\r\n return await rtAPI.security.call.APIEndPoint('manage-tfa-close');\r\n}\r\n\r\n\r\n//#endregion\r\n\r\n//#region Hardware Key\r\n\r\nrtAPI.security.call.registrationStep1 = async function () {\r\n return await rtAPI.security.call.APIEndPoint('registration-step-1');\r\n}\r\n\r\nrtAPI.security.call.registrationStep2 = async function (data) {\r\n return await rtAPI.security.call.APIEndPoint('registration-step-2', data);\r\n}\r\n\r\nrtAPI.security.call.loginStep1 = async function () {\r\n return await rtAPI.security.call.APIEndPoint('login-step-1');\r\n}\r\n\r\nrtAPI.security.call.loginStep2 = async function (data) {\r\n return await rtAPI.security.call.APIEndPoint('login-step-2', data);\r\n}\r\n\r\nrtAPI.security.call.registrationRemove = async function (idDB) {\r\n return await rtAPI.security.call.APIEndPoint('registration-remove', { 'id': idDB });\r\n}\r\n\r\nrtAPI.security.call.registrationAuthorise = async function (idDB) {\r\n return await rtAPI.security.call.APIEndPoint('registration-authorise', { 'id': idDB });\r\n}\r\n\r\nrtAPI.security.call.authorisedDeviceRemove = async function (idDB) {\r\n return await rtAPI.security.call.APIEndPoint('authorised-device-remove', { 'id': idDB });\r\n}\r\n\r\nrtAPI.security.call.authorisedDeviceAuthorise = async function (idDB) {\r\n return await rtAPI.security.call.APIEndPoint('authorised-device-authorise', { 'id': idDB });\r\n}\r\n\r\n\r\n\r\n//#endregion\r\n\r\n//#region Update Password\r\n\r\nrtAPI.security.call.updatePassword = async function (oldPassword, newPassword, retypeNewPassword) {\r\n return await rtAPI.security.call.APIEndPoint('update-password', { 'oldPassword': oldPassword, 'newPassword': newPassword, 'retypeNewPassword': retypeNewPassword });\r\n}\r\n\r\nrtAPI.security.call.getPasswordScoreInfo = async function () {\r\n return await rtAPI.security.call.APIEndPoint('get-password-score-info');\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Actions\r\n\r\nrtAPI.security.call.getCurrentUser = async function () {\r\n return await rtAPI.security.call.APIEndPoint('get-current-user');\r\n}\r\n\r\nrtAPI.security.call.APIEndPoint = async function (command, data) {\r\n return await rtAPI.call.APIEndPoint('security', command, data);\r\n}\r\n\r\n//#endregion\r\n\r\n","if (!rtAPI) var rtAPI = {};\r\nif (!rtAPI.security) rtAPI.security = {};\r\n\r\n//#region Login Steps\r\n\r\nrtAPI.security.handle.login = function (event) {\r\n event.preventDefault();\r\n var login = rtAPI.security.fd.login.value;\r\n var password = rtAPI.security.fd.password.value;\r\n if (!rtAPI.validateRequired('requiredGroupLogin') || login == '' || password == '') return;\r\n rtAPI.security.call.login(login, password, rtAPI.security.samePageLogin, rtAPI.security.fd.manageTFA.checked)\r\n .then(result => {\r\n if (result.statusOk) {\r\n rtAPI.security.fireTFAHardwareKeyLoginWhenSelected = true;\r\n rtAPI.security.showTFAManagement = rtAPI.security.fd.manageTFA.checked;\r\n rtAPI.security.clearFields();\r\n rtAPI.resetRequired();\r\n }\r\n rtAPI.security.updatePanels(result)\r\n })\r\n}\r\n\r\nrtAPI.security.handle.showLostPassword = function (event) {\r\n event.preventDefault();\r\n rtAPI.security.pnl.login.style.display = 'none';\r\n rtAPI.security.pnl.lostPassword.style.display = 'inherit';\r\n rtAPI.messages.clear();\r\n rtAPI.resetRequired();\r\n}\r\n\r\nrtAPI.security.handle.getLostPassword = function (event) {\r\n event.preventDefault();\r\n var userName = rtAPI.security.fd.loginLost.value;\r\n if (!rtAPI.validateRequired('requiredGroupLostPassword') || userName == '') return;\r\n rtAPI.security.call.getLostPassword(userName)\r\n rtAPI.security.handle.showLoginPanel(event)\r\n}\r\n\r\nrtAPI.security.handle.showLostUsername = function (event) {\r\n event.preventDefault();\r\n rtAPI.security.pnl.login.style.display = 'none';\r\n rtAPI.security.pnl.lostUsername.style.display = 'inherit';\r\n rtAPI.messages.clear();\r\n rtAPI.resetRequired();\r\n}\r\n\r\nrtAPI.security.handle.getLostUsername = function (event) {\r\n event.preventDefault();\r\n var email = rtAPI.security.fd.loginLostEmail.value;\r\n if (!rtAPI.validateRequired('requiredGroupLostUsername') || email == '') return;\r\n rtAPI.security.call.getLostUsername(email)\r\n rtAPI.security.handle.showLoginPanel(event)\r\n}\r\n\r\nrtAPI.security.handle.showResendAuthEmail = function (event) {\r\n event.preventDefault();\r\n rtAPI.security.pnl.login.style.display = 'none';\r\n rtAPI.security.pnl.resendAuthEmail.style.display = 'inherit';\r\n rtAPI.messages.clear();\r\n rtAPI.resetRequired();\r\n}\r\n\r\nrtAPI.security.handle.resendAuthEmailSend = function (event) {\r\n event.preventDefault();\r\n var userName = rtAPI.security.fd.resendAuthEmail.value;\r\n if (!rtAPI.validateRequired('requiredGroupResendAuthEmail') || userName == '') return;\r\n rtAPI.security.call.resendAuthEmail(userName)\r\n rtAPI.security.handle.showLoginPanel(event)\r\n}\r\n\r\nrtAPI.security.handle.showLoginPanel = function (event) {\r\n event.preventDefault();\r\n rtAPI.security.pnl.login.style.display = 'inherit';\r\n rtAPI.security.pnl.lostPassword.style.display = 'none';\r\n rtAPI.security.pnl.lostUsername.style.display = 'none';\r\n rtAPI.security.pnl.resendAuthEmail.style.display = 'none';\r\n rtAPI.security.fd.loginLost.value = '';\r\n rtAPI.security.fd.resendAuthEmail.value = '';\r\n rtAPI.messages.clear();\r\n rtAPI.resetRequired();\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Logout\r\n\r\nrtAPI.security.handle.logout = function (event) {\r\n event.preventDefault();\r\n rtAPI.security.call.logout()\r\n .then(result => {\r\n rtAPI.security.clearFields();\r\n rtAPI.security.updatePanels(result);\r\n rtAPI.resetRequired();\r\n })\r\n}\r\n\r\n//#endregion\r\n\r\n//#region 2FA - Respond\r\n\r\nrtAPI.security.handle.sendSelect2FAMethod = async function (event) {\r\n var selectedMethod = document.querySelector('input[name=\"tFAOptions\"]:checked').value;\r\n let result = await rtAPI.security.call.sendSelectedMethod(selectedMethod)\r\n rtAPI.security.updatePanels(result);\r\n}\r\n\r\nrtAPI.security.handle.tFAAuthenticateCodeSend = function (event) {\r\n event.preventDefault();\r\n var authCode = rtAPI.security.fd.authenticationCode.value;\r\n if (!rtAPI.validateRequired('requiredGroupAuthCode') || authCode == '') return;\r\n rtAPI.security.call.sendAuthCode(authCode)\r\n .then(result => {\r\n if (result.statusOk) rtAPI.resetRequired();\r\n rtAPI.security.updatePanels(result);\r\n })\r\n}\r\n\r\nrtAPI.security.handle.tFAMemorableDataSend = function (event) {\r\n event.preventDefault();\r\n var memorableData1 = document.getElementById('memorableData1').value;\r\n var memorableData2 = document.getElementById('memorableData2').value;\r\n var memorableData3 = document.getElementById('memorableData3').value;\r\n if (!rtAPI.validateRequired('requiredGroupMemorableData') || memorableData1 == '' || memorableData2 == '' || memorableData3 == '') return;\r\n rtAPI.security.call.sendMemorableData(memorableData1, memorableData2, memorableData3)\r\n .then(result => {\r\n if (result.statusOk) rtAPI.resetRequired();\r\n rtAPI.security.updatePanels(result);\r\n })\r\n}\r\n\r\nrtAPI.security.handle.tFAHardwareKeyRegister = async function (event) {\r\n event.preventDefault();\r\n let hardwareKeyResult = await rtAPI.security.hardwareKey.registrationStep1();\r\n if (!hardwareKeyResult) {\r\n //rtAPI.security.tFAManageUpdateMessagesUpdate();\r\n return;\r\n };\r\n let result = await rtAPI.security.call.getCurrentUser()\r\n rtAPI.security.updateManageHardwareKeyPanels(result);\r\n Swal.fire({\r\n title: rtAPI.security.tFAData.text.registeredNewHardwareKeyTitle,\r\n text: rtAPI.security.tFAData.text.registeredNewHardwareKeyText,\r\n imageUrl: \"/resources/securitykey.min.svg\",\r\n showCancelButton: false,\r\n showConfirmButton: true,\r\n focusConfirm: true,\r\n focusCancel: false\r\n });\r\n}\r\n\r\nrtAPI.security.handle.tFAHardwareKeyRetry = async function (event) {\r\n event.preventDefault();\r\n await rtAPI.security.hardwareKey.triggerLogin()\r\n}\r\n\r\nrtAPI.security.handle.tFAAuthenticateCancel = function (event) {\r\n event.preventDefault();\r\n rtAPI.security.call.cancelTFA()\r\n .then(result => {\r\n rtAPI.security.updatePanels(result);\r\n rtAPI.resetRequired();\r\n })\r\n}\r\n\r\n//#endregion\r\n\r\n//#region 2FA Manage\r\n\r\nrtAPI.security.handle.showMFM = async function (event) {\r\n event.preventDefault();\r\n let result = await rtAPI.security.call.getCurrentUser()\r\n rtAPI.security.showTFAManagement = true;\r\n rtAPI.security.updatePanels(result);\r\n}\r\n\r\nrtAPI.security.handle.tFAManageUpdate = async function (event) {\r\n event.preventDefault();\r\n //rtAPI.security.tFAManageUpdateMessagesClear();\r\n rtAPI.messages.clear();\r\n if (rtAPI.security.tFAManageOptionsAreValid()) {\r\n let hardwareKeyOption = rtAPI.security.get2FAOption('HardwareKey');\r\n if (hardwareKeyOption.enabled != hardwareKeyOption.newState && hardwareKeyOption.newState) {\r\n let hardwareKeyResult = await rtAPI.security.hardwareKey.registrationStep1();\r\n if (!hardwareKeyResult) {\r\n //rtAPI.security.tFAManageUpdateMessagesUpdate();\r\n return;\r\n };\r\n }\r\n rtAPI.security.call.tFAManageOptionsUpdate(rtAPI.security.tFAData)\r\n .then(result => {\r\n if (result.statusOk) {\r\n if (result.tFAData.updateStatusOk) {\r\n rtAPI.security.tFAData = result.tFAData;\r\n }\r\n //else {\r\n // rtAPI.security.tFAManageUpdateMessagesSet(result);\r\n //}\r\n }\r\n rtAPI.security.update2FAManagePanel();\r\n })\r\n }\r\n //rtAPI.security.tFAManageUpdateMessagesUpdate();\r\n}\r\n\r\nrtAPI.security.handle.tFAManageOptionToggle = function (event) {\r\n var option = rtAPI.security.get2FAOption(this.value);\r\n option.newState = this.checked;\r\n\r\n if (!option.newState) {\r\n for (const field of option.fields) {\r\n field.value = field.initialValue;\r\n }\r\n }\r\n rtAPI.security.update2FAManagePanel();\r\n}\r\n\r\nrtAPI.security.handle.tFAManageFieldInput = function (event) {\r\n event.preventDefault();\r\n rtAPI.security.get2FAOptionField(this.id).value = this.value;\r\n rtAPI.security.update2FAManagePanel();\r\n}\r\n\r\nrtAPI.security.handle.tFAManageOptionHardwareKey = function (event) {\r\n event.preventDefault();\r\n rtAPI.security.pnl.dialogFields.innerHTML = '';\r\n rtAPI.security.init2FAManageHardwareKeyPanel();\r\n}\r\n\r\nrtAPI.security.handle.tFAManageOptionDeviceAuthentication = function (event) {\r\n event.preventDefault();\r\n rtAPI.security.pnl.dialogFields.innerHTML = '';\r\n rtAPI.security.init2FAManageAuthorisedDevicePanel();\r\n}\r\n\r\nrtAPI.security.handle.tFAManageHardwareKeyAdd = async function (event) {\r\n event.preventDefault();\r\n let hardwareKeyResult = await rtAPI.security.hardwareKey.registrationStep1();\r\n if (!hardwareKeyResult) {\r\n //rtAPI.security.tFAManageUpdateMessagesUpdate();\r\n return;\r\n };\r\n let result = await rtAPI.security.call.getCurrentUser()\r\n rtAPI.security.updateManageHardwareKeyPanels(result);\r\n}\r\n\r\nrtAPI.security.handle.tFAManageHardwareKeyRemove = async function (event) {\r\n event.preventDefault();\r\n const swalResult = await Swal.fire({\r\n title: rtAPI.security.tFAData.text.removeHardwareKeyTitle.replace('{0}', this.userIdent),\r\n text: rtAPI.security.tFAData.text.removeHardwareKeyText,\r\n icon: 'error',\r\n showCancelButton: true,\r\n confirmButtonColor: '#d33',\r\n confirmButtonText: 'Remove',\r\n focusCancel: true,\r\n width: '450px'\r\n })\r\n if (swalResult.isDismissed) return;\r\n\r\n let result = await rtAPI.security.call.registrationRemove(this.idDB);\r\n rtAPI.security.updateManageHardwareKeyPanels(result);\r\n}\r\n\r\nrtAPI.security.handle.tFAManageHardwareKeyAuthorise = async function (event) {\r\n event.preventDefault();\r\n const swalResult = await Swal.fire({\r\n title: rtAPI.security.tFAData.text.authoriseHardwareKeyTitle.replace('{0}', this.userIdent),\r\n text: rtAPI.security.tFAData.text.authoriseHardwareKeyText,\r\n icon: 'error',\r\n showCancelButton: true,\r\n confirmButtonColor: '#d33',\r\n confirmButtonText: 'Authorise',\r\n focusCancel: true,\r\n width: '450px'\r\n })\r\n if (swalResult.isDismissed) return;\r\n\r\n let result = await rtAPI.security.call.registrationAuthorise(this.idDB);\r\n rtAPI.security.updateManageHardwareKeyPanels(result);\r\n}\r\n\r\nrtAPI.security.handle.tFAManageAuthorisedDeviceRemove = async function (event) {\r\n event.preventDefault();\r\n const swalResult = await Swal.fire({\r\n title: rtAPI.security.tFAData.text.removeDeviceTitle.replace('{0}', this.name),\r\n text: rtAPI.security.tFAData.text.removeDeviceText,\r\n icon: 'error',\r\n showCancelButton: true,\r\n confirmButtonColor: '#d33',\r\n confirmButtonText: 'Remove',\r\n focusCancel: true,\r\n width: '450px'\r\n })\r\n if (swalResult.isDismissed) return;\r\n\r\n let result = await rtAPI.security.call.authorisedDeviceRemove(this.idDB);\r\n rtAPI.security.updateManageAuthorisedDevicePanels(result);\r\n}\r\n\r\nrtAPI.security.handle.tFAManageAuthorisedDeviceAuthorise = async function (event) {\r\n event.preventDefault();\r\n const swalResult = await Swal.fire({\r\n title: rtAPI.security.tFAData.text.authoriseDeviceTitle.replace('{0}', this.name),\r\n text: rtAPI.security.tFAData.text.authoriseDeviceText,\r\n icon: 'error',\r\n showCancelButton: true,\r\n confirmButtonColor: '#d33',\r\n confirmButtonText: 'Approve',\r\n focusCancel: true,\r\n width: '450px'\r\n })\r\n if (swalResult.isDismissed) return;\r\n\r\n let result = await rtAPI.security.call.authorisedDeviceAuthorise(this.idDB);\r\n rtAPI.security.updateManageAuthorisedDevicePanels(result);\r\n}\r\n\r\nrtAPI.security.handle.tFAManageBack = function (event) {\r\n event.preventDefault();\r\n rtAPI.security.pnl.dialogFields.innerHTML = '';\r\n rtAPI.security.init2FAManagePanel();\r\n}\r\n\r\nrtAPI.security.handle.tFAManageAutoClose = function (event) {\r\n rtAPI.security.pnl.dialog.style.cursor = null;\r\n rtAPI.security.pnl.dialog.removeAttribute(\"onclick\");\r\n rtAPI.security.handle.tFAManageCloseCommon(event);\r\n}\r\n\r\nrtAPI.security.handle.tFAManageClose = function (event) {\r\n rtAPI.security.handle.tFAManageCloseCommon(event);\r\n rtAPI.security.call.tFAManageOptionsClose();\r\n}\r\n\r\nrtAPI.security.handle.tFAManageCloseCommon = function (event) {\r\n event.preventDefault();\r\n rtAPI.security.showTFAManagement = false;\r\n rtAPI.security.pnl.dialogButtons.innerHTML = '';\r\n rtAPI.security.pnl.dialogFields.innerHTML = '';\r\n rtAPI.security.pnl.dialog.style.display = 'none';\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Hardware Key\r\n\r\n//#endregion\r\n\r\n//#region Update Password\r\n\r\nrtAPI.security.handle.showUpdatePassword = function (event) {\r\n event.preventDefault();\r\n rtAPI.displayElement(rtAPI.security.pnl.updatePassword, '');\r\n rtAPI.displayElement(rtAPI.security.btn.updatePassword, '');\r\n rtAPI.messages.targetSuffix = 'UpdatePassword';\r\n}\r\n\r\nrtAPI.security.handle.updatePassword = function (event) {\r\n event.preventDefault();\r\n rtAPI.security.fd.retypeNewPassword.setCustomValidity('');\r\n rtAPI.messages.clear();\r\n var oldPassword = rtAPI.security.fd.oldPassword.value;\r\n var newPassword = rtAPI.security.fd.newPassword.value;\r\n var retypeNewPassword = rtAPI.security.fd.retypeNewPassword.value;\r\n if (!rtAPI.validateRequired('requiredGroupUpdatePassword') || oldPassword == '' || newPassword == '' || retypeNewPassword == '') return;\r\n if (newPassword != retypeNewPassword) {\r\n rtAPI.security.fd.retypeNewPassword.setCustomValidity(rtAPI.security.errorMessage.retypeNewPassword);\r\n rtAPI.messages.showCritical(rtAPI.security.errorMessage.retypeNewPasswordMustMatch);\r\n return;\r\n }\r\n if (!rtAPI.security.fd.newPassword.isValidPassword) {\r\n rtAPI.security.fd.newPassword.setCustomValidity(rtAPI.security.errorMessage.weakPassword);\r\n rtAPI.messages.showCritical(rtAPI.security.errorMessage.weakPassword);\r\n return;\r\n }\r\n rtAPI.security.call.updatePassword(oldPassword, newPassword, retypeNewPassword)\r\n .then(result => {\r\n if (result.statusOk) {\r\n if (result.passwordUpdated) {\r\n rtAPI.displayElement(rtAPI.security.btn.updatePassword, 'none');\r\n }\r\n }\r\n })\r\n}\r\n\r\nrtAPI.security.handle.updatePasswordClose = function (event) {\r\n event.preventDefault();\r\n rtAPI.displayElement(rtAPI.security.pnl.updatePassword, 'none');\r\n rtAPI.security.clearFields();\r\n rtAPI.messages.clear();\r\n rtAPI.resetRequired();\r\n rtAPI.messages.targetSuffix = '';\r\n}\r\n\r\nrtAPI.security.handle.inputPasswordField = function (event) {\r\n var pwd = this.value;\r\n var id = this.id;\r\n this.isValidPassword = pass_chkPass(pwd, id);\r\n //if (this.isValidPassword) this.setCustomValidity('weak')\r\n //else this.setCustomValidity('')\r\n}\r\n\r\n//#endregion\r\n","if (!rtAPI) var rtAPI = {};\r\nif (!rtAPI.security) rtAPI.security = {};\r\n\r\n//#region Panel Updates\r\n\r\nrtAPI.security.updatePanels = function (result) {\r\n //Setup visibility of elements\r\n var btnTFASelectCancel = 'none';\r\n var btnTFAHardwareKeyRegister = 'inherit';\r\n var btnTFAHardwareKeyRetry = 'inherit';\r\n if (!rtAPI.security.enableAccountActivation || !result.emailAccountActivationEnabled) rtAPI.displayElement(this.btn.resendAuthEmail, 'none');\r\n if (!rtAPI.security.enableGetUsername || !result.getUsernameEnabled) rtAPI.displayElement(this.btn.lostUsername, 'none');\r\n if (!rtAPI.security.enableGetPassword) rtAPI.displayElement(this.btn.lostPassword, 'none');\r\n if (!rtAPI.security.enableTFAManagement) {\r\n rtAPI.displayElement(document.querySelector(`label[for='${this.fd.manageTFA.id}']`), 'none');\r\n rtAPI.displayElement(rtAPI.btn.tFAManageBack, 'none');\r\n }\r\n\r\n\r\n //Setup pnls\r\n var pnlLogin = 'none';\r\n var pnlLogout = 'none';\r\n var pnlTFASelect = 'none';\r\n var pnlTFACode = 'none';\r\n var pnlTFAMemorableData = 'none';\r\n var pnlTFAHardwareKey = 'none';\r\n var pnl2FAManage = 'none';\r\n\r\n switch (result.loginPanelMode) {\r\n case \"Logout\":\r\n pnlLogout = 'inherit';\r\n rtAPI.security.tFASelectModeTriggered = false;\r\n rtAPI.security.clearFields();\r\n if (rtAPI.security.showTFAManagement) pnl2FAManage = '';\r\n rtAPI.security.tFAData = result.tFAData;\r\n rtAPI.security.init2FAManagePanel();\r\n break;\r\n\r\n case \"Login\":\r\n pnlLogin = 'inherit';\r\n rtAPI.security.tFASelectModeTriggered = false;\r\n break;\r\n\r\n case \"2FASelect\":\r\n btnTFASelectCancel = 'inherit';\r\n rtAPI.security.init2FASelectPanel(result);\r\n break;\r\n\r\n case \"2FACode\":\r\n pnlTFACode = 'inherit';\r\n rtAPI.security.fd.authenticationCode.value = result.code;\r\n break;\r\n\r\n case \"2FAMemorableData\":\r\n pnlTFAMemorableData = 'inherit';\r\n rtAPI.security.init2FAMemorableDataPanel(result);\r\n break;\r\n\r\n case \"2FAHardwareKey\":\r\n pnlTFAHardwareKey = 'inherit';\r\n if (rtAPI.security.fireTFAHardwareKeyLoginWhenSelected) {\r\n rtAPI.security.fireTFAHardwareKeyLoginWhenSelected = false;\r\n btnTFAHardwareKeyRegister = 'none';\r\n btnTFAHardwareKeyRetry = 'none';\r\n rtAPI.security.hardwareKey.triggerLogin()\r\n .then(success => { if (success) return; })\r\n }\r\n rtAPI.displayElement(this.btn.tFAHardwareKeyRegister, btnTFAHardwareKeyRegister);\r\n rtAPI.displayElement(this.btn.tFAHardwareKeyRetry, btnTFAHardwareKeyRetry);\r\n break;\r\n }\r\n\r\n this.btn.tFASelectCancel.style.display = btnTFASelectCancel;\r\n if (rtAPI.security.tFASelectModeTriggered) pnlTFASelect = 'inherit';\r\n else rtAPI.security.renderedTFAOptions = \"\";\r\n\r\n //Do callback\r\n if (typeof this.panelUpdateCallback === 'function') {\r\n result.abortPanelUpdate = false;\r\n this.panelUpdateCallback(result);\r\n if (result.abortPanelUpdate) return;\r\n }\r\n\r\n //Update displayed panels\r\n rtAPI.displayElement(this.pnl.login, pnlLogin);\r\n rtAPI.displayElement(this.pnl.logout, pnlLogout);\r\n rtAPI.displayElement(this.pnl.tFASelect, pnlTFASelect);\r\n rtAPI.displayElement(this.pnl.tFACode, pnlTFACode);\r\n rtAPI.displayElement(this.pnl.tFAMemorableData, pnlTFAMemorableData);\r\n rtAPI.displayElement(this.pnl.tFAHardwareKey, pnlTFAHardwareKey);\r\n if (rtAPI.security.enableTFAManagement) rtAPI.displayElement(this.pnl.dialog, pnl2FAManage);\r\n\r\n}\r\n\r\n//#endregion\r\n\r\n//#region 2FA Select Panel\r\n\r\nrtAPI.security.init2FASelectPanel = function (result) {\r\n rtAPI.security.tFASelectModeTriggered = true;\r\n if (JSON.stringify(result.tFAData.options) != JSON.stringify(rtAPI.security.renderedTFAOptions)) {\r\n rtAPI.security.renderedTFAOptions = result.tFAData.options;\r\n rtAPI.security.pnl.tFASelectOptions.innerHTML = '';\r\n for (const item of result.tFAData.options) {\r\n if (!item.enabled) continue;\r\n if (!item.interactive) continue;\r\n //var spanElement = document.createElement('span');\r\n //rtAPI.security.pnl.tFASelectOptions.appendChild(spanElement);\r\n\r\n //var inputElement = document.createElement('input');\r\n //spanElement.appendChild(inputElement);\r\n //inputElement.id = `tFAOption${item.method}`;\r\n //inputElement.type = 'radio'\r\n //inputElement.name = 'tFAOptions';\r\n //inputElement.value = `${item.method}`;\r\n //inputElement.setAttribute('sid-key', `pnl-two-factor-authentication-select-options-${item.method.toLowerCase()}`);\r\n //inputElement.addEventListener('click', this.handle.sendSelect2FAMethod);\r\n\r\n //var labelElement = document.createElement('label');\r\n //spanElement.appendChild(labelElement);\r\n //labelElement.setAttribute('for', `tFAOption${item.method}`);\r\n //labelElement.innerHTML = `${item.titleUse}`;\r\n }\r\n }\r\n}\r\n\r\n//#endregion\r\n\r\n//#region 2FA Memorable Data Panel\r\n\r\nrtAPI.security.init2FAMemorableDataPanel = function (result) {\r\n rtAPI.security.pnl.tFAMemorableDataFields.innerHTML = '';\r\n if (result.memorableDataHintVisible) {\r\n var hintElement = document.createElement('span');\r\n rtAPI.security.pnl.tFAMemorableDataFields.appendChild(hintElement);\r\n hintElement.id = 'pnl2FAMemorableDataHint';\r\n hintElement.innerHTML = `${result.memorableDataHintTitle}${result.memorableDataHintText}`;\r\n }\r\n var fields = [result.memorableDataLabel1, result.memorableDataLabel2, result.memorableDataLabel3];\r\n var counter = 1\r\n fields.forEach(function (item) {\r\n var fieldsElement = document.createElement('span');\r\n fieldsElement.id = `pnlmemorableData${counter}`;\r\n fieldsElement.className = 'pnlmemorableData';\r\n rtAPI.security.pnl.tFAMemorableDataFields.appendChild(fieldsElement);\r\n\r\n var labelElement = document.createElement('label');\r\n fieldsElement.appendChild(labelElement);\r\n labelElement.setAttribute('for', `memorableData${counter}`);\r\n labelElement.innerHTML = `${item}`;\r\n\r\n var inputElement = document.createElement('input');\r\n fieldsElement.appendChild(inputElement);\r\n inputElement.id = `memorableData${counter}`;\r\n inputElement.type = 'password'\r\n inputElement.setAttribute('autocomplete', 'new-password');\r\n inputElement.maxLength = 1;\r\n inputElement.setAttribute('requiredGroup', 'requiredGroupMemorableData');\r\n inputElement.setAttribute('requiredErrorMessage', eval(`result.memorableDataErrorMessage${counter}`));\r\n inputElement.setAttribute('sid-key', `pnl-two-factor-authentication-memorable-data-${counter}`);\r\n counter++;\r\n })\r\n document.getElementById('memorableData1').addEventListener('input', function () { rtAPI.security.init2FAMemorableDataPanelAutoTab(this, document.getElementById('memorableData2')) });\r\n document.getElementById('memorableData2').addEventListener('input', function () { rtAPI.security.init2FAMemorableDataPanelAutoTab(this, document.getElementById('memorableData3')) });\r\n}\r\n\r\nrtAPI.security.init2FAMemorableDataPanelAutoTab = function (current, to) {\r\n if (current.getAttribute && current.value.length == current.getAttribute(\"maxlength\")) to.focus();\r\n}\r\n\r\n//#endregion\r\n\r\n//#region 2FA Manage Panel\r\n\r\nrtAPI.security.init2FAManagePanel = function () {\r\n rtAPI.messages.targetSuffix = '';\r\n if (!rtAPI.security.showTFAManagement) return;\r\n rtAPI.messages.targetSuffix = 'MFM';\r\n if (rtAPI.security.pnl.dialogFields.innerHTML != '') return;\r\n\r\n for (const option of rtAPI.security.tFAData.options) {\r\n var rowElement = document.createElement('div');\r\n rowElement.className = 'tFAManageOptionRow';\r\n rtAPI.security.pnl.dialogFields.appendChild(rowElement);\r\n\r\n var spanElement = document.createElement('span');\r\n spanElement.className = 'switch-toggle';\r\n rowElement.appendChild(spanElement);\r\n\r\n var inputElement = document.createElement('input');\r\n spanElement.appendChild(inputElement);\r\n inputElement.id = `tFAManageOption${option.method}`;\r\n inputElement.className = 'tFAManageOptionCheckbox';\r\n inputElement.type = 'checkbox'\r\n inputElement.checked = option.enabled;\r\n inputElement.value = `${option.method}`;\r\n inputElement.setAttribute('sid-key', `pnl-two-factor-authentication-manage-options-${option.method.toLowerCase()}`);\r\n inputElement.addEventListener('click', rtAPI.security.handle.tFAManageOptionToggle);\r\n\r\n var labelElement = document.createElement('label');\r\n spanElement.appendChild(labelElement);\r\n labelElement.id = `tFAManageOptionImage${option.method}`;\r\n labelElement.className = 'tFAManageOptionImage';\r\n labelElement.setAttribute('for', `tFAManageOption${option.method}`);\r\n\r\n var labelTextElement = document.createElement('label');\r\n spanElement.appendChild(labelTextElement);\r\n labelTextElement.id = `tFAManageOptionText${option.method}`;\r\n labelTextElement.className = 'tFAManageOptionText';\r\n labelTextElement.setAttribute('for', `tFAManageOption${option.method}`);\r\n labelTextElement.innerHTML = `${option.titleEnable}`;\r\n\r\n if (option.buttonAction != '') {\r\n var spanButtonElement = document.createElement('span');\r\n spanButtonElement.className = 'button-span';\r\n rowElement.appendChild(spanButtonElement);\r\n\r\n var buttonElement = document.createElement('button');\r\n spanButtonElement.appendChild(buttonElement);\r\n buttonElement.id = `tFAManageOptionButton${option.method}`;\r\n buttonElement.innerText = option.buttonText;\r\n buttonElement.className = 'button button-TFA button-manage';\r\n if (!option.enabled && !option.alwaysShowButton) buttonElement.style.display = 'none';\r\n eval(`buttonElement.addEventListener('click', rtAPI.security.handle.tFAManageOption${option.buttonAction})`);\r\n }\r\n }\r\n\r\n for (const option of rtAPI.security.tFAData.options) {\r\n for (const field of option.fields) {\r\n rtAPI.security.create2FAManageUpdatePanelField(field);\r\n }\r\n }\r\n\r\n rtAPI.displayElement(this.btn.tFAManageHardwareKeyAdd, 'none');\r\n rtAPI.displayElement(this.btn.tFAManageBack, 'none');\r\n rtAPI.displayElement(this.btn.tFAManageClose, 'inline-block');\r\n rtAPI.security.create2FAManageUpdatePanelField(rtAPI.security.tFAData.password);\r\n rtAPI.security.update2FAManagePanel();\r\n}\r\n\r\nrtAPI.security.create2FAManageUpdatePanelField = function (field) {\r\n var spanElement = document.createElement('span');\r\n spanElement.id = field.pnlId;\r\n spanElement.className = 'tfa-manage-field';\r\n rtAPI.security.pnl.dialogFields.appendChild(spanElement);\r\n\r\n var labelTextElement = document.createElement('label');\r\n spanElement.appendChild(labelTextElement);\r\n labelTextElement.innerHTML = field.titleField;\r\n labelTextElement.setAttribute('for', field.id);\r\n\r\n var inputElement = document.createElement('input');\r\n spanElement.appendChild(inputElement);\r\n inputElement.id = field.id;\r\n inputElement.type = field.type.toLowerCase();\r\n inputElement.value = field.value;\r\n inputElement.setAttribute('autocomplete', 'new-password');\r\n inputElement.setAttribute('sid-key', `tfa-manage-field-${field.id}`);\r\n inputElement.addEventListener('input', rtAPI.security.handle.tFAManageFieldInput);\r\n for (const validator of field.validators) {\r\n switch (validator.validationType) {\r\n case \"Required\":\r\n if (field.initialValue != '') inputElement.setAttribute(validator.validationType.toLowerCase(), validator.parameter);\r\n continue;\r\n\r\n default:\r\n inputElement.setAttribute(validator.validationType.toLowerCase(), validator.parameter);\r\n break;\r\n }\r\n }\r\n}\r\n\r\nrtAPI.security.update2FAManagePanel = function () {\r\n rtAPI.security.btn.tFAManageUpdate.style.display = rtAPI.security.tFAManageOptionsChanged() ? '' : 'none';\r\n rtAPI.security.update2FAManageField(rtAPI.security.tFAData.password, rtAPI.security.tFAManageOptionsChanged());\r\n\r\n for (const option of rtAPI.security.tFAData.options) {\r\n var targetSwitch = document.getElementById(`tFAManageOption${option.method}`);\r\n targetSwitch.checked = option.newState;\r\n for (const field of option.fields) {\r\n rtAPI.security.update2FAManageField(field, option.newState);\r\n }\r\n if (option.buttonAction != '') {\r\n let buttonManageVisible = ((option.enabled == option.newState && option.newState) || option.alwaysShowButton);\r\n document.getElementById(`tFAManageOptionButton${option.method}`).style.display = buttonManageVisible ? 'inline-block' : 'none';\r\n }\r\n }\r\n //rtAPI.security.tFAManageUpdateMessagesUpdate();\r\n}\r\n\r\nrtAPI.security.update2FAManageField = function (field, enabled) {\r\n document.getElementById(field.pnlId).style.display = enabled ? '' : 'none';\r\n var targetInput = document.getElementById(field.id);\r\n if (field.value != targetInput.value) targetInput.value = field.value; //Used to resync data after api call \r\n\r\n for (const validator of field.validators) {\r\n switch (validator.validationType) {\r\n case \"Required\":\r\n if (enabled) {\r\n if (field.initialValue != '') targetInput.setAttribute('required', '');\r\n }\r\n else targetInput.removeAttribute('required');\r\n return;\r\n\r\n default:\r\n continue;\r\n }\r\n }\r\n\r\n}\r\n\r\nrtAPI.security.tFAManageOptionsChanged = function () {\r\n if (!rtAPI.security.showTFAManagement) return false;\r\n if (rtAPI.security.pnl.dialogFields.innerHTML == '') return false;\r\n\r\n for (const option of rtAPI.security.tFAData.options) {\r\n if (option.enabled == option.newState && !rtAPI.security.tFAManageOptionFieldsChanged(option)) continue;\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nrtAPI.security.tFAManageOptionFieldsChanged = function (option) {\r\n if (!rtAPI.security.showTFAManagement) return false;\r\n if (rtAPI.security.pnl.dialogFields.innerHTML == '') return false;\r\n\r\n for (const field of option.fields) {\r\n if (field.value == field.initialValue) continue;\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nrtAPI.security.tFAManageOptionsAreValid = function () {\r\n var isValid = true;\r\n if (!rtAPI.security.tFAManageFieldIsValid(rtAPI.security.tFAData.password)) isValid = false;\r\n for (const option of rtAPI.security.tFAData.options) {\r\n if (!option.newState) continue;\r\n for (const field of option.fields) {\r\n if (!rtAPI.security.tFAManageFieldIsValid(field)) isValid = false;\r\n }\r\n }\r\n return isValid;\r\n}\r\n\r\nrtAPI.security.tFAManageFieldIsValid = function (field) {\r\n var targetInput = document.getElementById(field.id);\r\n for (const validator of field.validators) {\r\n switch (validator.validationType) {\r\n case \"Required\":\r\n targetInput.setAttribute('required', '');\r\n if (!targetInput.validity.valueMissing) continue;\r\n targetInput.reportValidity();\r\n //rtAPI.security.tFAManageUpdateErrorMessageSet(validator.errorMessage, true);\r\n rtAPI.messages.addCritical(validator.errorMessage, true);\r\n return false;\r\n\r\n case \"MinLength\":\r\n if (!targetInput.validity.tooShort) continue;\r\n targetInput.reportValidity();\r\n //rtAPI.security.tFAManageUpdateErrorMessageSet(validator.errorMessage, true);\r\n rtAPI.messages.addCritical(validator.errorMessage, true);\r\n return false;\r\n\r\n case \"Pattern\":\r\n if (!targetInput.validity.patternMismatch) continue;\r\n targetInput.reportValidity();\r\n //rtAPI.security.tFAManageUpdateErrorMessageSet(validator.errorMessage, true);\r\n rtAPI.messages.addCritical(validator.errorMessage, true);\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n\r\n//#endregion\r\n\r\n//#region 2FA Manage HardwareKey Panel\r\n\r\nrtAPI.security.init2FAManageHardwareKeyPanel = function () {\r\n if (!rtAPI.security.showTFAManagement) return;\r\n\r\n rtAPI.security.pnl.dialogFields.innerHTML = '';\r\n const mHK = rtAPI.security.tFAData.manageTFAHardwareKey;\r\n var rowH3Element = document.createElement('h3');\r\n rowH3Element.className = 'tFAManageHardwareKeyPanelTitle';\r\n rowH3Element.innerText = mHK.title;\r\n rtAPI.security.pnl.dialogFields.appendChild(rowH3Element);\r\n\r\n var tableElement = document.createElement('div');\r\n tableElement.className = 'tFAManageOptionTable';\r\n rtAPI.security.pnl.dialogFields.appendChild(tableElement);\r\n\r\n var rowHElement = document.createElement('div');\r\n rowHElement.className = 'tFAManageOptionRow tFAHeader';\r\n tableElement.appendChild(rowHElement);\r\n\r\n var spanHUserIdentElement = document.createElement('span');\r\n spanHUserIdentElement.className = 'tFAManageOptionCell tFAManageOptionHardwareKeyUserIdent';\r\n spanHUserIdentElement.innerText = rtAPI.security.tFAData.text.deviceTableHeadings[0];\r\n rowHElement.appendChild(spanHUserIdentElement);\r\n\r\n var spanHButtonElement = document.createElement('span');\r\n spanHButtonElement.className = 'tFAManageOptionCell tFAManageOptionHardwareKeyStatusText';\r\n spanHButtonElement.innerText = rtAPI.security.tFAData.text.deviceTableHeadings[1];\r\n rowHElement.appendChild(spanHButtonElement);\r\n\r\n for (const hardwareKey of mHK.hardwareKeys) {\r\n var rowElement = document.createElement('div');\r\n rowElement.className = 'tFAManageOptionRow';\r\n tableElement.appendChild(rowElement);\r\n\r\n var spanUserIdentElement = document.createElement('span');\r\n spanUserIdentElement.className = 'tFAManageOptionCell tFAManageOptionHardwareKeyUserIdent';\r\n spanUserIdentElement.innerText = hardwareKey.UserIdent;\r\n rowElement.appendChild(spanUserIdentElement);\r\n\r\n var spanButtonElement = document.createElement('span');\r\n spanButtonElement.className = 'tFAManageOptionCell button-span';\r\n rowElement.appendChild(spanButtonElement);\r\n\r\n if (hardwareKey.Authorised) {\r\n var spanAuthorisedElement = document.createElement('span');\r\n spanAuthorisedElement.className = 'tFAManageOptionHardwareKeyStatus';\r\n spanAuthorisedElement.innerText = rtAPI.security.tFAData.text.hardwareKeyAuthorised;\r\n spanButtonElement.appendChild(spanAuthorisedElement);\r\n }\r\n else {\r\n var buttonAuthoriseElement = document.createElement('button');\r\n spanButtonElement.appendChild(buttonAuthoriseElement);\r\n buttonAuthoriseElement.id = `tFAManageOptionHardwareKeyAuthorise${hardwareKey.Id}`;\r\n buttonAuthoriseElement.idDB = hardwareKey.Id;\r\n buttonAuthoriseElement.userIdent = hardwareKey.UserIdent;\r\n buttonAuthoriseElement.className = 'button button-TFA button-authorise';\r\n buttonAuthoriseElement.innerText = rtAPI.security.tFAData.text.hardwareKeyAuthorise;\r\n buttonAuthoriseElement.addEventListener('click', rtAPI.security.handle.tFAManageAuthorise);\r\n }\r\n\r\n if (mHK.allowRemove) {\r\n var buttonRemoveElement = document.createElement('button');\r\n spanButtonElement.appendChild(buttonRemoveElement);\r\n buttonRemoveElement.id = `tFAManageOptionHardwareKeyRemove${hardwareKey.Id}`;\r\n buttonRemoveElement.idDB = hardwareKey.Id;\r\n buttonRemoveElement.userIdent = hardwareKey.UserIdent;\r\n buttonRemoveElement.innerText = rtAPI.security.tFAData.text.hardwareKeyRemove;\r\n buttonRemoveElement.className = 'button button-TFA button-remove';\r\n buttonRemoveElement.addEventListener('click', rtAPI.security.handle.tFAManageRemove);\r\n }\r\n\r\n }\r\n rtAPI.displayElement(this.btn.tFAManageHardwareKeyAdd, 'inline-block');\r\n rtAPI.displayElement(this.btn.tFAManageBack, 'inline-block');\r\n rtAPI.displayElement(this.btn.tFAManageClose, 'none');\r\n}\r\n\r\nrtAPI.security.updateManageHardwareKeyPanels = function (result) {\r\n rtAPI.security.tFAData = result.tFAData;\r\n rtAPI.security.init2FAManageHardwareKeyPanel();\r\n}\r\n\r\n//#endregion\r\n\r\n//#region 2FA Manage AuthorisedDevice Panel\r\n\r\nrtAPI.security.init2FAManageAuthorisedDevicePanel = function () {\r\n if (!rtAPI.security.showTFAManagement) return;\r\n\r\n rtAPI.security.pnl.dialogFields.innerHTML = '';\r\n const mAD = rtAPI.security.tFAData.manageTFAAuthorisedDevice;\r\n var rowH3Element = document.createElement('h3');\r\n rowH3Element.className = 'tFAManageAuthorisedDevicePanelTitle';\r\n rowH3Element.innerText = mAD.title;\r\n rtAPI.security.pnl.dialogFields.appendChild(rowH3Element);\r\n\r\n if (mAD.authorisedDevices.length == 0) {\r\n var tableElement = document.createElement('div');\r\n tableElement.className = 'tFAManageOptionEmptyTable';\r\n tableElement.innerHTML = rtAPI.security.tFAData.text.noDevices;\r\n rtAPI.security.pnl.dialogFields.appendChild(tableElement);\r\n return;\r\n }\r\n\r\n var tableElement = document.createElement('div');\r\n tableElement.className = 'tFAManageOptionTable';\r\n rtAPI.security.pnl.dialogFields.appendChild(tableElement);\r\n\r\n var rowHElement = document.createElement('div');\r\n rowHElement.className = 'tFAManageOptionRow tFAHeader';\r\n tableElement.appendChild(rowHElement);\r\n\r\n var spanHUserIdentElementBrowser = document.createElement('span');\r\n spanHUserIdentElementBrowser.className = 'tFAManageOptionCell tFAManageOptionAuthorisedDeviceBrowser';\r\n spanHUserIdentElementBrowser.innerText = rtAPI.security.tFAData.text.deviceTableHeadings[0];\r\n rowHElement.appendChild(spanHUserIdentElementBrowser);\r\n\r\n var spanHUserIdentElementDescription = document.createElement('span');\r\n spanHUserIdentElementDescription.className = 'tFAManageOptionCell tFAManageOptionAuthorisedDeviceDescription';\r\n spanHUserIdentElementDescription.innerText = rtAPI.security.tFAData.text.deviceTableHeadings[1];\r\n rowHElement.appendChild(spanHUserIdentElementDescription);\r\n\r\n var spanHUserIdentElementIPAddress = document.createElement('span');\r\n spanHUserIdentElementIPAddress.className = 'tFAManageOptionCell tFAManageOptionAuthorisedDeviceIPAddress';\r\n spanHUserIdentElementIPAddress.innerText = rtAPI.security.tFAData.text.deviceTableHeadings[2];\r\n rowHElement.appendChild(spanHUserIdentElementIPAddress);\r\n\r\n var spanHUserIdentElementLoginCounter = document.createElement('span');\r\n spanHUserIdentElementLoginCounter.className = 'tFAManageOptionCell tFAManageOptionAuthorisedDeviceLoginCounter';\r\n spanHUserIdentElementLoginCounter.innerText = rtAPI.security.tFAData.text.deviceTableHeadings[3];\r\n rowHElement.appendChild(spanHUserIdentElementLoginCounter);\r\n\r\n if (mAD.enabled) {\r\n var spanHButtonElement = document.createElement('span');\r\n spanHButtonElement.className = 'tFAManageOptionCell tFAManageOptionHardwareKeyStatusText';\r\n spanHButtonElement.innerText = rtAPI.security.tFAData.text.deviceTableHeadings[4];\r\n rowHElement.appendChild(spanHButtonElement);\r\n }\r\n\r\n for (const authorisedDevice of mAD.authorisedDevices) {\r\n var rowElement = document.createElement('div');\r\n rowElement.className = 'tFAManageOptionRow';\r\n tableElement.appendChild(rowElement);\r\n\r\n var spanUserIdentElementBrowser = document.createElement('span');\r\n spanUserIdentElementBrowser.className = 'tFAManageOptionCell tFAManageOptionAuthorisedDeviceBrowser';\r\n spanUserIdentElementBrowser.innerText = authorisedDevice.Browser;\r\n rowElement.appendChild(spanUserIdentElementBrowser);\r\n\r\n var spanUserIdentElementDescription = document.createElement('span');\r\n spanUserIdentElementDescription.className = 'tFAManageOptionCell tFAManageOptionAuthorisedDeviceDescription';\r\n spanUserIdentElementDescription.innerText = authorisedDevice.Description;\r\n rowElement.appendChild(spanUserIdentElementDescription);\r\n\r\n var spanUserIdentElementIPAddress = document.createElement('span');\r\n spanUserIdentElementIPAddress.className = 'tFAManageOptionCell tFAManageOptionAuthorisedDeviceIPAddress';\r\n spanUserIdentElementIPAddress.innerText = authorisedDevice.IPAddress;\r\n rowElement.appendChild(spanUserIdentElementIPAddress);\r\n\r\n var spanUserIdentElementLoginCounter = document.createElement('span');\r\n spanUserIdentElementLoginCounter.className = 'tFAManageOptionCell tFAManageOptionAuthorisedDeviceLoginCounter';\r\n spanUserIdentElementLoginCounter.innerText = authorisedDevice.LoginCounter;\r\n rowElement.appendChild(spanUserIdentElementLoginCounter);\r\n\r\n var spanButtonElement = document.createElement('span');\r\n spanButtonElement.className = 'tFAManageOptionCell button-span';\r\n rowElement.appendChild(spanButtonElement);\r\n\r\n if (mAD.enabled) {\r\n if (authorisedDevice.Activated) {\r\n var spanAuthorisedElement = document.createElement('span');\r\n spanAuthorisedElement.className = 'tFAManageOptionAuthorisedDeviceStatus';\r\n spanAuthorisedElement.innerText = rtAPI.security.tFAData.text.deviceAuthorised;\r\n spanButtonElement.appendChild(spanAuthorisedElement);\r\n }\r\n else {\r\n var buttonAuthoriseElement = document.createElement('button');\r\n spanButtonElement.appendChild(buttonAuthoriseElement);\r\n buttonAuthoriseElement.id = `tFAManageOptionAuthorisedDeviceAuthorise${authorisedDevice.Id}`;\r\n buttonAuthoriseElement.idDB = authorisedDevice.Id;\r\n buttonAuthoriseElement.name = authorisedDevice.Name;\r\n buttonAuthoriseElement.className = 'button button-TFA button-authorise';\r\n buttonAuthoriseElement.innerText = rtAPI.security.tFAData.text.deviceAuthorise;\r\n buttonAuthoriseElement.addEventListener('click', rtAPI.security.handle.tFAManageAuthorisedDeviceAuthorise);\r\n }\r\n }\r\n\r\n var buttonRemoveElement = document.createElement('button');\r\n spanButtonElement.appendChild(buttonRemoveElement);\r\n buttonRemoveElement.id = `tFAManageOptionAuthorisedDeviceRemove${authorisedDevice.Id}`;\r\n buttonRemoveElement.idDB = authorisedDevice.Id;\r\n buttonRemoveElement.name = authorisedDevice.Name;\r\n buttonRemoveElement.innerText = rtAPI.security.tFAData.text.deviceRemove;\r\n buttonRemoveElement.className = 'button button-TFA button-remove';\r\n buttonRemoveElement.addEventListener('click', rtAPI.security.handle.tFAManageAuthorisedDeviceRemove);\r\n\r\n }\r\n rtAPI.displayElement(this.btn.tFAManageHardwareKeyAdd, 'none');\r\n rtAPI.displayElement(this.btn.tFAManageBack, 'inline-block');\r\n rtAPI.displayElement(this.btn.tFAManageClose, 'none');\r\n}\r\n\r\nrtAPI.security.updateManageAuthorisedDevicePanels = function (result) {\r\n rtAPI.security.tFAData = result.tFAData;\r\n rtAPI.security.init2FAManageAuthorisedDevicePanel();\r\n}\r\n\r\n//#endregion\r\n\r\n","if (!rtAPI) var rtAPI = {};\r\nif (!rtAPI.security) rtAPI.security = {};\r\nif (!rtAPI.security.hardwareKey) rtAPI.security.hardwareKey = { debugEnabled: false };\r\n\r\n//#region Hardware Key Sign In\r\n\r\nrtAPI.security.hardwareKey.triggerLogin = async function () {\r\n let success = await rtAPI.security.hardwareKey.loginStep1();\r\n //if (!success) return false;\r\n let result = await rtAPI.security.call.getCurrentUser();\r\n rtAPI.security.updatePanels(result);\r\n return true\r\n}\r\n\r\nrtAPI.security.hardwareKey.loginStep1 = async function () {\r\n\r\n // send to server for registering\r\n let makeAssertionOptions;\r\n try {\r\n let result = await rtAPI.security.call.loginStep1();\r\n makeAssertionOptions = result.data;\r\n }\r\n catch (e) {\r\n console.error(\"Request to server failed\", e);\r\n rtAPI.messages.showCritical(rtAPI.security.tFAData.text.hardwareKeyRequestToServerFailed);\r\n return false;\r\n }\r\n\r\n // show options error to user\r\n if (rtAPI.security.hardwareKey.debugEnabled) console.log(\"Assertion Options Object\", makeAssertionOptions);\r\n if (makeAssertionOptions.status !== \"ok\") {\r\n console.error(\"Error creating assertion options\");\r\n console.error(makeAssertionOptions.errorMessage);\r\n rtAPI.messages.showCritical(makeAssertionOptions.errorMessage);\r\n return false;\r\n }\r\n\r\n // todo: switch this to coercebase64\r\n const challenge = makeAssertionOptions.challenge.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n makeAssertionOptions.challenge = Uint8Array.from(atob(challenge), c => c.charCodeAt(0));\r\n\r\n // fix escaping. Change this to coerce\r\n makeAssertionOptions.allowCredentials.forEach(function (listItem) {\r\n var fixedId = listItem.id.replace(/\\_/g, \"/\").replace(/\\-/g, \"+\");\r\n listItem.id = Uint8Array.from(atob(fixedId), c => c.charCodeAt(0));\r\n });\r\n\r\n if (rtAPI.security.hardwareKey.debugEnabled) console.log(\"Assertion options\", makeAssertionOptions);\r\n Swal.fire({\r\n title: rtAPI.security.tFAData.text.hardwareKeyLoggingInTitle,\r\n text: rtAPI.security.tFAData.text.hardwareKeyLoggingInText,\r\n imageUrl: \"/resources/securitykey.min.svg\",\r\n showCancelButton: true,\r\n showConfirmButton: false,\r\n focusConfirm: false,\r\n focusCancel: false\r\n });\r\n\r\n // ask browser for credentials (browser will ask connected authenticators)\r\n let credential;\r\n try {\r\n credential = await navigator.credentials.get({ publicKey: makeAssertionOptions })\r\n Swal.close();\r\n }\r\n catch (err) {\r\n Swal.close();\r\n console.error(err.message ? err.message : err);\r\n rtAPI.messages.showCritical(err.message ? err.message : err);\r\n return false;\r\n }\r\n\r\n try {\r\n return await rtAPI.security.hardwareKey.loginStep2(credential);\r\n }\r\n catch (e) {\r\n console.error(\"Could not verify assertion\", e);\r\n rtAPI.messages.showCritical(rtAPI.security.tFAData.text.hardwareKeyCouldNotVerifyAssertion);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Sends the credential to the the FIDO2 server for assertion\r\n * @param {any} assertedCredential\r\n */\r\nrtAPI.security.hardwareKey.loginStep2 = async function (assertedCredential) {\r\n\r\n // Move data into Arrays incase it is super long\r\n let authData = new Uint8Array(assertedCredential.response.authenticatorData);\r\n let clientDataJSON = new Uint8Array(assertedCredential.response.clientDataJSON);\r\n let rawId = new Uint8Array(assertedCredential.rawId);\r\n let sig = new Uint8Array(assertedCredential.response.signature);\r\n const data = {\r\n assertedResponse: {\r\n id: assertedCredential.id,\r\n rawId: coerceToBase64Url(rawId),\r\n type: assertedCredential.type,\r\n extensions: assertedCredential.getClientExtensionResults(),\r\n response: {\r\n authenticatorData: coerceToBase64Url(authData),\r\n clientDataJson: coerceToBase64Url(clientDataJSON),\r\n signature: coerceToBase64Url(sig)\r\n }\r\n }\r\n };\r\n\r\n let response;\r\n try {\r\n let result = await rtAPI.security.call.loginStep2(data);\r\n response = result.data;\r\n }\r\n catch (e) {\r\n console.error(\"Request to server failed\", e);\r\n rtAPI.messages.showCritical(rtAPI.security.tFAData.text.hardwareKeyRequestToServerFailed);\r\n return false;\r\n }\r\n\r\n if (rtAPI.security.hardwareKey.debugEnabled) console.log(\"Assertion Object\", response);\r\n // show error\r\n if (response.status !== \"ok\") {\r\n console.error(\"Error doing assertion\");\r\n console.error(response.errorMessage);\r\n rtAPI.messages.showCritical(response.errorMessage);\r\n return false;\r\n }\r\n\r\n // show success message\r\n await Swal.fire({\r\n title: rtAPI.security.tFAData.text.hardwareKeyLoggedInTitle,\r\n text: rtAPI.security.tFAData.text.hardwareKeyLoggedInText,\r\n icon: 'success',\r\n timer: 2000\r\n });\r\n rtAPI.messages.showInformation(rtAPI.security.tFAData.text.hardwareKeyLoggedInTitle);\r\n return true;\r\n\r\n // redirect to dashboard to show keys\r\n //window.location.href = \"/dashboard/\" + value(\"#login-username\");\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Hardware Key Register\r\nrtAPI.security.hardwareKey.registrationStep1 = async function () {\r\n\r\n const swalResult = await Swal.fire({\r\n padding: '15px',\r\n width: '40m',\r\n title: rtAPI.security.tFAData.text.enterHardwareKeyNameTitle,\r\n input: 'text',\r\n showCancelButton: true,\r\n inputPlaceholder: rtAPI.security.tFAData.text.enterHardwareKeyNameMessage,\r\n inputValidator: (value) => {\r\n if (!value) return rtAPI.security.tFAData.text.enterHardwareKeyNameMessage\r\n }\r\n })\r\n if (swalResult.isDismissed) return;\r\n\r\n // send to server for registering\r\n let makeCredentialOptions;\r\n try {\r\n let result = await rtAPI.security.call.registrationStep1();\r\n makeCredentialOptions = result.data;\r\n } catch (e) {\r\n console.error(e);\r\n rtAPI.messages.showCritical(rtAPI.security.tFAData.text.somethingWentWrong);\r\n return false;\r\n }\r\n\r\n\r\n if (rtAPI.security.hardwareKey.debugEnabled) console.log(\"Credential Options Object\", makeCredentialOptions);\r\n if (makeCredentialOptions.status !== \"ok\") {\r\n console.error(\"Error creating credential options\");\r\n console.error(makeCredentialOptions.errorMessage);\r\n rtAPI.messages.showCritical(makeCredentialOptions.errorMessage);\r\n return false;\r\n }\r\n\r\n // Turn the challenge back into the accepted format of padded base64\r\n makeCredentialOptions.challenge = coerceToArrayBuffer(makeCredentialOptions.challenge);\r\n // Turn ID into a UInt8Array Buffer for some reason\r\n makeCredentialOptions.user.id = coerceToArrayBuffer(makeCredentialOptions.user.id);\r\n\r\n makeCredentialOptions.excludeCredentials = makeCredentialOptions.excludeCredentials.map((c) => {\r\n c.id = coerceToArrayBuffer(c.id);\r\n return c;\r\n });\r\n\r\n if (makeCredentialOptions.authenticatorSelection.authenticatorAttachment === null) makeCredentialOptions.authenticatorSelection.authenticatorAttachment = undefined;\r\n\r\n if (rtAPI.security.hardwareKey.debugEnabled) console.log(\"Credential Options Formatted\", makeCredentialOptions);\r\n Swal.fire({\r\n title: rtAPI.security.tFAData.text.registeringHardwareKeyNameTitle,\r\n text: rtAPI.security.tFAData.text.registeringHardwareKeyNameText,\r\n imageUrl: \"/resources/securitykey.min.svg\",\r\n showCancelButton: false,\r\n showConfirmButton: false,\r\n focusConfirm: false,\r\n focusCancel: false\r\n });\r\n\r\n\r\n if (rtAPI.security.hardwareKey.debugEnabled) console.log(\"Creating PublicKeyCredential...\");\r\n let newCredential;\r\n try {\r\n newCredential = await navigator.credentials.create({ publicKey: makeCredentialOptions });\r\n } catch (e) {\r\n var msg = rtAPI.security.tFAData.text.publicKeyCredentialIssue;\r\n console.error(msg, e);\r\n rtAPI.messages.showCritical(msg);\r\n return false;\r\n }\r\n\r\n\r\n if (rtAPI.security.hardwareKey.debugEnabled) console.log(\"PublicKeyCredential Created\", newCredential);\r\n try {\r\n return await rtAPI.security.hardwareKey.registrationStep2(newCredential, swalResult.value);\r\n }\r\n catch (err) {\r\n rtAPI.messages.showCritical(err.message ? err.message : err);\r\n return false\r\n }\r\n}\r\n\r\n// This should be used to verify the auth data with the server\r\nrtAPI.security.hardwareKey.registrationStep2 = async function (newCredential, hardwareKeyFriendlyName) {\r\n\r\n // Move data into Arrays incase it is super long\r\n let attestationObject = new Uint8Array(newCredential.response.attestationObject);\r\n let clientDataJSON = new Uint8Array(newCredential.response.clientDataJSON);\r\n let rawId = new Uint8Array(newCredential.rawId);\r\n\r\n const data = {\r\n hardwareKeyFriendlyName: hardwareKeyFriendlyName,\r\n transports: newCredential.response.getTransports(),\r\n attestationResponse: {\r\n id: newCredential.id,\r\n rawId: coerceToBase64Url(rawId),\r\n type: newCredential.type,\r\n extensions: newCredential.getClientExtensionResults(),\r\n response: {\r\n attestationObject: coerceToBase64Url(attestationObject),\r\n clientDataJson: coerceToBase64Url(clientDataJSON)\r\n }\r\n }\r\n };\r\n\r\n let response;\r\n try {\r\n let result = await rtAPI.security.call.registrationStep2(data);\r\n response = result.data;\r\n } catch (e) {\r\n rtAPI.messages.showCritical(e);\r\n return false;\r\n }\r\n\r\n if (rtAPI.security.hardwareKey.debugEnabled) console.log(\"Credential Object\", response);\r\n // show error\r\n if (response.status !== \"ok\") {\r\n console.error(\"Error creating credential\");\r\n console.error(response.errorMessage);\r\n rtAPI.messages.showCritical(response.errorMessage);\r\n return false;\r\n }\r\n\r\n // show success \r\n Swal.fire({\r\n title: rtAPI.security.tFAData.text.hardwareKeyRegistrationSuccessfulTitle,\r\n text: rtAPI.security.tFAData.text.hardwareKeyRegistrationSuccessfulText,\r\n icon: 'success',\r\n timer: 2000\r\n });\r\n rtAPI.messages.showInformation(rtAPI.security.tFAData.text.hardwareKeyRegistrationSuccessfulText);\r\n return true;\r\n}\r\n\r\n//#endregion\r\n\r\n//#region Helpers\r\n\r\ncoerceToArrayBuffer = function (thing, name) {\r\n if (typeof thing === \"string\") {\r\n // base64url to base64\r\n thing = thing.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n\r\n // base64 to Uint8Array\r\n var str = window.atob(thing);\r\n var bytes = new Uint8Array(str.length);\r\n for (var i = 0; i < str.length; i++) {\r\n bytes[i] = str.charCodeAt(i);\r\n }\r\n thing = bytes;\r\n }\r\n\r\n // Array to Uint8Array\r\n if (Array.isArray(thing)) {\r\n thing = new Uint8Array(thing);\r\n }\r\n\r\n // Uint8Array to ArrayBuffer\r\n if (thing instanceof Uint8Array) {\r\n thing = thing.buffer;\r\n }\r\n\r\n // error if none of the above worked\r\n if (!(thing instanceof ArrayBuffer)) {\r\n throw new TypeError(\"could not coerce '\" + name + \"' to ArrayBuffer\");\r\n }\r\n\r\n return thing;\r\n};\r\n\r\n\r\ncoerceToBase64Url = function (thing) {\r\n // Array or ArrayBuffer to Uint8Array\r\n if (Array.isArray(thing)) {\r\n thing = Uint8Array.from(thing);\r\n }\r\n\r\n if (thing instanceof ArrayBuffer) {\r\n thing = new Uint8Array(thing);\r\n }\r\n\r\n // Uint8Array to base64\r\n if (thing instanceof Uint8Array) {\r\n var str = \"\";\r\n var len = thing.byteLength;\r\n\r\n for (var i = 0; i < len; i++) {\r\n str += String.fromCharCode(thing[i]);\r\n }\r\n thing = window.btoa(str);\r\n }\r\n\r\n if (typeof thing !== \"string\") {\r\n throw new Error(\"could not coerce to string\");\r\n }\r\n\r\n // base64 to base64url\r\n // NOTE: \"=\" at the end of challenge is optional, strip it off here\r\n thing = thing.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=*$/g, \"\");\r\n\r\n return thing;\r\n};\r\n\r\n\r\n\r\n// HELPERS\r\n\r\nfunction showErrorAlert(message, error) {\r\n let footermsg = '';\r\n if (error) {\r\n footermsg = 'exception:' + error.toString();\r\n }\r\n Swal.fire({\r\n icon: 'error',\r\n title: 'Error',\r\n text: message,\r\n footer: footermsg\r\n //footer: 'Why do I have this issue?'\r\n })\r\n}\r\n\r\nfunction detectFIDOSupport() {\r\n if (window.PublicKeyCredential === undefined ||\r\n typeof window.PublicKeyCredential !== \"function\") {\r\n //$('#register-button').attr(\"disabled\", true);\r\n //$('#login-button').attr(\"disabled\", true);\r\n var el = document.getElementById(\"notSupportedWarning\");\r\n if (el) {\r\n el.style.display = 'block';\r\n }\r\n return;\r\n }\r\n}\r\n\r\n/**\r\n * \r\n * Get a form value\r\n * @param {any} selector\r\n */\r\nfunction value(selector) {\r\n var el = document.querySelector(selector);\r\n if (el.type === \"checkbox\") {\r\n return el.checked;\r\n }\r\n return el.value;\r\n}\r\n\r\n//#endregion","/*\r\n cookie policy\r\n Version:2\r\n Dependencies: jQuery\r\n \r\n SUMMARY:\r\n\r\n Controls cookie policy display setting and removing cookies. Currently built to work with RocktimeCore.config setting\r\n EnableNewStyleCookiePolicyVersionNo = 3. This is the default so no settings need to be set in the initialise example below.\r\n\r\n*/\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n\r\n if (document.getElementById(\"CookiePolicyAcceptAll\") !== null) {\r\n document.getElementById(\"CookiePolicyAcceptAll\").onclick = function () {\r\n var date = new Date();\r\n date.setTime(date.getTime() + (90 * 24 * 60 * 60 * 1000));\r\n document.cookie = \"rtCookiePrivacySetting=AcceptedTypes=ALL; expires=\" + date.toUTCString() + \"; SameSite=Lax; path=/;\";\r\n\r\n document.getElementById(\"CookiePolicy\").style.display = 'none';\r\n if (document.getElementById(\"CookiePolicyModal\") !== null) { document.getElementById(\"CookiePolicyModal\").style.display = 'none'; }\r\n };\r\n }\r\n\r\n if (document.getElementById(\"CookieControlCentre\") !== null) {\r\n document.getElementById(\"CookieControlCentre\").onclick = function () {\r\n document.getElementById(\"CookiePolicy\").style.display = 'none';\r\n if (document.getElementById(\"CookiePolicyModal\") !== null) { document.getElementById(\"CookiePolicyModal\").style.display = 'none'; }\r\n };\r\n }\r\n});\r\n","var orginalFormAction = null;\r\nfunction EndRequestHandlerAjaxTransfer() {\r\n theForm.action = orginalFormAction;\r\n theForm._initialAction = orginalFormAction;\r\n}\r\nfunction RegisterRequestHandlersAjaxTransfer() {\r\n if (typeof (Sys) != \"undefined\") {\r\n if (typeof (Sys.WebForms.PageRequestManager.getInstance()) != \"undefined\") {\r\n Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandlerAjaxTransfer);\r\n Sys.Application.notifyScriptLoaded();\r\n }\r\n }\r\n}\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n if (typeof (Sys) != \"undefined\") {\r\n orginalFormAction = theForm.action;\r\n Sys.Application.add_load(RegisterRequestHandlersAjaxTransfer);\r\n }\r\n})","","/*\r\n** Created by: Jeff Todnem (http://www.todnem.com/)http://www.passwordmeter.com/\r\n** Created on: 2007-08-14\r\n** Last modified: 2010-05-17 Kieron Matthews - Rocktime\r\n** \r\n** License Information:\r\n** -------------------------------------------------------------------------\r\n** Copyright (C) 2007 Jeff Todnem\r\n**\r\n** This program is free software; you can redistribute it and/or modify it\r\n** under the terms of the GNU General Public License as published by the\r\n** Free Software Foundation; either version 2 of the License, or (at your\r\n** option) any later version.\r\n** \r\n** This program is distributed in the hope that it will be useful, but\r\n** WITHOUT ANY WARRANTY; without even the implied warranty of\r\n** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r\n** General Public License for more details.\r\n** \r\n** You should have received a copy of the GNU General Public License along\r\n** with this program; if not, write to the Free Software Foundation, Inc.,\r\n** 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r\n** \r\n*/\r\n\r\nString.prototype.strReverse = function () {\r\n var newstring = \"\";\r\n for (var s = 0; s < this.length; s++) {\r\n newstring = this.charAt(s) + newstring;\r\n }\r\n return newstring;\r\n};\r\n\r\nfunction pass_createError(value, index, pass_Standards, pass_Mins) {\r\n var output = '
  • ' + pass_Standards[index] + '
  • ';\r\n output = output.replace(/\\{0\\}/gi, pass_Mins[index])\r\n output = output.replace(/\\{1\\}/gi, value)\r\n output = output.replace('/', ' / ')\r\n return output\r\n}\r\n\r\nfunction pass_getBackgroundcolor(score) {\r\n var hexc = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');\r\n var redcol_1;\r\n var redcol_2;\r\n var greencol_1;\r\n var greencol_2;\r\n var bluecol_1;\r\n var bluecol_2;\r\n var red = 0;\r\n var green = 0;\r\n var blue = 0;\r\n\r\n if (score >= 50) {\r\n red = Math.round(255 - ((score - 50) * (255 / 50)));\r\n } else {\r\n red = 255;\r\n }\r\n\r\n if (score <= 50) {\r\n green = Math.round(255 - ((50 - score) * (255 / 50)));\r\n } else {\r\n green = 255;\r\n }\r\n\r\n redcol_1 = hexc[Math.floor(red / 16)];\r\n redcol_2 = hexc[red % 16];\r\n\r\n greencol_1 = hexc[Math.floor(green / 16)];\r\n greencol_2 = hexc[green % 16];\r\n\r\n bluecol_1 = hexc[Math.floor(blue / 16)];\r\n bluecol_2 = hexc[blue % 16];\r\n\r\n return '#' + redcol_1 + redcol_2 + greencol_1 + greencol_2 + bluecol_1 + bluecol_2\r\n}\r\n\r\nfunction pass_chkPassKeyPress(pwd, id) {\r\n var val = document.getElementById(id);\r\n val.isvalid = pass_chkPass(pwd, id);\r\n ValidatorUpdateDisplay(val);\r\n if (val.parent != undefined && val.parent != '') {\r\n val.parentObj = document.all ? document.all[val.parent] : document.getElementById(val.parent)\r\n RocktimeValidateEx(val.parentObj);\r\n };\r\n}\r\n\r\nfunction pass_chkPass(pwd, id) {\r\n\r\n var oHelp = $('#pass_help_' + id);\r\n var oScore = $('#pass_score_' + id);\r\n\r\n if (pwd == '') { oScore.hide(); oHelp.hide(); return true; }\r\n oScore.show();\r\n oHelp.show();\r\n\r\n var pass_DisplayType = eval('pass.displayType_' + id);\r\n var pass_UseHelp = eval('pass.useHelp_' + id);\r\n var pass_ShowOk = eval('pass.showOk_' + id);\r\n var pass_Standards = eval('pass.standards_' + id);\r\n var pass_Complexities = eval('pass.complexities_' + id);\r\n var pass_ComplexityThresholds = eval('pass.complexityThresholds_' + id);\r\n var pass_Mins = eval('pass.mins_' + id);\r\n\r\n // Simultaneous variable declaration and value assignment aren't supported in IE apparently\r\n // so I'm forced to assign the same value individually per var to support a crappy browser *sigh* \r\n var nScore = 0, nLength = 0, nAlphaUC = 0, nAlphaLC = 0, nNumber = 0, nSymbol = 0, nMidChar = 0, nUnqChar = 0, nRepChar = 0, nRepInc = 0, nConsecAlphaUC = 0, nConsecAlphaLC = 0, nConsecNumber = 0, nConsecSymbol = 0, nConsecCharType = 0, nSeqAlpha = 0, nSeqNumber = 0, nSeqSymbol = 0, nSeqChar = 0, nReqChar = 0, nMultConsecCharType = 0;\r\n var nMultMidChar = 2, nMultConsecAlphaUC = 2, nMultConsecAlphaLC = 2, nMultConsecNumber = 2;\r\n var nMultSeqAlpha = 3, nMultSeqNumber = 3, nMultSeqSymbol = 3;\r\n var nMultLength = 4, nMultNumber = 4;\r\n var nMultSymbol = 6;\r\n var nTmpAlphaUC = \"\", nTmpAlphaLC = \"\", nTmpNumber = \"\", nTmpSymbol = \"\";\r\n var sAlphas = \"abcdefghijklmnopqrstuvwxyzqwertyuiopasdfghjklzxcvbnm\";\r\n var sNumerics = \"01234567890\";\r\n var sSymbols = \")!@#$%^&*()!\\\"$%\";\r\n\r\n var sComplexity = \"\";\r\n var sStandard = \"\";\r\n\r\n //if (document.all) { var nd = 0; } else { var nd = 1; }\r\n\r\n if (!pwd) {\r\n /* Display default score criteria to client */\r\n oScore.css({ 'backgroundColor': pass_getBackgroundcolor(0) });\r\n switch (pass_DisplayType) {\r\n case 0:\r\n oScore.text(pass_Complexities[0] + ' (0%)');\r\n break;\r\n\r\n case 1:\r\n oScore.text(pass_Complexities[0]);\r\n break;\r\n\r\n case 2:\r\n oScore.text('0%');\r\n break;\r\n case 3:\r\n oScore.text(' ');\r\n break;\r\n }\r\n if (pass_UseHelp) { oHelp.html(\"\"); }\r\n return false;\r\n }\r\n\r\n\r\n nScore = parseInt(pwd.length * nMultLength);\r\n nLength = pwd.length;\r\n var arrPwd = pwd.replace(/\\s+/g, \"\").split(/\\s*/);\r\n var arrPwdLen = arrPwd.length;\r\n\r\n /* Loop through password to check for Symbol, Numeric, Lowercase and Uppercase pattern matches */\r\n for (var a = 0; a < arrPwdLen; a++) {\r\n if (arrPwd[a].match(/[A-Z]/g)) {\r\n if (nTmpAlphaUC !== \"\") { if ((nTmpAlphaUC + 1) == a) { nConsecAlphaUC++; nConsecCharType++; } }\r\n nTmpAlphaUC = a;\r\n nAlphaUC++;\r\n }\r\n else if (arrPwd[a].match(/[a-z]/g)) {\r\n if (nTmpAlphaLC !== \"\") { if ((nTmpAlphaLC + 1) == a) { nConsecAlphaLC++; nConsecCharType++; } }\r\n nTmpAlphaLC = a;\r\n nAlphaLC++;\r\n }\r\n else if (arrPwd[a].match(/[0-9]/g)) {\r\n if (a > 0 && a < (arrPwdLen - 1)) { nMidChar++; }\r\n if (nTmpNumber !== \"\") { if ((nTmpNumber + 1) == a) { nConsecNumber++; nConsecCharType++; } }\r\n nTmpNumber = a;\r\n nNumber++;\r\n }\r\n //else if (arrPwd[a].match(/[^a-zA-Z0-9_]/g)) {\r\n else {\r\n if (a > 0 && a < (arrPwdLen - 1)) { nMidChar++; }\r\n if (nTmpSymbol !== \"\") { if ((nTmpSymbol + 1) == a) { nConsecSymbol++; nConsecCharType++; } }\r\n nTmpSymbol = a;\r\n nSymbol++;\r\n }\r\n /* Internal loop through password to check for repeat characters */\r\n var bCharExists = false;\r\n for (var b = 0; b < arrPwdLen; b++) {\r\n if (arrPwd[a] == arrPwd[b] && a != b) { /* repeat character exists */\r\n bCharExists = true;\r\n /* \r\n Calculate increment deduction based on proximity to identical characters\r\n Deduction is incremented each time a new match is discovered\r\n Deduction amount is based on total password length divided by the\r\n difference of distance between currently selected match\r\n */\r\n nRepInc += Math.abs(arrPwdLen / (b - a));\r\n }\r\n }\r\n if (bCharExists) {\r\n nRepChar++;\r\n nUnqChar = arrPwdLen - nRepChar;\r\n nRepInc = (nUnqChar) ? Math.ceil(nRepInc / nUnqChar) : Math.ceil(nRepInc);\r\n }\r\n }\r\n\r\n /* Check for sequential alpha string patterns (forward and reverse) */\r\n for (var s = 0; s < 49; s++) {\r\n var sFwd = sAlphas.substring(s, parseInt(s + 3));\r\n var sRev = sFwd.strReverse();\r\n if (pwd.toLowerCase().indexOf(sFwd) != -1 || pwd.toLowerCase().indexOf(sRev) != -1) { nSeqAlpha++; nSeqChar++; }\r\n }\r\n\r\n /* Check for sequential numeric string patterns (forward and reverse) */\r\n for (var s = 0; s < 8; s++) {\r\n var sFwd = sNumerics.substring(s, parseInt(s + 3));\r\n var sRev = sFwd.strReverse();\r\n if (pwd.toLowerCase().indexOf(sFwd) != -1 || pwd.toLowerCase().indexOf(sRev) != -1) { nSeqNumber++; nSeqChar++; }\r\n }\r\n\r\n /* Check for sequential symbol string patterns (forward and reverse) */\r\n for (var s = 0; s < sSymbols.length - 3; s++) {\r\n var sFwd = sSymbols.substring(s, parseInt(s + 3));\r\n var sRev = sFwd.strReverse();\r\n if (pwd.toLowerCase().indexOf(sFwd) != -1 || pwd.toLowerCase().indexOf(sRev) != -1) { nSeqSymbol++; nSeqChar++; }\r\n }\r\n\r\n /* Modify overall score value based on usage vs requirements */\r\n var nTypes = 0;\r\n\r\n /* General point assignment */\r\n if (nAlphaUC > 0) {\r\n nScore = parseInt(nScore + ((nLength - nAlphaUC) * 2));\r\n nTypes += 1;\r\n }\r\n if (nAlphaLC > 0) {\r\n nScore = parseInt(nScore + ((nLength - nAlphaLC) * 2));\r\n nTypes += 1;\r\n }\r\n if (nNumber > 0) {\r\n nScore = parseInt(nScore + (nNumber * nMultNumber));\r\n nTypes += 1;\r\n }\r\n if (nSymbol > 0) {\r\n nScore = parseInt(nScore + (nSymbol * nMultSymbol));\r\n nTypes += 1;\r\n }\r\n if (nMidChar > 0) {\r\n nScore = parseInt(nScore + (nMidChar * nMultMidChar));\r\n }\r\n\r\n /* Point deductions for poor practices */\r\n if ((nAlphaLC > 0 || nAlphaUC > 0) && nSymbol === 0 && nNumber === 0) { // Only Letters\r\n nScore = parseInt(nScore - nLength);\r\n }\r\n if (nAlphaLC === 0 && nAlphaUC === 0 && nSymbol === 0 && nNumber > 0) { // Only Numbers\r\n nScore = parseInt(nScore - nLength);\r\n }\r\n if (nRepChar > 0) { // Same character exists more than once\r\n nScore = parseInt(nScore - nRepInc);\r\n }\r\n if (nConsecAlphaUC > 0) { // Consecutive Uppercase Letters exist\r\n nScore = parseInt(nScore - (nConsecAlphaUC * nMultConsecAlphaUC));\r\n }\r\n if (nConsecAlphaLC > 0) { // Consecutive Lowercase Letters exist\r\n nScore = parseInt(nScore - (nConsecAlphaLC * nMultConsecAlphaLC));\r\n }\r\n if (nConsecNumber > 0) { // Consecutive Numbers exist\r\n nScore = parseInt(nScore - (nConsecNumber * nMultConsecNumber));\r\n }\r\n if (nSeqAlpha > 0) { // Sequential alpha strings exist (3 characters or more)\r\n nScore = parseInt(nScore - (nSeqAlpha * nMultSeqAlpha));\r\n }\r\n if (nSeqNumber > 0) { // Sequential numeric strings exist (3 characters or more)\r\n nScore = parseInt(nScore - (nSeqNumber * nMultSeqNumber));\r\n }\r\n if (nSeqSymbol > 0) { // Sequential symbol strings exist (3 characters or more)\r\n nScore = parseInt(nScore - (nSeqSymbol * nMultSeqSymbol));\r\n }\r\n\r\n sStandard = \"\";\r\n //pass_Standards (0\"length\", 1\"score\", 2\"upper case chars\", 3\"lower case chars\", 4\"numbers\", 5\"symbols\", 6\"%\", 7\"Ok\", 8\"You need to meet the following minimums:\",);\r\n\r\n var penaltyOffset = pass_Mins[0] + pass_Mins[2] + pass_Mins[3] + pass_Mins[4] + pass_Mins[5];\r\n if (!penaltyOffset == 0) { penaltyOffset = 40 / penaltyOffset; }\r\n if (nScore > 100) { nScore = 100; } //ensures you can never get 100% if all criteria aren't met\r\n\r\n\r\n if (nLength < pass_Mins[0]) {\r\n nScore -= (penaltyOffset * (pass_Mins[0] - nLength));\r\n sStandard += pass_createError(nLength, 0, pass_Standards, pass_Mins);\r\n }\r\n\r\n if (nAlphaUC < pass_Mins[2]) {\r\n nScore -= (penaltyOffset * (pass_Mins[2] - nAlphaUC));\r\n sStandard += pass_createError(nAlphaUC, 2, pass_Standards, pass_Mins);\r\n }\r\n\r\n if (nAlphaLC < pass_Mins[3]) {\r\n nScore -= (penaltyOffset * (pass_Mins[3] - nAlphaLC));\r\n sStandard += pass_createError(nAlphaLC, 3, pass_Standards, pass_Mins);\r\n }\r\n\r\n if (nNumber < pass_Mins[4]) {\r\n nScore -= (penaltyOffset * (pass_Mins[4] - nNumber));\r\n sStandard += pass_createError(nNumber, 4, pass_Standards, pass_Mins);\r\n }\r\n\r\n if (nSymbol < pass_Mins[5]) {\r\n nScore -= (penaltyOffset * (pass_Mins[5] - nSymbol));\r\n sStandard += pass_createError(nSymbol, 5, pass_Standards, pass_Mins);\r\n }\r\n\r\n if (nTypes < pass_Mins[6]) {\r\n nScore -= (10 * (pass_Mins[6] - nTypes));\r\n sStandard += pass_createError(nTypes, 6, pass_Standards, pass_Mins);\r\n }\r\n\r\n nScore = Math.round(nScore);\r\n\r\n if (nScore > 100) { nScore = 100; } else if (nScore < 0) { nScore = 0; }\r\n if (nScore < pass_Mins[1]) {\r\n sStandard += pass_createError(nScore, 1, pass_Standards, pass_Mins);\r\n }\r\n\r\n var isValid;\r\n if (sStandard == \"\") {\r\n if (pass_ShowOk == 1) {\r\n sStandard = '' + pass_Standards[7] + '';\r\n } else {\r\n sStandard = '';\r\n }\r\n isValid = true;\r\n } else {\r\n sStandard = '' + pass_Standards[8] + '
      ' + sStandard + '
    '\r\n isValid = false;\r\n }\r\n\r\n //for color tesing\r\n //nScore = nLength * 1;\r\n\r\n /* Determine complexity based on overall score */\r\n if (nScore >= 0 && nScore < pass_ComplexityThresholds[0]) { sComplexity = pass_Complexities[0]; }\r\n else if (nScore >= pass_ComplexityThresholds[0] && nScore < pass_ComplexityThresholds[1]) { sComplexity = pass_Complexities[1]; }\r\n else if (nScore >= pass_ComplexityThresholds[1] && nScore < pass_ComplexityThresholds[2]) { sComplexity = pass_Complexities[2]; }\r\n else if (nScore >= pass_ComplexityThresholds[2] && nScore < pass_ComplexityThresholds[3]) { sComplexity = pass_Complexities[3]; }\r\n else if (nScore >= pass_ComplexityThresholds[3] && nScore <= 100) { sComplexity = pass_Complexities[4]; }\r\n\r\n /* Display updated score criteria to client */\r\n oScore.css({ 'backgroundColor': pass_getBackgroundcolor(nScore) });\r\n if (pass_UseHelp) { oHelp.html(sStandard); }\r\n switch (pass_DisplayType) {\r\n case 0:\r\n oScore.text(sComplexity + ' (' + nScore + \"%)\");\r\n break;\r\n\r\n case 1:\r\n oScore.text(sComplexity);\r\n break;\r\n\r\n case 2:\r\n oScore.text(nScore + \"%\");\r\n break;\r\n\r\n case 3:\r\n oScore.text(' ');\r\n break;\r\n }\r\n return isValid;\r\n}","var rtSessionTimer = function () {\r\n var rtNow;\r\n var rtServerTime;\r\n var rtEnd;\r\n var rtWarningTimer = 60;\r\n var rtUIWarningTimer = 300;\r\n var rtSessionLength = 1200;\r\n var rtLoggedIn = false;\r\n var rtUseUIWarning = false;\r\n var rtTimeOffset = 0;\r\n var rtTime = 0;\r\n var rtRemaining = 0;\r\n var rtGetDataWait = 600;\r\n var rtUseTitle = false;\r\n var rtTitle = \"\";\r\n var rtColorBoxIsOpen = false;\r\n var rtControl = false;\r\n var rtTimerId;\r\n var rtLastLoggedInState = false;\r\n var rtDebugMode = 'N';\r\n\r\n if (typeof jQuery == 'undefined') return;\r\n\r\n $.get(rtGetLocation(\"S\"), function (data) {\r\n rtTitle = document.title;\r\n rtNow = new Date().getTime();\r\n rtServerTime = rtNow;\r\n rtEnd = rtNow;\r\n rtProcessData(data);\r\n rtCalcWait();\r\n rtTimerId = window.setInterval(rtAction, 200);\r\n $(\"a.rtSessionContinue\").click(function () { rtContinue(); });\r\n $(\"a.rtSessionLogout\").click(function () { rtLogout(); });\r\n $(\"a.rtSessionContinue\").attr(\"href\", \"javascript:void(0);\");\r\n $(\"a.rtSessionLogout\").attr(\"href\", \"javascript:void(0);\");\r\n\r\n }, \"html\")\r\n\r\n function rtAction() {\r\n rtGetDataWait -= 1;\r\n rtUpdateDivs(false);\r\n if (rtGetDataWait > 0) return\r\n rtCalcWait();\r\n $.get(rtGetLocation(\"S\"), function (data) { rtProcessData(data, false) }, \"html\");\r\n }\r\n\r\n function dyingBreath() {\r\n $.get(rtGetLocation(\"S\"), function (data) { rtProcessData(data, true) }, \"html\");\r\n }\r\n\r\n function rtGetLocation(mode) {\r\n return \"/RocktimeCore.Session.ashx?mode=\" + mode + \"&location=\" + encodeURIComponent(window.location.pathname) + \"&qs=\" + encodeURIComponent(window.location.search.substring(1));\r\n }\r\n\r\n function rtCalcWait() {\r\n rtGetDataWait = ((rtEnd - rtNow) / 1000) - rtUIWarningTimer - 10;\r\n if (rtSessionLength < rtGetDataWait) { rtGetDataWait = rtSessionLength - 10; }\r\n if (rtLoggedIn && rtGetDataWait > 30) { rtGetDataWait = 30; }\r\n if (rtRemaining < rtUIWarningTimer + 20) { rtGetDataWait = 10; }\r\n if (rtRemaining < rtWarningTimer + 4) { rtGetDataWait = 2; }\r\n if (rtRemaining < 10) { rtGetDataWait = 1; }\r\n rtGetDataWait = Math.floor(rtGetDataWait * 5);\r\n }\r\n\r\n function rtProcessData(data, isDyingBreath) {\r\n var dataParts = data.split(\",\");\r\n rtServerTime = parseInt(dataParts[0]);\r\n rtEnd = parseInt(dataParts[1]);\r\n rtWarningTimer = parseInt(dataParts[2]);\r\n rtUIWarningTimer = parseInt(dataParts[3]);\r\n rtLoggedIn = (dataParts[4] == \"True\");\r\n rtUseUIWarning = (dataParts[5] == \"True\");\r\n rtUseTitle = (dataParts[6] == \"True\");\r\n rtSessionLength = parseInt(dataParts[7]);\r\n rtControl = (dataParts[8] == \"True\");\r\n rtDebugMode = dataParts[9];\r\n rtTimeOffset = rtServerTime - rtNow;\r\n if (rtLoggedIn) rtLastLoggedInState = true\r\n rtUpdateDivs(isDyingBreath);\r\n if (isDyingBreath && rtRemaining <= 0) rtLogout()\r\n }\r\n\r\n function rtUpdateDivs(isDyingBreath) {\r\n rtNow = new Date().getTime()\r\n rtTime = rtEnd - rtNow;\r\n rtRemaining = Math.floor((rtTime - rtTimeOffset) / 1000);\r\n if (!isDyingBreath && rtRemaining <= 0) dyingBreath(); //check to see if the session has been updated\r\n\r\n //document.title = rtTitle + \" (\" + rtFormatTime(rtRemaining) + \")\" + rtGetDataWait; //Ajax Call Timer Showing (Debug)\r\n if (rtUseTitle) document.title = rtTitle + \" (\" + rtFormatTime(rtRemaining) + \")\"; //Normal Operation\r\n\r\n if (rtDebugMode == 'N' && !rtLoggedIn) {\r\n if (rtLastLoggedInState) rtLogout()\r\n return;\r\n }\r\n rtSetTime(\"#rtUIDialogTime\");\r\n rtShow(\"#rtUIDialog\", (rtRemaining > rtWarningTimer) && rtDebugMode != 'P', true)\r\n\r\n if (!rtUseUIWarning || rtGetLocation == \"C\") { return; }\r\n rtSetTime(\"#rtUIWarningTime\");\r\n rtShow(\"#rtUIWarning\", (rtRemaining > rtUIWarningTimer) && rtDebugMode != 'B', false);\r\n }\r\n\r\n function rtShow(divId, divHide, useColorBox) {\r\n if ($(divId).length = 0) { return; }\r\n if (useColorBox) {\r\n if (divHide) { if (rtColorBoxIsOpen) { $.colorbox.close(); } }\r\n else {\r\n if (!rtColorBoxIsOpen) {\r\n $.colorbox(\r\n {\r\n close: \"\",\r\n escKey: false,\r\n overlayClose: false,\r\n inline: true,\r\n href: divId,\r\n onOpen: function () { rtColorBoxIsOpen = true; },\r\n onCleanup: function () { rtContinue(); },\r\n onClosed: function () { rtColorBoxIsOpen = false; }\r\n }\r\n );\r\n }\r\n }\r\n }\r\n else {\r\n if (divHide) { $(divId).hide(); }\r\n else { $(divId).show(); }\r\n }\r\n }\r\n\r\n function rtSetTime(divId) {\r\n if ($(divId).length = 0) { return; }\r\n $(divId).html(rtFormatTime(rtRemaining));\r\n }\r\n\r\n function rtFormatTime(timeSecs) {\r\n if (Number.isNaN(timeSecs)) return '0:00';\r\n if (timeSecs < 0) return '0:00';\r\n return Math.floor(timeSecs / 60) + ':' + (timeSecs % 60).toFixed().pad(2, '0');\r\n }\r\n\r\n function rtContinue() {\r\n $.get(rtGetLocation(\"R\"), function () { rtGetDataWait = -1; rtAction(); });\r\n }\r\n\r\n function rtLogout() {\r\n rtRemaining = -1;\r\n rtLastLoggedInState = false;\r\n clearInterval(rtTimerId);\r\n if (rtLoggedIn || rtControl) document.location = rtGetLocation(\"L\"); //Go to logout page for control and logged in site\r\n else $.get(rtGetLocation(\"E\")); // just kill session for non logged in\r\n }\r\n\r\n String.prototype.pad = function (l, s) {\r\n return (l -= this.length) > 0 ? (s = new Array(Math.ceil(l / s.length) + 1).join(s)).substr(0, s.length) + this + s.substr(0, l - s.length) : this;\r\n }\r\n};","\r\nfunction getTwitterTweets(listId, screenName, tweetCount, includeRetweets) {\r\n $.ajax({\r\n url: \"/twitter.ashx?fdScreenName=\" + screenName + \"&fdTweetCount=\" + tweetCount + \"&fdIncludeRetweets=\" + includeRetweets,\r\n contentType: \"application/json; charset=utf-8\",\r\n dataType: \"json\",\r\n responseType: \"json\",\r\n success: twitterCallback\r\n })\r\n\r\n function twitterCallback(twitters) {\r\n var statusHTML = [];\r\n for (var i = 0; i < twitters.length; i++) {\r\n var username = twitters[i].user.screen_name;\r\n var status = twitters[i].text.replace(/((https?|s?ftp|ssh)\\:\\/\\/[^\"\\s\\<\\>]*[^.,;'\">\\:\\s\\<\\>\\)\\]\\!])/g, function (url) {\r\n return '' + url + '';\r\n }).replace(/\\B@([_a-z0-9]+)/ig, function (reply) {\r\n return reply.charAt(0) + '' + reply.substring(1) + '';\r\n });\r\n statusHTML.push('
  • ' + status + ' ' + relative_time(twitters[i].created_at) + '
  • ');\r\n }\r\n document.getElementById(listId).innerHTML = statusHTML.join('');\r\n }\r\n\r\n function relative_time(time_value) {\r\n var values = time_value.split(\" \");\r\n time_value = values[1] + \" \" + values[2] + \", \" + values[5] + \" \" + values[3];\r\n var parsed_date = Date.parse(time_value);\r\n var relative_to = (arguments.length > 1) ? arguments[1] : new Date();\r\n var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);\r\n delta = delta + (relative_to.getTimezoneOffset() * 60);\r\n\r\n if (delta < 60) {\r\n return 'less than a minute ago';\r\n } else if (delta < 120) {\r\n return 'about a minute ago';\r\n } else if (delta < (60 * 60)) {\r\n return (parseInt(delta / 60)).toString() + ' minutes ago';\r\n } else if (delta < (120 * 60)) {\r\n return 'about an hour ago';\r\n } else if (delta < (24 * 60 * 60)) {\r\n return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';\r\n } else if (delta < (48 * 60 * 60)) {\r\n return '1 day ago';\r\n } else {\r\n return (parseInt(delta / 86400)).toString() + ' days ago';\r\n }\r\n }\r\n};\r\n\r\n","//\r\n//Trigger Validate\r\n//\r\nfunction RocktimeValidate(ValidatorName) {\r\n var validator = document.getElementById(ValidatorName);\r\n ValidatorValidate(validator);\r\n}\r\n\r\nfunction Page_ClientValidateByControl(controlId) {\r\n if (typeof (Page_InvalidControlToBeFocused) !== \"undefined\") { Page_InvalidControlToBeFocused = null; }\r\n if (typeof (Page_Validators) == \"undefined\") { return true; }\r\n var i;\r\n for (i = 0; i < Page_Validators.length; i++) {\r\n if (Page_Validators[i].controltovalidate == controlId) {\r\n ValidatorValidate(Page_Validators[i]);\r\n return;\r\n }\r\n }\r\n\r\n}\r\n\r\n\r\n//\r\n//Custom Result Processing\r\n//\r\nfunction RocktimeCustomResultProcessing(val) {\r\n if (val.customResultProcessingJavascriptFunction == undefined | val.customResultProcessingJavascriptFunction == '') { return; }\r\n var value = ValidatorGetValue(val.controltovalidate);\r\n value = eval(val.customResultProcessingJavascriptFunction + '(value)');\r\n if (value != undefined) { document.getElementById(val.controltovalidate).value = value };\r\n}\r\n\r\n//\r\n//Core\r\n//\r\nfunction RocktimeValidateEx(val) {\r\n val.isvalid = true;//GetCoreIsValid(val);\r\n return val.isvalid;//true;//prevents default behaviour for core validator\r\n}\r\n\r\n//\r\n//DropDownList\r\n//\r\nfunction RocktimeDropDownListValidatorIsValid(val) {\r\n var value = ValidatorGetValue(val.controltovalidate);\r\n //if (val.allowCustomText == \"true\") { return (value != val.invalidValue); }\r\n //if (val.isLoadOnDemand == \"true\") { return (value != val.invalidValue); }\r\n //if (val.isDropDownList == \"true\") { return (value != val.invalidValue); }\r\n if (val.allowCustomText == \"true\") return RocktimeDropDownListValidatorIsInvalidValue(value, val);\r\n //if (val.isLoadOnDemand == \"true\") return RocktimeDropDownListValidatorIsInvalidValue(value, val);\r\n if (val.isDropDownList == \"true\") return RocktimeDropDownListValidatorIsInvalidValue(value, val);\r\n\r\n if (val.isRadDropDownList == \"true\") {\r\n var raddropdownlist = $find(val.controltovalidate);\r\n //return (raddropdownlist.get_selectedItem().get_value() != val.invalidValue);\r\n return RocktimeDropDownListValidatorIsInvalidValue(raddropdownlist.get_selectedItem().get_value(), val);\r\n }\r\n\r\n var combo = $find(val.controltovalidate);\r\n if (combo == null) {\r\n combo = $(\"#\" + val.controltovalidate);\r\n value = combo.val();\r\n //return (value != val.invalidValue);\r\n return RocktimeDropDownListValidatorIsInvalidValue(value, val);\r\n }\r\n\r\n var text = combo.get_text();\r\n if (text.length < 1) { return false; }\r\n\r\n var node = combo.findItemByText(text);\r\n if (!node) {\r\n value = combo._value;\r\n //return (value != val.invalidValue);\r\n return RocktimeDropDownListValidatorIsInvalidValue(value, val);\r\n }\r\n\r\n //if (value == node.get_value()) { return true; }//assumes that the please select is not an item\r\n value = node.get_value();\r\n //return (value != val.invalidValue);\r\n return RocktimeDropDownListValidatorIsInvalidValue(value, val);\r\n}\r\n\r\nfunction RocktimeDropDownListValidatorIsInvalidValue(value, val) {\r\n return (value != val.invalidValue) && (value != val.invalidDefaultValue);;\r\n}\r\n\r\n//\r\n//CheckBox\r\n//\r\nfunction RocktimeCheckBoxValidatorIsValid(val) {\r\n if (val.testType == 'CheckBox') {\r\n return $(\"#\" + val.controltovalidate).is(':checked');\r\n }\r\n var checkBoxCount = 0;\r\n if (val.testType == \"CheckBoxList\") {\r\n $(\"#\" + val.controltovalidate).find(\":checkbox\").each(function () {\r\n if ($(this).is(\":checked\")) { checkBoxCount++; }\r\n });\r\n } else if (val.testType == \"RadListBox\") {\r\n $(\"#\" + val.controltovalidate).find(\":checkbox\").each(function () {\r\n if ($(this).is(\":checked\")) { checkBoxCount++; }\r\n });\r\n } else {\r\n var value = ValidatorGetValue(val.controltovalidate);\r\n if (ValidatorTrim(value).length == 0) { checkBoxCount = 0; }\r\n else { checkBoxCount = value.split(\",\").length; }\r\n }\r\n\r\n if (val.requiredChecked == 'false' && checkBoxCount == 0) { return true; }\r\n if (val.minimumChecked == '' && val.maximumChecked == '') { return true; }\r\n if (val.minimumChecked == '' && checkBoxCount <= val.maximumChecked) { return true; }\r\n if (val.maximumChecked == '' && checkBoxCount >= val.minimumChecked) { return true; }\r\n return (checkBoxCount <= val.maximumChecked && checkBoxCount >= val.minimumChecked);\r\n}\r\n\r\n//\r\n//ListBox\r\n//\r\nfunction RocktimeListBoxValidatorIsValid(val) {\r\n var checkBoxCount = 0;\r\n\r\n if ($(\"#\" + val.controltovalidate + \"_ClientState\").length == 0) {\r\n $(\"#\" + val.controltovalidate).find(\"option\").each(function () {\r\n if ($(this).is(\":selected\")) { checkBoxCount++; }\r\n });\r\n }\r\n else {\r\n checkBoxCount = $(\"#\" + val.controltovalidate + \" .rlbSelected\").length\r\n }\r\n if (val.minimumSelected == '' && val.maximumSelected == '') { return true; }\r\n if (val.minimumSelected == '' && checkBoxCount <= val.maximumSelected) { return true; }\r\n if (val.maximumSelected == '' && checkBoxCount >= val.minimumSelected) { return true; }\r\n return (checkBoxCount <= val.maximumSelected && checkBoxCount >= val.minimumSelected);\r\n}\r\n\r\n//\r\n//RadioButton\r\n//\r\nfunction RocktimeRadioButtonRequiredValidatorIsValid(val) {\r\n var checkedClassName = val.checkedClassName;\r\n var controlToValidate = $(\"#\" + val.controltovalidate);\r\n var checkedOptions = controlToValidate.find(\".\" + checkedClassName);\r\n return (checkedOptions.length == 1);\r\n}\r\n\r\n//\r\n//TextBox Length\r\n//\r\nfunction RocktimeTextBoxLengthValidatorIsValid(val) {\r\n var value = ValidatorGetValue(val.controltovalidate);\r\n if (ValidatorTrim(value).length == 0) { return true; }\r\n if (val.minimumlength == '' && val.maximumlength == '') { return true; }\r\n if (val.minimumlength == '' && value.length <= val.maximumlength) { return true; }\r\n if (val.maximumlength == '' && value.length >= val.minimumlength) { return true; }\r\n return (value.length <= val.maximumlength && value.length >= val.minimumlength);\r\n}\r\n\r\n//\r\n//TextBox Required\r\n//\r\nfunction RocktimeTextBoxRequiredValidatorIsValid(val) {\r\n if (val.IsFileUploadEx == \"true\") {\r\n if (val.FileExists == \"true\") { return true; }\r\n }\r\n var value;\r\n if (val.IsWYSIWYG == \"true\") {\r\n value = $find(val.controltovalidate).get_html();\r\n value = value.replace(/[ \\n\\r\\t]|<[^>]+>| /gmi, '');\r\n value = ValidatorTrim(value);\r\n return (value.length != 0) && (value != ValidatorTrim(val.initialValue));\r\n }\r\n value = ValidatorGetValue(val.controltovalidate);\r\n return (ValidatorTrim(value).length != 0) && (ValidatorTrim(value) != ValidatorTrim(val.initialValue))\r\n}\r\n\r\n//\r\n//TextBox Password Strength\r\n//\r\nfunction RocktimePasswordStrengthValidatorIsValid(val) {\r\n var value = ValidatorGetValue(val.controltovalidate);\r\n return pass_chkPass(value, val.id);\r\n}\r\n\r\n//\r\n//TextBox Numeric\r\n//\r\nfunction RocktimeNumericValidatorIsValid(val) {\r\n return RocktimeNumericValidatorAction(val.controltovalidate, (val.allowdecimal == \"true\"), val.fieldErrorClass);\r\n}\r\n\r\nfunction RocktimeNumericValidatorAction(id, allowDecimal, fieldErrorClass) {\r\n var result;\r\n var val = $(\"#\" + id).val();\r\n val = val.replace(/,/g, \"\");\r\n if (val == \"\") {\r\n result = true;\r\n } else {\r\n if (allowDecimal) { result = $.isNumeric(val); }\r\n else { result = isInt(val); }\r\n }\r\n\r\n if (result) {\r\n $('#' + id).removeClass(fieldErrorClass);\r\n } else {\r\n $('#' + id).addClass(fieldErrorClass);\r\n }\r\n return result;\r\n}\r\n\r\nfunction isInt(n) {\r\n return parseFloat(n) == parseInt(n, 10) && !isNaN(n);\r\n}\r\n\r\n//\r\n//TextBox Time\r\n//\r\nfunction RocktimeTimeValidatorIsValid(val) {\r\n var value = ValidatorGetValue(val.controltovalidate);\r\n if (value == \"\") { return true; }\r\n if (!RocktimeTimeValidatorValidateTime(value)) { return false; }\r\n if (val.minimumtime == '' && val.maximumtime == '') { return true; }\r\n if (val.minimumtime == '' && RocktimeTimeValidatorGetTime(value) <= RocktimeTimeValidatorGetTime(val.maximumtime)) { return true; }\r\n if (val.maximumtime == '' && RocktimeTimeValidatorGetTime(value) >= RocktimeTimeValidatorGetTime(val.minimumtime)) { return true; }\r\n return (RocktimeTimeValidatorGetTime(value) <= RocktimeTimeValidatorGetTime(val.maximumtime)) && RocktimeTimeValidatorGetTime(value) >= RocktimeTimeValidatorGetTime(val.minimumtime);\r\n}\r\n\r\nfunction RocktimeTimeValidatorGetTime(Time) {\r\n var Parts;\r\n\r\n if (Time.indexOf(\"-\") != -1) {\r\n Parts = Time.split(\"-\");\r\n return new Date(2000, 1, 1, Parts[3], Parts[4], Parts[5]);\r\n }\r\n\r\n Parts = Time.split(\":\");\r\n\r\n if (Parts.length == 2) { return new Date(2000, 1, 1, Parts[0], Parts[1], 0); }\r\n if (Parts[2].indexOf(\".\") != -1) { return new Date(2000, 1, 1, Parts[0], Parts[1], Parts[2]); }\r\n\r\n var Seconds = Parts[2].split(\".\");\r\n return new Date(2000, 1, 1, Parts[0], Parts[1], Seconds[0], Seconds[1]);\r\n\r\n}\r\n\r\nfunction RocktimeTimeValidatorValidateTime(Time) {\r\n\r\n var Parts;\r\n if (Time.indexOf(\"-\") != -1) {\r\n Parts = Time.split(\"-\");\r\n return (Parts.length == 6);\r\n\r\n }\r\n\r\n Parts = Time.split(\":\")\r\n if (Parts.length == 2) {\r\n if (Parts[0] < 0) { return false };\r\n if (Parts[0] > 23) { return false };\r\n if (Parts[1] < 0) { return false };\r\n if (Parts[1] > 59) { return false };\r\n return true;\r\n }\r\n if (Parts.length == 3) {\r\n if (Parts[0] < 0) { return false };\r\n if (Parts[0] > 23) { return false };\r\n if (Parts[1] < 0) { return false };\r\n if (Parts[1] > 59) { return false };\r\n if (Parts[2] < 0) { return false };\r\n if (Parts[2] >= 60) { return false };\r\n return true;\r\n }\r\n return false;\r\n\r\n}\r\n\r\nfunction RocktimeTimeValidateControl(controlToValidateId) {\r\n var validator = document.getElementById(controlToValidateId);\r\n RocktimeValidateEx(validator);\r\n}\r\n\r\n//\r\n//TextBox Regular Expression\r\n//\r\nfunction RocktimeRegularExpressionValidatorEvaluateIsValid(val) {\r\n var value = ValidatorGetValue(val.controltovalidate);\r\n switch (val.setCase) {\r\n case \"u\": value = value.toUpperCase(); break;\r\n case \"l\": value = value.toLowerCase(); break;\r\n }\r\n if (val.removeChars != '') {\r\n var pattern = new RegExp('[' + val.removeChars + ']', 'gmi');\r\n value = value.replace(pattern, '');\r\n }\r\n if (ValidatorTrim(value).length == 0)\r\n return true;\r\n var rx = new RegExp(val.validationexpression);\r\n var matches = rx.exec(value);\r\n return (matches != null && value == matches[0]);\r\n}\r\n\r\n//\r\n//TextBox Compare\r\n//\r\nfunction CompareValidatorEvaluateIsValidEx(val) {\r\n var result = CompareValidatorEvaluateIsValid(val)\r\n return result;\r\n\r\n}\r\n\r\n//\r\n//TextBox Compare Ajax\r\n//\r\nfunction RocktimeAjaxValidatorEvaluateIsValid(val) {\r\n return (val.ajaxIsValid.toLowerCase() == 'true');\r\n}\r\n\r\nfunction RocktimeAjaxValidatorKeyUp(val, controlToValidateId) {\r\n val = document.getElementById(controlToValidateId);//Reconect val to validator span after ajax call\r\n if (val.timeoutId) { window.clearTimeout(val.timeoutId); }\r\n val.timeoutId = window.setTimeout(function () {\r\n var value = ValidatorGetValue(val.controltovalidate);\r\n eval(val.webFormDoCallback);\r\n }, 200);\r\n}\r\n\r\n// Called when result is returned from server\r\nfunction RocktimeAjaxValidatorResult(returnValue, val) {\r\n val.update = !(val.LastIsValid == returnValue) ? 'true' : 'false';\r\n val.ajaxIsValid = returnValue;\r\n val.LastIsValid = returnValue;\r\n val.isvalid = (val.ajaxIsValid.toLowerCase() == 'true');\r\n if (val.update == 'true') {\r\n ValidatorUpdateDisplay(val);\r\n if (val.parent != undefined && val.parent != '') {\r\n val.parentObj = document.all ? document.all[val.parent] : document.getElementById(val.parent)\r\n RocktimeValidateEx(val.parentObj);\r\n };\r\n }\r\n}\r\n\r\n// If there is an error, show it\r\nfunction RocktimeAjaxValidatorError(message, val) {\r\n alert('Error: ' + decodeHTML(message));\r\n val.ajaxIsValid = 'false';\r\n}\r\n\r\nvar decodeHTML = function (html) {\r\n var txt = document.createElement('textarea');\r\n txt.innerHTML = html;\r\n return txt.value;\r\n};\r\n","//\r\n//Intercept and extend ValidatorUpdateDisplay\r\n//\r\nvar ValidatorUpdateDisplaySaved;\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n if (typeof (ValidatorUpdateDisplay) == \"function\") {\r\n ValidatorUpdateDisplaySaved = ValidatorUpdateDisplay;\r\n ValidatorUpdateDisplay = ValidatorUpdateDisplayEx;\r\n }\r\n}\r\n)\r\n\r\nfunction ValidatorUpdateDisplayEx(val) {\r\n ValidatorUpdateDisplaySaved(val);\r\n RocktimeValidateExSetHighlight(getCoreValidator(val));\r\n if (!val.id.endsWith('_Core')) UpdateValidationSummariesAutoAction();\r\n return val.isvalid;\r\n}\r\n\r\n// \r\n//Core\r\n//\r\nfunction ValidatorValidateEx(val) {\r\n if ((typeof (Page_Validators) != \"undefined\") && (Page_Validators != null)) {\r\n for (var i = 0; i < Page_Validators.length; i++) {\r\n if (typeof (val.ValidatorExName) != \"undefined\") {\r\n if (val.ValidatorExName == Page_Validators[i].ValidatorExName && !Page_Validators[i].id.endsWith('_Core')) ValidatorValidate(Page_Validators[i]);\r\n }\r\n }\r\n }\r\n return;\r\n}\r\n\r\nfunction GetCoreIsValid(val) {\r\n if ((typeof (Page_Validators) != \"undefined\") && (Page_Validators != null)) {\r\n for (var i = 0; i < Page_Validators.length; i++) {\r\n if (typeof (val.ValidatorExName) != \"undefined\") {\r\n if (val.ValidatorExName == Page_Validators[i].ValidatorExName && val.id != Page_Validators[i].id) {\r\n if (!Page_Validators[i].isvalid) { return false; }\r\n }\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nfunction getCoreValidator(val) {\r\n if ((typeof (Page_Validators) != \"undefined\") && (Page_Validators != null)) {\r\n for (var i = 0; i < Page_Validators.length; i++) {\r\n if (typeof (val.ValidatorExName) != \"undefined\") {\r\n if (val.ValidatorExName == Page_Validators[i].ValidatorExName && Page_Validators[i].id.endsWith('_Core')) return Page_Validators[i];\r\n }\r\n }\r\n }\r\n return;\r\n}\r\n\r\n//\r\n//Misc\r\n//\r\nfunction IsValidationGroupValid(validationGroup) {\r\n if (!validationGroup) validationGroup = '';\r\n if (typeof (Page_Validators) == \"undefined\") return true;\r\n for (var i = 0; i < Page_Validators.length; i++) {\r\n var val = Page_Validators[i];\r\n var valValidationGroup = val.validationGroup;\r\n if (!valValidationGroup) valValidationGroup = '';\r\n if ((typeof (val.enabled) == \"undefined\" || val.enabled != false) && valValidationGroup == validationGroup) {\r\n if (!val.id.endsWith('_Core')) {\r\n if (!val.isvalid) return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n//\r\n//Summary Error Highlighting\r\n//\r\nfunction UpdateValidationSummariesAutoAction() {\r\n if (typeof (Page_ValidationSummaries) == \"undefined\") return;\r\n var summary, sums, s;\r\n var headerSep, first, pre, post, end;\r\n for (sums = 0; sums < Page_ValidationSummaries.length; sums++) {\r\n summary = Page_ValidationSummaries[sums];\r\n if (!summary) continue;\r\n if (summary.AutoUpdateSummaryValidationMessages == 'true') {\r\n summary.style.display = \"none\";\r\n if (!IsValidationGroupValid(summary.validationGroup)) {\r\n var i;\r\n if (typeof (summary.showsummary) != \"undefined\") {\r\n if (summary.showsummary.toLowerCase() != \"false\") {\r\n summary.style.display = \"\";\r\n if (typeof (summary.displaymode) != \"string\") {\r\n summary.displaymode = \"BulletList\";\r\n }\r\n switch (summary.displaymode) {\r\n case \"List\":\r\n headerSep = \"
    \";\r\n first = \"\";\r\n pre = \"\";\r\n post = \"
    \";\r\n end = \"\";\r\n break;\r\n case \"BulletList\":\r\n default:\r\n headerSep = \"\";\r\n first = \"
      \";\r\n pre = \"
    • \";\r\n post = \"
    • \";\r\n end = \"
    \";\r\n break;\r\n case \"SingleParagraph\":\r\n headerSep = \" \";\r\n first = \"\";\r\n pre = \"\";\r\n post = \" \";\r\n end = \"
    \";\r\n break;\r\n }\r\n s = \"\";\r\n if (typeof (summary.headertext) == \"string\") {\r\n s += summary.headertext + headerSep;\r\n }\r\n s += first;\r\n for (i = 0; i < Page_Validators.length; i++) {\r\n var summaryValidationGroup = summary.validationGroup;\r\n if (!summaryValidationGroup) summaryValidationGroup = '';\r\n var valValidationGroup = Page_Validators[i].validationGroup;\r\n if (!valValidationGroup) valValidationGroup = '';\r\n if (!Page_Validators[i].isvalid && typeof (Page_Validators[i].errormessage) == \"string\" && valValidationGroup == summaryValidationGroup) {\r\n s += pre + Page_Validators[i].errormessage + post;\r\n }\r\n }\r\n s += end;\r\n summary.innerHTML = s;\r\n window.scrollTo(0, 0);\r\n }\r\n }\r\n if (typeof (summary.showmessagebox) != \"undefined\") {\r\n if (summary.showmessagebox.toLowerCase() == \"true\") {\r\n s = \"\";\r\n if (typeof (summary.headertext) == \"string\") {\r\n s += summary.headertext + \"\\r\\n\";\r\n }\r\n var lastValIndex = Page_Validators.length - 1;\r\n for (i = 0; i <= lastValIndex; i++) {\r\n var summaryValidationGroup = summary.validationGroup;\r\n if (!summaryValidationGroup) summaryValidationGroup = '';\r\n var valValidationGroup = Page_Validators[i].validationGroup;\r\n if (!valValidationGroup) valValidationGroup = '';\r\n if (!Page_Validators[i].isvalid && typeof (Page_Validators[i].errormessage) == \"string\" && valValidationGroup == summaryValidationGroup) {\r\n switch (summary.displaymode) {\r\n case \"List\":\r\n s += Page_Validators[i].errormessage;\r\n if (i < lastValIndex) {\r\n s += \"\\r\\n\";\r\n }\r\n break;\r\n case \"BulletList\":\r\n default:\r\n s += \"- \" + Page_Validators[i].errormessage;\r\n if (i < lastValIndex) {\r\n s += \"\\r\\n\";\r\n }\r\n break;\r\n case \"SingleParagraph\":\r\n s += Page_Validators[i].errormessage + \" \";\r\n break;\r\n }\r\n }\r\n }\r\n alert(s);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n UpdateSummaryWrappers();\r\n}\r\n\r\n//\r\n//Field Error Highlighting\r\n//\r\nfunction RocktimeValidateExSetHighlight(val) {\r\n if (!val) return;\r\n if (GetCoreIsValid(val)) {\r\n RocktimeValidateClass(val, true);\r\n RocktimeValidateBorderCss(val, val.borderColorNormal);\r\n return;\r\n }\r\n RocktimeValidateClass(val, false);\r\n RocktimeValidateBorderCss(val, val.borderColorError);\r\n}\r\n\r\nfunction RocktimeValidateClass(val, removeClass) {\r\n if (val.fieldErrorClass == '') { return; }\r\n if ($('#' + val.controltovalidate) == undefined) { return; }\r\n if (typeof (val.enabled) != \"undefined\" && !val.enabled) { return; }\r\n\r\n var valueMe = ValidatorGetValue(val.controltovalidate);\r\n //var valueCmp = $('#' + val.controltocompare).val();\r\n var targetCmp = $('#' + val.fieldErrorClassCompareTarget);\r\n var hasCmp = (val.fieldErrorClassCompareTarget != undefined && val.fieldErrorClassCompareTarget != '' && valueMe != '');\r\n\r\n if (removeClass) {\r\n $('#' + val.fieldErrorClassTarget).removeClass(val.fieldErrorClass);\r\n if (hasCmp) targetCmp.removeClass(val.fieldErrorClass);\r\n\r\n }\r\n else {\r\n $('#' + val.fieldErrorClassTarget).addClass(val.fieldErrorClass);\r\n if (hasCmp) targetCmp.addClass(val.fieldErrorClass);\r\n\r\n }\r\n RocktimeValidateClassForMultiLine(val, removeClass);\r\n}\r\n\r\nfunction RocktimeValidateClassForMultiLine(val, removeClass) {\r\n RocktimeValidateClassForMultiLineAction($('#' + val.fieldErrorClassTarget).parent().parent().find(\".rtRECView\"), val, removeClass);\r\n RocktimeValidateClassForMultiLineAction($('#' + val.fieldErrorClassTarget).parent().parent().find(\".rtTACView\"), val, removeClass);\r\n RocktimeValidateClassForMultiLineAction($('#' + val.fieldErrorClassTarget).parent().parent().parent().find(\".rtTACView\"), val, removeClass);\r\n}\r\n\r\nfunction RocktimeValidateClassForMultiLineAction(target, val, removeClass) {\r\n if (target == null) { return };\r\n if (removeClass) {\r\n target.removeClass(val.fieldErrorClass);\r\n }\r\n else {\r\n target.addClass(val.fieldErrorClass);\r\n }\r\n}\r\n\r\nfunction RocktimeValidateBorderCss(val, borderColor) {\r\n if (borderColor == '') { return; }\r\n $('#' + val.fieldErrorClassTarget).css('border-color', borderColor);\r\n if (val.controltocompare != '') { $('#' + val.controltocompare).css('border-color', borderColor); }\r\n}\r\n","//\r\n//Intercept and extend ValidationSummaryOnSubmit\r\n//\r\nvar ValidationSummaryOnSubmitSaved;\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n if (typeof (ValidationSummaryOnSubmit) == \"function\") {\r\n ValidationSummaryOnSubmitSaved = ValidationSummaryOnSubmit;\r\n ValidationSummaryOnSubmit = ValidationSummaryOnSubmitEx;\r\n }\r\n}\r\n)\r\n\r\nfunction ValidationSummaryOnSubmitEx(validationGroup) {\r\n ValidationSummaryOnSubmitSaved(validationGroup);\r\n UpdateSummaryWrappers(validationGroup);\r\n}\r\n\r\n//\r\n//Summary Update\r\n//\r\nfunction UpdateSummaryWrappers() {\r\n if (typeof (Page_ValidationSummaries) == \"undefined\") return;\r\n for (var sums = 0; sums < Page_ValidationSummaries.length; sums++) {\r\n var summary = Page_ValidationSummaries[sums];\r\n if (!summary) continue;\r\n var summaryTarget = GetSummaryTarget(summary.validationGroup);\r\n if (SummaryHasEMShowing(summaryTarget) || SummaryIsVisible(summaryTarget)) $(summaryTarget).show();\r\n else $(summaryTarget).hide();\r\n }\r\n}\r\n\r\nfunction SummaryIsVisible(summaryTarget) {\r\n if ($(summaryTarget + ' .error-componant__validator').css('display') == 'none') return false;\r\n return true;\r\n}\r\n\r\nfunction SummaryHasEMShowing(summaryTarget) {\r\n return ($(summaryTarget).attr('data-state-has-em') == 'true');\r\n}\r\n\r\nfunction GetSummaryTarget(validationGroup) {\r\n var summaryTarget = validationGroup;\r\n if (!summaryTarget || summaryTarget == '') summaryTarget = 'no-group';\r\n summaryTarget = '.error-componant-' + summaryTarget;\r\n return summaryTarget;\r\n}\r\n\r\n","// Custom browser upload feature that hides features upon button clicks, and changes the browser default input file type to use a custom build input workaround\r\nvar uploader = {};\r\n\r\nuploader.bind = function () {\r\n uploader.initFakeInput();\r\n\r\n uploader.cancelBtn.off(\"click\").on(\"click\", function () {\r\n\r\n uploader.removeFile($(this));\r\n uploader.hideFileInput($(this));\r\n uploader.showFileDetails($(this));\r\n });\r\n\r\n uploader.replaceBtn.off(\"click\").on(\"click\", function () {\r\n\r\n uploader.hideFileDetails($(this));\r\n uploader.showFileInput($(this));\r\n });\r\n};\r\n\r\nuploader.initFakeInput = function () {\r\n for (var i = 0; i < uploader.container.length; i++) {\r\n var container = $(uploader.container[i]);\r\n var imageUpload = container.find(uploader.inputTarget);\r\n\r\n imageUpload.on(\"change\", function () {\r\n\r\n var uploadMsg = $(this).parents(\".\" + uploader.containerClass).find(\".\" + uploader.fileUploadMsgClass),\r\n input = this.files[0],\r\n text,\r\n val = $(this).val();\r\n\r\n if (input) {\r\n text = 'Selected File to upload: ' + val.replace(/.*\\\\(.+)/g, \"$1\") + \"\";\r\n } else {\r\n text = 'Please select a file';\r\n }\r\n\r\n uploadMsg.html(text);\r\n });\r\n }\r\n};\r\n\r\nuploader.removeFile = function (selected) {\r\n var container = selected.parents(\".\" + uploader.containerClass);\r\n var input = container.find(uploader.inputTarget);\r\n var uploadMsg = container.find(\".\" + uploader.fileUploadMsgClass);\r\n\r\n input.val(\"\");\r\n uploadMsg.html(\"No File Selected\");\r\n};\r\n\r\nuploader.hideFileInput = function (selected) {\r\n var container = selected.parents(\".\" + uploader.containerClass);\r\n var fileOpts = container.find(\".\" + uploader.fileOptsClass);\r\n fileOpts.addClass(uploader.fileOptsHiddenClass);\r\n};\r\n\r\nuploader.showFileInput = function (selected) {\r\n var container = selected.parents(\".\" + uploader.containerClass);\r\n var fileOpts = container.find(\".\" + uploader.fileOptsClass);\r\n fileOpts.removeClass(uploader.fileOptsHiddenClass);\r\n var input = container.find(uploader.inputTarget);\r\n input.focus();\r\n};\r\n\r\nuploader.hideFileDetails = function (selected) {\r\n var container = selected.parents(\".\" + uploader.containerClass);\r\n var fileDetails = container.find(\".\" + uploader.fileDetailsClass);\r\n fileDetails.addClass(uploader.fileDetailsHiddenClass);\r\n};\r\n\r\nuploader.showFileDetails = function (selected) {\r\n var container = selected.parents(\".\" + uploader.containerClass);\r\n var fileDetails = container.find(\".\" + uploader.fileDetailsClass);\r\n fileDetails.removeClass(uploader.fileDetailsHiddenClass);\r\n fileDetails.find(\".\" + uploader.replaceBtnClass).focus();\r\n};\r\n\r\nuploader.init = function () {\r\n if (typeof jQuery == 'undefined') return;\r\n uploader.containerClass = \"c-file-upload\";\r\n uploader.cancelBtnClass = \"c-file-upload__cancel\";\r\n uploader.replaceBtnClass = \"c-file-upload__replace\";\r\n uploader.fileOptsClass = \"c-file-upload__file-opts\";\r\n uploader.fileOptsHiddenClass = \"c-file-upload__file-opts--hidden\";\r\n uploader.fileDetailsClass = \"c-file-upload__file-details\";\r\n uploader.fileDetailsHiddenClass = \"c-file-upload__file-details--hidden\";\r\n uploader.fileUploadMsgClass = \"c-file-upload__upload-msg\";\r\n uploader.inputTarget = \"input[type=file]\";\r\n\r\n uploader.container = $(\".\" + uploader.containerClass);\r\n uploader.fileInput = uploader.container.find(uploader.inputTarget);\r\n\r\n if (uploader.fileInput.length > 0) {\r\n\r\n uploader.cancelBtn = uploader.container.find(\".\" + uploader.cancelBtnClass);\r\n uploader.replaceBtn = uploader.container.find(\".\" + uploader.replaceBtnClass);\r\n\r\n uploader.bind();\r\n }\r\n};\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n uploader.init();\r\n});\r\n","var cbox = {};\r\n\r\ncbox.onComplete = function (id, width, height, timerInMSecs) {\r\n\r\n var minWidth = 250,\r\n minHeight = 75,\r\n maxHeight = 450,\r\n x = 0,\r\n y=0;\r\n if (width == 'auto') x = $('#' + id).width() + 20; else x = width;\r\n if (timerInMSecs === 0) x += 60;\r\n if (x < minWidth) x = minWidth;\r\n\r\n if (width == 'auto') y = $('#' + id).height() + 15; else y = height;\r\n if (y < minHeight) y = minHeight;\r\n if (y > maxHeight) y = maxHeight;\r\n\r\n $.colorbox.resize({ width: x, height: y })\r\n\r\n}","/*************************************\r\n- The (read) 'more' and (read) 'less' links on the end of some lengthy sentences\r\n**************************************/\r\n\r\nvar readToggleButton = {};\r\n\r\nreadToggleButton.bind = function () {\r\n for (var i = 0; i < readToggleButton.readMoreBtn.length; i++) {\r\n readToggleButton.showText(i);\r\n }\r\n\r\n for (var i = 0; i < readToggleButton.readLessBtn.length; i++) {\r\n readToggleButton.hideText(i);\r\n }\r\n};\r\n\r\nreadToggleButton.showText = function (i) {\r\n $(readToggleButton.readMoreBtn[i])\r\n .off(\"click.show\")\r\n .on(\"click.show\", function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n\r\n readToggleButton.innerSpan = this.parentNode;\r\n readToggleButton.outerSpan = readToggleButton.innerSpan.parentNode;\r\n readToggleButton.label = readToggleButton.outerSpan.parentNode;\r\n\r\n readToggleButton.textMin = readToggleButton.label.getElementsByClassName(readToggleButton.moreTextMinClass)[0];\r\n readToggleButton.textMax = readToggleButton.label.getElementsByClassName(readToggleButton.moreTextMaxClass)[0];\r\n\r\n readToggleButton.textMin.classList.add(\"hidden\");\r\n readToggleButton.textMax.classList.add(\"show\");\r\n return false;\r\n });\r\n};\r\n\r\nreadToggleButton.hideText = function (i) {\r\n $(readToggleButton.readLessBtn[i])\r\n .off(\"click.hide\")\r\n .on(\"click.hide\", function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n\r\n readToggleButton.innerSpan = this.parentNode;\r\n readToggleButton.outerSpan = readToggleButton.innerSpan.parentNode;\r\n readToggleButton.label = readToggleButton.outerSpan.parentNode;\r\n\r\n readToggleButton.textMin = readToggleButton.label.getElementsByClassName(readToggleButton.moreTextMinClass)[0];\r\n readToggleButton.textMax = readToggleButton.label.getElementsByClassName(readToggleButton.moreTextMaxClass)[0];\r\n\r\n readToggleButton.textMin.classList.remove(\"hidden\");\r\n readToggleButton.textMax.classList.remove(\"show\");\r\n return false;\r\n });\r\n};\r\n\r\nreadToggleButton.init = function () {\r\n if (document.getElementsByClassName(\"more-text__button-show\").length > 0) {\r\n readToggleButton.moreTextMinClass = \"more-text__min\";\r\n readToggleButton.moreTextMaxClass = \"more-text__max\";\r\n\r\n readToggleButton.readMoreBtn = document.getElementsByClassName(\r\n \"more-text__button-show\"\r\n );\r\n readToggleButton.readLessBtn = document.getElementsByClassName(\r\n \"more-text__button-hide\"\r\n );\r\n\r\n readToggleButton.bind();\r\n }\r\n};\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n readToggleButton.init();\r\n});","var scrollToView = function (elem, speed) {\r\n\r\n var scrollTarget = elem;\r\n\r\n $(\"html,body\").animate({\r\n scrollTop: scrollTarget.offset().top\r\n }, speed);\r\n\r\n return false;\r\n};","var actionSkipLink = function (id) {\r\n var elem = $(\"#\" + id);\r\n\r\n elem.focus();\r\n scrollToView(elem, 0);\r\n};","//Setup DOB Controls\r\nfunction parentId(senderId) {\r\n return senderId.replace(\"_Year\", \"\").replace(\"_Month\", \"\").replace(\"_Day\", \"\").replaceAll(\"$\", \"_\");\r\n}\r\n\r\n//function updateDroplistDays(sender, eventArgs) { \r\n// var senderId = parentId(sender._uniqueId);\r\n// var day = $find(senderId + \"_Day\");\r\n// var month = $find(senderId + \"_Month\");\r\n// var year = $find(senderId + \"_Year\");\r\n// day.trackChanges();\r\n\r\n// var daySelectedItem = day.get_selectedItem();\r\n// var monthSelectedItem = month.get_selectedItem();\r\n// var yearSelectedItem = year.get_selectedItem();\r\n\r\n// var dIM = daysInMonth(monthSelectedItem.get_value(), yearSelectedItem.get_value());\r\n// if (daySelectedItem != undefined) { if (daySelectedItem.get_value() > dIM) { day.getItem(0).set_selected(true); } }\r\n\r\n// var Item29 = day.findItemByValue(29);\r\n// var Item30 = day.findItemByValue(30);\r\n// var Item31 = day.findItemByValue(31);\r\n\r\n// if (Item29 != undefined) { Item29.set_visible(dIM >= 29); }\r\n// if (Item30 != undefined) { Item30.set_visible(dIM >= 30); }\r\n// if (Item31 != undefined) { Item31.set_visible(dIM >= 31); }\r\n\r\n// day.commitChanges();\r\n// updateValue(sender, eventArgs);\r\n//}\r\n\r\nfunction updateSelectValue(changedCheckbox) {\r\n var senderId = parentId(changedCheckbox.id);\r\n var control = document.getElementById(senderId);\r\n if (control.yearValue() == -1 && control.monthValue() == -1 && control.dayValue() == -1) {\r\n control.value = \"-1\";\r\n $(\"#\" + senderId).parents('.' + $('#' + senderId).attr('data-parent')).removeClass($('#' + senderId).attr('data-active-class'));\r\n }\r\n else if (control.yearValue() != \"\" && control.monthValue() != \"\" && control.dayValue() != \"\" && control.yearValue() != -1 && control.monthValue() != -1 && control.dayValue() != -1) {\r\n var y = control.yearValue();\r\n var m = (parseInt(control.monthValue()) > 9 ? \"\" : \"0\") + parseInt(control.monthValue());\r\n var d = (parseInt(control.dayValue()) > 9 ? \"\" : \"0\") + parseInt(control.dayValue());\r\n control.value = y + \"-\" + m + \"-\" + d;\r\n $(\"#\" + senderId).parents('.' + $('#' + senderId).attr('data-parent')).addClass($('#' + senderId).attr('data-active-class'));\r\n }\r\n else {\r\n control.value = \"\";\r\n $(\"#\" + senderId).parents('.' + $('#' + senderId).attr('data-parent')).removeClass($('#' + senderId).attr('data-active-class'));\r\n }\r\n if ((control.FiredValidation == 'true') || (control.yearValue() != \"\" && control.monthValue() != \"\" && control.dayValue() != \"\")) {\r\n control.FiredValidation = 'true';\r\n Page_ClientValidateByControl(parentId(changedCheckbox.id));\r\n }\r\n else {\r\n control.value = \"Error!\";\r\n Page_ClientValidateByControl(parentId(changedCheckbox.id));\r\n control.value = \"\";\r\n }\r\n}\r\n\r\nfunction updateValue(sender, eventArgs) {\r\n var senderId = parentId(sender._uniqueId);\r\n var control = document.getElementById(senderId);\r\n if (control.yearValue() == -1 && control.monthValue() == -1 && control.dayValue() == -1) {\r\n control.value = \"-1\";\r\n $(\"#\" + senderId).parents('.' + $('#' + senderId).attr('data-parent')).removeClass($('#' + senderId).attr('data-active-class'));\r\n }\r\n else if (control.yearValue() != \"\" && control.monthValue() != \"\" && control.dayValue() != \"\" && control.yearValue() != -1 && control.monthValue() != -1 && control.dayValue() != -1) {\r\n var y = control.yearValue();\r\n var m = (parseInt(control.monthValue()) > 9 ? \"\" : \"0\") + parseInt(control.monthValue());\r\n var d = (parseInt(control.dayValue()) > 9 ? \"\" : \"0\") + parseInt(control.dayValue());\r\n control.value = y + \"-\" + m + \"-\" + d;\r\n $(\"#\" + senderId).parents('.' + $('#' + senderId).attr('data-parent')).addClass($('#' + senderId).attr('data-active-class'));\r\n }\r\n else {\r\n control.value = \"\";\r\n $(\"#\" + senderId).parents('.' + $('#' + senderId).attr('data-parent')).removeClass($('#' + senderId).attr('data-active-class'));\r\n }\r\n if ((control.FiredValidation == 'true') || (control.yearValue() != \"\" && control.monthValue() != \"\" && control.dayValue() != \"\")) {\r\n control.FiredValidation = 'true';\r\n Page_ClientValidateByControl(parentId(sender._uniqueId));\r\n }\r\n}\r\n\r\n//function updateComboBoxDays(sender, eventArgs) {\r\n// updateComboBoxDaysAction(sender._uniqueId);\r\n// updateValue(sender, eventArgs);\r\n//}\r\n\r\n//function updateComboBoxDaysAction(senderId) {\r\n\r\n// senderId = parentId(senderId);\r\n// var jqDay = $(\"#\" + senderId + \"_Day\");\r\n// jqDay.removeClass('day-error');\r\n// jqDay.removeClass('day-error--custom');\r\n\r\n// var day = $find(senderId + \"_Day\");\r\n// var month = $find(senderId + \"_Month\");\r\n// var year = $find(senderId + \"_Year\");\r\n// day.trackChanges();\r\n\r\n// var daySelectedItem = day.get_selectedItem();\r\n// var monthSelectedItem = month.get_selectedItem();\r\n// var yearSelectedItem = year.get_selectedItem();\r\n\r\n// var dIM = daysInMonth(getValue(month), getValue(year));\r\n// if ((getValue(day) == -1 && getValue(month) != -1 && getValue(year) != -1) || getValue(day) > dIM) {\r\n// day.get_items().getItem(0).set_selected(true);\r\n// if (typeof day.set_text !== \"undefined\") { day.set_text(\"??\"); }\r\n// jqDay.addClass('day-error');\r\n// jqDay.addClass('day-error--custom');\r\n// }\r\n\r\n// var Item29 = day.findItemByValue(29);\r\n// var Item30 = day.findItemByValue(30);\r\n// var Item31 = day.findItemByValue(31);\r\n\r\n// if (Item29 != undefined) { Item29.set_visible(dIM >= 29); }\r\n// if (Item30 != undefined) { Item30.set_visible(dIM >= 30); }\r\n// if (Item31 != undefined) { Item31.set_visible(dIM >= 31); }\r\n\r\n// //if (dIM >= 29) {\r\n// // if (Item29 == undefined) {\r\n// // var newItem = new Telerik.Web.UI.RadComboBoxItem();\r\n// // newItem.set_text(\"29\");\r\n// // newItem.set_value(\"29\");\r\n// // day.get_items().add(newItem);\r\n// // }\r\n// //}\r\n// //else {\r\n// // if (Item29 != undefined) { day.get_items().remove(Item29); }\r\n// //}\r\n\r\n// //if (dIM >= 30) {\r\n// // if (Item30 == undefined) {\r\n// // var newItem = new Telerik.Web.UI.RadComboBoxItem();\r\n// // newItem.set_text(\"30\");\r\n// // newItem.set_value(\"30\");\r\n// // day.get_items().add(newItem);\r\n// // }\r\n// //}\r\n// //else {\r\n// // if (Item30 != undefined) { day.get_items().remove(Item30); }\r\n// //}\r\n\r\n// //if (dIM >= 31) {\r\n// // if (Item31 == undefined) {\r\n// // var newItem = new Telerik.Web.UI.RadComboBoxItem();\r\n// // newItem.set_text(\"31\");\r\n// // newItem.set_value(\"31\");\r\n// // day.get_items().add(newItem);\r\n// // }\r\n// //}\r\n// //else {\r\n// // if (Item31 != undefined) { day.get_items().remove(Item31); }\r\n// //}\r\n// day.commitChanges();\r\n//}\r\n\r\nfunction getValue(item) {\r\n if (typeof item.get_text !== \"undefined\") {\r\n var listItem = item.findItemByText(item.get_text());\r\n if (listItem) { return listItem.get_value(); }\r\n return \"\";\r\n } else if (typeof item.get_selectedItem === \"function\") {\r\n return item.get_selectedItem().get_value();\r\n } else {\r\n return item.value;\r\n }\r\n return \"\"\r\n}\r\n\r\nfunction daysInMonth(month, year) {\r\n if (month == undefined || year == undefined) { return 31; }\r\n if (isNaN(month)) { month = getValue(month); }\r\n if (isNaN(year)) { year = getValue(year); }\r\n if ((month == '' || month == -1) || (year == '' || year == -1)) { return 31; }\r\n return new Date(year, month, 0).getDate();\r\n}\r\n\r\nfunction dateControlSetup() {\r\n\r\n $('.date-droplist,.date-combobox').each(function () {\r\n document.getElementById(this.id).getValue = function () {\r\n if (this.isEmpty()) { return \"-1\"; }\r\n if (!this.isValid()) { return; }\r\n return (new Date(this.yearValue(), this.monthValue() - 1, this.dayValue()));\r\n };\r\n\r\n document.getElementById(this.id).value = \"\";\r\n\r\n document.getElementById(this.id).isValidDay = function () {\r\n //updateComboBoxDaysAction(this.id);\r\n if (this.isEmpty()) { return this.showAsValid(true); }\r\n if (this.dayValue() == \"\") { return this.showAsValid(false); }\r\n if (!this.isValidMonth) { return this.showAsValid(true); }\r\n if (!this.isValidYear) { return this.showAsValid(true); }\r\n if (daysInMonth(this.month(), this.year()) >= this.day()) { return this.showAsValid(false); }\r\n if (this.maxDate().getMonth() + 1 == this.monthValue()) { return this.showAsValid(this.maxDate().getDate() >= this.dayValue()) };\r\n if (this.minDate().getMonth() + 1 == this.monthValue()) { return this.showAsValid(this.minDate().getDate() <= this.dayValue()) };\r\n return this.showAsValid(true);\r\n };\r\n\r\n document.getElementById(this.id).isValidMonth = function () {\r\n //updateComboBoxDaysAction(this.id);\r\n if (this.isEmpty()) { return this.showAsValid(true); }\r\n if (this.monthValue() == \"\") { return this.showAsValid(false); }\r\n if (!this.isValidYear) { return this.showAsValid(true); } if (this.maxDate().getFullYear() == this.yearValue()) { return this.showAsValid(this.maxDate().getMonth() + 1 >= this.monthValue()) };\r\n if (this.minDate().getFullYear() == this.yearValue()) { return this.showAsValid(this.minDate().getMonth() + 1 <= this.monthValue()) };\r\n return this.showAsValid(true);\r\n };\r\n\r\n document.getElementById(this.id).isValidYear = function () {\r\n //updateComboBoxDaysAction(this.id);\r\n if (this.isEmpty()) { return this.showAsValid(true); }\r\n if (this.yearValue() == \"\") { return this.showAsValid(false); }\r\n if (this.yearValue() == -1) { return this.showAsValid(false); }\r\n return this.showAsValid(this.maxDate().getFullYear() >= this.yearValue()) && (this.minDate().getFullYear() <= this.yearValue());\r\n };\r\n\r\n document.getElementById(this.id).isValid = function () {\r\n //updateComboBoxDaysAction(this.id);\r\n if (this.isEmpty()) { return this.showAsValid(true); }\r\n return this.showAsValid(this.isValidYear() && this.isValidMonth() && this.isValidDay());\r\n };\r\n\r\n document.getElementById(this.id).showAsValid = function (HideError) {\r\n if (HideError) { this.classList.remove(\"RocktimeFieldErrorDate\"); }\r\n else { this.classList.add(\"RocktimeFieldErrorDate\"); }\r\n return (HideError);\r\n };\r\n\r\n document.getElementById(this.id).isEmpty = function () {\r\n return (this.yearValue() == \"-1\") && (this.monthValue() == \"-1\") && (this.dayValue() == \"-1\");\r\n };\r\n\r\n document.getElementById(this.id).maxDate = function () {\r\n var $field = $(this);\r\n var max = Date.parse($field.attr('data-maxdate'));\r\n if (!max) { return new Date(Date.maxValue); }\r\n return new Date(max);\r\n\r\n };\r\n\r\n document.getElementById(this.id).minDate = function () {\r\n var $field = $(this);\r\n var min = Date.parse($field.attr('data-mindate'));\r\n if (!min) { return new Date(Date.minValue); }\r\n return new Date(min);\r\n };\r\n\r\n document.getElementById(this.id).day = function () {\r\n if ($find(this.id + \"_Day\") != undefined) {\r\n return $find(this.id + \"_Day\");\r\n } else {\r\n return document.getElementById(this.id + \"_Day\");\r\n }\r\n };\r\n\r\n document.getElementById(this.id).month = function () {\r\n if ($find(this.id + \"_Month\") != undefined) {\r\n return $find(this.id + \"_Month\");\r\n } else {\r\n return document.getElementById(this.id + \"_Month\");\r\n }\r\n };\r\n\r\n document.getElementById(this.id).year = function () {\r\n if ($find(this.id + \"_Year\") != undefined) {\r\n return $find(this.id + \"_Year\");\r\n } else {\r\n return document.getElementById(this.id + \"_Year\");\r\n }\r\n };\r\n\r\n document.getElementById(this.id).dayValue = function () {\r\n return getValue(this.day());\r\n };\r\n\r\n document.getElementById(this.id).monthValue = function () {\r\n return getValue(this.month());\r\n };\r\n\r\n document.getElementById(this.id).yearValue = function () {\r\n return getValue(this.year());\r\n };\r\n\r\n })\r\n\r\n $('.AutoAdvance Input, Input.AutoAdvance').blur(\r\n function () {\r\n $(this).removeClass('day-error');\r\n $(this).removeClass('day-error--custom');\r\n }\r\n )\r\n\r\n $('.AutoAdvance Input, Input.AutoAdvance').keyup(function (e) {\r\n if (e.keyCode < 48 && e.keyCode != 8) { return }\r\n if (e.keyCode > 105) { return }\r\n var $field = $(this);\r\n var $dataOptions = $(this).closest('.AutoAdvance');\r\n var $previousField = $('#' + $dataOptions.attr('data-autoadvance-previous') + ' Input, Input#' + $dataOptions.attr('data-autoadvance-previous'));\r\n var $nextField = $('#' + $dataOptions.attr('data-autoadvance-next') + ' Input, Input#' + $dataOptions.attr('data-autoadvance-next'));\r\n var maxchars = parseInt($dataOptions.attr('data-autoadvance-maxchars'), 10);\r\n var numbersOnly = ($dataOptions.attr('data-autoadvance-numbersonly') == \"true\");\r\n var isComboBox = ($dataOptions.attr('data-autoadvance-iscombobox') == \"true\");\r\n var allowcomboboxfreetext = ($dataOptions.attr('data-autoadvance-allowcomboboxfreetext') == \"true\");\r\n var fieldVar = $field.val().trim();\r\n\r\n if (isComboBox) {\r\n var Dl = $find(this.id.replace(\"_Input\", \"\"));\r\n if (Dl) {\r\n Dl.hideDropDown();\r\n\r\n if (!allowcomboboxfreetext && fieldVar != '1') {\r\n maxchars = 10;\r\n var result = checkComboBoxValue(Dl);\r\n if (result == -1) { return };\r\n if (result != 0) { fieldVar = result; maxchars = fieldVar.length; }\r\n }\r\n }\r\n }\r\n\r\n if (numbersOnly && isNaN(fieldVar)) {\r\n $field.val(fieldVar.substring(0, previousmaxchars - 1));\r\n return\r\n }\r\n\r\n if (e.keyCode == 8) {\r\n if ($dataOptions.attr('data-autoadvance-previous') != undefined) {\r\n if ($dataOptions.attr('isEmpty') == 'true' && fieldVar == '') {\r\n var $previousDataOptions = $previousField.closest('.AutoAdvance');\r\n var previousmaxchars = parseInt($previousDataOptions.attr('data-autoadvance-maxchars'), 10);\r\n $previousDataOptions.attr('isEmpty', false);\r\n $previousField.focus();\r\n $previousField.val($previousField.val().substring(0, previousmaxchars - 1));\r\n }\r\n $dataOptions.attr('isEmpty', (fieldVar == ''));\r\n }\r\n return;\r\n }\r\n\r\n $dataOptions.attr('isEmpty', true);\r\n if (fieldVar.length >= maxchars) {\r\n if ($dataOptions.attr('data-autoadvance-next') != undefined) {\r\n var $nextDataOptions = $nextField.closest('.AutoAdvance');\r\n $nextField.focus();\r\n $nextField.select();\r\n if (!fieldVar.substring(maxchars) == \"\") { $nextField.val(fieldVar.substring(maxchars)); }\r\n $nextDataOptions.attr('isEmpty', false);\r\n }\r\n $field.val(fieldVar.substring(0, maxchars));\r\n return;\r\n }\r\n });\r\n\r\n function checkComboBoxValue(Dl) {\r\n\r\n var textInTheCombo = Dl.get_text();\r\n for (var i = 0; i < Dl.get_items().get_count(); i++) {\r\n var item = Dl.get_items().getItem(i);\r\n if (item.get_text() == textInTheCombo || item.get_text() == textInTheCombo.toTitleCase() || item.get_value() == textInTheCombo) {\r\n Dl.trackChanges();\r\n Dl.set_text(item.get_text());\r\n Dl.commitChanges();\r\n return item.get_text();\r\n }\r\n if (item.get_text().startsWith(textInTheCombo) || item.get_text().startsWith(textInTheCombo.toTitleCase()) || item.get_value().startsWith(textInTheCombo)) {\r\n return 0;\r\n }\r\n }\r\n\r\n Dl.showDropDown();\r\n Dl.trackChanges();\r\n Dl.get_items().getItem(0).set_selected(true);\r\n Dl.set_text(\"\");\r\n var inputElement = Dl.get_inputDomElement();\r\n inputElement.focus();\r\n Dl.commitChanges();\r\n return -1;\r\n }\r\n\r\n}","var popoutMessagePanel = {};\r\n\r\npopoutMessagePanel.bind = function () {\r\n popoutMessagePanel.ctrl.addEventListener('click', function () { popoutMessagePanel.toggleView(); });\r\n popoutMessagePanel.viewClose.addEventListener('click', function () { popoutMessagePanel.toggleView(); });\r\n popoutMessagePanel.view.addEventListener('click', popoutMessagePanel.clearLoadTime);\r\n popoutMessagePanel.view.addEventListener('dblclick', popoutMessagePanel.closeView);\r\n};\r\n\r\npopoutMessagePanel.clearLoadTime = function () {\r\n clearTimeout(popoutMessagePanel.loadTimer);\r\n popoutMessagePanel.view.removeEventListener('click', popoutMessagePanel.clearLoadTime);\r\n};\r\n\r\npopoutMessagePanel.toggleView = function () {\r\n if (popoutMessagePanel.mainDiv.classList.contains(popoutMessagePanel.mainDivHiddenClass)) {\r\n popoutMessagePanel.openView();\r\n return;\r\n }\r\n popoutMessagePanel.closeView();\r\n\r\n};\r\n\r\npopoutMessagePanel.closeView = function () {\r\n popoutMessagePanel.mainDiv.classList.add(popoutMessagePanel.mainDivHiddenClass);\r\n // popoutMessagePanel.view.style.maxHeight = 0 + \"px\";\r\n popoutMessagePanel.view.style.height = 0 + \"px\";\r\n};\r\n\r\npopoutMessagePanel.openView = function () {\r\n popoutMessagePanel.mainDiv.classList.remove(popoutMessagePanel.mainDivHiddenClass);\r\n popoutMessagePanel.view.style.height = window.innerHeight + \"px\";\r\n // popoutMessagePanel.view.style.maxHeight = window.innerHeight + \"px\";\r\n};\r\n\r\npopoutMessagePanel.load = function () {\r\n popoutMessagePanel.loadTimer = setTimeout(function () {\r\n popoutMessagePanel.closeView();\r\n popoutMessagePanel.view.removeEventListener('click', popoutMessagePanel.clearLoadTime);\r\n }, popoutMessagePanel.loadDisplayTime);\r\n};\r\n\r\npopoutMessagePanel.init = function () {\r\n popoutMessagePanel.mainDiv = document.getElementsByClassName('c-popout-message-panel')[0];\r\n popoutMessagePanel.view = document.getElementsByClassName('c-popout-message-panel__view')[0];\r\n if (!popoutMessagePanel.view) return;\r\n popoutMessagePanel.ctrl = document.getElementsByClassName('c-popout-message-panel__ctrl-button')[0];\r\n popoutMessagePanel.viewClose = document.getElementsByClassName('c-popout-message-panel__view-close')[0];\r\n popoutMessagePanel.mainDivHiddenClass = 'c-popout-message-panel--hidden';\r\n popoutMessagePanel.loadDisplayTime = 500;\r\n popoutMessagePanel.openView();\r\n popoutMessagePanel.bind();\r\n popoutMessagePanel.load();\r\n\r\n};\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n popoutMessagePanel.init();\r\n});","if (!SIDAction) { var SIDAction = {}; }\r\n\r\n//Click+ (Result Types)\r\n//Ctrl : Short Default Action(Input -> .Input.TextBox(\"sid\",) or Get -> .Find(\"sid\")\r\n//Alt : Short Get -> .Find(\"sid\")\r\n//Shift : SID only -> \"sid\"\r\n//Ctrl + Shift: Long Default Action(Input -> Driver.Input.TextBox(\"sid\",) or Get -> Driver.Find(\"sid\")\r\n//Alt + Shift : Long Get -> Driver.Get(\"sid\")\r\n\r\nSIDAction.getKey = function (codeType, SID) {\r\n\r\n var codeFunctions;\r\n var preventDefault = false;\r\n switch (codeType) {\r\n\r\n //Standard And Standard Ex Commands =============================================================================================================\r\n case 'TextBox':\r\n case 'TextBoxEx':\r\n case 'UrlTextBoxEx':\r\n codeFunctions = ['.Input.TextBox(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'RadioButtonList':\r\n codeFunctions = ['.Input.RadioButton(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'ListBox':\r\n codeFunctions = ['.Input.ListBox(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'DropDownList':\r\n codeFunctions = ['.Input.Dropdown(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'DateDropList':\r\n codeFunctions = ['.Input.DateDropList(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'CheckBoxList':\r\n codeFunctions = ['.Input.CheckboxList(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'CheckBox':\r\n case 'CheckBoxEx':\r\n codeFunctions = ['.Input.Checkbox(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'FileUpload':\r\n case 'FileUploadEx':\r\n codeFunctions = ['.Input.FileUpload(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'RadioButton':\r\n codeFunctions = ['.Click(\"{0}\")\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'Label':\r\n case 'LabelEx':\r\n codeFunctions = ['.Find(\"{0}\").Text\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'PinButtonEx':\r\n codeFunctions = ['.Click(\"{0}\")\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'AnchorEx':\r\n codeFunctions = ['.Click(\"{0}\")\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'DateDropDownListEx':\r\n codeFunctions = ['.Input.DateDropDownList(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n\r\n\r\n //Rad And Rad Ex Commands =============================================================================================================\r\n //case'AccessibleRadEditor' : \r\n case 'RadCalendar':\r\n codeFunctions = ['.Input.Rad.DateDropDownList(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n //case'RadCheckBox' :\r\n //case'RadCheckBoxList' : \r\n case 'RadComboBox':\r\n codeFunctions = ['.Input.Rad.ComboBox(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'RadDatePicker':\r\n codeFunctions = ['.Input.Rad.DatePicker(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'RadDateTimePicker':\r\n codeFunctions = ['.Input.Rad.DateTimePicker(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'TimePicker':\r\n codeFunctions = ['.Input.Rad.TimePicker(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'RadDropDownList':\r\n codeFunctions = ['.Input.Rad.DropDownList_ByValue(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'RadMonthYearPicker':\r\n codeFunctions = ['.Input.Rad.MonthYearPicker(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'RadEditor':\r\n codeFunctions = ['.Input.Rad.Editor(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n //case'RadLabel' : \r\n case 'RadListBox':\r\n codeFunctions = ['.Input.Rad.Dropdown_ByValue(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n //case'RadMaskedTextBox' : \r\n //case'RadNumericTextBox' : \r\n //case'RadRadioButton' : \r\n //case'RadRadioButtonList' : \r\n //case'RadSlider' : \r\n //case'RadTextBox' : \r\n //case'RadToggleButton' :\r\n //case'RadUpload' : \r\n //case'RadColorPicker' :\r\n\r\n case 'DateRadComboBoxEx':\r\n codeFunctions = ['.Input.Rad.DateComboBox(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n case 'DateRadDropDownListEx':\r\n codeFunctions = ['.Input.Rad.DateDropDownList(\"{0}\",)\\n', '.Find(\"{0}\")', 'Driver'];\r\n break;\r\n\r\n\r\n\r\n //Button Commands =============================================================================================================\r\n case 'Button':\r\n case 'HyperLink':\r\n case 'ImageButton':\r\n case 'LinkButton':\r\n case 'ButtonEx':\r\n case 'HyperLinkEx':\r\n case 'ImageButtonEx':\r\n case 'LinkButtonEx':\r\n case 'RadButtonEx':\r\n case 'RadButton':\r\n case 'RadImageButton':\r\n case 'RadLinkButton':\r\n case 'CPControlButtonEx':\r\n case 'CPControlHyperLinkEx':\r\n case 'CPControlLinkButtonEx':\r\n codeFunctions = ['.Click(\"{0}\")\\n', '.Find(\"{0}\")', 'Driver'];\r\n preventDefault = true;\r\n break;\r\n\r\n case 'Validator':\r\n codeFunctions = ['.Get.Validator(\"{0}\").Assert.Is_Valid\\n', '.Get.Validator(\"{0}\")', 'Driver'];\r\n preventDefault = true;\r\n break;\r\n\r\n case 'NavWidget':\r\n codeFunctions = ['.Click_Nav(\"{0}\")', '.Click_Nav(\"{0}\")', 'Driver.Action.Control.Menu'];\r\n preventDefault = true;\r\n break;\r\n\r\n case 'CPControlButtonExNav':\r\n case 'CPControlHyperLinkExNav':\r\n case 'CPControlLinkButtonExNav':\r\n codeFunctions = ['.Click_Button(\"{0}\")', '.Click_Button(\"{0}\")', 'Driver.Action.Control.Menu'];\r\n preventDefault = true;\r\n break;\r\n\r\n case 'CPControlDashboardButtonEx':\r\n codeFunctions = ['.Dashboard()', '.Dashboard()', 'Driver.Action.Control.Menu'];\r\n preventDefault = true;\r\n break;\r\n\r\n case 'CPControlDashboardToggleButtonEx':\r\n codeFunctions = ['.DashboardToggle()', '.DashboardToggle()', 'Driver.Action.Control.Menu'];\r\n preventDefault = true;\r\n break;\r\n\r\n case 'CPControlDashboardBackButtonEx':\r\n codeFunctions = ['.DashboardBack()', '.DashboardBack()', 'Driver.Action.Control.Menu'];\r\n preventDefault = true;\r\n break;\r\n\r\n\r\n //Misc And Default Commands =============================================================================================================\r\n default:\r\n codeFunctions = ['{0}', '{0}', ''];\r\n break;\r\n\r\n }\r\n SIDAction.processKey(codeFunctions, SID, preventDefault)\r\n}\r\n\r\nSIDAction.processKey = function (codeFunctions, SID, preventDefault) {\r\n if (event.button != 2) return false;\r\n var selectedNetCode;\r\n if (event.shiftKey) selectedNetCode = '{0}';\r\n if (event.ctrlKey) selectedNetCode = codeFunctions[0];\r\n if (event.altKey) selectedNetCode = codeFunctions[1];\r\n if (event.ctrlKey && event.shiftKey) selectedNetCode = codeFunctions[2] + codeFunctions[0];\r\n if (event.altKey && event.shiftKey) selectedNetCode = codeFunctions[2] + codeFunctions[1];\r\n if (!selectedNetCode) return true;\r\n selectedNetCode = selectedNetCode.formatEx(SID);\r\n SIDAction.copyFnToClipboard(selectedNetCode);\r\n if (preventDefault) { event.preventDefault(); }\r\n return !preventDefault;\r\n}\r\n\r\nSIDAction.copyFnToClipboard = function (functionText) {\r\n navigator.clipboard.writeText(functionText);\r\n if (!window.Notification) return;\r\n if (Notification.permission !== 'granted') Notification.requestPermission();\r\n var notification = new Notification('Copied Function To Clipboard', { body: functionText, });\r\n setTimeout(() => { notification.close() }, 2500)\r\n};\r\n\r\nSIDAction.addClickEvent = function (targetId, fn) {\r\n var target = document.getElementById(targetId);\r\n if (!target) return;\r\n target.addEventListener('mousedown', fn);\r\n SIDAction.addContextMenuEvent();\r\n}\r\n\r\nSIDAction.addContextMenuEvent = function () {\r\n if (SIDAction.addContextMenuEventAdded) return;\r\n document.addEventListener('contextmenu', function (event) { SIDAction.processContextMenuKey(); }, true);\r\n SIDAction.addContextMenuEventAdded = true;\r\n}\r\n\r\nSIDAction.processContextMenuKey = function () {\r\n var preventDefault = false;\r\n if (event.shiftKey) preventDefault = true;\r\n if (event.ctrlKey) preventDefault = true;\r\n if (event.altKey) preventDefault = true;\r\n if (event.ctrlKey && event.shiftKey) preventDefault = true;\r\n if (event.altKey && event.shiftKey) preventDefault = true;\r\n if (!preventDefault) return true;\r\n event.preventDefault();\r\n return false;\r\n\r\n}\r\n\r\nSIDAction.genSIDKey = function (prefix, name, suffix) {\r\n name = (\"\" + name).match(/([A-Z]?[^A-Z]*)/g).slice(0, -1).join('-').toLowerCase();\r\n if (prefix != undefined) { name = prefix + \"-\" + name }\r\n if (suffix != undefined) { name = name + \"-\" + suffix }\r\n return name;\r\n}\r\n\r\n","if (!SIDAction) var SIDAction = {};\r\n\r\n//Click+ (Result Types)\r\n//Ctrl : Short Default Action(Input -> .Input.TextBox(\"sid\",) or Get -> .Find(\"sid\")\r\n//Alt : Short Get -> .Find(\"sid\")\r\n//Shift : SID only -> \"sid\"\r\n//Ctrl + Shift: Long Default Action(Input -> Driver.Input.TextBox(\"sid\",) or Get -> Driver.Find(\"sid\")\r\n//Alt + Shift : Long Get -> Driver.Get(\"sid\")\r\n\r\nSIDAction.getKeyCPC = function (codeType, SID) {\r\n\r\n switch (codeType) {\r\n case 'cpc-free-text-readonly': SIDAction.processKey(['.Get.CPC(\"{0}\").Get_ReadOnly\\n', '.Get.CPC(\"{0}\")', 'Driver'], SID, false);\r\n break;\r\n\r\n case 'cpc-number-readonly': SIDAction.processKey(['.Get.CPC(\"{0}\").Get_ReadOnly\\n', '.Get.CPC(\"{0}\")', 'Driver'], SID, false);\r\n break;\r\n\r\n case 'cpc-date-readonly': SIDAction.processKey(['.Get.CPC(\"{0}\").Get_ReadOnly\\n', '.Get.CPC(\"{0}\")', 'Driver'], SID, false);\r\n break;\r\n\r\n case 'cpc-time-readonly': SIDAction.processKey(['.Get.CPC(\"{0}\").Get_ReadOnly\\n', '.Get.CPC(\"{0}\")', 'Driver'], SID, false);\r\n break;\r\n\r\n case 'cpc-boolean-readonly': SIDAction.processKey(['.Get.CPC(\"{0}\").Get_ReadOnly\\n', '.Get.CPC(\"{0}\")', 'Driver'], SID, false);\r\n break;\r\n\r\n case 'cpc-string-readonly': SIDAction.processKey(['.Get.CPC(\"{0}\").Get_ReadOnly\\n', '.Get.CPC(\"{0}\")', 'Driver'], SID, false);\r\n break;\r\n\r\n case 'cpc-free-text': SIDAction.processKey(['.Get.CPC(\"{0}\").Input_ByFreeText(\"\")\\n', '.Get.CPC(\"{0}\")', 'Driver'], SID, false);\r\n break;\r\n\r\n case 'cpc-number': SIDAction.processKey(['.Get.CPC(\"{0}\").Input()\\n', '.Get.CPC(\"{0}\")', 'Driver'], SID, false);\r\n break;\r\n\r\n case 'cpc-date': SIDAction.processKey(['.Get.CPC(\"{0}\").Input(New Date())\\n', '.Get.CPC(\"{0}\")', 'Driver'], SID, false);\r\n break;\r\n\r\n case 'cpc-time': SIDAction.processKey(['.Get.CPC(\"{0}\").Input(New TimeSpan())\\n', '.Get.CPC(\"{0}\")', 'Driver'], SID, false);\r\n break;\r\n\r\n case 'cpc-boolean': SIDAction.processKey(['.Get.CPC(\"{0}\").Input()\\n', '.Get.CPC(\"{0}\")', 'Driver'], SID, false);\r\n break;\r\n\r\n default: SIDAction.processKey(['.Get.CPC(\"{0}\").Input(\"\")\\n', '.Get.CPC(\"{0}\")', 'Driver'], SID, false);\r\n }\r\n}\r\n\r\nSIDAction.updateSeleniumInfo = function (name, key, value, addStyle) {\r\n\r\n var rootElement = document.getElementById('selenium-info');\r\n if (rootElement.getElementsByTagName(name).length == 0) { rootElement.appendChild(document.createElement(name)) }\r\n\r\n var nameElement = rootElement.getElementsByTagName(name)[0];\r\n if (nameElement.getElementsByTagName(key).length == 0) { nameElement.appendChild(document.createElement(key)) }\r\n\r\n var keyElement = nameElement.getElementsByTagName(key)[0];\r\n if (addStyle) keyElement.style.display = 'table-row';\r\n keyElement.innerText = value;\r\n\r\n}","document.addEventListener(\"DOMContentLoaded\", function () {\r\n documentReady();\r\n});\r\n\r\n\r\nfunction documentReady() {\r\n\r\n if (typeof jQuery === 'undefined') {\r\n console.log(\"jquery is missing\");\r\n return;\r\n }\r\n //InIt\r\n setupHelp();\r\n editorsSetup();\r\n dateControlSetup();\r\n\r\n //Events\r\n $('.ViewImage').colorbox({ onComplete: function () { $.colorbox.resize(); $('#cboxClose').remove(); } });\r\n $(\"#CookieControlCentre,.CookieControlCentreFooter\").colorbox({ iframe: true, scrolling: true, width: \"80%\", height: \"80%\", closeButton: false, overlayClose: false, escKey: false });\r\n}\r\n\r\n//Init Functions\r\nvar isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0; // Opera 8.0+ (UA detection to detect Blink/v8-powered Opera) \r\nvar isFirefox = typeof InstallTrigger !== 'undefined'; // Firefox 1.0+ \r\nvar isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0; // At least Safari 3+: \"[object HTMLElementConstructor]\" \r\nvar isChrome = !!window.chrome && !isOpera; // Chrome 1+ \r\nvar isIE = /*@cc_on!@*/false || document.documentMode;\r\n\r\n\r\n","// For xml date+time;\r\n//Url\r\nfunction addTrailingDirSlash(url) {\r\n if (url == \"\") { return \"\" }\r\n url = url.replace(/\\/\\/+/gi, \"/\").toLowerCase();\r\n if (url.charAt(0) == '/') { url = url.substring(1) }\r\n if (url == \"\" || url == \"/\") { return \"\" }\r\n var urlParts = url.split(\"/\");\r\n if (urlParts[urlParts.length - 1].indexOf(\".\") !== -1) { return url }\r\n return (url + \"/\").replace(/\\/\\/+/gi, \"/\");\r\n}\r\n\r\n\r\n\r\n// Disable button\r\nfunction disableButtonOnClick(target, text, waitText, seconds) {\r\n Page_ClientValidate();\r\n if (!Page_IsValid) return false;\r\n return disableButton(target, text, waitText, seconds);\r\n}\r\n\r\nfunction disableButton(target, text, waitText, seconds) {\r\n if (target.countdownInterval != undefined) return false\r\n target.countdownValue = seconds;\r\n target.text = text;\r\n target.waitText = waitText;\r\n disableButtonCheck(target);\r\n target.countdownInterval = setInterval(() => { disableButtonCheck(target); }, 1000);\r\n return true;\r\n}\r\n\r\nfunction disableButtonCheck(target) {\r\n if (target.countdownValue <= 0) {\r\n target.disabled = false;\r\n target.value = target.text;\r\n target.classList.remove(\"aspNetDisabled\");\r\n clearInterval(target.countdownInterval);\r\n target.countdownInterval = null;\r\n }\r\n else {\r\n //target.disabled = true;\r\n target.value = target.text + \" \" + target.waitText + \" \" + target.countdownValue;\r\n target.classList.add(\"aspNetDisabled\");\r\n }\r\n target.countdownValue -= 1;\r\n}\r\n\r\nfunction setPopupParentHTML(src) {\r\n src = document.getElementById(src);\r\n var dest = top.document.getElementById('ParentPopupTarget');\r\n dest.innerHTML = src.innerHTML;\r\n}\r\n\r\n\r\n\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n var elements = document.getElementsByClassName(\"click-to-copy-me\")\r\n Array.from(elements).forEach(function (element) {\r\n element.addEventListener('click', (e) => {\r\n //debugger;\r\n var copyText = e.currentTarget.querySelector('.click-to-copy-me-text');\r\n var textArea = document.createElement(\"textarea\");\r\n var textContent = copyText.textContent\r\n textArea.value = textContent;\r\n document.body.appendChild(textArea);\r\n textArea.select();\r\n document.execCommand(\"Copy\");\r\n textArea.remove();\r\n\r\n var message = `'${textContent}'\\nhas been copied to your clipboard`;\r\n if (!(\"Notification\" in window)) {\r\n }\r\n else if (Notification.permission === \"granted\") {\r\n const notification = new Notification(message);\r\n }\r\n else if (Notification.permission !== \"denied\") {\r\n Notification.requestPermission().then((permission) => {\r\n if (permission === \"granted\") {\r\n const notification = new Notification(message);\r\n }\r\n });\r\n\r\n }\r\n });\r\n })\r\n})\r\n\r\n\r\n\r\n","//Setup Help\r\nfunction setupHelp() {\r\n $('.rtHelpButton').attr('href', 'javascript:void(0);');\r\n $('.rtHelpButton').attr('target', '');\r\n $('.rtHelpMessage').click(function () { $(this).hide(); });\r\n}\r\n\r\n\r\n//Help\r\nfunction rtHelpOpen(HelpMessage, LinkId) {\r\n $('#' + HelpMessage).text('Loading....');\r\n $('#' + HelpMessage).show();\r\n $('#' + HelpMessage).load('/help/summary/' + LinkId);\r\n}\r\n//Help\r\nfunction rtHelpOpenMessage(HelpMessage, Text) {\r\n $('#' + HelpMessage).html(Text);\r\n $('#' + HelpMessage).show();\r\n}","//TextArea\r\nfunction initTextAreas() {\r\n $(\".rtTACView\").each(function () {\r\n $(this).text($(this).parent().parent().find(\"TextArea\").text().replace(/\\n/gi, \"
    \").replace(/\\r/, \"\"));\r\n $(this).html($(this).html().replace(/<br \\/>/gi, \"
    \"));\r\n });\r\n $(\".rtTACEdit\").hide();\r\n}\r\n\r\nfunction moveCaretToEnd(el) {\r\n moveCaretTo(el, el.val().length, el.val().length)\r\n}\r\n\r\nfunction moveCaretTo(el, selectionStart, selectionEnd) {\r\n el.focus();\r\n var input = el[0];\r\n if (input.setSelectionRange) {\r\n selectionStart = adjustOffset(input, selectionStart);\r\n selectionEnd = adjustOffset(input, selectionEnd);\r\n input.setSelectionRange(selectionStart, selectionEnd);\r\n }\r\n else if (input.createTextRange) {\r\n var range = input.createTextRange();\r\n range.collapse(true);\r\n range.moveEnd('character', selectionEnd);\r\n range.moveStart('character', selectionStart);\r\n range.select();\r\n }\r\n else if (input.selection) {\r\n var range = input.createRange();\r\n range.collapse(true);\r\n range.moveEnd('character', selectionEnd);\r\n range.moveStart('character', selectionStart);\r\n range.select();\r\n }\r\n else {\r\n el.val(el.val());\r\n }\r\n};\r\n\r\nfunction adjustOffset(el, offset) {\r\n var val = el.value, newOffset = offset;\r\n if (val.indexOf(\"\\r\\n\") > -1) {\r\n var matches = val.replace(/\\r\\n/g, \"\\n\").slice(0, offset).match(/\\n/g);\r\n newOffset += matches ? matches.length : 0;\r\n }\r\n return newOffset;\r\n}","//ControlBaseEx\r\nElement.prototype.active = function (state) {\r\n if (state) {\r\n $(this).show();\r\n }\r\n else {\r\n $(this).hide();\r\n }\r\n return this.validationActive(state);\r\n};\r\n\r\nElement.prototype.validationActive = function (state) {\r\n var i;\r\n for (i = 0; i < Page_Validators.length; i++) {\r\n var eId = this.id;\r\n var vId = Page_Validators[i].id;\r\n if (vId.startsWith(eId)) { ValidatorEnableNoValidate(Page_Validators[i], state); }\r\n }\r\n return this;\r\n};\r\n\r\nfunction ValidatorEnableNoValidate(val, enable) {\r\n val.enabled = (enable != false);\r\n}\r\n\r\nfunction ToggleRadRadioButtonEx(val) {\r\n var button = $find(val);\r\n button.set_checked(!button.get_checked());\r\n}\r\n","//Functions\r\n//Grid\r\nfunction onRowDropping(sender, args, senderId, destId1, destId2, recycleBinId1, recycleBinId2, alertText, canSort) {\r\n if (sender.get_id() == senderId) {\r\n var node = args.get_destinationHtmlElement();\r\n if (isChildOf(senderId, node) || isChildOf(destId1, node) || isChildOf(destId2, node)) {\r\n }\r\n else if (isChildOf(recycleBinId1, node)) {\r\n if (confirm(alertText)) { args.set_destinationHtmlElement($get(recycleBinId1)); }\r\n else { args.set_cancel(true); }\r\n }\r\n else if (isChildOf(recycleBinId2, node)) {\r\n if (confirm(alertText)) { args.set_destinationHtmlElement($get(recycleBinId2)); }\r\n else { args.set_cancel(true); }\r\n }\r\n else {\r\n args.set_cancel(true);\r\n }\r\n }\r\n else {\r\n args.set_cancel(true);\r\n }\r\n}\r\n\r\n//Misc\r\nfunction isChildOf(parentId, element) {\r\n if (parentId == \"\") { return false; }\r\n while (element) {\r\n if (element.id && element.id.indexOf(parentId) > -1) {\r\n return true;\r\n }\r\n element = element.parentNode;\r\n }\r\n return false;\r\n}","//RadEditor\r\nfunction editorsSetup() {\r\n\r\n $(\".rtRECView\").click(function () {\r\n $(this).parent().parent().find(\".rtRECEdit\").show();\r\n $(this).parent().parent().find(\".rtRECView\").hide();\r\n $(this).parent().find(\".rtRECEditbtn\").hide();\r\n $(this).parent().find(\".rtRECViewbtn\").show();\r\n $find($(this).parent().find(\".RadEditor\").attr('id')).setFocus();\r\n moveCaretToEndRadEditor($find($(this).parent().find(\".RadEditor\").attr('id')));\r\n });\r\n\r\n $(\".rtRECEditbtn\").click(function () {\r\n $(this).parent().parent().find(\".rtRECEdit\").show();\r\n $(this).parent().parent().find(\".rtRECView\").hide();\r\n $(this).parent().find(\".rtRECEditbtn\").hide();\r\n $(this).parent().find(\".rtRECViewbtn\").show();\r\n $find($(this).parent().parent().find(\".RadEditor\").attr('id')).setFocus();\r\n moveCaretToEndRadEditor($find($(this).parent().parent().find(\".RadEditor\").attr('id')));\r\n });\r\n\r\n $(\".rtRECViewbtn\").click(function () {\r\n $(this).parent().parent().find(\".rtRECEdit\").hide();\r\n $(this).parent().parent().find(\".rtRECView\").show();\r\n $(this).parent().find(\".rtRECEditbtn\").show();\r\n $(this).parent().find(\".rtRECViewbtn\").hide();\r\n copyRadEditorContent($find($(this).parent().parent().find(\".RadEditor\").attr('id')), $(this).parent().parent().find(\".rtRECView\"));\r\n });\r\n\r\n //TextArea\r\n $(\".rtTACView\").click(function () {\r\n $(this).parent().parent().find(\".rtTACEdit\").show();\r\n $(this).parent().parent().find(\".rtTACView\").hide();\r\n $(this).parent().find(\".rtTACEditbtn\").hide();\r\n $(this).parent().find(\".rtTACViewbtn\").show();\r\n $(this).parent().parent().find(\"textarea\").focus();\r\n moveCaretToEnd($(this).parent().parent().find(\"textarea\"));\r\n });\r\n\r\n $(\".rtTACEditbtn\").click(function () {\r\n $(this).parent().parent().find(\".rtTACEdit\").show();\r\n $(this).parent().parent().find(\".rtTACView\").hide();\r\n $(this).parent().find(\".rtTACEditbtn\").hide();\r\n $(this).parent().find(\".rtTACViewbtn\").show();\r\n $(this).parent().parent().find(\"textarea\").focus();\r\n moveCaretToEnd($(this).parent().parent().find(\"textarea\"));\r\n });\r\n\r\n $(\".rtTACViewbtn\").click(function () {\r\n $(this).parent().parent().find(\".rtTACEdit\").hide();\r\n $(this).parent().parent().find(\".rtTACView\").show();\r\n $(this).parent().find(\".rtTACEditbtn\").show();\r\n $(this).parent().find(\".rtTACViewbtn\").hide();\r\n $(this).parent().parent().find(\".rtTACView\").text($(this).parent().parent().find(\"textarea\").val().replace(/\\n/gi, \"
    \").replace(/\\r/, \"\"));\r\n $(this).parent().parent().find(\".rtTACView\").html($(this).parent().parent().find(\".rtTACView\").html().replace(/<br \\/>/gi, \"
    \"));\r\n });\r\n\r\n //Init\r\n initTextAreas();\r\n initRadEditors();\r\n}\r\n\r\nfunction ToggleTACEditView(target) {\r\n var btnView = target.parent().parent().find(\".rtTACViewbtn\");\r\n var btnEdit = target.parent().parent().find(\".rtTACEditbtn\");\r\n if (btnView.is(':visible')) { btnView.click() }\r\n else { btnEdit.click() }\r\n}\r\n\r\nfunction ToggleRECEditView(target) {\r\n var btnView = target.parent().parent().find(\".rtRECViewbtn\");\r\n var btnEdit = target.parent().parent().find(\".rtRECEditbtn\");\r\n if (btnView.is(':visible')) { btnView.click() }\r\n else { btnEdit.click() }\r\n}\r\n\r\n\r\n//RadEditor\r\nfunction initRadEditors() {\r\n FixRECs();\r\n}\r\n\r\n//function onLoadRadEditors() {\r\n// updateContent();\r\n//}\r\n\r\nfunction FixRECs() {\r\n $(\".rtRECViewbtn\").each(function () {\r\n $(this).parent().parent().find(\".rtRECEdit\").hide();\r\n $(this).parent().parent().find(\".rtRECView\").show();\r\n $(this).parent().find(\".rtRECEditbtn\").show();\r\n $(this).parent().find(\".rtRECViewbtn\").hide();\r\n });\r\n}\r\n\r\n//function updateContent() {\r\n// $(\".rtRECViewbtn\").each(function () {\r\n// copyRadEditorContent($find($(this).parent().parent().find(\".RadEditor\").attr('id')), $(this).parent().parent().find(\".rtRECView\"));\r\n// });\r\n//}\r\n\r\nfunction rtRECHideEditor(editor, args) {\r\n copyRadEditorContent(editor, editorFindPart(editor));\r\n editorFindPart(editor, \"rtRECEdit\").hide();\r\n var style = editor.get_contentArea().style;\r\n style.margin = \"0\";\r\n style.padding = \"8px 10px\";\r\n style.border = \"0\";\r\n}\r\n\r\nfunction editorFindPart(editor, part) {\r\n return $(\"#\" + editor.get_id()).parent().parent().find(\".\" + part);\r\n}\r\n\r\nfunction moveCaretToEndRadEditor(editor) {\r\n //editor.set_html('

    0123456789abcdefghijklmnop


    ');\r\n //editor.set_html('

    0123456789abcdefghijklmnop

    ');\r\n //editor.set_html('0123456789abcdefghijklmnop');\r\n var content = editor.get_html();\r\n content = FixPTags(content);\r\n editor.set_html(content);\r\n editor.repaint();\r\n\r\n try {\r\n var selectionStart = content.lastIndexOf(\"

    \");\r\n if (selectionStart == -1) { selectionStart = content.length; }\r\n var selectionEnd = selectionStart;\r\n\r\n var iframe = document.getElementById(editor.get_id() + \"_contentIframe\");\r\n var iframewin = iframe.contentWindow;\r\n var input = (iframe.contentDocument || iframe.contentWindow.document).body;\r\n if (input.setSelectionRange) {\r\n selectionStart = adjustOffset(input, selectionStart);\r\n selectionEnd = adjustOffset(input, selectionEnd);\r\n input.setSelectionRange(selectionStart, selectionEnd);\r\n }\r\n else if (input.selection) {\r\n var range = input.createRange();\r\n range.collapse(true);\r\n range.moveEnd('character', selectionEnd);\r\n range.moveStart('character', selectionStart);\r\n range.select();\r\n }\r\n else if (input.createTextRange) {\r\n var range = input.createTextRange();\r\n range.collapse(true);\r\n range.moveEnd('character', selectionEnd);\r\n range.moveStart('character', selectionStart);\r\n range.select();\r\n }\r\n else if (editor.get_document().selection) {\r\n var range = (editor.get_document().selection.createRange());\r\n var oRange = range.duplicate();\r\n range.moveEnd('character', selectionEnd);\r\n range.moveStart('character', selectionStart);\r\n range.select();\r\n }\r\n else if (iframewin.getSelection && isChrome) {//Chrome\r\n var sel = iframewin.getSelection();\r\n var range = editor.get_document().createRange();\r\n var node = range.startContainer;\r\n var offset = 1;\r\n node = node.lastChild;\r\n node = node.lastChild;\r\n if (node.nodeType != 3) {\r\n if (node.lastChild && node.lastChild.localName == \"p\") {\r\n node = node.lastChild;\r\n }\r\n else {\r\n var tempnode = node.lastChild;\r\n while (tempnode.previousSibling) {\r\n tempnode = tempnode.previousSibling;\r\n if (tempnode.localName == \"p\" || tempnode.nodeType == 3) {\r\n node = tempnode;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n }\r\n if (node.lastChild) { node = node.lastChild; }\r\n if (node.nodeType == 3) { offset = node.nodeValue.length; }\r\n range.setStart(node, offset);\r\n range.setEnd(node, offset);\r\n range.collapse(false);\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n }\r\n else if (iframewin.getSelection && !isChrome) {//firefox\r\n var range = iframewin.getSelection().getRangeAt(0);\r\n var node = range.startContainer;\r\n var offset = 1;\r\n if (node.nodeType != 3) {\r\n if (node.lastChild && node.lastChild.localName == \"p\") {\r\n node = node.lastChild;\r\n }\r\n else {\r\n var tempnode = node.lastChild;\r\n while (tempnode.previousSibling) {\r\n tempnode = tempnode.previousSibling;\r\n if (tempnode.localName == \"p\" || tempnode.nodeType == 3) {\r\n node = tempnode;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n if (node.nodeType == 3) { offset = node.nodeValue.length; }\r\n range.setEnd(node, offset);\r\n range.setStart(node, offset);\r\n range.collapse(false);\r\n }\r\n else if (editor.getSelection) {\r\n var range = editor.getSelection().getRange();\r\n range.collapse(true);\r\n range.moveEnd('character', selectionEnd);\r\n range.moveStart('character', selectionStart);\r\n range.select();\r\n }\r\n\r\n }\r\n catch (err) {\r\n console.log(\"Needs looking at oneday!\");\r\n console.log(err);\r\n }\r\n}\r\n\r\nfunction copyRadEditorContent(src) {\r\n var dest = $(\"#\" + src.get_id() + \"_contentIframeViewOnly\");\r\n setIframeDocument(document.getElementById(src.get_id() + \"_contentIframeViewOnly\"), src.get_html());\r\n if ($(window).width() < 1024) {\r\n dest.contents().find('body').css(\"min-height\", \"26px\");\r\n }\r\n else {\r\n dest.contents().find('body').css(\"min-height\", \"20px\");\r\n }\r\n dest.height(\"0px\");\r\n dest.contents().find('body').css(\"padding\", \"0\");\r\n dest.contents().find('body').css(\"margin\", \"0\");\r\n dest.contents().find('#iFrameHtml').css(\"padding\", \"8px 10px\");\r\n dest.contents().find('#iFrameHtml').css(\"margin\", \"0\");\r\n dest.contents().find('#iFrameHtml').css(\"cursor\", \"pointer\");\r\n dest.contents().find('#iFrameHtml').click(function () { dest.click() });\r\n dest.height(dest.contents().find('body').height() - 2);\r\n}\r\n\r\nfunction setIframeDocument(iframe, content) {\r\n if (iframe) {\r\n content = FixPTags(content);\r\n var iframeWin = iframe.contentWindow || iframe.contentDocument.parentWindow;\r\n var d = iframeWin.document;\r\n d.open();\r\n d.write('<\\/head>' + content + '<\\/body><\\/html>');\r\n d.close();\r\n }\r\n};\r\n\r\nfunction FixPTags(content) {\r\n\r\n while (content.endsWith(\"
    \")) { content = content.substring(0, content.length - 4); }\r\n while (content.endsWith(\"
    \")) { content = content.substring(0, content.length - 6); }\r\n\r\n // content = content.replace(/| [^>]*>) /gmi, \"| [^>]*>)[\\s\\t\\n\\r]*/gmi, \"/gmi, \"

    \"); //remove white space\r\n // content = content.replace(/<\\/p>[\\s\\t\\n\\r]*| [^>]*>)/gmi, \"

    /gmi, \"

    \"); //remove any end p tags\r\n // content = content.replace(/| [^>]*>)/gmi, \"

    | [^>]*>)/gmi, \"\\s*$/gmi, \"

    \"); //remove white space after ending p tag\r\n\r\n // if (!content.startsWith(\"

    \") && !content.startsWith(\"

    \" + content; } //add missing start p tag\r\n // if (!content.endsWith(\"

    \")) { content = content + \"

    \"; } //add missing end p tag\r\n\r\n // content = content.replace(/| [^>]*>)[\\s\\t\\n\\r]*/gmi, \"/gmi, \"

    \"); //remove white space\r\n\r\n // content = content.replace(/<\\/p>

    <\\/p>| [^>]*>)/gmi, \"

    <\\/p>| [^>]*>)/gmi, \"

    <\\/p>$/gmi, \"

    \"); //remove unwanted empty p tags at end\r\n\r\n // content = content.replace(/| [^>]*>)<\\/p>/gmi, \"\"); //fix empty p tags\r\n\r\n return content;\r\n}\r\n\r\n//function editorOnClientLoad(editor, args) {\r\n// alert(editor.get_html());\r\n// editor.add_submit(function () {\r\n// editor.fire(\"SelectAll\");\r\n// editor.fire(\"FormatStripper\", { value: \"CSS\" });\r\n// alert(editor.get_html());\r\n// });\r\n//}\r\n","//RadCombobox LoadOnDemand\r\n\r\nfunction ComboboxListLocked_OnClientRequestFailedHandler(sender, eventArgs) {\r\n eventArgs.set_cancel(true);\r\n var text = sender.get_text();\r\n if (text.length == 0) return\r\n\r\n text = text.substring(0, text.length - 1)\r\n sender.set_text(text);\r\n sender.searchText = text;\r\n sender.isFailedSearch = true;\r\n sender.requestItemsIsRunning = true;\r\n sender.requestItems();\r\n}\r\n\r\nfunction ComboboxListLocked_OnClientItemsRequesting(sender, eventArgs) {\r\n sender.requestItemsIsRunning = true;\r\n if (!sender.isFailedSearch) return\r\n var context = eventArgs.get_context();\r\n context[\"searchText\"] = sender.searchText;\r\n sender.set_text(sender.searchText);\r\n sender.searchText = \"\";\r\n sender.isFailedSearch = false;\r\n}\r\n\r\nfunction Combobox_OnClientItemsRequested(sender, eventArgs) {\r\n sender.requestItemsIsRunning = false;\r\n}\r\n\r\nfunction Combobox_OnClientLoad(sender) {\r\n sender.requestItemsIsRunning = false;\r\n}\r\n\r\n\r\n","Date.prototype.toXML = function () {\r\n return (this.toXMLDate() + \"T\" + this.toXMLTime());\r\n}\r\n\r\n// For xml date;\r\nDate.prototype.toXMLDate = function () {\r\n return this.getFullYear() + \"-\" + (((this.getMonth() + 1) < 10) ? \"0\" : \"\") + (this.getMonth() + 1) + \"-\" + ((this.getDate() < 10) ? \"0\" : \"\") + this.getDate();\r\n}\r\n\r\n// For xml time;\r\nDate.prototype.toXMLTime = function () {\r\n return this.timeNow();\r\n}\r\n\r\n// For todays date;\r\nDate.prototype.today = function () {\r\n return ((this.getDate() < 10) ? \"0\" : \"\") + this.getDate() + \"/\" + (((this.getMonth() + 1) < 10) ? \"0\" : \"\") + (this.getMonth() + 1) + \"/\" + this.getFullYear();\r\n}\r\n\r\n// For the time now\r\nDate.prototype.timeNow = function () {\r\n return ((this.getHours() < 10) ? \"0\" : \"\") + this.getHours() + \":\" + ((this.getMinutes() < 10) ? \"0\" : \"\") + this.getMinutes();\r\n}\r\n\r\n// For the time now\r\nDate.prototype.timeNowSeconds = function () {\r\n return ((this.getHours() < 10) ? \"0\" : \"\") + this.getHours() + \":\" + ((this.getMinutes() < 10) ? \"0\" : \"\") + this.getMinutes() + \":\" + ((this.getSeconds() < 10) ? \"0\" : \"\") + this.getSeconds();\r\n}\r\n\r\nString.prototype.toTitleCase = function () {\r\n return this.replace(/\\w\\S*/g, function (txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); });\r\n}\r\n\r\nString.prototype.endsWith = function (str) {\r\n return (this.match(str + \"$\") == str)\r\n}\r\n\r\nString.prototype.startsWith = function (str) {\r\n return (this.match(\"^\" + str) == str)\r\n}\r\n\r\nString.prototype.formatEx = function (tokens) {\r\n var str = this;\r\n if (!tokens) return str;\r\n if (!Array.isArray(tokens)) return str.replace(new RegExp('\\\\{0\\\\}', 'g'), tokens);\r\n for (var i = 0; i < tokens.length; i++) {\r\n str = str.replace(new RegExp('\\\\{' + i + '\\\\}', 'g'), tokens[i]);\r\n }\r\n return str;\r\n}\r\n\r\nString.prototype.trim = function () {\r\n return (this.replace(/^[\\s\\xA0]+/, \"\").replace(/[\\s\\xA0]+$/, \"\"))\r\n}\r\n\r\nString.prototype.replaceAll = function (search, replacement) {\r\n return this.split(search).join(replacement);\r\n};\r\n\r\nObject.defineProperties(Date, {\r\n minValue: { value: -8640000000000000 }, // A number, not a date\r\n maxValue: { value: 8640000000000000 }\r\n});\r\n\r\nElement.prototype.getInfo = function () {\r\n const rect = this.getBoundingClientRect();\r\n return {\r\n left: rect.left + window.scrollX,\r\n top: rect.top + window.scrollY,\r\n centerX: rect.left + window.scrollX + ((rect.right - rect.left) / 2),\r\n centerY: rect.top + window.scrollY + ((rect.bottom - rect.top) / 2),\r\n x: rect.x,\r\n y: rect.y\r\n };\r\n}\r\n\r\nHTMLElement.prototype.addEventListenerEx = function (type, func, capture) {\r\n var target = this;\r\n var newTarget = target.cloneNode(true);\r\n target.parentNode.replaceChild(target, newTarget);\r\n newTarget.addEventListener(type, func, capture);\r\n}\r\n\r\nHTMLElement.prototype.addClick = function (func, capture) {\r\n this.addEventListenerEx('click', func, capture);\r\n}\r\n\r\nfunction addEventListenerById(id, type, func, capture) {\r\n document.getElementById(id).addEventListenerEx(type, func, capture);\r\n}\r\n\r\nfunction addEventListenerByClass(className, type, func, capture) {\r\n const targets = document.querySelectorAll(className);\r\n targets.forEach(target => target.addEventListenerEX(type, func, capture));\r\n}\r\n\r\nfunction addClickById(id, func, capture) {\r\n addEventListenerById(id, 'click', func, capture);\r\n}\r\n\r\nfunction addClickByClass(className, func, capture) {\r\n addEventListenerByClass(className, 'click', func, capture);\r\n}\r\n\r\n","Element.prototype.extendDOM = function () {\r\n\r\n //#region Container Elements\r\n\r\n this.addH1 = function (text, className, id) {\r\n var element = document.createElement('h1');\r\n if (text != null) element.innerText = text;\r\n if (className != null) element.className = className;\r\n if (id != null) element.id = id;\r\n element.extendDOM();\r\n this.appendChild(element);\r\n return element;\r\n }\r\n\r\n this.addH2 = function (text, className, id) {\r\n var element = document.createElement('h2');\r\n if (text != null) element.innerText = text;\r\n if (className != null) element.className = className;\r\n if (id != null) element.id = id;\r\n element.extendDOM();\r\n this.appendChild(element);\r\n return element;\r\n }\r\n\r\n this.addH3 = function (text, className, id) {\r\n var element = document.createElement('h3');\r\n if (text != null) element.innerText = text;\r\n if (className != null) element.className = className;\r\n if (id != null) element.id = id;\r\n element.extendDOM();\r\n this.appendChild(element);\r\n return element;\r\n }\r\n\r\n this.addH4 = function (text, className, id) {\r\n var element = document.createElement('h4');\r\n if (text != null) element.innerText = text;\r\n if (className != null) element.className = className;\r\n if (id != null) element.id = id;\r\n element.extendDOM();\r\n this.appendChild(element);\r\n return element;\r\n }\r\n\r\n this.addSpan = function (data) {\r\n if (data == null) data = {};\r\n var element = document.createElement('span');\r\n if (data.id != null) element.id = data.id;\r\n if (data.text != null) element.innerHTML = data.text;\r\n if (data.className != null) element.className = data.className;\r\n element.extendDOM();\r\n this.appendChild(element);\r\n return element;\r\n }\r\n\r\n this.addDiv = function (data, beforeElement) {\r\n if (data == null) data = {};\r\n var element = document.createElement('div');\r\n if (data.id != null) element.id = data.id;\r\n if (data.text != null) element.innerHTML = data.text;\r\n if (data.className != null) element.className = data.className;\r\n element.extendDOM();\r\n if (!beforeElement) this.appendChild(element);\r\n else this.insertBefore(element, beforeElement);\r\n return element;\r\n }\r\n\r\n this.addLabel = function (targetId, title, className, labelId) {\r\n var element = document.createElement('label');\r\n if (labelId != null) element.id = labelId;\r\n element.setAttribute('for', targetId);\r\n element.innerHTML = title;\r\n if (className != null) element.className = className;\r\n element.extendDOM();\r\n this.appendChild(element);\r\n return element;\r\n }\r\n\r\n this.addButtonSpan = function () {\r\n return this.addSpan({ 'className': 'button-span' });\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Input Elements\r\n\r\n this.addTextbox = function (id, maxChars, sidKey, requiredGroup, requiredMessage, className) {\r\n\r\n //var element = document.createElement('input');\r\n //element.id = id;\r\n //element.type = 'password'\r\n //element.setAttribute('autocomplete', 'new-password');\r\n //if (className != null) element.className = className;\r\n //if (maxChars != null) element.maxLength = maxChars;\r\n //if (sidKey != null) element.setAttribute('sid-key', sidKey);\r\n //if (requiredGroup != null) element.setAttribute('requiredGroup', requiredGroup);\r\n //if (requiredMessage != null) element.setAttribute('requiredErrorMessage', requiredMessage);\r\n //element.extendDOM();\r\n //this.appendChild(element);\r\n //return element;\r\n }\r\n\r\n this.addPasswordbox = function (id, maxChars, sidKey, requiredGroup, requiredMessage, clickEventHandler, className) {\r\n\r\n var element = document.createElement('input');\r\n element.id = id;\r\n element.type = 'password'\r\n element.setAttribute('autocomplete', 'new-password');\r\n if (className != null) element.className = className;\r\n if (maxChars != null) element.maxLength = maxChars;\r\n if (sidKey != null) element.setAttribute('sid-key', sidKey);\r\n if (requiredGroup != null) element.setAttribute('requiredGroup', requiredGroup);\r\n if (requiredMessage != null) element.setAttribute('requiredErrorMessage', requiredMessage);\r\n if (clickEventHandler != null) element.addEventListener('click', clickEventHandler);\r\n element.extendDOM();\r\n this.appendChild(element);\r\n return element;\r\n }\r\n\r\n this.addRadioButton = function (id, buttonGroupName, value, sidKey, clickEventHandler, className) {\r\n var element = document.createElement('input');\r\n element.id = id;\r\n element.type = 'radio'\r\n element.name = buttonGroupName;\r\n element.value = value;\r\n if (className != null) element.className = className;\r\n if (sidKey != null) element.setAttribute('sid-key', sidKey);\r\n if (clickEventHandler != null) element.addEventListener('click', clickEventHandler);\r\n element.extendDOM();\r\n this.appendChild(element);\r\n return element;\r\n }\r\n\r\n this.addCheckbox = function (id, value, checked, sidKey, clickEventHandler, className) {\r\n\r\n var element = document.createElement('input');\r\n element.id = id;\r\n if (className != null) element.className = className;\r\n element.type = 'checkbox'\r\n element.checked = checked;\r\n element.value = value;\r\n if (sidKey != null) element.setAttribute('sid-key', sidKey);\r\n if (clickEventHandler != null) element.addEventListener('click', clickEventHandler);\r\n element.extendDOM();\r\n this.appendChild(element);\r\n return element;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Buttons\r\n\r\n this.addButton = function (id, text, clickEventHandler, hidden, className) {\r\n var element = document.createElement('button');\r\n element.id = id;\r\n element.innerText = text;\r\n if (className != null) element.className = className;\r\n if (hidden == true) element.style.display = 'none';\r\n if (clickEventHandler != null) element.addEventListener('click', clickEventHandler);\r\n element.extendDOM();\r\n this.appendChild(element);\r\n return element;\r\n }\r\n\r\n\r\n\r\n //#endregion\r\n\r\n //#region Componants\r\n\r\n this.addRadioButtonAndLabel = function (id, buttonGroupName, title, value, sidKey, clickEventHandler, className, spanData) {\r\n var element = this.addSpan(spanData);\r\n element.addRadioButton(id, buttonGroupName, value, sidKey, clickEventHandler, className);\r\n element.addLabel(id, title);\r\n return element;\r\n }\r\n\r\n this.addPasswordAndLabel = function (id, maxChars, title, sidKey, requiredGroup, requiredMessage, clickEventHandler, className, spanData) {\r\n var element = this.addSpan(spanData);\r\n element.addLabel(id, title);\r\n element.addPasswordbox(id, maxChars, sidKey, clickEventHandler, requiredGroup, requiredMessage, clickEventHandler, className);\r\n return element;\r\n }\r\n\r\n this.addToggleSwitch = function (id, text, checked, sidKey, clickEventHandler, data) {\r\n\r\n if (data == null) data = {};\r\n data.className = 'switch-toggle ' + data.className;\r\n var element = this.addSpan(data);\r\n element.addCheckbox(id, value, checked, sidKey, clickEventHandler, data.cbClassName)\r\n element.addLabel(targetId, null, data.label1ClassName, data.label1Id)\r\n element.addLabel(targetId, text, data.label2ClassName, data.label2Id)\r\n return element;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Misc\r\n\r\n return this;\r\n\r\n //#endregion\r\n}\r\n\r\n","function resetTabIndex() {\r\n $('a, input, select, button, textarea').each(function () {\r\n let attr = $(this).attr('tabindex');\r\n if (typeof attr !== typeof undefined && attr !== false && attr > 0) {\r\n $(this).attr(\"tabindex\", 0);\r\n }\r\n });\r\n let focusable = document.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])');\r\n if (focusable.length == 0) return;\r\n focusable[0].focus();\r\n};\r\n"]}