function OpenArtiklarDialog(n=false){const t=getAvailablePlaceholder("Artiklar");var i=null,r=null;n||(i=$("#ArtikelNr").val(),r=$("#ArtikelMatPrisHuv_Id").val());$.ajax({cache:!1,url:"/Artikel/Index",type:"GET",data:{matnr:i,matprishuv_id:r},"async":!0,beforeSend:function(){showLoadingAjax(!0)},success:function(i){t.html(i);initSelectPickers(t);ArtiklarModalDialogInitAfterLoad(t,n);t.on("hidden.bs.modal",()=>{console.debug("(cleanup) Splitter "),window.destroySplitter(".artiklar-splitter")})},error:function(n){displayAjaxErrorMessage(n,"OpenArtiklarDialog")},complete:function(){showLoadingAjax(!1)}});t.modal({backdrop:"static"})}function ArtiklarModalDialogInitAfterLoad(n,t){function y(n){pvf.table.setModified(n);n.addClass("row-modified")}let i=!1,u=null,f=null,e=null,r=null,w=null,b=null,h=null;const s=function(o,s,c,l){u=s;f=c;e=l;w=$("#Dim1").val();b=$("#Material").val();h=$("#MatPrisHuv_Id").val();r!=null&&($("#matnodetxt_"+r).removeClass("artiklar-highlight-treenode"),$("#matnode_"+r).removeClass("artiklar-highlight-treenode"));o!=null&&($("#matnodetxt_"+o).addClass("artiklar-highlight-treenode"),$("#matnode_"+o).addClass("artiklar-highlight-treenode"));r=o;$("#artiklarList").html("");$("#artiklarList").html('
"+t+"<\/pre>"}catch(r){console.error("Kunde inte skriva till popup:",r)}}if(typeof t=="object"){doAjaxMsg2(t,function(){window.location.href="../Edit/"+currentProject_Id});return}n.document.readyState==="complete"?i():n.onload=i},error:function(n){displayAjaxErrorMessage(n)},complete:function(){showLoadingAjax(!1)}})}function isUtskEditMode(){const n=$("#buUtskEditMode");return n.length?n.hasClass("pvf-button-selected"):!1}function showHideUtskEditModeButton(n){const t=$("#buUtskEditMode");t.length&&t.toggleClass("d-none",$.inArray(n,c_PagesWithUtskEditModeButton)===-1)}function doUtskPageDelete(n){Number.isInteger(n)||(n=-1);var i="#frmUtskEdit"+currentUtskPageIndex,t="";t+="&pageIndex="+currentUtskPageIndex;t+="&project_Id="+currentProject_Id;t+="&projectTree_Id="+currentProjectTree_Id;t+="&editMode="+isUtskEditMode();t+="&recId="+n;typeof currentUtskResetFlags!="undefined"&&(t+="&resetFlags="+currentUtskResetFlags);$.ajax({url:"/Utskrift/Delete",cache:!1,type:"POST","async":!0,data:$(i).serialize()+t,beforeSend:function(){showLoadingAjax(!0)},success:function(n){typeof n=="object"?doAjaxMsg2(n,function(){doUtskriftLoadTab(currentUtskPageIndex,!0)}):doSetupUtskPageOnChange(currentUtskPageIndex,n)},error:function(n){displayAjaxErrorMessage(n)},complete:function(){showLoadingAjax(!1)}})}function doUtskPageUeOvrSetModified(n){const t=$(n.target).closest("tr");t.length&&(pvf.table.setModified(t),$(n.target).closest("button").remove())}function loadKindCombo(n,t,i,r){t.data("loading")||(i===""&¤tDefKinds.length>=3&&(r=currentDefKinds),t.data("loading",!0),$.ajax({cache:!1,url:"/Wizard/KindCombos",type:"GET",data:{WizGrupp_Id:n,MyKinds:i,SelKinds:r,ProjectWizard_Id:currentProjectWizard_Id,Project_Id:currentProject_Id},"async":!0,beforeSend:function(){showLoadingAjax(!0)},success:function(i){t.html(i);initSelectPickers(t);loadWizardRows(n);$("select.kindcombo").off("change").on("change",function(){const t=$(this),u=t.data("kindid"),f=t.data("ksortnr");initSelectPicker(t);let i="",r="";$("select.kindcombo option:selected").each(function(){const t=$(this).data("kindid"),u=$(this).data("ksortnr"),e=$(this).data("shortid"),n=`${t},${e}`;u<=f?i+=(i.length>0?";":"")+n:r+=(r.length>0?";":"")+n});loadKindCombo(n,$("#wkc_"+u+"_subs"),i,r)})},error:function(n){displayAjaxErrorMessage(n);$("#kindcombo_selection").html("")},complete:function(){t.data("loading",!1);showLoadingAjax(!1)}}))}function initWizardMomTill(){const n=function(n=""){$.ajax({cache:!1,url:"/Tillagg/MomTillAuto",type:"GET","async":!0,data:{project_id:currentProject_Id,autoMode:n},beforeSend:function(){showLoadingAjax(!0)},success:function(n){n.status=="init"?(autoMomTillChars=n.autoChars,autoMomTillLongString=n.autoLongString):doAjaxMsg2(n)},error:function(n){displayAjaxErrorMessage(n)},complete:function(){showLoadingAjax(!1)}})},t=function(){const t=$("#buToggleWizardMomTillAuto").toggleClass("pvf-button-selected").hasClass("pvf-button-selected");t?console.debug("Toggle Auto MomTill ON"):console.debug("Toggle Auto MomTill OFF");n("T");setWizardMomTillValues()};$("#buToggleWizardMomTillAuto").off("click").on("click",function(){t()});n("I")}function setWizardMomTillValues(){const r=$("#buToggleWizardMomTillAuto"),t=r.hasClass("pvf-button-selected"),n=t?autoMomTillChars:"",u=t?autoMomTillLongString:"",i=$("#StoraMomTill"),f=$("#StoraMomTillText");if(i.length&&(i.val(n),f.html(u)),wizard?.Rows?.length){for(let t of wizard.Rows)t.MomTill=n;$("span.wr_momtill").html(n)}}async function showWizardMomTill(n,t=-1){const u=t==null||t===-1?-1:t,f=u===-1?$("#StoraMomTill").val():wizard.Rows[u].MomTill,r=await modalService.openAndWaitForResultDirect("momTill",{selectedMomTill:f,project_Id:currentProject_Id},this);if(r)if(u!=-1)wizard.setProperty(u,"MomTill",r.selectedMomTill),$("#momtilltext_"+u).html(r.selectedMomTill);else if($("#StoraMomTill")&&($("#StoraMomTill").val(r.selectedMomTill),$("#StoraMomTillText").html(r.selectedMomTillLongText),wizard&&wizard.Rows)){for(i=0;iul>li>ul").css("display","none");$("#wizardtree_body li>ul>li>span.trvcollapsible").toggleClass("trvexpand trvcollapse");eval($("#wizardtree_body a").first().attr("href"))},error:function(n){displayAjaxErrorMessage(n,"loadWizardTree")}})}function loadWizardList(n){currentWizardTree_Id!=-1&&($("#wiznodetxt_"+currentWizardTree_Id).toggleClass("wiz_selected"),$("#wiznodetxt_"+n).is(":visible")||$("#li_"+currentWizardTree_Id+">span.trvcollapsible").trigger("click"));currentWizardTree_Id=n;doLoadWizardBilder(n);$("#wiznodetxt_"+n).toggleClass("wiz_selected");$("#wizardlist_body").is(":visible")&&$.ajax({url:"/Wizard/List/"+currentWizardTree_Id,type:"GET","async":!0,success:function(n){$("#wizardlist_body").html(n)},error:function(n){displayAjaxErrorMessage(n,"loadWizardList")}})}function doClickWizardBild(n,t){t!=-1?doSelectWizard(t,"",null):loadWizardList(n)}function doWizardBilderBackButton(){if(currentWizardTree_Id!=-1){var n=$("#wiznodetxt_"+currentWizardTree_Id).parents("li").eq(1).find("a").first();eval(n.attr("href"))}}function displayAjaxErrorMessage(n){function f(n){switch(n.status){case 0:return"Ingen anslutning. Kontrollera nätverket.";case 400:return"Felaktig begäran (400).";case 401:return"Du är inte inloggad (401).";case 403:return"Åtkomst nekad (403).";case 404:return"Sidan hittades inte (404).";case 500:return"Internt serverfel (500).";case 503:return"Tjänsten är inte tillgänglig (503).";default:return`Ett okänt fel inträffade (${n.status}).`}}const i=document.createElement("div");i.className="modal-overlay";const t=document.createElement("div");t.className="ajaxerrormessage";const r=document.createElement("span");r.innerText="×";r.className="close-button";r.onclick=function(){document.body.removeChild(i)};const u=document.createElement("div"),e=f(n);if(u.innerText=e,t.appendChild(r),t.appendChild(u),n.responseText){const r=document.createElement("button");r.innerHTML="Visa mer ⓘ";r.className="show-more-button";const i=document.createElement("pre");i.className="response-details";i.innerHTML=n.responseText||"Ingen ytterligare information.";i.style.display="none";r.onclick=function(){const n=i.style.display==="block";i.style.display=n?"none":"block";r.innerHTML=n?"Visa mer ⓘ":"Dölj ⓘ"};t.appendChild(i);t.appendChild(r)}i.appendChild(t);document.body.appendChild(i)}function doAjaxMsgNew(n,t,i=null,r=3e3){let u;if(n.status=="ok"?u="bg-success":n.status=="info"?u="bg-info":n.status=="error"?(u="bg-danger",r<3e3&&(r=3e3)):u="bg-info",n.msg!=""){const t=document.createElement("div");t.innerText=n.msg;t.className=`ajaxmsgnew ${u}`;document.body.appendChild(t);setTimeout(()=>{t.remove()},r)}typeof t=="function"&&setTimeout(function(){t.apply(this,i||[])},100)}function doAjaxMsg2(n,t,i,r){doAjaxMsgNew(n,t,i,r);return}function doAjaxMsg(n,t,i){doAjaxMsgNew(n,t,n,i);return}function doConfirmJS(n,t,i,r=[]){if(n=="")confirm(t)&&i.call(null,...r);else{$("#confirmJSModal .modal-title").html(n);$("#confirmJSBody").html(t);$("#confirmJSOk").off("click").on("click",function(){i.call(null,...r);$("#confirmJSOk").off("click");$("#confirmJSModal").modal("hide")});$("#confirmJSModal").modal("show")}}function doOnLoad(){isModified=!1}function doOnBeforeUnload(){if(isModified)return"Du har osparade ändringar"}function lmRound(n,t){var i=Math.pow(10,t||0);return Math.round(n*i)/i}function lmIsNumeric(n){return typeof n=="number"||typeof n=="string"&&n.trim()!==""&&!isNaN(n)}function isInModal(n){return n.closest(".modal")!==null}function getModalByChild(n){return n.closest(".modal")}function sortSelectOptions(n){const t=document.getElementById(n),r=t.value,i=Array.from(t.options);i.sort((n,t)=>n.text.localeCompare(t.text,"sv"));t.innerHTML="";i.forEach(n=>{t.appendChild(n)});t.value=r}function getAvailablePlaceholder(n){const i=document.getElementById("modalPlaceholderArea"),r=`modal${n}_${Date.now()}`;let t=i.querySelector('.modal[data-modal-type="'+n+'"]:not(.in)');if(t===null){const u=document.createElement("div");u.className="modal fade";u.id=r;u.setAttribute("role","dialog");u.setAttribute("data-keyboard","false");u.setAttribute("data-model-type",`${n}`);i.appendChild(u);t=u;$(t).off("hidden.bs.modal").on("hidden.bs.modal",function(){console.debug(`hidden.bs.modal triggered for #${t.id}`);this.remove()});const f=Math.max(...$(".modal.in").map(function(){return parseInt($(this).css("z-index"),10)||1050}).get());t.style.zIndex=f+10}return $(t)}function showLoadingAjax(n){document.getElementById("loadingAjax").style.display=n?"block":"none"}function makeClearClone(n){const t=document.getElementById(n);if(t){const n=t.cloneNode(!0);return t.replaceWith(n),n}return null}function toggleCheckboxesByFormAndSelector(n,t){let r=document.getElementById(n),i=r.querySelectorAll(t);if(i.length!==0){let u=!i[0].checked;i.forEach(function(n){n.checked=u})}}function getValueOrDefault(n,t=null){const i=document.getElementById(n);return i?i.value:t}function getObjectFromElement(n){let i=null;const t=document.getElementById(n);if(t){try{const n=t.getAttribute("data-object");n&&(i=JSON.parse(n))}catch(r){console.error(`Kunde inte parsa data-object för #${n}:`,r)}t.remove()}return i}function getDataFromElement(n){const i=[],t=document.getElementById(n);if(t){try{const n=t.getAttribute("data-object");n&&i.push(...JSON.parse(n))}catch(r){console.error(`Kunde inte parsa data-object för #${n}:`,r)}t.remove()}return i}function enableDynamicModalResize(n){const t=n.find(".modal-dialog");t.css({width:"auto",maxWidth:"none",minWidth:"500px",display:"inline-block",marginLeft:"auto",marginRight:"auto"});const i=n.find("textarea")[0];if(i){$(i).css({minWidth:"480px",minHeight:"50px"});const r=new MutationObserver(function(){t.css("width","auto");t.css("margin-left","auto");t.css("margin-right","auto");t[0].offsetHeight});r.observe(i,{attributes:!0,attributeFilter:["style"]})}}function copyToClipboard(n){function t(n){return downloadTextFile(n,"anteckningar.txt"),!1}return navigator.clipboard&&navigator.clipboard.writeText?(navigator.clipboard.writeText(n).catch(()=>t(n)),!0):(t(n),!1)}function downloadTextFile(n,t="export.txt"){const u=new Blob([n],{type:"text/plain;charset=utf-8;"}),r=URL.createObjectURL(u),i=document.createElement("a");i.href=r;i.download=t;document.body.appendChild(i);i.click();document.body.removeChild(i);URL.revokeObjectURL(r)}function dumpJsonToConsole(n,t){console.debug("=== "+n+" ===");console.debug(JSON.stringify(t,null,4));console.debug("=== END "+n+" ===")}function deepFreezeClone(n){const t=structuredClone(n);return deepFreeze(t)}function deepFreeze(n){Object.freeze(n);for(const t of Object.keys(n)){const i=n[t];i&&typeof i=="object"&&!Object.isFrozen(i)&&deepFreeze(i)}return n}function debugSnapshot(n){const t={};for(const i in n){const r=n[i];if(r instanceof HTMLElement){t[i]="DOM element";continue}if(r&&r.jquery){t[i]="jQuery object";continue}if(typeof r=="function"){t[i]="function";continue}try{t[i]=structuredClone(r)}catch{t[i]=r}}return t}function busyStart(n){n.addClass("spinner-busy");n.prop("disabled",!0)}function busyEnd(n){n.removeClass("spinner-busy");n.prop("disabled",!1)}function initSelectPickers(n){$(n).find(".selectpicker").each(function(){var n=$(this);n.data("selectpicker")?n.selectpicker("refresh"):n.selectpicker({width:"100%",container:"body",noneSelectedText:" "})})}function initSelectPicker(n){var t=$(n);t.data("selectpicker")?t.selectpicker("refresh"):t.selectpicker({container:"body",noneSelectedText:" "})}function parseDecimal(n){if(n===null||n==="")return null;n=n.replace(/\s+/g,"");n=n.replace(",",".");var t=parseFloat(n);return isNaN(t)?null:t}var currentUtskPageIndex,currentUtskResetFlags,doLoadWizardBilder,isModified;(function(){function i(i){const r=function(){$("#artikelOk").off("click").on("click",function(){if(n){const t={matPrisHuv_Id:$("#ArtikelMatPrisHuv_Id").val(),matNr:$("#ArtikelNr").val(),matNamn:$("#ArtikelNamn").val(),matAPris:Number($("#ArtikelPris").val().replace(",","."))};n(t)}$("#artikelModal").modal("hide")});$("#artikelCancel").off("click").on("click",function(){$("#artikelModal").modal("hide")})};if($("#artikelModal").length>0){t||(r(),t=!0);i();return}$.ajax({url:"/Artikel/ArtikelModalPartial",type:"GET",beforeSend:function(){showLoadingAjax(!0)},success:function(n){$("body").append(n);r();t=!0;i()},error:function(n){displayAjaxErrorMessage(n)},complete:function(){showLoadingAjax(!1)}})}console.debug("KalkylShared-ArtikelModal.js initieras...");let n=null,t=!1;window.openArtikelModal=function(t,r){n=r;i(function(){if(t){let n=parseFloat(t.matAPris&&t.matAPris.toString().replace(",",".")||"0");$("#ArtikelMatPrisHuv_Id").val(t.matPrisHuv_Id||"0");$("#ArtikelNr").val(t.matNr||"");$("#ArtikelNamn").val(t.matNamn||"");$("#ArtikelPris").val(n.toFixed(2))}else $("#ArtikelMatPrisHuv_Id, #ArtikelNr, #ArtikelNamn, #ArtikelPris").val("");$("#artikelModal").modal()})}})();var currentDefKinds="",currentProject_Id=null,currentProjectTree_Id=null,currentProjectWizard_Id=null,currentProjectWizardMode=!1,currentWizardTree_Id=-1,wizard=null,oldHeaderBxH="",autoMomTillChars="",autoMomTillLongString="",currentShowGlobalMallar=null;(function(){console.debug("KalkylShared-Splitter.js initieras...");const n={};window.initSplitter=function(t,i={}){function h(n){const i=document.querySelector(t);if(i){const u=i.parentElement,f=i.previousElementSibling,e=i.nextElementSibling,r=u.getBoundingClientRect(),o=n-r.left,s=r.right-n;f.style.width=`${o}px`;e.style.width=`${s}px`}}function u(n){r&&h(n.clientX)}function f(){r=!1;document.removeEventListener("mousemove",u);document.removeEventListener("mouseup",f)}function e(n){h(n.touches[0].clientX)}function o(){document.removeEventListener("touchmove",e);document.removeEventListener("touchend",o)}let r=!1;if(i.adjustHeightSelector){let n=window.innerHeight-(i.heightOffset||250);i.standAlone&&(n-=i.standAloneOffset||70);document.querySelectorAll(i.adjustHeightSelector).forEach(t=>{t.style.maxHeight=`${n}px`,t.style.minHeight=`${n}px`})}const s=document.querySelector(t);s&&(n[t]={onMouseMove:u,onMouseUp:f,onTouchMove:e,onTouchEnd:o},s.addEventListener("mousedown",()=>{r=!0,document.addEventListener("mousemove",u),document.addEventListener("mouseup",f)}),s.addEventListener("touchstart",()=>{document.addEventListener("touchmove",e,{passive:!0}),document.addEventListener("touchend",o,{passive:!0})},{passive:!0}))};window.destroySplitter=function(t){const i=n[t];i&&(document.removeEventListener("mousemove",i.onMouseMove),document.removeEventListener("mouseup",i.onMouseUp),document.removeEventListener("touchmove",i.onTouchMove),document.removeEventListener("touchend",i.onTouchEnd),delete n[t])}})();currentUtskPageIndex=0;currentUtskResetFlags=0;class Wizard{constructor(n,t,i,r){this.Id=n;this.NeedValidCode=t;this.Rows=i;$("#wizard_title").html("Räknemall: "+r);$("#wizardinfolink").attr("href","/wizard/info/"+n)}getSelectedKinds(){return $("select.kindcombo option:selected").map(function(){return $(this).data("kindid")+","+$(this).data("shortid")}).get().join(";")}Save(){return new Promise((n,t)=>{let i=this.validate();if(i.status!="ok")return doAjaxMsg(i),n(!1);const r=this.getFilteredWizardRowsWithValues();var u={__RequestVerificationToken:$('input[name="__RequestVerificationToken"]').val(),Project_Id:currentProject_Id,ProjectTree_Id:currentProjectTree_Id,WizGrupp_Id:$("#WizGrupp_Id").val(),ProjectWizard_Id:$("#ProjectWizard_Id").val(),StoraMomTill:$("#StoraMomTill").val(),StoraAntal:$("#StoraAntal").val(),SaveNamn:$("#SaveNamn").val(),Kulor:$("#Kulor").val(),B:$("#B").val(),H:$("#H").val(),IsoMatris_Nr:$("#IsoMatris_Nr").val(),SelectedKinds:wizard.getSelectedKinds(),WizardRows:r};$.ajax({cache:!1,url:"/Wizard/Inmatning",type:"POST",data:u,"async":!0,beforeSend:function(){showLoadingAjax(!0)},success:function(t){typeof t=="object"?(doAjaxMsg(t),t.status=="ok"?(isModified=!1,currentProjectWizard_Id!=null&&showHideWizard(!1),loadProjectWizardList(),n(!0)):n(!1)):(alert(t),n(!1))},error:function(n,i,r){displayAjaxErrorMessage(n);t(r)},complete:function(){showLoadingAjax(!1)}})})}spreadValues(n,t){var i=this.Rows[n];if(t=="L")switch(i.PanelType){case 1:i.V=i.L*(i.B/1e3);break;case 3:i.V=i.L}else if(t=="B")switch(i.PanelType){case 1:i.V=i.L*(i.B/1e3)}else if(t=="H")switch(i.PanelType){case 1:i.V=i.L*(i.H/1e3)}}pushChanges(n){var f=-1,e=-1,r="",u=this.Rows[n],c,t,l,i,h,a,o,s;if(u.RadKod!=""&&u.RadKod!=null)for(c=";"+u.RadKod+";",f=0;f-1)){i=0;switch(t.ArvRadKodMetod){case 1:i=0;break;case 2:i=1;break;default:alert("ERROR: Ingen arvradkodmetod angiven.\n\nWizardRow.RecId = "+t.RecId)}for(h=t.ArvFromRadKod.split(";"),e=0;e0?i=Math.round(i+.49):t.VolymCalcMethod==3&&i>0&&(i=lmRound(i,1)):t.ArvMetod==2?i=Math.floor(i):alert("Error: pushValues->Fixa ArvMetod!!!\n\nWizardrow.RecId = "+t.RecId+" ArvMethod = "+t.ArvMetod)}}t.L!=i&&(wizard.setProperty(f,"L",""+i),this.spreadValues(t.RadIndex,"L"),this.updateEdits(t.RadIndex),this.pushChanges(t.RadIndex))}}}setProperty(n,t,i){const r=["L","B","H","V"].includes(t);this.Rows[n][t]=r?i.replace(",","."):i}validate(){var r,t,i;let n={status:"ok",msg:"Validated Ok!"};if($("#StoraAntal").length&&(r=$("#StoraAntal").val(),!/^\d+$/.test(r)||r<1))return n.status="error",n.msg="Ange antal kopior",$("#StoraAntal")[0].focus(),n;if($("#B").length&&(t=$("#B").val(),!/^\d+$/.test(t)||t<1||t>4e3))return n.status="error",n.msg="Bredd är inte ett gilltigt värde (1 - 4000)",$("#B")[0].focus(),n;if($("#H").length&&(i=$("#H").val(),!/^\d+$/.test(i)||i<1||i>4e3))return n.status="error",n.msg="Höjd är inte ett gilltigt värde (1 - 4000)",$("#H")[0].focus(),n;const u=this.getFilteredWizardRowsWithValues();return u.length?n:{status:"error",msg:"Post ej sparad, det finns inga rader att spara."}}getFilteredWizardRowsWithValues(){return this.Rows.filter(n=>n.L!==0&&n.L!==null&&n.L!==undefined&&n.L!=="")}getWizardRowByRadKod(n){return this.Rows.find(t=>t.RadKod===n)}updateEdits(n){let t=this.Rows[n];this.setEditorValue(n,"L",t.L);[1,6,7,8].includes(t.PanelType)&&this.setEditorValue(n,"B",t.B);[7,8].includes(t.PanelType)&&this.setEditorValue(n,"H",t.H);[2].includes(t.PanelType)&&this.setEditorValue(n,"V",t.V)}setEditorValue(n,t,i){try{if(!this.Rows||typeof n!="number"||!Number.isInteger(n)||n<0||n>=this.Rows.length){console.warn(`WARN: wizard.setEditorValue-> Ogiltigt parIndex (${n}) eller saknade Rows.`);return}const r=document.querySelector(`#WizardRows_${n}__${t}`);if(r)r.value=i;else{const i=this.Rows[n],r=i&&i.PanelType?i.PanelType:"okänd";console.debug(`DEBUG: wizard.setEditorValue hittar inte kontrollen. ${t} (PanelType: ${r})`)}}catch(r){console.debug(`ERROR: wizard.setEditorValue misslyckades – ${r.message}`)}}getEditorValue(n,t){const i=$(`#WizardRows_${n}__${t}`);return i.length?i.val():(console.debug(`DEBUG: wizard.getEditorValue hittar inte kontrollen. ${t}`),undefined)}}doLoadWizardBilder=function(n){$.ajax({url:"/Wizard/Bilder",type:"GET","async":!0,data:{wizSelection_Id:n},success:function(n){$("#wizardbilder_body").html(n)},error:function(n){displayAjaxErrorMessage(n,"doLoadWizardBilder")}})};window.pvf=window.pvf||{};pvf.modal=pvf.modal||{};pvf.modal.syncBackdrop=function(n){const i=n instanceof Element?n:n&&n.jquery?n[0]:document.querySelector(n);if(i){const t=parseInt(window.getComputedStyle(i).zIndex,10);if(t&&!isNaN(t)){const r=document.querySelector(".modal-backdrop:last-of-type");r&&(r.style.zIndex=t-1)}}};pvf.modal.getTopmostModal=function(){const i=document.querySelectorAll(".modal.in");let n=null,t=-1;return i.forEach(i=>{const r=parseInt(window.getComputedStyle(i).zIndex,10);r>t&&(t=r,n=i)}),n};pvf.modal.getField=function(n,t){return n.find(`[name="${t}"]`)};pvf.modal.getFieldValue=function(n,t){const i=n.find(`[name="${t}"]`);return i.length?i.is(":checkbox")?i.is(":checked"):i.is(":radio")?i.filter(":checked").val()||null:i.val():null};pvf.modal.setFieldValue=function(n,t,i){const r=n.find(`[name="${t}"]`);if(r.length){if(r.is(":checkbox")){r.prop("checked",Boolean(i));return}if(r.is(":radio")){r.filter(`[value="${i}"]`).prop("checked",!0);return}r.val(i)}};pvf.modal.extractForm=function(n){const t={};return n.find("[name]").each(function(){const n=$(this),r=n.attr("name");let i;if(n.is(":checkbox"))i=n.is(":checked");else if(n.is(":radio"))if(n.is(":checked"))i=n.val();else return;else i=n.val();t[r]=i}),t};pvf.modal.createModelFromForm=function(n){function u(n){return n!==""&&!isNaN(n)}function f(n){return u(n)?Number(n):n}let r=n.serializeArray(),i={},t={};return r.forEach(n=>{let u=n.name,e=f(n.value),r=u.match(/^(\w+)\[(\d+)\]\.(.+)$/);if(r){let n=r[1],i=r[2],u=r[3];t[n]||(t[n]={});t[n][i]||(t[n][i]={});t[n][i][u]=e}else i[u]=e}),Object.keys(t).forEach(n=>{let r=Object.values(t[n]);r.some(n=>n.Modified!==undefined)&&(r=r.filter(n=>n.Modified===!0||n.Modified==="true"));i[n]=r}),i};pvf.modal.promptValue=function({caption:n,label:i,defaultValue:t,validate:r}){return new Promise(u=>{function h(){if(!Array.isArray(r)||r.length===0){e.prop("disabled",!1);s.hide();return}const t=o.val();let n=null;for(const i of r){const r=i(t);if(r!==!0){n=r;break}}n?(e.prop("disabled",!0),s.text(n.message).show()):(e.prop("disabled",!1),s.hide())}const f=getAvailablePlaceholder("promptValue"),c=`
${n}
`;f.html(c);const o=f.find(".pvf-prompt-input"),e=f.find(".pvf-prompt-ok"),l=f.find(".pvf-prompt-cancel"),s=f.find(".pvf-prompt-error");o.on("input",h);h();const a=()=>{const n=o.val();f.modal("hide");u(n)},v=()=>{f.modal("hide"),u(null)};e.one("click",a);l.one("click",v);f.on("shown.bs.modal",function(){const n=$(this).find(".pvf-prompt-input").first();n.length&&n.trigger("focus").select()});f.modal("show")})};pvf.modal.confirm=function(n,t,i={}){return new Promise(r=>{const e="confirmDialog_"+Date.now(),s=i.default==="cancel"?"cancel":"ok",f=i.icon||null,h=i.iconPosition||"header",o=f==="info"?"ℹ️":f==="warning"?"⚠️":f==="error"?"❌":f==="question"?"❓":f==="delete"?"🗑️":f==="success"?"✔️":"",p=f?`${o}`:"",l=f?`${o}`:"",a=h==="header"?`
${n}
${o}
`:`
${n}
`,v=h==="body"?`
${l}
${t}
`:`
${t}
`,y=`
${a}
${v}
`,u=$(y).appendTo("body");u.css("z-index",99999);u.on("shown.bs.modal",function(){s==="cancel"?$(`#${e}_cancelbtn`).focus():$(`#${e}_okbtn`).focus()});const c=n=>{if(n.key==="Enter"){const n=document.activeElement;if(n&&n.hasAttribute("data-result")){n.click();return}s==="cancel"?u.find('[data-result="false"]').click():u.find('[data-result="true"]').click()}n.key==="Escape"&&u.find('[data-result="false"]').click()};$(document).on("keydown",c);u.on("click","[data-result]",function(){const n=$(this).data("result")===!0;u.modal("hide");r(n)});u.on("hidden.bs.modal",function(){$(document).off("keydown",c);u.remove()});u.modal("show")})};pvf.modal.applyFocusTrap=function(n){const i=n.jquery?n:$(n),t=i[0];console.debug(`(init) FocusTrap for #${t.id} in pvf.modal.applyFocusTrap`);const r=n=>{if(n.key==="Tab"&&t.classList.contains("in")&&t.contains(document.activeElement)){const r=i.find(`
a[href],
area[href],
input:not([disabled]):not([readonly]),
select:not([disabled]):not([readonly]),
textarea:not([disabled]):not([readonly]),
button:not([disabled]):not([tabindex="-1"]),
iframe,
object,
embed,
[tabindex]:not([tabindex="-1"]),
[contenteditable]
`).filter(":visible");if(r.length!==0){console.debug(`(trap) FocusTrap for #${t.id} in pvf.modal.applyFocusTrap`);const u=r[0],f=r[r.length-1];n.shiftKey?document.activeElement===u&&(n.preventDefault(),f.focus()):document.activeElement===f&&(n.preventDefault(),u.focus())}}};$(document).on("keydown",r);i.on("hidden.bs.modal",()=>{console.debug(`(remove) FocusTrap for #${t.id} in pvf.modal.applyFocusTrap`),$(document).off("keydown",r)})};pvf.modal.openTab=function(n,t){var r=n.attr("id"),u,i;r&&(u="[data-target=\"[data-name='"+r+"-"+t+"']\"]",i=n.find(u),i.length&&i.tab("show"))};pvf.modal.getActiveTab=function(n){var i=n.attr("id"),t,r,u;return i?(t=n.find(".tab-pane.active"),!t.length)?null:(r=t.attr("data-name"),u=r.replace(i+"-",""),u):null};isModified=!1;$.fn.setFocusOnFirstInput=function(n){const i=n?`input:not([type=${n}]), select, textarea`:"input, select, textarea, button",t=this.find(i).filter(":visible").first();t.length&&t[0].focus()};const ClipboardHelper=function(){function r(){n=document.createElement("textarea");n.style.position="fixed";n.style.top="-1000px";n.style.left="-1000px";document.body.appendChild(n);n.focus();n.select();t=!0}function u(n){return!t&&navigator.clipboard&&typeof navigator.clipboard.writeText=="function"?navigator.clipboard.writeText(n).then(()=>!0).catch(()=>i(n)):i(n)}function i(t){if(!n)return!1;n.value=t;n.select();let i=!1;try{i=document.execCommand("copy")}catch(r){i=!1}return f(),i}function f(){n&&(document.body.removeChild(n),n=null);t=!1}let n=null,t=!1;return{begin:r,copy:u}}();$.validator.addMethod("notzero",function(n){if(n===null||n==="")return!0;var t=parseFloat(n.replace(",","."));return t!==0});$.validator.unobtrusive.adapters.add("notzero",[],function(n){n.rules.notzero=!0;n.messages.notzero=n.message});$.validator.methods.number=function(n){return n===null||n===""?!0:(n=n.replace(/\s+/g,""),n=n.replace(",","."),!isNaN(n)&&/^-?\d+(\.\d+)?$/.test(n))};$.validator.addMethod("conditionalnotzero",function(n,t,i){var u=$(t).closest("form"),f=u.find("[name='"+i.dependentproperty+"']").val(),r;return f!=i.requiredvalue?!0:(r=parseDecimal(n),r===null)?!1:r>0});$.validator.unobtrusive.adapters.add("conditionalnotzero",["dependentproperty","requiredvalue"],function(n){n.rules.conditionalnotzero={dependentproperty:n.params.dependentproperty,requiredvalue:n.params.requiredvalue};n.messages.conditionalnotzero=n.message});window.pvf=window.pvf||{};pvf.table=pvf.table||{};pvf.table.formatters=pvf.table.formatters||{};pvf.table.getColumnIndexFromRow=function(n,t){if(!t)return-1;t=t.toLowerCase();const r=n.closest("table")[0];if(!r)return-1;const i=r.querySelectorAll("thead th[data-col]");if(!i.length)return-1;for(let n=0;n=0)return $.trim(n.find("td").eq(i).text())};pvf.table.setText=function(n,t,i){const r=pvf.table.getColumnIndexFromRow(n,t);if(!(r<0)){const u=n.find("td").eq(r);u.text(i==null?"":i)}};pvf.table.setHtml=function(n,t,i){const r=pvf.table.getColumnIndexFromRow(n,t);if(!(r<0)){const u=n.find("td").eq(r);u.html(i)}};pvf.table.setModified=function(n,t="true"){const i=n.find(".modified-flag");i.length&&i.val(t)};pvf.table.getNextRowIndex=function(n){let t=-1,i=null;if(n.find("[name]").each(function(){const t=$(this).attr("name"),n=t.match(/([A-Za-z_]+)\[(\d+)\]\./);if(n)return i=n[1],!1}),!i)return 0;const r=new RegExp(`${i}\\[(\\d+)\\]\\.`);return n.find("[name]").each(function(){const i=$(this).attr("name"),n=i.match(r);if(n){const i=parseInt(n[1],10);i>t&&(t=i)}}),t+1};pvf.table.reindexRow=function(n,t){n.find("[name]").each(function(){const n=$(this).attr("name"),i=n.replace(/([A-Za-z_]+)\[\d+\]\./,`$1[${t}].`);$(this).attr("name",i)})};pvf.table.normalizeKeys=function(n){const t={};for(const i in n)t[i.toLowerCase()]=n[i];return t};pvf.table.getValue=function(n,t){if(!t)return null;let f=t.toString().trim().replace(/\[[^\]]*\]/g,"").split(".").pop().toLowerCase();const e=n.closest("table"),o=e.find("thead th[data-col]");let i=-1;if(o.each(function(n){const t=($(this).data("col")||"").toString().trim().toLowerCase();if(t===f)return i=n,!1}),i===-1)return null;const r=n.children("td").eq(i),u=r.find("input, select, textarea");return u.length?u.val():r.text().trim()};pvf.table.setValue=function(n,t,i){t=t.toLowerCase();const f=n.closest("table"),r=f.find("thead th[data-col]"),u=r.index(r.filter(`[data-col="${t}"]`));if(u!==-1){const t=n.children("td").eq(u),r=t.find("input, select, textarea");r.length?r.val(i).trigger("change"):t.text(i);return}n.find("input[type='hidden']").each(function(){const n=$(this).attr("name");if(n){const r=n.split(".").pop();r.toLowerCase()===t&&$(this).val(i)}})};pvf.table.getRowModel=function(n){const i=n.closest("table"),r=i.find("thead th[data-col]"),t={};return r.each(function(i){const f=$(this).data("col").toLowerCase(),r=n.children("td").eq(i),u=r.find("input, select, textarea");t[f]=u.length?u.val():r.text().trim()}),n.find("input[type='hidden']").each(function(){const n=$(this).attr("name");if(n){const i=n.split(".").pop().toLowerCase();t[i]=$(this).val()}}),t};pvf.table.setRowModel=function(n,t){const i=pvf.table.normalizeKeys(t);for(const t in i)pvf.table.setValue(n,t,i[t])};pvf.table.updateRow=function(n,t){if(n&&n.length){const i=pvf.table.normalizeKeys(t),u=n.closest("table")[0];if(u){const r=u.querySelectorAll("thead th[data-col]");if(r.length){const f=Array.from(r).map(n=>n.dataset.col.toLowerCase());r.forEach(t=>{const f=t.dataset.col;if(f){const u=f.toLowerCase();let r=i[u];if(r!==undefined){const e=pvf.table.formatters&&pvf.table.formatters[u];e&&(r=e(r,i,n));typeof r=="string"&&r.trim().startsWith("<")?pvf.table.setHtml(n,u,r):pvf.table.setText(n,u,r)}}});for(const t in i)f.includes(t)||pvf.table.setValue(n,t,i[t])}}}};pvf.table.bindAutoCalc=function(n,t){if(n&&n.length)n.on("input change","input, select, textarea",function(){const n=$(this).closest("tr");if(n.length){const i=pvf.table.getRowModel(n);for(const r in t){const u=t[r];if(typeof u=="function"){const f=u(i,n);f!==undefined&&pvf.table.setValue(n,r,f)}}}})};pvf.table.validateRow=function(n,t){const i=pvf.table.getRowModel(n),r={};for(const u in t){const f=t[u];if(typeof f=="function"){const o=i[u],e=f(o,i,n);e!==!0&&(r[u]=e)}}return{ok:Object.keys(r).length===0,errors:r,model:i}};pvf.table.highlightErrors=function(n,t){const r=n.closest("table"),i=r.find("thead th[data-col]");n.children("td").removeClass("has-error");for(const r in t){const t=i.index(i.filter(`[data-col="${r}"]`));t!==-1&&n.children("td").eq(t).addClass("has-error")}};pvf.table.isRowEmpty=function(n,t){for(const i of t){const t=pvf.table.getValue(n,i);if(t!==""&&t!==null&&t!==undefined&&t!==0)return!1}return!0};pvf.table.isRowModelEmpty=function(n,t){const i={};for(const t in n){const r=t.trim().toLowerCase();i[r]=n[t]}const r=t.map(n=>n.trim().toLowerCase()),u=n=>{if(n===null||n===undefined)return!0;if(typeof n=="string"){const t=n.trim();return t===""?!0:t==="0"?!0:t==="0.0"||t==="0.00"?!0:t==="0,0"||t==="0,00"?!0:!1}return typeof n=="number"&&n===0?!0:!1};for(const n of r){const t=i[n];if(!u(t))return!1}return!0};window.pvf=window.pvf||{};pvf.validators=pvf.validators||{};pvf.validators={required(n="Detta fält är obligatoriskt."){return t=>t==null||t.trim()===""?{message:n}:!0},numeric(n="Du måste ange ett numeriskt värde."){return t=>{if(t==null||t.trim()==="")return{message:"Värdet får inte vara tomt."};const i=t.replace(",",".");return isNaN(Number(i))?{message:n}:!0}},integer(n="Värdet måste vara ett heltal."){return t=>/^-?\d+$/.test(t)?!0:{message:n}},notZero(n="Värdet får inte vara 0."){return t=>{const i=t.replace(",",".");return Number(i)===0?{message:n}:!0}},min(n,t=null){return i=>{const u=i.replace(",","."),r=Number(u);return isNaN(r)||r{const u=i.replace(",","."),r=Number(u);return isNaN(r)||r>n?{message:t||`Värdet får inte vara större än ${n}.`}:!0}},between(n,t,i=null){return r=>{const f=r.replace(",","."),u=Number(f);return isNaN(u)||ut?{message:i||`Värdet måste vara mellan ${n} och ${t}.`}:!0}},regex(n,t="Värdet matchar inte det förväntade formatet."){return i=>n.test(i)?!0:{message:t}}};class EventEmitter{constructor(){this.events={}}on(n,t){this.events[n]||(this.events[n]=[]);this.events[n].push(t)}off(n,t){this.events[n]&&(this.events[n]=this.events[n].filter(n=>n!==t))}emit(n,t){this.events[n]&&this.events[n].forEach(n=>n(t))}async emitAsync(n,t){const r=this.events[n];if(!r||r.length===0)return[];const i=[];for(const n of r)try{const r=n(t);r instanceof Promise?i.push(await r):i.push(r)}catch(u){console.error("Event handler error:",u);i.push(undefined)}return i}once(n,t){const i=r=>{this.off(n,i),t(r)};this.on(n,i)}}const MLDropDownHandler=function(){function i(t){if(n){const i=document.getElementById(n);i&&(i.contains(t.target)||MLDropDownHandler.close())}}function r(n){n.key==="Escape"&&MLDropDownHandler.close()}function f(){t||(document.addEventListener("click",i),document.addEventListener("keydown",r),t=!0)}function e(){t&&(document.removeEventListener("click",i),document.removeEventListener("keydown",r),t=!1)}function o(n){const t=n.parents().filter(function(){const n=$(this).css("overflow-y");return n==="auto"||n==="scroll"}).first();if(!t.length){const n=$(window).scrollTop();if(n>0)return $(window)}return t.length?t:null}function u(n,t){let i=o(t);const r=$(window).scrollTop();if(i&&i.length&&i[0]instanceof HTMLElement){const r=i.offset(),e=i.outerHeight(),s=i.scrollTop(),u=r.top+e-(t.offset().top+t.outerHeight()),f=t.offset().top-r.top;dropdownLeft=i.outerWidth()-10-(t.offset().left+n.outerWidth());const o=-(t.offset().left-r.left-5);dropdownLeft=Math.max(dropdownLeft,o);u>f?(dropdownTop=t.outerHeight(),maxHeight=Math.min(n.outerHeight(),u-10)):(maxHeight=Math.min(n.outerHeight(),f-10),dropdownTop=-Math.min(maxHeight,n.outerHeight()))}else{const u=t.offset(),e=t.outerHeight(),i=n.outerHeight(),s=$(window).height(),h=$(window).width();dropdownLeft=h-10-(u.left+n.outerWidth());const f=s-(u.top+e)+r,o=u.top-50-r;f>=i||f>o?(maxHeight=Math.min(i,f-10),dropdownTop=Math.min(e,maxHeight)):(maxHeight=Math.min(i,o-10),dropdownTop=Math.max(-i,-maxHeight))}n.css({top:dropdownTop,left:Math.min(dropdownLeft,0),maxHeight:maxHeight+"px",overflowY:"auto"})}let n=null,t=!1;return{open:function(t,i={}){const r=$("#"+t),e=r.closest(".input-group").find(".PVFDropDown-Input");n&&n!==t&&MLDropDownHandler.close();i.ajaxUrl&&(r.html().includes("NOT_LOADED")||i.forceReload)?$.get(i.ajaxUrl,i.ajaxData,function(n){if(r.html(n),i.onRowClick)r.find("tbody tr").on("click",n=>{try{i.onRowClick(n)}finally{MLDropDownHandler.close()}});u(r,e);r.show()}):(u(r,e),r.show());n=t;f()},close:function(){if(n){const t=document.getElementById(n);t&&(t.style.display="none");n=null;e()}}}}();class ModalService{static registryQueue=[];static instance=null;constructor(){this.registry={};this.initialized=!1;this.bus=new EventEmitter;this._asyncWaiters={};this.defaultActions={close:async n=>{const{$modal:t}=n;t.modal("hide")}};this.defaultHooks={"api:start":()=>{showLoadingAjax(!0)},"api:end":({result:n})=>{showLoadingAjax(!1),n?.status&&n?.msg&&doAjaxMsg2(n)}};this.bindActions();ModalService.instance=this}static register(n,t){const i=ModalService.instance;i&&i.initialized?i.register(n,t):ModalService.registryQueue.push({name:n,config:t})}async init(){this.initialized=!0;ModalService.registryQueue.forEach(n=>{this.register(n.name,n.config)});ModalService.registryQueue=[]}async register(n,t){const i=Object.assign({},t);i.modalService=this;i.urls=i.urls||{};i.bus=this.bus;i.behavior=i.behavior||{backdrop:"static",keyboard:!1,focus:!0};for(const t in i.urls){const r=i.urls[t];if(typeof r!="string")throw new Error(`URL '${n}.${t}' måste vara en sträng`);r.startsWith("/")||(i.urls[t]="/"+r)}if(i.api)for(const n in i.api){const t=i.api[n];i.api[n]=async function(n){i.bus.emit(`${i.modalType}:api:start`,{model:n});let r;try{return await t.call(i,n)}finally{i.bus.emit(`${i.modalType}:api:end`,{result:r})}}}if(i.hooks)for(const n in i.hooks){const t=i.hooks[n];this.bus.on(`${i.modalType}:${n}`,t)}for(const n in this.defaultHooks)if(!i.hooks||!i.hooks[n]){const t=this.defaultHooks[n];this.bus.on(`${i.modalType}:${n}`,t)}if(i.actions)for(const n in i.actions)this.bus.on(`${i.modalType}:${n}`,t=>{this.runAction({...t,action:n})});return this.registry[n]=i,i}async getOpenParams(n){const{$modal:r,modalConfig:i}=n;let t={...n.payload};const u=i.openParams||[];for(const n of u){const i=pvf.modal.getFieldValue(r,n);i!==null&&i!==undefined&&(t[n]=i)}if(typeof i.getOpenParams=="function"){const r=await i.getOpenParams({...n,payload:t});r!==undefined&&r!==null&&(t=r)}return n.payload=t,t}async getActionParams(n){const{$modal:r,modalConfig:i,action:u}=n;let t={...n.payload};const f=i.params?.[u]||[];for(const n of f){const i=pvf.modal.getFieldValue(r,n);i!==null&&i!==undefined&&(t[n]=i)}if(typeof i.getActionParams=="function"){const r=await i.getActionParams({...n,payload:t});r!==undefined&&r!==null&&(t=r)}return n.payload=t,t}_resolveAsync(n,t){const i=this._asyncWaiters[n];if(i){if(i.resolve(t),!i.direct){const r=i.opener;if(r){const i=r.closest(".modal"),u=i.data("modal-type");if(u){const r=i.data("basecontext");if(r){const i=this.createWorkingContext(r,{action:`${n}:result`});i.childResult=t;i.childModalType=n;this.bus.emit(`${u}:${n}:result`,i)}}}}delete this._asyncWaiters[n]}}async openAndWaitForResult(n,t={},i){return new Promise(r=>{const u=this.registry[n];this._asyncWaiters[u.modalType]={resolve:r,opener:i};this.open(n,t,i)})}async openAndWaitForResultDirect(n,t={},i){return new Promise(r=>{const u=this.registry[n];this._asyncWaiters[u.modalType]={resolve:r,opener:i,direct:!0};this.open(n,t,i)})}async open(n,t={},i){const r=this.registry[n];if(r){const f=this.getAvailablePlaceholder(r.modalType,r.modalClassExtra),u={$modal:f,modalConfig:r,payload:t,action:"open",$opener:i};u.call=n=>r.modalService.callAction(n,u);await this.getOpenParams(u);u.live={};const o=this.createContextSnapshot(u);f.data("basecontext",o);const e=f.find(".modal-content");if(r.urls.open){e.html("");const n=$.param(u.payload),t=n?`${r.urls.open}?${n}`:r.urls.open;$.ajax({url:t,method:"GET",beforeSend:()=>showLoadingAjax(!0),success:async n=>{let i=$(n);const t=i.filter(".modal-dialog");if(t.length){const n=t.find(".modal-content").first();e.html(n.html())}else e.html(n);r.onContentLoaded&&(u.action="onContentLoaded",this.getActionParams(u),await r.onContentLoaded(u))},error:n=>displayAjaxErrorMessage(n),complete:()=>showLoadingAjax(!1)})}else r.template&&(e.html(r.template),r.onContentLoaded&&(u.action="onContentLoaded",this.getActionParams(u),await r.onContentLoaded(u)));const s={backdrop:r.behavior?.backdrop??!0,keyboard:r.behavior?.keyboard??!0,focus:r.behavior?.focus??!0};f.modal(s);f.on("shown.bs.modal",function(){f.trigger("focus")})}}async bindActions(){$(document).on("click","[data-action]",async n=>{const t=$(n.currentTarget),u=t.data("action"),f=t.closest(".modal"),i=f.data("basecontext");if(i){const r=this.createWorkingContext(i,{action:u,$trigger:t}),e=t.data("payload")||{};Object.assign(r.payload,e);await this.runAction(r)}})}async callAction(n,t,i=null){const f=i||t.modalConfig.modalType,r=t.$modal.data("basecontext");if(!r){console.error("Ingen basecontext hittades i modalen.");return}const u=this.createWorkingContext(r,{action:n});return await this.runAction(u),u}async runAction(n){let{modalConfig:i,action:t}=n;const r=i.actions?.[t]||this.defaultActions[t]||null;if(r){await this.getActionParams(n);const f=await this.bus.emitAsync(`${i.modalType}:before:${t}`,n);if(!f.some(n=>n?.stop)){const u=await r(n);u?.stop||(Object.assign(n,u),await this.bus.emitAsync(`${i.modalType}:after:${t}`,n),t==="save"&&this._resolveAsync(i.modalType,n.lastActionResult||null),t==="close"&&this._resolveAsync(i.modalType,null))}}}getAvailablePlaceholder(n,t=""){const r=document.getElementById("modalPlaceholderArea"),u=`modal_${n}_${Date.now()}`;let i=r.querySelector(`.modal[data-modal-type="${n}"]:not(.in)`);if(!i){const f=document.createElement("div");f.className=`modal fade ${t==="modal-auto"?"modal-auto":""}`;f.id=u;f.setAttribute("role","dialog");f.setAttribute("tabindex","-1");f.setAttribute("data-modal-type",n);f.innerHTML=`
`;r.appendChild(f);this.initModalCleanup(f);this.adjustZIndex(f);i=f}return $(i)}initModalCleanup(n){const t=`#${n.id}`;$(document).off("hidden.bs.modal",t).on("hidden.bs.modal",t,()=>{$(n).remove();const t=this.getTopmostModal();t&&t.focus()})}adjustZIndex(n){const t=Math.max(...$(".modal.in").map(function(){return parseInt($(this).css("z-index"),10)||1050}).get());$(n).css("z-index",t+10)}getTopmostModal(){const i=document.querySelectorAll(".modal.in");let n=null,t=-1;return i.forEach(i=>{const r=parseInt(window.getComputedStyle(i).zIndex,10);r>t&&(t=r,n=i)}),n}createContextSnapshot(n){const t={};for(const i in n){const r=n[i];if(i==="live"){t[i]=r;continue}if(r instanceof HTMLElement||r&&r.jquery){t[i]=r;continue}if(typeof r=="function"){t[i]=r;continue}try{t[i]=structuredClone(r)}catch{t[i]=r}}return Object.freeze(t),t.payload&&typeof t.payload=="object"&&Object.freeze(t.payload),t}createWorkingContext(n,t={}){const i={};for(const t in n){const r=n[t];if(t==="live"){i[t]=r;continue}if(r instanceof HTMLElement||r&&r.jquery){i[t]=r;continue}if(typeof r=="function"){i[t]=r;continue}try{i[t]=structuredClone(r)}catch{i[t]=r}}return Object.assign(i,t),i.call=n=>i.modalConfig.modalService.callAction(n,i),i}}window.modalService=new ModalService;$(function(){modalService.init()});ModalService.register("momentSetup",{modalType:"momentSetup",urls:{open:"/Moment/Setup",save:"/Moment/SetupSave",loadRows:"/Moment/SetupRows",reset:"/Moment/SetupReset",updproc:"/Moment/SetupUpdProc"},params:{loadRows:["SetupIndex","Kategori"],updproc:["SetupIndex","Kategori"],reset:["SetupIndex","Kategori"],save:[],onContentLoaded:["SetupIndex","Kategori"]},hooks:{"after:loadRows":async({$modal:n,html:t})=>{n.find(".rows-placeholder").html(t)},"before:reset":async n=>{if(n.payload.Kategori<0)return doAjaxMsg2({status:"error",msg:"Du måste välja en kategori."}),{stop:!0};const t=await pvf.modal.confirm("Återställ","Vill du återställa värdena till grundvärden på visade rader?",{icon:"warning",iconPosition:"header","default":"cancel"});if(!t)return{stop:!0}},"after:reset":async n=>{await n.call("loadRows")},"after:save":async n=>{await n.call("loadRows")},"before:updproc":async n=>{if(n?.payload?.Kategori<0)return doAjaxMsg2({status:"error",msg:"Du måste välja en kategori."}),{stop:!0}},"after:updproc":async n=>{await n.call("loadRows")}},actions:{async loadRows(n){const t=await n.modalConfig.api.loadRows(n.payload);return typeof t=="object"?{stop:!0,result:t}:{stop:!1,html:t}},async reset(n){const t=await n.modalConfig.api.reset(n.payload);return{stop:t.status!=="ok",result:t}},async save(n){const i=pvf.modal.createModelFromForm(n.$modal.find("form")),t=await n.modalConfig.api.save(i);return{stop:t.status!=="ok",result:t}},async updproc(n){const t=await pvf.modal.promptValue({caption:"Uppdatera med procent +/-",label:"Procent",defaultValue:"",validate:[pvf.validators.numeric(),pvf.validators.notZero()]});if(t===null)return{stop:!0};n.payload.updproc=t;const i=await n.modalConfig.api.updproc(n.payload);return{stop:i.status!=="ok",result:i}}},api:{async updproc(n){return $.ajax({url:this.urls.updproc,type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify(n)})},async loadRows(n){return $.get(this.urls.loadRows,n)},async reset(n){return $.ajax({url:this.urls.reset,type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify(n)})},async save(n){return $.ajax({url:this.urls.save,type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify(n)})}},async bindInternalEvents(n){n.$modal.on("change input","input, select, textarea",function(){const n=$(this).closest("tr");if(n.length){const t=n.find(".modified-flag");t.length&&t.val("true")}});n.$modal.on("change",'[name="Kategori"]',async t=>{n.payload.Kategori=t.target.value,await n.call("loadRows")})},async onContentLoaded(n){await this.bindInternalEvents(n);initSelectPickers(n.$modal);n.payload.Kategori!=-1&&await n.call("loadRows")}});ModalService.register("momTill",{modalType:"momTill",modalClassExtra:"modal-auto",behavior:{backdrop:"static",keyboard:!0,focus:!0},urls:{open:"/Wizard/MomTill"},params:{save:[],open:["SelectedMomTill,Project_Id"],onContentLoaded:["Project_Id"]},hooks:{"after:save":n=>{doAjaxMsg2(n.result),n.call("close")}},actions:{async save(n){const r=n.$modal.find("#momTillChooseList > li.checked"),i=r.map((n,t)=>{const i=$(t);return{tabb:i.data("tabb"),text:i.html()}}).get(),u=i.map(n=>n.tabb).join(""),f=i.map(n=>`${n.tabb}=${n.text}`).join(", "),t={status:"ok",msg:"",selectedMomTill:u,selectedMomTillLongText:f};return n.lastActionResult=t,{stop:t.status!=="ok",result:t}}},api:{},helpers:{},bindInternalEvents(n){const{}=n;$("#momTillChooseList > li").off("click").on("click",function(){$(this).toggleClass("checked")})},onContentLoaded(n){this.bindInternalEvents(n)}});ModalService.register("projectAnteckningar",{modalType:"projectAnteckningar",modalClassExtra:"modal-lg",behavior:{backdrop:"static",keyboard:!0,focus:!0},urls:{open:"/Project/Anteckningar",save:"/Project/Anteckningar","export":"/Project/ExportAnteckningar"},params:{save:[],onContentLoaded:["Project_Id"],"export":["Project_Id"]},hooks:{"after:export":n=>{const t=copyToClipboard(n.text);t?doAjaxMsg2({status:"ok",msg:"Anteckningar kopierade till urklipp. (inkl. trädnods anteckningar)"}):doAjaxMsg2({status:"warning",msg:"Kunde inte kopiera till urklipp. En textfil laddades ner istället."})},"after:save":n=>{doAjaxMsg2(n.result),n.call("close")}},actions:{async export(n){const t=await n.modalConfig.api.export(n.payload);return{stop:!1,text:t}},async save(n){const i=pvf.modal.createModelFromForm(n.$modal.find("form")),t=await n.modalConfig.api.save(i);return{stop:t.status!=="ok",result:t}}},api:{async export(n){const t=$.param(n),i=t?`${this.urls.export}?${t}`:this.urls.export;return $.ajax({url:i,type:"GET",contentType:"application/text; charset=utf-8",data:JSON.stringify(n)})},async save(n){return $.ajax({url:this.urls.save,type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify(n)})}},helpers:{},bindInternalEvents(n){const{$modal:t}=n;t.on("shown.bs.modal",function(){const n=t.attr("id");t.find("[data-pane]").each(function(){var t=$(this).attr("data-pane");$(this).attr("data-name",n+"-"+t)});t.find("[data-toggle='tab']").each(function(){var t=$(this).attr("data-tab");$(this).attr("data-target","[data-name='"+n+"-"+t+"']")});t.setFocusOnFirstInput("input")});t.on("change input","input, select, textarea",function(){})},onContentLoaded(n){this.bindInternalEvents(n)}});ModalService.register("ueovrSetup",{modalType:"ueovrSetup",modalClassExtra:"modal-lg",urls:{open:"/UeOvr/Setup",save:"/UeOvr/SetupSave",loadRows:"/UeOvr/SetupRows",deleteRow:"/UeOvr/SetupDeleteRow"},params:{loadRows:["SetupIndex"],save:[],onContentLoaded:["SetupIndex"],deleteRow:["SetupIndex","RecId"]},hooks:{"before:deleteRow":async n=>{const{$trigger:u}=n,i=u.closest("tr"),t=pvf.table.getRowModel(i);if(pvf.table.isRowModelEmpty(t,["RecId","Namn","Antal","APris","Belopp"]))return i.remove(),{stop:!0};if(t.recid==-1)return{stop:!0};let r=t.namn??"";r===""&&(r="(Tom)");const f=await pvf.modal.confirm("Ta bort",`Vill du ta bort raden
"${r}" ?`,{icon:"warning",iconPosition:"header","default":"cancel"});return f?t.recid==0?(i.remove(),{stop:!0}):void 0:{stop:!0}},"after:deleteRow":function(n){const t=n.$trigger.closest("tr");t.remove()},"after:save":n=>{n.call("loadRows")},"after:loadRows":({$modal:n,html:t})=>{n.find(".rows-placeholder").html(t)}},actions:{deleteRow:async function(n){const t=await n.modalConfig.api.deleteRow(n.payload);return{stop:t.status!=="ok",result:t}},addRow(n){n.modalConfig.helpers.addNewRow(n.$modal,n.modalConfig)},async loadRows(n){const t=await n.modalConfig.api.loadRows(n.payload);return typeof t=="object"?{stop:!0,result:t}:{stop:!1,html:t}},async save(n){const i=pvf.modal.createModelFromForm(n.$modal.find("form")),t=await n.modalConfig.api.save(i);return{stop:t.status!=="ok",result:t}},close(n){n.modal("hide")}},api:{async deleteRow(n){const t=$.param(n),i=`${this.urls.deleteRow}?${t}`;return $.ajax({url:i,method:"DELETE",dataType:"json"})},async loadRows(n){return $.get(this.urls.loadRows,n)},async save(n){return $.ajax({url:this.urls.save,type:"POST",contentType:"application/json; charset=utf-8",data:JSON.stringify(n)})}},helpers:{createEmptyRow:function(n){const t=`
`;return $(t)},ensureDeleteButton:function(n,t){const r=n.find("td.delete-cell");let i=r.find("[data-action='deleteRow']");i.length?i.data("payload",{RecId:t}):(i=$(`
`),r.append(i))},addNewRow:function(n,t){const i=n.find("table"),u=pvf.table.getNextRowIndex(i),r=t.helpers.createEmptyRow(u);i.find("tbody").append(r);r.find("input[type=text],input[type=number]").first().focus()},updateRow(n){const i=parseFloat(n.find('input[name$=".Antal"]').val())||0,r=parseFloat(n.find('input[name$=".APris"]').val())||0,t=i*r;n.find('input[name$=".Belopp"]').val(t===0?"":t.toString())}},bindInternalEvents(n){n.$modal.on("change input","input, select, textarea",function(){const t=$(this).closest("tr");t.length&&(pvf.table.setModified(t),typeof n.modalConfig.helpers.updateRow=="function"&&n.modalConfig.helpers.updateRow(t))})},onContentLoaded(n){this.bindInternalEvents(n);n.call("loadRows")}})