{"version":3,"file":"uppsala.formpage.min.js","names":["define","$","formPage","init","elements","add","ToggleAreas","click","select","selectOptions","find","bytesToMegabytes","bytes","Math","pow","toFixed","isExecutableFileExtension","name","executables","i","length","toLowerCase","includes","keyup","window","location","on","e","preventDefault","value","currentFileContainer","this","parents","currentFileBlock","parent","hidden","fileInput","not","index","data","val","hide","insertBefore","siblings","show","change","inputElem","file","sum","errorMsg","oneMB","maxAttachedFileSizeSumBytes","parseInt","document","getElementById","maxFileSizeBytes","maxTotalFileSizeBytes","FileReader","files","alert","size","each","isValidFileSize","ariaLabelFilename","spanFilename","attr","text","addClass","removeClass","siblingFileContainers","children","remove","confirm","input","is","clone","insertAfter","trigger","QrLinksHandler","setup","KeepSessionAlive","items","inputId","area","checked","selected","prop","currentPath","pathname","lastSlashIndex","substr","actionUrl","protocol","host","SessionUpdater","Setup","keepSessionAliveUrl","checkToKeepSessionAlive","setTimeout","ajax","type","url","success","error","console","log","requestedUrl","urlQueryParams","searchParams","urlParams","href","URLSearchParams","split","forEach","key","Array","isArray","push","queryKey","currentQuery","queryValue","startsWith","elementIdStartsWith","substring","removeFromName","$elements","$element","first"],"sources":["uppsala.formpage.js"],"mappings":"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","ignoreList":[],"sourcesContent":["define([\"jquery\"], function ($) {\r\n var formPage = {\r\n init: function () {\r\n\r\n var elements = $(\"div.field.radio-area input[type=radio]\").add($(\"div.field.checkbox-area input[type=checkbox]\"));\r\n formPage.ToggleAreas(elements);\r\n elements.click(function () { formPage.ToggleAreas(elements); });\r\n\r\n var select = $(\"div.field select\");\r\n var selectOptions = select.find(\"option\");\r\n formPage.ToggleAreas(selectOptions);\r\n select.click(function () { formPage.ToggleAreas(selectOptions); });\r\n select.keyup(function () { formPage.ToggleAreas(selectOptions); });\r\n\r\n if ($(\"#validation-summary\").length === 1) {\r\n window.location = \"#validation-summary\";\r\n }\r\n\r\n // Remove-button for uploaded files (after \"granska\")\r\n $(\".js-remove-file-button\").on('click',\r\n function (e) {\r\n e.preventDefault();\r\n var currentFileContainer = $(this).parents(\".js-current-file\");\r\n var currentFileBlock = currentFileContainer.parent();\r\n var hidden = $(\".js-hidden-remove-file\", currentFileBlock);\r\n var fileInput = $(\".js-form-file-input\", currentFileBlock).not(\".js-has-file\");\r\n var value;\r\n var index = $(this).data(\"fileindex\");\r\n\r\n if (hidden) {\r\n value = hidden.val();\r\n if (value) {\r\n value += \",\";\r\n }\r\n\r\n hidden.val(value + index);\r\n currentFileContainer.hide();\r\n\r\n // If there's no other uploaded files left in the upload block when the current one is removed\r\n if ($(\".js-current-file:visible\", currentFileBlock).length === 0) {\r\n\r\n fileInput.parent().insertBefore(fileInput.parent().siblings(\".js-form-file-add-more\"));\r\n\r\n // If there's no other currently selected files (not yet uploaded) in the upload block\r\n if (fileInput.parent().siblings(\".js-clientside-current-file:visible\").length === 0) {\r\n fileInput.show();\r\n fileInput.parent().siblings(\".js-form-file-add-more\").hide();\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n });\r\n\r\n $(\".js-form-file-input\").change(\r\n function () {\r\n if (!isValidFileSize($(this)[0])) {\r\n $(this).val(\"\");\r\n return;\r\n }\r\n\r\n // If the input element now has a value (i.e, a file was chosen)\r\n if ($(this).val()) {\r\n $(this).parent().siblings(\".js-form-file-add-more\").show();\r\n\r\n if ($(this)[0].files[0]) {\r\n var ariaLabelFilename = \"Ta bort \";\r\n var spanFilename = \"\";\r\n // If there's more than one file selected\r\n if ($(this)[0].files.length > 1) {\r\n // Add every filename to span\r\n for (var i = 0; i < $(this)[0].files.length; i++) {\r\n if (i === 0) {\r\n ariaLabelFilename += $(this)[0].files[i].name;\r\n spanFilename += $(this)[0].files[i].name;\r\n } else {\r\n ariaLabelFilename += \", \" + $(this)[0].files[i].name;\r\n spanFilename += \", \" + $(this)[0].files[i].name;\r\n }\r\n }\r\n // Only one file is selected\r\n } else {\r\n ariaLabelFilename += $(this)[0].files[0].name;\r\n spanFilename = $(this)[0].files[0].name;\r\n }\r\n // Set aria-label and show \"Ta bort\" button\r\n $(this).siblings(\".js-clear-file-button\").attr(\"aria-label\", ariaLabelFilename).show();\r\n // Set text and show span with filename\r\n $(this).siblings(\".js-clientside-file-name\")\r\n .text(spanFilename)\r\n .show();\r\n\r\n $(this).addClass(\"js-has-file\");\r\n // Hide file input\r\n $(this).hide();\r\n }\r\n\r\n } else {\r\n if ($(this).siblings(\".js-clear-file-button:visible\")) {\r\n $(this).siblings(\".js-clear-file-button\").hide();\r\n }\r\n }\r\n\r\n });\r\n\r\n $(\".js-clear-file-button\").click(\r\n function (e) {\r\n e.preventDefault();\r\n var currentFileContainer = $(this).parents(\".js-clientside-current-file\");\r\n // Show file input\r\n $(\".js-form-file-input\", currentFileContainer).val(\"\").show();\r\n $(\".js-form-file-input\", currentFileContainer).removeClass(\"js-has-file\");\r\n // Hide file label\r\n $(\".js-clientside-file-name\", currentFileContainer).hide();\r\n\r\n var siblingFileContainers = $(this).parent().siblings(\".js-clientside-current-file:visible\");\r\n // If there's other file inputs, with selected or un-selected files, we can remove the current container\r\n if (siblingFileContainers.children(\".js-form-file-input:visible\").length > 0 || siblingFileContainers.children(\".js-clientside-file-name:visible\").length > 0) {\r\n currentFileContainer.remove();\r\n } else {\r\n $(this).parent().siblings(\".js-form-file-add-more\").hide();\r\n }\r\n\r\n $(this).hide();\r\n }\r\n );\r\n\r\n $(\".js-form-cancel-button\").click(\r\n function (e) {\r\n if (confirm($(\"#js-form-cancel-button-text\").text())) {\r\n return true;\r\n }\r\n\r\n e.preventDefault();\r\n return false;\r\n });\r\n\r\n $(\".js-form-file-add-more\").click(\r\n function (e) {\r\n e.preventDefault();\r\n var input = $(this).siblings(\".js-clientside-current-file:last\");\r\n\r\n if (input.is(\":visible\")) {\r\n var clone = input.clone(true);\r\n clone.children(\".js-form-file-input\").val(\"\").show();\r\n clone.children(\".js-clear-file-button\").hide();\r\n clone.children(\".js-clientside-file-name\").val(\"\").hide();\r\n clone.insertAfter(input);\r\n // Open the select file dialog automatically, instead of having to click again\r\n clone.children(\".js-form-file-input\").click();\r\n } else {\r\n input.show();\r\n }\r\n\r\n $(this).hide();\r\n });\r\n\r\n $(\".js-hidden-remove-file\").val(\"\"); // auto-filled on page reload in Firefox\r\n $(\".js-form-file-input\").each(function () {\r\n // trigger change event (show more button) for auto-filled file inputs after page reload\r\n if ($(this).val()) {\r\n $(this).show();\r\n $(this).trigger(\"change\");\r\n }\r\n });\r\n\r\n \r\n if ($('#user-form')) {\r\n\r\n // handle pre-selection from querys in url\r\n QrLinksHandler.setup();\r\n\r\n // initialize Session Updater on page\r\n formPage.KeepSessionAlive();\r\n }\r\n\r\n function bytesToMegabytes(bytes) {\r\n var mb = bytes / Math.pow(1024, 2);\r\n return mb.toFixed(2) + \" MB\";\r\n }\r\n\r\n function isValidFileSize(inputElem) {\r\n var oneMB = 1048576;\r\n var maxAttachedFileSizeSumBytes = parseInt(document.getElementById(\"maxAttachedFileSizeSum\").value) || (10 * oneMB);\r\n var maxFileSizeBytes = maxAttachedFileSizeSumBytes;\r\n var maxTotalFileSizeBytes = maxAttachedFileSizeSumBytes;\r\n\r\n var i, file, sum, errorMsg;\r\n \r\n\r\n if (!window.FileReader) {\r\n // file api not supported\r\n return true;\r\n }\r\n\r\n if (inputElem.files.length > 1) {\r\n errorMsg = \"De senast valda filerna kommer inte att laddas upp.\";\r\n } else {\r\n errorMsg = \"Den senast valda filen kommer inte att laddas upp.\";\r\n }\r\n\r\n // check this input\r\n for (i = 0; i < inputElem.files.length; i++) {\r\n file = inputElem.files[i];\r\n\r\n // check for executables\r\n if (isExecutableFileExtension(file.name)) {\r\n alert('Tyvärr är den här filtypen inte tillåten av säkerhetsskäl');\r\n return false;\r\n }\r\n\r\n if (file.size > maxFileSizeBytes) {\r\n alert(errorMsg + \"\\n\\nFilen \" + file.name + \" är \" + bytesToMegabytes(file.size) + \" stor.\\nDet går inte att ladda upp filer större än \" + bytesToMegabytes(maxFileSizeBytes) + \".\");\r\n return false;\r\n }\r\n }\r\n\r\n // sum of all inputs\r\n sum = 0;\r\n $(\".js-form-file-input\").each(\r\n function () {\r\n var inputElem = $(this)[0];\r\n for (i = 0; i < inputElem.files.length; i++) {\r\n file = inputElem.files[i];\r\n sum += file.size;\r\n }\r\n });\r\n\r\n $(\".js-remove-file-button:visible\").each(\r\n function () {\r\n sum += $(this).data(\"filesize\");\r\n });\r\n\r\n if (sum > maxTotalFileSizeBytes) {\r\n alert(errorMsg + \"\\n\\nDen sammanlagda storleken på alla filer skulle bli \" + bytesToMegabytes(sum) + \".\\nDet går inte att ladda upp mer än \" + bytesToMegabytes(maxTotalFileSizeBytes) + \" sammanlagt.\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function isExecutableFileExtension(name) {\r\n if (name) {\r\n var executables = ['.EXE', '.BAT', '.COM', '.CMD', '.INF', '.IPA', '.OSX', '.PIF', '.RUN', '.WSH', '.PS1', '.PSM1', '.PSD1'];\r\n\r\n for (var i = 0; i < executables.length; i++) {\r\n if (name.toLowerCase().includes(executables[i].toLowerCase())) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n },\r\n ToggleAreas: function (items) {\r\n items.each(function () {\r\n var inputId = $(this).data(\"toggleid\");\r\n var area = $(\"#\" + inputId);\r\n if (this.checked || this.selected) {\r\n area.show();\r\n }\r\n else {\r\n area.hide();\r\n area.find(\":checked\").prop(\"checked\", false);\r\n area.find(\":selected\").prop(\"selected\", false);\r\n area.find(\"input:text\").val(\"\");\r\n area.find(\"textarea\").val(\"\");\r\n }\r\n });\r\n },\r\n KeepSessionAlive: function () {\r\n var postPath = \"keepsessionalive\";\r\n // get current url\r\n var location = window.location;\r\n var currentPath = location.pathname;\r\n var lastSlashIndex = currentPath.length - 1;\r\n // strip last slash from current path\r\n currentPath = currentPath[lastSlashIndex] == '/' ? currentPath.substr(0, lastSlashIndex) : currentPath;\r\n\r\n var actionUrl = `${location.protocol}//${location.host}/${currentPath}/${postPath}`;\r\n // initialize Session Updater on page\r\n SessionUpdater.Setup(actionUrl);\r\n }\r\n };\r\n return formPage;\r\n});\r\n\r\n// keep session alive\r\nSessionUpdater = (function () {\r\n var keepSessionAliveUrl = null;\r\n var timeout = 19 * 1000 * 60; // 19 minutes\r\n\r\n function setupSessionUpdater(actionUrl) {\r\n // store local value\r\n keepSessionAliveUrl = actionUrl;\r\n // start timeout - it'll run after n minutes\r\n checkToKeepSessionAlive();\r\n }\r\n\r\n // fires every n minutes - if there's been movement ping server and restart timer\r\n function checkToKeepSessionAlive() {\r\n setTimeout(function () {\r\n keepSessionAlive();\r\n }, timeout);\r\n }\r\n\r\n function keepSessionAlive() {\r\n // if we've had any movement since last run, ping the server\r\n if (keepSessionAliveUrl != null) {\r\n $.ajax({\r\n type: \"POST\",\r\n url: keepSessionAliveUrl,\r\n success: function (data) {\r\n // restart timeout to check again in n minutes\r\n checkToKeepSessionAlive();\r\n },\r\n error: function (data) {\r\n console.log(\"Error posting to \" & keepSessionAliveUrl);\r\n }\r\n });\r\n }\r\n }\r\n // export setup method\r\n return {\r\n Setup: setupSessionUpdater\r\n };\r\n})();\r\n\r\n// handles pre-selection on dropdowns by elementIds from url query parameters\r\nQrLinksHandler = (function () {\r\n var requestedUrl = null;\r\n var urlQueryParams = {};\r\n // pre as in prefix\r\n const removeFromName = 'pre';\r\n\r\n // handles pre-selection from url by picking elements ids from query parameters\r\n function setupQrLinksHandler() {\r\n // picks elementIds and value from urlQuerys /?form137487=105&form142141=test\r\n // removes \"form\" from urlQuery name\r\n\r\n requestedUrl = window.location.href;\r\n urlQueryParams = getQueryParams(requestedUrl);\r\n\r\n if (urlQueryParams) {\r\n for (var queryKey in urlQueryParams) {\r\n var currentQuery = urlQueryParams[queryKey];\r\n var queryValue = Array.isArray(currentQuery) ? currentQuery[0] : currentQuery;\r\n\r\n if (queryKey.startsWith(removeFromName) && queryValue.length) {\r\n //url-query comes in as preXXXX=value\r\n //remove pre from queryName\r\n let elementIdStartsWith = queryKey.substring(removeFromName.length);\r\n\r\n //find elements with ids starting with\r\n let $elements = $('[id^=\"' + elementIdStartsWith + '\"]');\r\n if ($elements.length) {\r\n const $element = $elements.first();\r\n\r\n // find option with value\r\n const hasOption = $element.find('[value=\"' + queryValue + '\"]').length > 0;\r\n // only if value exists as option then set value and trigger change\r\n if (hasOption) {\r\n $element.val(queryValue).change();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // converts querys and values to object\r\n function getQueryParams(url) {\r\n var searchParams = new URLSearchParams(url.split('?')[1]);\r\n var urlParams = {};\r\n\r\n searchParams.forEach((value, key) => {\r\n if (urlParams[key]) {\r\n if (!Array.isArray(urlParams[key])) {\r\n urlParams[key] = [urlParams[key]];\r\n }\r\n urlParams[key].push(value);\r\n } else {\r\n urlParams[key] = value;\r\n }\r\n });\r\n\r\n return urlParams;\r\n }\r\n // export setup method\r\n return {\r\n setup: setupQrLinksHandler\r\n };\r\n})();"]}