{"version":3,"sources":["obj.js","main.js","helpers.js","asset_editor.js","categories_admin.js","client_form.js","clients_accounts_requests.js","dashboard.js","email_templates.js","file_editor.js","group_form.js","import_orphans.js","install.js","login.js","login_ldap.js","options.js","public_files_list.js","reset_password_enter_email.js","reset_password_enter_new.js","upload_form.js","user_form.js","bulk_actions.js","download_cookie_handler.js","file_preview_modal.js","generate_password.js","jquery_validation_custom_methods.js","load_ckeditor.js","login2faInputs.js","main_menu_sidebar.js","misc.js","password_visibility_toggle.js","public_links_popup.js","select2.js","side_modal.js","widget_action_log.js","widget_news.js","widget_statistics.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzBA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A1BrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A2BRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AC9JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"app.js","sourcesContent":["(function () {\n 'use strict';\n \n window.admin = {\n parts: {},\n pages: {}\n };\n})();","(function () {\n 'use strict';\n\n admin.parts.main = function () {\n\n $(document).ready(function() {\n });\n };\n})();","function htmlEncode(str)\n{\n return String(str).replace(/[^\\w. ]/gi, function(c){\n return '&#'+c.charCodeAt(0)+';';\n });\n}\n\n// Adapted from https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript\nfunction fallbackCopyTextToClipboard(text) {\n var textArea = document.createElement(\"textarea\");\n textArea.value = text;\n \n // Avoid scrolling to bottom\n textArea.style.top = \"0\";\n textArea.style.left = \"0\";\n textArea.style.position = \"fixed\";\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n var successful = document.execCommand('copy');\n if (successful) {\n toastr.success(json_strings.translations.copy_ok)\n } else {\n toastr.error(json_strings.translations.copy_error) \n }\n } catch (err) {\n toastr.error(json_strings.translations.copy_error)\n }\n\n document.body.removeChild(textArea);\n}\n\nfunction copyTextToClipboard(text) {\n if (!navigator.clipboard) {\n fallbackCopyTextToClipboard(text);\n return;\n }\n\n navigator.clipboard.writeText(text).then(function() {\n toastr.success(json_strings.translations.copy_ok)\n }, function(err) {\n toastr.error(json_strings.translations.copy_ok)\n });\n}\n\n//https://gist.github.com/fnicollier/4258461\nfunction insertAtCaret(areaId,text) {\n var txtarea = document.getElementById(areaId);\n var scrollPos = txtarea.scrollTop;\n var strPos = 0;\n var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? \n \"ff\" : (document.selection ? \"ie\" : false ) );\n if (br == \"ie\") { \n txtarea.focus();\n var range = document.selection.createRange();\n range.moveStart ('character', -txtarea.value.length);\n strPos = range.text.length;\n }\n else if (br == \"ff\") strPos = txtarea.selectionStart;\n\n var front = (txtarea.value).substring(0,strPos); \n var back = (txtarea.value).substring(strPos,txtarea.value.length); \n txtarea.value=front+text+back;\n strPos = strPos + text.length;\n if (br == \"ie\") { \n txtarea.focus();\n var range = document.selection.createRange();\n range.moveStart ('character', -txtarea.value.length);\n range.moveStart ('character', strPos);\n range.moveEnd ('character', 0);\n range.select();\n }\n else if (br == \"ff\") {\n txtarea.selectionStart = strPos;\n txtarea.selectionEnd = strPos;\n txtarea.focus();\n }\n txtarea.scrollTop = scrollPos;\n}\n\nfunction urlParamExists(param, value = null)\n{\n var urlParams = new URLSearchParams(window.location.search);\n var search = urlParams.get(param);\n \n if(search) {\n return true;\n }\n\n if (value != null) {\n if(search == value) {\n return true;\n }\n }\n \n return false;\n}\n\nfunction isNumeric(value){\n if (typeof value != \"string\") {\n return false;\n }\n\n return !isNaN(value) && !isNaN(parseFloat(value))\n}\n ","(function () {\n 'use strict';\n\n admin.pages.assetEditor = function () {\n $(document).ready(function()\n {\n const types_allowed = ['js', 'css', 'html'];\n const type = $('#asset_language').val();\n var mode;\n if (types_allowed.includes(type)) {\n switch (type) {\n case 'css': mode = 'css'; break;\n case 'js': mode = 'javascript'; break;\n case 'html': mode = 'htmlmixed'; break;\n }\n }\n // console.log(mode);\n var editor = CodeMirror.fromTextArea(document.getElementById(\"content\"), {\n lineNumbers: true,\n mode: mode,\n //theme: 'neo',\n lineWrapping: true\n });\n });\n };\n})();\n\n","(function () {\n 'use strict';\n\n admin.pages.categoriesAdmin = function () {\n\n $(document).ready(function(){\n var validator = $(\"#process_category\").validate({\n rules: {\n category_name: {\n required: true,\n }\n },\n messages: {\n category_name: {\n required: json_strings.validation.no_name,\n }\n },\n errorPlacement: function(error, element) {\n error.appendTo(element.parent('div'));\n },\n });\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.clientForm = function () {\n\n $(document).ready(function(){\n var form_type = $(\"#client_form\").data('form-type');\n\n var validator = $(\"#client_form\").validate({\n rules: {\n name: {\n required: true\n },\n username: {\n required: true,\n minlength: json_strings.character_limits.user_min,\n maxlength: json_strings.character_limits.user_max,\n alphanumericUsername: true\n },\n email: {\n required: true,\n email: true\n },\n max_file_size: {\n required: {\n param: true,\n depends: function(element) {\n return form_type != 'new_client_self';\n }\n },\n digits: true\n },\n password: {\n required: {\n param: true,\n depends: function(element) {\n if (form_type == 'new_client' || form_type == 'new_client_self') {\n return true;\n }\n if (form_type == 'edit_client' || form_type == 'edit_client_self') {\n if ($.trim($(\"#password\").val()).length > 0) {\n return true;\n }\n }\n return false;\n }\n },\n minlength: json_strings.character_limits.password_min,\n maxlength: json_strings.character_limits.password_max,\n passwordValidCharacters: true\n }\n },\n messages: {\n name: {\n required: json_strings.validation.no_name\n },\n username: {\n required: json_strings.validation.no_user,\n minlength: json_strings.validation.length_user,\n maxlength: json_strings.validation.length_user,\n alphanumericUsername: json_strings.validation.alpha_user\n },\n email: {\n required: json_strings.validation.no_email,\n email: json_strings.validation.invalid_email\n },\n max_file_size: {\n digits: json_strings.validation.file_size\n },\n password: {\n required: json_strings.validation.no_pass,\n minlength: json_strings.validation.length_pass,\n maxlength: json_strings.validation.length_pass,\n passwordValidCharacters: json_strings.validation.alpha_pass\n }\n },\n errorPlacement: function(error, element) {\n error.appendTo(element.parent('div'));\n }\n });\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.clientsAccountsRequests = function () {\n\n $(document).ready(function(){\n $('.change_all').click(function(e) {\n e.preventDefault();\n var target = $(this).data('target');\n var check = $(this).data('check');\n $(\"input[data-client='\"+target+\"']\").prop(\"checked\",check).change();\n check_client(target);\n });\n \n $('.account_action').on(\"change\", function() {\n if ( $(this).prop('checked') == false ) {\n var target = $(this).data('client');\n $(\".membership_action[data-client='\"+target+\"']\").prop(\"checked\",false).change();\n }\n });\n \n $('.checkbox_toggle').change(function() {\n var target = $(this).data('client');\n check_client(target);\n });\n \n function check_client(client_id) {\n $(\"input[data-clientid='\"+client_id+\"']\").prop(\"checked\",true);\n }\n });\n };\n})();","(function () {\n 'use strict';\n \n admin.pages.dashboard = function () {\n \n $(document).ready(function(){\n // Nothing here yet\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.emailTemplates = function () {\n\n $(document).ready(function(){\n $(document).on('click', '.load_default', function(e) {\n e.preventDefault();\n\n var file = jQuery(this).data('file');\n var textarea = document.getElementById(jQuery(this).data('textarea'));\n var accept = confirm(json_strings.translations.email_templates.confirm_replace);\n \n if ( accept ) {\n $.ajax({\n url: \"emails/\"+file,\n cache: false,\n success: function (data){\n textarea.value = data;\n },\n error: function() {\n alert(json_strings.translations.email_templates.loading_error);\n }\n });\n }\n });\n \n $('.preview').click(function(e) {\n e.preventDefault();\n var type = jQuery(this).data('preview');\n var url = json_strings.uri.base+ 'email-preview.php?t=' + type;\n window.open(url, \"previewWindow\", \"width=800,height=600,scrollbars=yes\");\n });\n });\n\n $('.insert_tag').on('click', function(e) {\n var target = jQuery(this).data('target');\n insertAtCaret(target, $(this).data('tag'));\n });\n\n // Check if each tag is used or not\n var tags_dt = document.querySelectorAll('#email_available_tags dt button');\n var tags = [];\n Array.prototype.forEach.call(tags_dt, function(tag) {\n tags.push(tag.dataset.tag);\n });\n\n var textareas = document.querySelectorAll('#form_email_template textarea');\n\n const check_tags_usage = setInterval(() => {\n tags.forEach(tag => {\n checkTagsUsage(tag);\n });\n }, 1000);\n\n function checkTagsUsage(tag)\n {\n textareas.forEach(element => {\n const el = document.querySelector('button[data-tag=\"'+tag+'\"]');\n if (!element.value.includes(tag)) {\n el.classList.add('btn-warning');\n el.classList.remove('btn-pslight');\n } else {\n el.classList.add('btn-pslight');\n el.classList.remove('btn-warning');\n }\n });\n }\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.fileEditor = function () {\n\n $(document).ready(function(){\n // Datepicker\n if ( $.isFunction($.fn.datepicker) ) {\n $('.date-container .date-field').datepicker({\n format : 'dd-mm-yyyy',\n autoclose : true,\n todayHighlight : true\n });\n }\n\n // Validation\n var validator = $(\"#files\").validate({\n errorPlacement: function(error, element) {\n error.appendTo(element.parent('div'));\n }\n });\n\n var file = $('input[name^=\"file\"]');\n\n file.filter('input[name$=\"[name]\"]').each(function() {\n $(this).rules(\"add\", {\n required: true,\n messages: {\n required: json_strings.validation.no_name\n }\n });\n });\n\n // Copy settings to other files\n function copySettingsToCheckboxes(el, to, question)\n {\n if ( confirm( question ) ) {\n $(to).each(function(i, obj) {\n var from_element = document.getElementById($(el).data('copy-from'));\n $(this).prop('checked', from_element.checked);\n });\n }\n }\n\n $('.copy-expiration-settings').on('click', function() {\n copySettingsToCheckboxes($(this), '.checkbox_setting_expires', json_strings.translations.upload_form.copy_expiration);\n // Copy date\n var element = $('#'+$(this).data('copy-date-from'));\n var date = element.val();\n $('.date-field').each(function(i, obj) {\n console.log(date);\n $('.date-field').datepicker('update', date);\n });\n });\n\n $('.copy-public-settings').on('click', function() {\n copySettingsToCheckboxes($(this), '.checkbox_setting_public', json_strings.translations.upload_form.copy_public);\n });\n\n $('.copy-hidden-settings').on('click', function() {\n copySettingsToCheckboxes($(this), '.checkbox_setting_hidden', json_strings.translations.upload_form.copy_hidden);\n });\n\n // Collapse - expand single item\n $('.toggle_file_editor').on('click', function(e) {\n let wrapper = $(this).parents('.file_editor_wrapper');\n wrapper.toggleClass('collapsed');\n });\n\n // Collapse all\n document.getElementById('files_collapse_all').addEventListener('click', function(e) {\n let wrappers = document.querySelectorAll('.file_editor_wrapper');\n wrappers.forEach(wrapper => {\n wrapper.classList.add('collapsed');\n });\n \n })\n\n // Expand all\n document.getElementById('files_expand_all').addEventListener('click', function(e) {\n let wrappers = document.querySelectorAll('.file_editor_wrapper');\n wrappers.forEach(wrapper => {\n wrapper.classList.remove('collapsed');\n });\n \n })\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.groupForm = function () {\n\n $(document).ready(function(){\n var validator = $(\"#group_form\").validate({\n rules: {\n name: {\n required: true\n },\n },\n messages: {\n name: {\n required: json_strings.validation.no_name\n },\n },\n errorPlacement: function(error, element) {\n error.appendTo(element.parent('div'));\n }\n });\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.importOrphans = function () {\n\n $(document).ready(function(){\n $(\"#import_orphans\").submit(function() {\n\t\t\t\tvar checks = $(\"td>input:checkbox\").serializeArray(); \n\t\t\t\t\n\t\t\t\tif (checks.length == 0) { \n\t\t\t\t\talert(json_strings.translations.select_one_or_more);\n\t\t\t\t\treturn false; \n\t\t\t\t} \n\t\t\t});\n\t\t\t\n\t\t\t/**\n\t\t\t * Only select the current file when clicking an \"edit\" button\n\t\t\t */\n\t\t\t$('.btn-edit-file').click(function(e) {\n\t\t\t\t$('#select_all').prop('checked', false);\n\t\t\t\t$('td .select_file_checkbox').prop('checked', false);\n\t\t\t\t$(this).parents('tr').find('td .select_file_checkbox').prop('checked', true);\n\t\t\t\t$(\"#import_orphans\").submit();\n\t\t\t});\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.install = function () {\n\n $(document).ready(function(){\n var validator = $(\"#install_form\").validate({\n rules: {\n install_title: {\n required: true,\n },\n base_uri: {\n required: true\n // url: true // Does not work on localhost\n },\n admin_name: {\n required: true,\n },\n admin_email: {\n required: true,\n email: true\n },\n admin_username: {\n required: true,\n minlength: json_strings.character_limits.user_min,\n maxlength: json_strings.character_limits.user_max,\n alphanumericUsername: true\n },\n admin_pass: {\n required: true,\n minlength: json_strings.character_limits.password_min,\n maxlength: json_strings.character_limits.password_max,\n passwordValidCharacters: true\n },\n },\n messages: {\n category_name: {\n required: json_strings.validation.no_name,\n }\n },\n errorPlacement: function(error, element) {\n error.appendTo(element.parent('div'));\n },\n });\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.loginForm = function () {\n\n $(document).ready(function(){\n // let data_changed = false;\n // $('body').on('input', '#username, #password', function(e) {\n // data_changed = true;\n // });\n\n // $('body').on('change', '#language', function (e) {\n // if (data_changed == false) {\n // let change_locale_uri = json_strings.uri.base + 'process.php?do=change_language&language=' + $(this).val();\n // window.location.replace(change_locale_uri);;\n // }\n // });\n\n var initial = $('.seconds_countdown').text();\n if (initial) {\n $('#btn_submit').attr('disabled', 'disabled');\n }\n var downloadTimer = setInterval(function(){\n if (initial <= 0) {\n clearInterval(downloadTimer);\n $('#btn_submit').removeAttr('disabled');\n $('#message_countdown').slideUp();\n }\n $('.seconds_countdown').text(initial);\n initial -= 1;\n }, 1000);\n\n var validator = $(\"#login_form\").validate({\n rules: {\n username: {\n required: true,\n },\n password: {\n required: true,\n },\n },\n messages: {\n username: {\n required: json_strings.validation.no_user,\n },\n password: {\n required: json_strings.validation.no_pass,\n }\n },\n errorPlacement: function(error, element) {\n error.appendTo(element.parent('div'));\n },\n submitHandler: function(form) {\n form.submit();\n\n var button_loading_text = json_strings.login.logging_in;\n $('#btn_submit').html(' '+button_loading_text+'...').attr('disabled', 'disabled');\n /*\n \n var button_text = json_strings.login.button_text;\n var button_redirecting_text = json_strings.login.redirecting;\n var url = $(form).attr('action');\n $('.ajax_response').html('').removeClass('alert alert-danger alert-success').slideUp();\n \n\n $.ajax({\n cache: false,\n method: 'POST',\n url: url,\n data: $(form).serialize(),\n }).done( function(data) {\n var obj = JSON.parse(data);\n if ( obj.status == 'success' ) {\n $('#submit').html(' '+button_redirecting_text+'...');\n $('#submit').removeClass('btn-primary').addClass('btn-success');\n setTimeout('window.location.href = \"'+obj.location+'\"', 1000);\n } else {\n $('.ajax_response').addClass('alert alert-danger').slideDown().html(obj.message);\n $('#submit').html(button_text).removeAttr('disabled');\n }\n }).fail( function(data) {\n $('.ajax_response').addClass('alert alert-danger').slideDown().html('Uncaught error');\n $('#submit').html(button_text).removeAttr('disabled');\n }).always( function() {\n });\n\n return false;\n */\n }\n });\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.loginLdapForm = function () {\n\n $(document).ready(function(){\n var validator = $(\"#login_ldap_form\").validate({\n rules: {\n ldap_email: {\n required: true,\n },\n ldap_password: {\n required: true,\n },\n },\n messages: {\n ldap_email: {\n required: json_strings.validation.no_email,\n },\n ldap_password: {\n required: json_strings.validation.no_pass,\n }\n },\n errorPlacement: function(error, element) {\n error.appendTo(element.parent('div'));\n },\n submitHandler: function(form) {\n var button_text = json_strings.login.button_text;\n var button_loading_text = json_strings.login.logging_in;\n var button_redirecting_text = json_strings.login.redirecting;\n\n var url = $(form).attr('action');\n $('.ajax_response').html('').removeClass('alert-danger alert-success').slideUp();\n $('#ldap_submit').html(' '+button_loading_text+'...');\n $.ajax({\n cache: false,\n type: \"post\",\n url: url,\n data: $(form).serialize(),\n success: function(response)\n {\n var json = jQuery.parseJSON(response);\n if ( json.status == 'success' ) {\n $('#ldap_submit').html(' '+button_redirecting_text+'...');\n $('#ldap_submit').removeClass('btn-primary').addClass('btn-success');\n setTimeout('window.location.href = \"'+json.location+'\"', 1000);\n }\n else {\n $('.ajax_response').addClass('alert-danger').slideDown().html(json.message);\n $('#ldap_submit').html(\"'\"+button_text+\"'\");\n }\n }\n });\n\n return false;\n }\n });\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.options = function () {\n var tagifyContainer = document.getElementById('allowed_file_types');\n var tagify = new Tagify (tagifyContainer);\n //tagifyContainer.addEventListener('change', tagifyOnChange)\n\n function tagifyOnChange(e){\n console.log(e.target.value)\n }\n\n $(document).ready(function(){\n var validator = $(\"#options\").validate({\n errorPlacement: function(error, element) {\n error.appendTo(element.parent('div'));\n },\n });\n\n $('#download_method').on('change', function(e) {\n var method = $(this).find('option:selected').val();\n $('.method_note').hide();\n $('.method_note[data-method=\"'+method+'\"]').show();\n });\n\n $('#download_method').trigger('change');\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.publicFilesList = function () {\n\n $(document).ready(function(){\n $('select[name=\"group\"]').on('change', function(e) {\n var token = $(this).find(':selected').data('token');\n $('input[name=\"token\"]').val(token);\n });\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.resetPasswordEnterEmail = function () {\n\n $(document).ready(function(){\n var validator = $(\"#reset_password_enter_email\").validate({\n rules: {\n email: {\n required: true,\n email: true,\n },\n },\n messages: {\n email: {\n required: json_strings.validation.no_email,\n email: json_strings.validation.invalid_email\n },\n },\n errorPlacement: function(error, element) {\n error.appendTo(element.parent('div'));\n }\n });\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.resetPasswordEnterNew = function () {\n\n $(document).ready(function(){\n var validator = $(\"#reset_password_enter_new\").validate({\n rules: {\n password: {\n required: true,\n minlength: json_strings.character_limits.password_min,\n maxlength: json_strings.character_limits.password_max,\n passwordValidCharacters: true\n }\n },\n messages: {\n password: {\n required: json_strings.validation.no_pass,\n minlength: json_strings.validation.length_pass,\n maxlength: json_strings.validation.length_pass,\n passwordValidCharacters: json_strings.validation.alpha_pass\n }\n },\n errorPlacement: function(error, element) {\n error.appendTo(element.parent('div'));\n }\n });\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.uploadForm = function () {\n\n $(document).ready(function(){\n var file_ids = [];\n var errors = 0;\n var successful = 0;\n\n // Send a keep alive action every 1 minute\n setInterval(function(){\n var timestamp = new Date().getTime()\n $.ajax({\n type:\t'GET',\n cache:\tfalse,\n url:\t'includes/ajax-keep-alive.php',\n data:\t'timestamp='+timestamp,\n success: function(result) {\n var dummy = result;\n }\n });\n },1000*60);\n\n var uploader = $('#uploader').pluploadQueue();\n\n $('#upload_form').on('submit', function(e) {\n if (uploader.files.length > 0) {\n uploader.bind('StateChanged', function() {\n if (uploader.files.length === (uploader.total.uploaded + uploader.total.failed)) {\n var action = $('#upload_form').attr('action') + '?ids=' + file_ids.toString() + '&type=new';\n $('#upload_form').attr('action', action);\n if (successful > 0) {\n if (errors == 0) {\n window.location = action;\n } else {\n $(`\n
`+json_strings.translations.upload_form.some_files_had_errors+`
\n `+json_strings.translations.upload_form.continue_to_editor+`\n `).insertBefore( \"#upload_form\" );\n }\n return;\n }\n // $('#upload_form')[0].submit();\n }\n });\n\n uploader.start();\n\n $(\"#btn-submit\").hide();\n $(\".message_uploading\").fadeIn();\n\n uploader.bind('Error', function(uploader, error) {\n var obj = JSON.parse(error.response);\n $(\n `
`+obj.error.filename+`: `+obj.error.message+`
`\n ).insertBefore( \"#upload_form\" );\n //console.log(obj);\n });\n \n uploader.bind('FileUploaded', function (uploader, file, info) {\n var obj = JSON.parse(info.response);\n file_ids.push(obj.info.id);\n successful++;\n });\n\n return false;\n } else {\n alert(json_strings.translations.upload_form.no_files);\n }\n\n return false;\n });\n\n window.onbeforeunload = function (e) {\n var e = e || window.event;\n\n console.log('state? ' + uploader.state);\n\n // if uploading\n if(uploader.state === 2) {\n //IE & Firefox\n if (e) {\n e.returnValue = json_strings.translations.upload_form.leave_confirm;\n }\n\n // For Safari\n return json_strings.translations.upload_form.leave_confirm;\n }\n\n };\n\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.pages.userForm = function () {\n\n $(document).ready(function(){\n // Display or not the limit accounts selector\n $('#level').on('change', function(e) {\n var el = document.getElementById('limit_upload_to_container');\n if (typeof(el) != 'undefined' && el != null) {\n if ($(this).val() == '7') {\n $('#limit_upload_to_container').slideDown();\n } else {\n $('#limit_upload_to_container').slideUp();\n }\n }\n });\n\n var form_type = $(\"#user_form\").data('form-type');\n\n var validator = $(\"#user_form\").validate({\n rules: {\n name: {\n required: true\n },\n username: {\n required: true,\n minlength: json_strings.character_limits.user_min,\n maxlength: json_strings.character_limits.user_max,\n alphanumericUsername: true\n },\n email: {\n required: true,\n email: true\n },\n level: {\n required: true\n },\n max_file_size: {\n required: true,\n digits: true\n },\n password: {\n required: {\n param: true,\n depends: function(element) {\n if (form_type == 'new_user') {\n return true;\n }\n if (form_type == 'edit_user' || form_type == 'edit_user_self') {\n if ($.trim($(\"#password\").val()).length > 0) {\n return true;\n }\n }\n return false;\n }\n },\n minlength: json_strings.character_limits.password_min,\n maxlength: json_strings.character_limits.password_max,\n passwordValidCharacters: true\n }\n },\n messages: {\n name: {\n required: json_strings.validation.no_name\n },\n username: {\n required: json_strings.validation.no_user,\n minlength: json_strings.validation.length_user,\n maxlength: json_strings.validation.length_user,\n alphanumericUsername: json_strings.validation.alpha_user\n },\n email: {\n required: json_strings.validation.no_email,\n email: json_strings.validation.invalid_email\n },\n level: {\n required: json_strings.validation.no_role\n },\n max_file_size: {\n digits: json_strings.validation.file_size\n },\n password: {\n required: json_strings.validation.no_pass,\n minlength: json_strings.validation.length_pass,\n maxlength: json_strings.validation.length_pass,\n passwordValidCharacters: json_strings.validation.alpha_pass\n }\n },\n errorPlacement: function(error, element) {\n error.appendTo(element.parent('div'));\n }\n });\n });\n };\n})();","/**\n * Apply bulk actions\n */\n(function () {\n 'use strict';\n\n admin.parts.bulkActions = function () {\n\n $(document).ready(function(e) {\n $(\".batch_actions\").on('submit', function(e) {\n var checks = $(\"td>input:checkbox\").serializeArray();\n var action = $('#action').val();\n if (action != 'none') {\n // Generic actions\n if (action == 'delete') {\n if (checks.length == 0) {\n alert(json_strings.translations.select_one_or_more);\n return false;\n }\n else {\n var _formatted = sprintf(json_strings.translations.confirm_delete, checks.length);\n if (!confirm(_formatted)) {\n e.preventDefault();\n }\n }\n }\n\n // Activities log actions\n if (action == 'log_clear') {\n var msg = json_strings.translations.confirm_delete_log;\n if (!confirm(msg)) {\n e.preventDefault();\n }\n }\n\n if (action == 'log_download') {\n e.preventDefault();\n\n let modal_content = `

\n \"Loading\"

\n

`+json_strings.translations.download_wait+`

\n `;\n\n Cookies.set('log_download_started', 0, { expires: 100 });\n setTimeout(check_log_download_cookie, 1000);\n\n Swal.fire({\n title: '',\n html: modal_content,\n showCloseButton: false,\n showCancelButton: false,\n showConfirmButton: false,\n showClass: {\n popup: 'animate__animated animated__fast animate__fadeInUp'\n },\n hideClass: {\n popup: 'animate__animated animated__fast animate__fadeOutDown'\n },\n didOpen: function () {\n var url = json_strings.uri.base+'includes/actions.log.export.php?format=csv';\n let iframe = document.createElement('iframe');\n let swalcontainer = document.getElementById('swal2-html-container')\n swalcontainer.appendChild(iframe);\n iframe.setAttribute('src', url);\n }\n }).then((result) => {\n });\n }\n\n if (action == 'cron_log_download') {\n e.preventDefault();\n\n let modal_content = `

\n \"Loading\"

\n

`+json_strings.translations.download_wait+`

\n `;\n\n Cookies.set('log_download_started', 0, { expires: 100 });\n setTimeout(check_log_download_cookie, 1000);\n\n Swal.fire({\n title: '',\n html: modal_content,\n showCloseButton: false,\n showCancelButton: false,\n showConfirmButton: false,\n showClass: {\n popup: 'animate__animated animated__fast animate__fadeInUp'\n },\n hideClass: {\n popup: 'animate__animated animated__fast animate__fadeOutDown'\n },\n didOpen: function () {\n var url = json_strings.uri.base+'includes/cron.log.export.php?format=csv';\n let iframe = document.createElement('iframe');\n let swalcontainer = document.getElementById('swal2-html-container')\n swalcontainer.appendChild(iframe);\n iframe.setAttribute('src', url);\n }\n }).then((result) => {\n });\n }\n\n // Manage files actions\n if (action == 'unassign') {\n var _formatted = sprintf(json_strings.translations.confirm_unassign, checks.length);\n if (!confirm(_formatted)) {\n e.preventDefault();\n }\n }\n\n // Download multiple files as zip\n if (action == 'zip') {\n e.preventDefault();\n var checkboxes = $(\"td>input:checkbox:checked\").serializeArray();\n if (checkboxes.length > 0) {\n let modal_content = `

\"Loading\"

\n

`+json_strings.translations.download_wait+`

\n

`+json_strings.translations.download_long_wait+`

\n `;\n\n Cookies.set('download_started', 0, { expires: 100 });\n setTimeout(check_download_cookie, 1000);\n\n Swal.fire({\n title: '',\n html: modal_content,\n showCloseButton: false,\n showCancelButton: false,\n showConfirmButton: false,\n showClass: {\n popup: 'animate__animated animated__fast animate__fadeInUp'\n },\n hideClass: {\n popup: 'animate__animated animated__fast animate__fadeOutDown'\n },\n didOpen: function () {\n $.ajax({\n method: 'GET',\n url: json_strings.uri.base + 'process.php',\n data: { do:\"return_files_ids\", files:checkboxes }\n }).done( function(rsp) {\n var url = json_strings.uri.base + 'process.php?do=download_zip&files=' + rsp;\n let iframe = document.createElement('iframe');\n let swalcontainer = document.getElementById('swal2-html-container')\n swalcontainer.appendChild(iframe);\n iframe.setAttribute('src', url);\n });\n }\n }).then((result) => {\n });\n }\n }\n }\n else {\n return false;\n }\n });\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.parts.downloadCookieHandler = function () {\n $(document).ready(function() {\n /**\n * CLOSE THE ZIP DOWNLOAD MODAL\n * Solution to close the modal. Suggested by remez, based on\n * https://stackoverflow.com/questions/29532788/how-to-display-a-loading-animation-while-file-is-generated-for-download\n */\n var downloadTimeout;\n window.check_download_cookie = function() {\n if (Cookies.get(\"download_started\") == 1) {\n Cookies.set(\"download_started\", \"false\", { expires: 100 });\n Swal.close();\n } else {\n downloadTimeout = setTimeout(check_download_cookie, 1000);\n }\n };\n\n // Close the log CSV download modal\n var logdownloadTimeout;\n window.check_log_download_cookie = function() {\n if (Cookies.get(\"log_download_started\") == 1) {\n Cookies.set(\"log_download_started\", \"false\", { expires: 100 });\n Swal.close();\n } else {\n logdownloadTimeout = setTimeout(check_log_download_cookie, 1000);\n }\n };\n });\n }\n})();","(function () {\n 'use strict';\n\n admin.parts.filePreviewModal = function () {\n\n $(document).ready(function(e) {\n // Append modal\n var modal_layout = `
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
`;\n $('body').append(modal_layout);\n\n // Button trigger\n $('.get-preview').on('click', function(e) {\n e.preventDefault();\n var url = $(this).data(\"url\"); \n var content = '';\n\n $.ajax({\n method: \"GET\",\n url: url,\n cache: false,\n }).done(function(response) {\n var obj = JSON.parse(response);\n switch (obj.type) {\n case 'video':\n content = `\n
\n \n
`;\n break;\n case 'audio':\n content = `\n `;\n break;\n case 'pdf':\n content = `\n
\n \n
\n `;\n break;\n case 'image':\n content = ``\n break;\n }\n $('.modal-header h5').html(obj.name);\n $('.modal-body').html(content);\n // show modal\n $('#preview_modal').modal('show');\n }).fail(function(response) {\n alert(json_strings.translations.preview_failed);\n }).always(function() {\n }); \n });\n\n // Remove content when closing modal\n $('#preview_modal').on('hidden.bs.modal', function (e) {\n $('.modal-body').html('');\n })\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.parts.generatePassword = function () {\n $(document).ready(function () {\n var hdl = new Jen(true);\n hdl.hardening(true);\n\n $('.btn_generate_password').click(function(e) {\n var target = $(this).parents('.form-group').find('.attach_password_toggler');\n var min_chars = $(this).data('min');\n var max_chars = $(this).data('max');\n $(target).val( hdl.password( min_chars, max_chars ) );\n });\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.parts.jqueryValidationCustomMethods = function () {\n\n $(document).ready(function(){\n jQuery.validator.addMethod(\"alphanumericUsername\", function(value, element) {\n return this.optional(element) || /^[\\w.]+$/i.test(value);\n }, json_strings.validation.alpha_user);\n\n jQuery.validator.addMethod(\"passwordValidCharacters\", function(value, element) {\n return this.optional(element) || /^[0-9a-zA-Z`!\"?$%\\^&*()_\\-+={\\[}\\]:;@~#|<,>.'\\/\\\\]+$/.test(value);\n }, json_strings.validation.alpha_user);\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.parts.loadCKEditor = function () {\n\n $(document).ready(function() {\n if (document.querySelector('textarea.ckeditor') !== null) {\n // CKEditor\n ClassicEditor\n .create( document.querySelector( '.ckeditor' ), {\n removePlugins: [ 'Heading', 'Link' ],\n toolbar: [ 'bold', 'italic', 'bulletedList', 'numberedList', 'blockQuote' ]\n })\n .then( editor => {\n window.editor = editor;\n } )\n .catch( error => {\n console.error( 'There was a problem initializing the editor.', error );\n } );\n }\n });\n }\n})();","(function () {\n 'use strict';\n\n admin.parts.login2faInputs = function () {\n\n let request_button = document.getElementById('request_new_2fa_code');\n if (typeof(request_button) != 'undefined' && request_button != null) {\n request_button.addEventListener('click', function (event) {\n // request new\n const token = document.getElementsByName('token')[0].value;\n console.log(token);\n })\n\n // Countdown and enable button \n const shouldEnableButton = setInterval(() => {\n const wait_until = request_button.dataset.time;\n var now = new Date();\n var dateUntil = new Date(wait_until);\n var diff = Math.ceil((dateUntil - now) / 1000);\n request_button.innerText = request_button.dataset.textWait.replace('{seconds}', diff);\n if (diff < 0) {\n request_button.innerText = request_button.dataset.text;\n request_button.removeAttribute('disabled');\n clearInterval(shouldEnableButton);\n }\n }, 1000);\n }\n\n // Adapted from Jinul's answer at\n // https://stackoverflow.com/questions/41698357/how-to-partition-input-field-to-appear-as-separate-input-fields-on-screen\n function OTPInput() {\n const otp_input_1 = document.querySelector('#otp_inputs #n1');\n if (typeof(otp_input_1) != 'undefined' && otp_input_1 != null){\n otp_input_1.onpaste = pasteOTP;\n }\n\n const inputs = document.querySelectorAll('#otp_inputs > *[id]');\n for (let i = 0; i < inputs.length; i++) {\n inputs[i].addEventListener('input', function (event) {\n handleOTPNumericInput(event, this);\n });\n\n inputs[i].addEventListener('keyup', function (event) {\n handleOTPNumericInput(event, this);\n });\n\n inputs[i].addEventListener('paste', function (event) {\n handleOTPNumericInput(event, this);\n });\n }\n }\n OTPInput();\n\n function handleOTPNumericInput(event, el) {\n if (event.key !== 'undefined' && event.key != 'Backspace') {\n if (!isNumeric(event.target.value)) {\n el.value = '';\n el.focus();\n return;\n }\n }\n if (!event.target.value || event.target.value == '') {\n if (event.target.previousSibling.previousSibling) {\n event.target.previousSibling.previousSibling.focus();\n }\n } else {\n if (event.target.nextSibling.nextSibling) {\n event.target.nextSibling.nextSibling.focus();\n }\n }\n }\n\n function pasteOTP(event) {\n event.preventDefault();\n let elm = event.target;\n let pasteVal = event.clipboardData.getData('text').split(\"\");\n if (pasteVal.length > 0) {\n while (elm) {\n elm.value = pasteVal.shift();\n elm = elm.nextSibling.nextSibling;\n }\n const last = document.getElementById('n6').focus();\n }\n }\n }\n})();","(function () {\n 'use strict';\n\n admin.parts.mainMenuSidebar = function () {\n\n $(document).ready(function() {\n window.adjust_main_menu = function() {\n var window_width = jQuery(window).width();\n if ( window_width < 769 ) {\n $('.main_menu .active .dropdown_content').hide();\n $('.main_menu li').removeClass('active');\n \n if ( !$('body').hasClass('menu_contracted') ) {\n $('body').addClass('menu_contracted');\n }\n }\n }\n\n adjust_main_menu();\n\n $('.main_menu > li.has_dropdown .nav_top_level').click(function(e) {\n e.preventDefault();\n\n var parent = $(this).parents('.has_dropdown');\n if ( $(parent).hasClass('active') ) {\n $(parent).removeClass('active');\n $(parent).find('.dropdown_content').stop().slideUp();\n }\n else {\n if ( $('body').hasClass('menu_contracted') ) {\n $('.main_menu li').removeClass('active');\n $('.main_menu').find('.dropdown_content').stop().slideUp(100);\n }\n $(parent).addClass('active');\n $(parent).find('.dropdown_content').stop().slideDown();\n }\n });\n\n $('.toggle_main_menu').click(function(e) {\n e.preventDefault();\n\n var window_width = jQuery(window).width();\n if ( window_width > 768 ) {\n $('body').toggleClass('menu_contracted');\n if ( $('body').hasClass('menu_contracted') ) {\n Cookies.set(\"menu_contracted\", 'true', { expires: 365 } );\n $('.main_menu li').removeClass('active');\n $('.main_menu').find('.dropdown_content').stop().hide();\n }\n else {\n Cookies.set(\"menu_contracted\", 'false', { expires: 365 } );\n $('.current_nav').addClass('active');\n $('.current_nav').find('.dropdown_content').stop().show();\n }\n }\n else {\n $('body').toggleClass('menu_hidden');\n $('.main_menu li').removeClass('active');\n\n if ( $('body').hasClass('menu_hidden') ) {\n //Cookies.set(\"menu_hidden\", 'true', { expires: 365 } );\n $('.main_menu').find('.dropdown_content').stop().hide();\n }\n else {\n //Cookies.set(\"menu_hidden\", 'false', { expires: 365 } );\n }\n }\n });\n });\n\n jQuery(window).resize(function($) {\n adjust_main_menu();\n });\n }\n})();","(function () {\n 'use strict';\n\n admin.parts.misc = function () {\n\n $(document).ready(function() {\n // Focus the first input on the page. Generally, it's the search box\n $('input:first').focus();\n\n // Generic confirm alert\n $('.confirm_generic').on('click', function(e) {\n if (!confirm(json_strings.translations.confirm_generic)) {\n e.preventDefault();\n }\n });\n \n // Dismiss messages\n $('.message .close').on('click', function () {\n $(this).closest('.message').transition('fade');\n });\n\n // Common for all tables\n $(\"#select_all\").click(function(){\n var status = $(this).prop(\"checked\");\n /** Uncheck all first in case you used pagination */\n $(\"tr td input[type=checkbox].batch_checkbox\").prop(\"checked\",false);\n $(\"tr:visible td input[type=checkbox].batch_checkbox\").prop(\"checked\",status);\n });\n\n // Loose focus after clicking buttons\n $('button').on('click', function() {\n $(this).blur();\n });\n\n $('.copy_text').on('click', function(e) {\n let target_id = $(this).data('target');\n let target = document.getElementById(target_id);\n var element_type = target.tagName.toLowerCase();\n switch (element_type) {\n case 'input':\n copyTextToClipboard(target.value);\n break;\n default:\n copyTextToClipboard(target.innerHTML);\n break;\n }\n });\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.parts.passwordVisibilityToggle = function () {\n let password_inputs = document.querySelectorAll('.attach_password_toggler')\n password_inputs.forEach(element => {\n var id;\n if (element.hasAttribute('id')) {\n id = element.id;\n } else {\n let random = (Math.random() + 1).toString(36).substring(7);\n id = 'el_pass_'+random;\n element.setAttribute('id', id);\n }\n\n let button = document.createElement('button');\n button.classList.add('btn', 'btn-sm', 'btn-light', 'input-group-btn', 'password_toggler');\n button.setAttribute('type', 'button');\n button.dataset.targetId = id;\n button.dataset.status = 'hidden';\n\n let icon = document.createElement('i');\n icon.classList.add('fa', 'fa-eye');\n button.appendChild(icon);\n\n var copy = element.cloneNode();\n var wrapper = document.createElement('div');\n wrapper.classList.add('input-group');\n wrapper.appendChild(copy);\n wrapper.appendChild(button);\n\n element.insertAdjacentElement(\"afterend\", wrapper);\n element.remove();\n\n button.addEventListener( 'click', function ( event ) {\n let id = event.target.dataset.targetId;\n let target = document.getElementById(id);\n let me = event.target;\n let icon = this.querySelector('i');\n let type;\n switch (me.dataset.status) {\n case 'hidden':\n icon.classList.remove('fa-eye');\n icon.classList.add('fa-eye-slash');\n me.dataset.status = 'visible';\n type = 'text';\n break;\n case 'visible':\n icon.classList.remove('fa-eye-slash');\n icon.classList.add('fa-eye');\n me.dataset.status = 'hidden';\n type = 'password';\n break;\n }\n\n let new_input = document.createElement('input');\n new_input.setAttribute('type', type);\n new_input.setAttribute('id', id);\n new_input.setAttribute('name', target.name);\n if (target.hasAttribute('max-length')) {\n new_input.maxLength = target.maxLength;\n }\n new_input.className = target.className;\n new_input.value = target.value;\n target.insertAdjacentElement(\"beforebegin\", new_input);\n target.remove();\n }, true);\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.parts.publicLinksPopup = function () {\n $(document).ready(function () {\n /**\n * Modal: show a public file's URL\n */\n $('body').on('click', '.public_link', function (e) {\n var type = $(this).data('type');\n var file_title = $(this).data('title');\n var public_url = $(this).data('public-url');\n\n if (type == 'group') {\n var note_text = json_strings.translations.public_group_note;\n } else if (type == 'file') {\n var note_text = json_strings.translations.public_file_note;\n }\n\n var modal_content = `\n `;\n\n Swal.fire({\n title: json_strings.translations.public_url,\n html: modal_content,\n showCloseButton: false,\n showCancelButton: false,\n showConfirmButton: false,\n showClass: {\n popup: 'animate__animated animated__fast animate__fadeInUp'\n },\n hideClass: {\n popup: 'animate__animated animated__fast animate__fadeOutDown'\n }\n }).then((result) => {});\n });\n\n /** Used on the public link modal on both manage files and the upload results */\n $(document).on('click', '.public_link_copy', function(e) {\n var text = $(this).data('copy-text');\n copyTextToClipboard(text);\n });\n });\n };\n})();","(function () {\n 'use strict';\n\n admin.parts.select2 = function () {\n\n $(document).ready(function(){\n $('.select2').select2({\n width: '100%',\n theme: \"bootstrap-5\",\n });\n\n $('.add-all').on('click', function() {\n var target = $(this).data('target');\n var selector = $('#'+target);\n $(selector).hide();\n $(selector).find('option').each(function() {\n $(this).prop('selected', true);\n });\n $(selector).trigger('change');\n return false;\n });\n\n $('.remove-all').on('click', function() {\n var target = $(this).data('target');\n var selector = $('#'+target);\n selector.val(null).trigger('change');\n return false;\n });\n\n $('.copy-all').on('click', function() {\n if ( confirm( json_strings.translations.upload_form.copy_selection ) ) {\n var target = $(this).data('target');\n var type = $(this).data('type');\n var selector = $('#'+target);\n var val;\n \n var selected = new Array();\n $(selector).find('option:selected').each(function() {\n selected.push($(this).val().toString());\n });\n\n $('.select2[data-type=\"'+type+'\"]').not(selector).each(function() {\n $(this).find('option').each(function() {\n val = $(this).val().toString();\n if (selected.includes(val)) {\n $(this).prop('selected', 'selected');\n } else {\n $(this).removeAttr('selected');\n }\n });\n $(this).trigger('change');\n });\n }\n\n return false;\n });\n });\n };\n})();","let sideModal = class {\n constructor()\n {\n let markup = `\n
\n\n
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n
\n
\n Loading...\n
\n
\n
\n
\n
\n
\n `;\n\n document.body.insertAdjacentHTML('afterend', markup);\n\n this.triggers = document.querySelectorAll(\"[data-side-modal]\");\n this.cover = document.getElementById('side_modal_cover');\n this.modal = document.getElementById('side_modal');\n this.header = document.getElementById('sm_header');\n this.closeButton = this.header.querySelector('.dismiss');\n this.titleEl = this.header.querySelector('h5');\n this.loader = this.modal.querySelector('.loader');\n this.contentArea = this.modal.querySelector('.content');\n this.isOpen = false;\n this.closeWithButtonOnly = false;\n }\n\n setUp() {\n document.addEventListener('click', this.shouldOpenSideModal.bind(this));\n\n this.triggers.forEach(trigger => {\n trigger.addEventListener(\"click\", this.openSideModalAndLoadContent.bind(this));\n });\n\n this.cover.addEventListener(\"click\", this.closeSideModalFromCover.bind(this));\n this.closeButton.addEventListener(\"click\", this.closeSideModal.bind(this));\n\n document.addEventListener(\"keydown\", this.closeWithEscKey.bind(this));\n }\n\n changeCloseWithButtonOnly(value)\n {\n if (typeof value == \"boolean\") {\n this.closeWithButtonOnly = value;\n }\n }\n\n closeWithEscKey(e)\n {\n if (e.keyCode === 27 && this.closeWithButtonOnly == false) {\n this.closeSideModal();\n }\n }\n\n closeSideModalFromCover()\n {\n if (this.closeWithButtonOnly == false) {\n this.closeSideModal();\n }\n }\n\n shouldOpenSideModal(e)\n {\n if (e.target && e.target.dataset.sideModal) {\n this.openSideModal();\n }\n }\n\n openSideModal(e)\n {\n this.isOpen = true;\n this.cover.classList.add('visible');\n this.modal.classList.remove('hidden');\n document.body.classList.add('ox-h');\n }\n\n openSideModalAndLoadContent(e)\n {\n e.preventDefault();\n this.isOpen = true;\n this.cover.classList.add('visible');\n this.modal.classList.remove('hidden');\n document.body.classList.add('ox-h');\n\n this.cleanAndSetLoading();\n this.setTitle(e.target.dataset.title);\n\n let url = e.target.href;\n let that = this;\n\n axios.get(url, {\n })\n .then(function (response) {\n that.setContent(response.data);\n })\n .catch(function (error) {\n toastr.error(json_strings.translations.cannot_load_content);\n\n that.setTitle('');\n that.setContent('');\n that.closeSideModal();\n });\n\n }\n\n closeSideModal()\n {\n if (this.isOpen) {\n this.isOpen = false;\n this.cover.classList.remove('visible');\n this.modal.classList.add('hidden');\n document.body.classList.remove('ox-h');\n\n this.clean();\n }\n }\n\n setTitle(title)\n {\n this.titleEl.innerHTML = title;\n }\n\n setContent(content)\n {\n this.contentArea.innerHTML = content;\n this.loader.classList.remove('visible');\n }\n\n clean()\n {\n this.contentArea.innerHTML = \"\";\n }\n\n cleanAndSetLoading()\n {\n this.clean();\n this.loader.classList.add('visible');\n }\n};\n\nwindow.smd = new sideModal();\nwindow.smd.setUp();\n","(function () {\n 'use strict';\n \n admin.parts.widgetActionLog = function () {\n \n $(document).ready(function(){\n // Action log\n function ajax_widget_log( action ) {\n var target = $('#log_container');\n var select = $('#widget_actions_log_change');\n var list = $('