PageSourceSearch

https://terminalen-vejle.dk/wp-content/plugins/boligoversigt-plugi…/public/js/bolig-public.js?ver=1784152539

js terminalen-vejle.dk collected 2026-10-08 07:35:51 UTC 36,151 bytes, 834 lines download raw bytes

1ddModuleManager.addModule(boliginfoWindowModule = function(){
2    var publicFunctions = {
3        init:init
4    };
5
6    function registerEvents(){
7        ipeApplication.registerOnLoadEvent( createObjects );
8    }
9
10    function init(){
11        registerEvents();
12        ipeApplication.consoleLog("Module was initted: Bolig");
13    }
14
15
16    function createObjects(){
17        jQuery3_4_1(".sape-boliginfo-window-controller").each(function(){ 
18            if(!this.sapeBoliginfoWindowController) {
19                consoleLog("Creating Boliginfo Window Object");
20                this.sapeBoliginfoWindowController = new SapeBoliginfoWindowController(this);
21            }
22        });
23        jQuery3_4_1(".sape-biw-viewport-controller").each(function(){ 
24            if(!this.sapeViewportController) {
25                consoleLog("Creating Boliginfo Viewport Object");
26                this.sapeViewportController = new SapeViewportController(this);
27            }
28        });
29        jQuery3_4_1(".sape-accordion-controller").each(function(){ 
30            if(!this.sapeAccordionController) {
31                consoleLog("Creating Accordion Object");
32                this.sapeAccordionController = new SapeAccordionController(this);
33            }
34        });
35        jQuery3_4_1(".sape-disclaimer-controller").each(function(){ 
36            if(!this.sapeDisclaimerController) {
37                consoleLog("Creating Disclaimer Object");
38                this.sapeDisclaimerController = new SapeDisclaimerController(this);
39            }
40        });
41        jQuery3_4_1(".sape-boligstoette-beregner-controller").each(function(){ 
42            if(!this.sapeBoligstoetteBeregner) {
43                consoleLog("Creating Boligstoette Beregner Object");
44                this.sapeBoligstoetteBeregner = new SapeBoligstoetteBeregner(this);
45            }
46        });
47    }
48
49
50    function SapeBoliginfoWindowController(parent){
51        var self = this;
52        this.parent = parent;
53        this.viewport;
54
55        // CHANGE VIEW LOGIC
56        this.addAction = function(index, element){
57            var actionType = jQuery3_4_1(element).data("sape-action");
58            var actionData = jQuery3_4_1(element).data("sape-action-data");
59            switch (actionType) {
60                case "purchase":
61                    jQuery3_4_1(element).on("click", (event)=>{self.onPurchaseClick(event, element, actionData)});
62                    break;
63                case "openLink":
64                    // jQuery3_4_1(element).on("click", (event)=>{self.onOpenLinkClick(event, element, actionData)});
65                    break;
66                case "downloadLink":
67                    jQuery3_4_1(element).on("click", (event)=>{self.onDownloadLinkClick(event, element, actionData)});
68                    break;
69                case "openPopup":
70                    jQuery3_4_1(element).on("click", (event)=>{self.onOpenPopupClick(event, element, actionData)});
71                    break;
72                case "openFancyboxPlandrawing":
73                    jQuery3_4_1(element).on("click", (event)=>{self.onOpenFancyboxPlandrawing(event, element, actionData)});
74                    break;
75                case "openFancyboxIframe":
76                    jQuery3_4_1(element).on("click", (event)=>{self.onOpenFancyboxIframe(event, element, actionData)});
77                    break;
78                case "changeTab":
79                    jQuery3_4_1(element).on("click", (event)=>{self.onChangeTabClick(event, element, actionData)});
80                    break;
81                case "changeExplorerTab":
82                    jQuery3_4_1(element).on("click", (event)=>{self.onChangeExplorerTabClick(event, element, actionData)});
83                    break;
84                default:
85                    break;
86            }
87        }
88        this.getViewportController = function(){
89            if(self.viewport){
90                return self.viewport;
91            }
92            var elements = jQuery3_4_1(self.parent).find(".sape-biw-viewport-controller");
93            if(elements.length === 0){
94                console.error("No viewport controller found");
95                return self.viewport;
96            }
97            self.viewport = elements[0].sapeViewportController;
98            return self.viewport;
99        };
100        this.setFancyboxMaxWidth = function( width ){
101            var className = "fancybox-override-styles";
102            var css = ".fancybox__content { max-width: "+width+"; }</style>";
103            var style = jQuery3_4_1('html > head > .' + className);
104            if(style.length > 0){
105                style.html(css);
106            } else {
107                var head = jQuery3_4_1('html > head');
108                head.append( '<style class="'+className+'">' + css );
109            }
110        };
111        this.onPurchaseClick = function(event, element, data){
112            alert("onPurchaseClick not implemented. Trying to buy bolig: " + data.id);
113        };
114        this.onOpenLinkClick = function(event, element, data){
115            // event.preventDefault();
116            function openUrl(url, target = "_blank") {
117                var link = document.createElement('a');
118                link.href = url;
119                link.target = target;
120                link.click();
121            }
122            var url = data.link ? data.link.url : undefined;
123            var target = data.link ? data.link.target : undefined;
124            if(url){
125                event.preventDefault();
126                openUrl(url, target);
127            } else {
128                console.error("Invalid link:", data);
129            }
130        };
131        this.onDownloadLinkClick = function(event, element, data){
132            event.preventDefault();
133            function downloadFile(url) {
134                var link = document.createElement('a');
135                var filename = url.split('/').pop();
136                filename = filename.split('?')[0];
137                link.href = url;
138                link.download = filename;
139                link.click();
140            }
141            var url = data.link ? data.link.url : undefined;
142            if(url){
143                downloadFile(url);
144            } else {
145                console.error("Invalid download link:", data);
146            }
147        };
148        this.onOpenPopupClick = function(event, element, data){
149            event.preventDefault();
150            var controllerElement = jQuery3_4_1(".ipe-popups-controller");
151            if(controllerElement.length) {
152                var popupsController = controllerElement.first()[0].ipePopupsController;
153                if(popupsController){
154                    var popupId = data.target_id;
155
156                    var settings = {
157                        returnFocus:element
158                    }
159
160                    var setFormValues = jQuery3_4_1(element).data("set-form-values");
161                    var setFormValues = self.filterSpecialCharactersInObjectKeys(setFormValues)
162                    if(setFormValues !== undefined) {
163                        settings.setFormValues = setFormValues;
164                        ipeApplication.consoleLog("Setting form values:", setFormValues);
165                    }
166
167                    popupsController.openPopup(popupId, settings);
168                    return;
169                }
170            }
171            console.error("No popup controller fount", data);
172        };
173        this.filterSpecialCharacters = function(str){
174            return str.replace("|___", "[").replace("___|","]");
175        };
176        this.filterSpecialCharactersInObjectKeys = function(obj){
177            for (let key in obj) {
178                if (obj.hasOwnProperty(key)) {
179                    const value = obj[key];
180                    var newKey = self.filterSpecialCharacters(key);
181                    delete obj[key];
182                    obj[newKey] = value;
183                }
184            }
185            return obj;
186        };
187        this.RegisterFancybox = function(){
188            Fancybox.bind('.sape-fancybox-plandrawing [data-fancybox]', {
189                on: {
190                    ready: (fancybox, slide) => {
191                        // Add a class to the Fancybox lightbox container
192                        console.log("Adding class to Fancybox");
193                        fancybox.$container.classList.add('sape-fancybox-plandrawing-lightbox');
194                    }
195                }
196            });
197        };
198        this.onOpenFancyboxPlandrawing = function(event, element, data){
199            self.setFancyboxMaxWidth("95%"); // The fancybox handles its own logic - we're only adjusting the max width
200        };
201        this.onOpenFancyboxIframe = function(event, element, data){
202            self.setFancyboxMaxWidth("1160px"); // The fancybox handles its own logic - we're only adjusting the max width
203            // console.log(element);            // TODO: Move focus to iframe
204            // jQuery3_4_1(element).find(':focusable').eq(0).focus();
205        };
206        this.onChangeExplorerTabClick = function(event, element, data){
207            event.preventDefault();
208            var tabId = data.target_id;
209            var tabManager = ipeApplication.componentFinder.findComponent("IpeTabManager", event.currentTarget);
210            if (tabManager) {
211                tabManager.changeTab(tabId);
212            } else {
213                console.error("No Tab Manager found. (569654)");
214            }
215        };
216        this.onChangeTabClick = function(event, element, data){
217            event.preventDefault();
218            var tabName = data.target_id;
219            var viewport = self.getViewportController();
220            viewport.changeTabTo(tabName);
221            
222            // OLD VERSION
223            jQuery3_4_1(self.parent).find(".sape-biw-menu .sape-button.sape-button-highlight").removeClass("sape-button-highlight");
224            jQuery3_4_1(element).addClass("sape-button-highlight");
225            // NEW VERSION
226            jQuery3_4_1(self.parent).find(".sape-biw-menu .dd-button.dd-highlighted-button").removeClass("dd-highlighted-button");
227            jQuery3_4_1(element).addClass("dd-highlighted-button");
228
229            self.addUrlParameter("viewport", tabName);
230        };
231        this.addUrlParameter = function(key, value){
232            const urlSearchParams = new URLSearchParams(window.location.search);
233            urlSearchParams.set(key, value);
234            const newUrl = window.location.origin + window.location.pathname + '?' + urlSearchParams.toString();
235            window.history.replaceState(window.history.state, '', newUrl);
236        };
237        this.addActions = function(){
238            jQuery3_4_1(self.parent).find("button[data-sape-action], a[data-sape-action]").each(self.addAction);
239        };
240        this.init = function(){
241            ipeApplication.consoleLog("Initializing Boliginfo Window Controller");
242            jQuery3_4_1(document).ready(function(){
243                self.addActions();
244            });
245            self.RegisterFancybox();
246        };
247
248        self.init();
249
250    }
251
252
253    
254
255
256    function SapeViewportController(parent){
257        var self = this;
258        this.parent = parent;
259        this.buttonHighlightClass = jQuery3_4_1(parent).data("button-highlight-class");
260        this.buttonSelector = "button[data-sape-action='changeTab']";
261
262        // OLD CHANGE VIEW LOGIC
263        this.changeTabTo = function(tabName){
264            var tab = jQuery3_4_1(self.parent).find(".sape-viewort-tab.tab-"+tabName).first();
265            var tabs = jQuery3_4_1(self.parent).find(".sape-viewort-tab").not(tab);
266            tabs.removeClass("active");
267            tab.addClass("active");
268        }
269
270        this.handleChangeHighlight = function(event){
271            var element = jQuery3_4_1(event.currentTarget);
272            var elements = jQuery3_4_1(self.buttonSelector).not(element);
273            elements.removeClass(self.buttonHighlightClass);
274            element.addClass(self.buttonHighlightClass);
275        }
276
277        this.registerButtons = function(){
278            // OLD
279            jQuery3_4_1(self.parent).closest(".sape-boliginfo-window").find("button[data-sape-action='changeTab']").on({
280                click:self.handleChangeHighlight
281            });
282
283            // NEW PLATFORM LOGIC
284            jQuery3_4_1(self.parent).closest(".sape-boliginfo-window").find("[data-dd-action='changeViewportTab']").on({
285                click:function(event){
286                    event.preventDefault();
287                    const button = jQuery3_4_1(this);
288                    const otherButtons = jQuery3_4_1("[data-dd-action='changeViewportTab']").not(button);
289                    otherButtons.removeClass("dd-highlighted-button");
290                    button.addClass("dd-highlighted-button");
291                    const tabId = button.data("tab-id");
292                    self.changeTabTo(tabId);
293                    self.handleDisclaimers(tabId);
294                    DDPlatform.history.replace({
295                        'viewport':tabId
296                    });
297                }
298            });
299        }
300
301        this.handleDisclaimers = function(tabId){
302            const tab = jQuery3_4_1(self.parent).find(".sape-viewort-tab.tab-"+tabId).first();
303            const disclaimerSettings = tab.data("disclaimer");
304            if(disclaimerSettings){
305                const disclaimerContainer = tab.find(".dd-viewport-disclaimer").first();
306                disclaimerContainer.empty();
307                DDPlatform.disclaimer.trigger(disclaimerSettings, disclaimerContainer);
308            }
309        }
310
311        this.registerEvents = function(){
312            ipeApplication.registerOnLoadEvent( self.registerButtons );
313        }
314
315        this.init = function(){
316            jQuery3_4_1(document).ready(self.registerEvents);
317            const activeTab = jQuery3_4_1(self.parent).find(".sape-viewort-tab.active");
318            const activeTabID = activeTab.data("tab-id");
319            self.handleDisclaimers(activeTabID);
320        };
321        self.init();
322    }
323
324
325    function SapeDisclaimerController(parent){  // NOT USED IN DD PLATFORM
326        var self = this;
327        this.parent = parent;
328        this.mode = jQuery3_4_1(parent).data("mode");
329        this.storageID = "sape-biw-viewport-disclaimer-model-closed";
330
331        this.handleClick = function(event, element){
332            event.preventDefault();
333            event.currentTarget.parentElement.parentElement.classList.add("ipe-do-fade");
334            self.saveStateOnDevice();
335            self.saveStateInSession();
336        }
337        this.addAction = function(index, element){
338            jQuery3_4_1(element).on("click", (event)=>{self.handleClick(event, element)});
339        }
340        this.addActions = function(){
341            jQuery3_4_1(self.parent).find(".sape-button").each(self.addAction);
342        };
343        this.reveal = function(){
344            jQuery3_4_1(self.parent).removeClass("display-none")
345        };
346        this.saveStateOnDevice = function(){
347            localStorage.setItem(self.storageID,"true");
348        };
349        this.saveStateInSession = function(){
350            sessionStorage.setItem(self.storageID,"true");
351        };
352        this.checkDevice = function(){
353            var deviceStatus = localStorage.getItem(self.storageID);
354            if(deviceStatus == null) {
355                return true;
356            } else {
357                return false;
358            }
359        };
360        this.checkSession = function(){
361            var sessionStatus = sessionStorage.getItem(self.storageID);
362            if(sessionStatus == null) {
363                return true;
364            } else {
365                return false;
366            }
367        };
368        this.checkMode = function(){
369            switch (self.mode) {
370                case 'never':
371                    return false;
372                case 'once-per-device':
373                    return self.checkDevice();
374                case 'once-per-session':
375                    return self.checkSession();
376                case 'always':
377                    break;
378                default:
379                    break;
380            }
381            return true;
382        };
383        this.init = function(){
384            jQuery3_4_1(document).ready(function(){
385                var isEnabled = self.checkMode();
386                if(isEnabled) {
387                    self.reveal();
388                    self.addActions();
389                }
390            });
391        };
392        self.init();
393    }
394
395
396    function SapeAccordionController(parent){
397        var self = this;
398        this.parent = parent;
399        this.onlyAllowOneOpen = false;
400        this.localStorageKey = "dd_sape_biw_accordion_states";
401        this.states = {};
402        this.defaultState = false;
403
404        // CHANGE VIEW LOGIC
405        this.toggleTab = function(index, element){
406            var toggleButton = jQuery3_4_1(element);
407            var tab = toggleButton.parent();
408            tab.toggleClass("open");
409            var accordionContent = tab.find(".sape-accordion-content-wrapper");
410            var isOpen = tab.hasClass("open");
411            if(isOpen){
412                accordionContent.removeAttr('inert');
413            } else {
414                accordionContent.attr('inert', '');
415            }
416            self.calculateTabHeight(tab);
417            var i = tab.index();
418            self.states[i] = tab.hasClass("open");
419            self.storeStates();
420        }
421        this.calculateTabHeight = function(tab){
422            var isJQuery = tab instanceof jQuery3_4_1; 
423            if(!isJQuery){
424                tab = jQuery3_4_1(tab);
425            }
426            var wrapper = tab.find(".sape-accordion-content-wrapper");
427            var arrow = tab.find(".sape-arrow-down");
428            var content = wrapper.find(".sape-accordion-content");
429            var contentHeight = "" + content.outerHeight() + "px";
430            var maxHeight = tab.hasClass("open") ? contentHeight : "0px";
431            var arrowRotation = tab.hasClass("open") ? "rotate(180deg)" : "rotate(0deg)";
432            wrapper.css("max-height", maxHeight);
433            arrow.css("transform", arrowRotation);
434        }
435        this.handleClick = function(event, element){
436            if(self.onlyAllowOneOpen){
437                jQuery3_4_1(self.parent).find(".open .sape-accordion-toggle").not(element).each(self.toggleTab);
438            }
439            self.toggleTab(-1, element);
440        }
441        this.addAction = function(index, element){
442            jQuery3_4_1(element).on("click", (event)=>{self.handleClick(event, element)});
443        }
444        this.addActions = function(){
445            jQuery3_4_1(self.parent).find(".sape-accordion-toggle").each(self.addAction);
446        };
447        this.setInitialStates = function(){
448            self.states = localStorage.getItem(self.localStorageKey) ? JSON.parse( localStorage.getItem(self.localStorageKey) ) : self.getDefaultStates();
449            ipeApplication.verboseConsoleLog("STATES LOADED: ", self.states);
450            var tabs = jQuery3_4_1(self.parent).find(".sape-accordion-tab");
451            tabs.each(self.setInitialState);
452        };
453        this.getDefaultStates = function(){
454            const result = {}
455            var tabs = jQuery3_4_1(self.parent).find(".sape-accordion-tab");
456            tabs.each(function(index, element){
457                const rolledUp = jQuery3_4_1(element).data("initial-roll-up");
458                result[index] = rolledUp ? false : true;
459            });
460            return result;
461        }
462        this.setInitialState = function(index, element){
463            var currentState = (self.states[index] !== undefined) ? self.states[index] : self.defaultState;
464            var tab = jQuery3_4_1(element);
465            tab.toggleClass("open", currentState);
466            self.calculateTabHeight(tab);
467        };
468        this.storeStates = function(){
469            ipeApplication.verboseConsoleLog("STORING STATES: ", self.states);
470            localStorage.setItem(self.localStorageKey, JSON.stringify(self.states));
471        }
472        this.init = function(){
473            ipeApplication.consoleLog("Initializing Accordion Controller");
474            jQuery3_4_1(document).ready(function(){
475                self.addActions();
476                setTimeout(function(){
477                    self.setInitialStates();
478                },1000);
479            });
480            jQuery3_4_1(window).on("resize", function(){
481                jQuery3_4_1(self.parent).find(".sape-accordion-tab.open").each(self.calculateTabHeight);
482            });
483            ipeApplication.registerOnLoadEvent(function(){
484                jQuery3_4_1(self.parent).find(".sape-accordion-tab.open").each(self.calculateTabHeight);
485            });
486        };
487
488        self.init();
489
490    }
491
492
493    function SapeBoligstoetteBeregner(parent){
494        var self = this;
495        var husleje;
496        this.parent = parent;
497
498        this.openModal = function(event){
499            var isKeyDown = false;
500            var initiatingButton = jQuery3_4_1(event.currentTarget);
501            var indkomst = 0;
502            var numChildren = 0;
503            var pensionist = false;
504            var inputs = [
505                {
506                    type:"text",
507                    label:"MÃ¥nedlig husstandsindkomst",
508                    class:"autoNumericPris",
509                    placeholder:"Månedsindkomst (før skat, efter AM bidrag)",
510                    events:{
511                        input:function(){
512                            indkomst = this.autoNumeric ? this.autoNumeric.rawValue : jQuery3_4_1(this).val();
513                            indkomst = parseInt( indkomst );
514                            var notice = (indkomst > 99999) ? "OBS: MÃ¥nedsindkomst" : null;
515                            jQuery3_4_1(this).parent().data("notice", notice).attr("data-notice", notice);
516                        },
517                        keydown:function(event){
518                            isKeyDown = true;
519                        },
520                        keyup:function(event){
521                            if(isKeyDown && event.keyCode === 13){
522                                self.beregn(indkomst, numChildren, pensionist);
523                                self.closeModal(initiatingButton);
524                            };
525                            if(event.keyCode === 27){
526                                self.closeModal(initiatingButton);
527                            };
528                            isKeyDown = false;
529                        }
530                    },
531                },
532                {
533                    type:"number",
534                    label:"Antal børn i husstanden",
535                    value:0,
536                    placeholder:"Antal børn",
537                    events:{
538                        input:function(){
539                            numChildren = parseInt( jQuery3_4_1(this).val() );
540                        },
541                        keydown:function(event){
542                            isKeyDown = true;
543                        },
544                        keyup:function(event){
545                            if(isKeyDown && event.keyCode === 13){
546                                self.beregn(indkomst, numChildren, pensionist);
547                                self.closeModal(initiatingButton);
548                            };
549                            if(event.keyCode === 27){
550                                self.closeModal(initiatingButton);
551                            };
552                            isKeyDown = false;
553                        }
554                    },
555                },
556                {
557                    type:"checkbox",
558                    label:"Folkepensionist",
559                    labelPlacement:"right",
560                    value:pensionist,
561                    events:{
562                        change:function(){
563                            pensionist = jQuery3_4_1(this).is(':checked');
564                        }
565                    },
566                },
567            ];
568            var data = { 
569                heading:"Boligstøtte",
570                text:"<p>Beregningen er vejledende.</p><p>Du kan udregne din boligstøtte mere præcist på <a href='https://www.borger.dk/bolig-og-flytning/Boligstoette-oversigt' target='_blank'>borger.dk</a></p>",
571                hasCloseButton:true,
572                accept:"Beregn",
573                cancel:"Fortryd",
574                class:"boligstoette-beregner-modal",
575                inputs:inputs,
576                acceptCallback:function(event){ 
577                    self.beregn(indkomst, numChildren, pensionist);
578                },
579                cancelCallback:function(event){
580                    self.clear();
581                }
582            }
583            ddModuleManager.modalsModule.openBoligstoetteModal(data);
584            self.applyAutoNumeric();
585        };
586        
587        this.closeModal = function(shouldGetFocus = undefined){
588            ddModuleManager.modalsModule.closeModal();
589            if(shouldGetFocus){
590                setTimeout(function(){
591                    shouldGetFocus.focus();
592                },1);
593            }
594        }
595
596        this.beregnBoligstoette = function( husleje, areal, husstandsIndkomst , numChildren = 0, pensionist = false ){ 
597            // CHECK DATA
598            if(husleje === undefined){
599                console.error("Please provide a: husleje");
600                return;
601            }
602            if(areal === undefined){
603                console.error("Please provide a: areal");
604                return;
605            }
606            if(husstandsIndkomst === undefined){
607                console.error("Please provide a: husstandsindkomst");
608                return;
609            }
610
611            // CHOSE METHOD
612            if(pensionist){
613                return simpelBeregningPensionist(husstandsIndkomst, numChildren, husleje);
614            }
615            return simpelBeregning(husstandsIndkomst, numChildren, husleje);
616
617            function simpelBeregning(indkomst, numChildren, husleje){
618                var max = 1059;
619                if (numChildren > 0) {
620                    max = (numChildren >= 4) ? 4655 : 3724;
621                }
622                var min = 275;
623                var huslejeResult = getMaxStoetteFromHusleje(husleje, numChildren);
624                var indkomstResult = getMaxStoetteFromIndkomst(indkomst, numChildren);
625                ipeApplication.verboseConsoleLog("Støtte pga. husleje:", huslejeResult);
626                ipeApplication.verboseConsoleLog("Støtte pga. indkomst:", indkomstResult);
627                var result = Math.min(indkomstResult, huslejeResult);
628                result = Math.min(result, max);
629                if(result < min){
630                    result = 0;
631                }
632                return result;
633            }
634
635            function simpelBeregningPensionist(indkomst, numChildren){
636                var max = (numChildren >= 4) ? 5511 : 4409;
637                var min = 275;
638                var huslejeResult = getMaxStoetteFromHuslejePensionist(husleje, numChildren);
639                var indkomstResult = getMaxStoetteFromIndkomstPensionist(indkomst, numChildren)
640                ipeApplication.verboseConsoleLog("Støtte pga. husleje:", huslejeResult);
641                ipeApplication.verboseConsoleLog("Støtte pga. indkomst:", indkomstResult);
642                var result = Math.min(indkomstResult, huslejeResult);
643                result = Math.min(result, max);
644                if(result < min){
645                    result = 0;
646                }
647                return result;
648            }
649
650            // CALCULATIONS
651            function getMaxStoetteFromHusleje(husleje, numChildren){
652                var factor = 0.6;
653                var koefficient = 3225;
654                if(numChildren > 0){
655                    var maxChildrenInCalculation = 4;
656                    numChildren = Math.min(numChildren, maxChildrenInCalculation);
657                    koefficient = 3822 + 597 * numChildren;
658                }
659                var r = husleje * factor - koefficient;
660                r = Math.max(r, 0);
661                return r;
662            }
663
664            function getMaxStoetteFromIndkomst(indkomst, numChildren){
665                var factor = 0.18;
666                var koefficient = 6499;
667                if(numChildren > 0){
668                    var maxChildrenInCalculation = 4;
669                    numChildren = Math.min(numChildren, maxChildrenInCalculation);
670                    koefficient = 5902 + 809 * numChildren;
671                }
672                var r = koefficient - (factor * indkomst);
673                return r;
674            }
675
676            function getMaxStoetteFromHuslejePensionist(husleje, numChildren){
677                var factor = (numChildren < 3) ? 0.75 : 1.0;
678                var koefficient = 3022;
679                if(numChildren > 1) {
680                    koefficient = (numChildren < 3) ? 2139 : 2551;
681                }
682                var r = husleje * factor - koefficient;
683                r = Math.max(r, 0);
684                return r;
685            }
686
687            function getMaxStoetteFromIndkomstPensionist(indkomst, numChildren){
688                var factor = 0.225;
689                var koefficient = 10082;
690                if(numChildren > 0){
691                    var maxChildrenInCalculation = 4;
692                    numChildren = Math.min(numChildren, maxChildrenInCalculation);
693                    koefficient = 9199 + 1196 * numChildren;
694                }
695                var r = koefficient - (factor * indkomst);
696                return r;
697            }
698
699
700            // ALGORITHM IS NOT CORRECT
701            // function BeregnBoligsikring(husleje = 12000, numChildren = 0, indkomst, hasHandicap = false){
702
703            //     // VARS
704            //     var boligudgift_faktor = 0.6; // %
705            //     var husstandsindkomst_faktor = 0.18; // %
706            //     var indkomst_graense = 150600;
707            //     var indkomst_graense_tillaeg_pr_barn = 39700;
708            //     var husstandsIndkomst = 12 * indkomst;
709
710            //     // FORHØJET INDKOMSTGRÆNSE FOR BØRNEFAMILIER
711            //     var maxValidChildren = Math.min( numChildren , 4 );
712            //     indkomst_graense += maxValidChildren * indkomst_graense_tillaeg_pr_barn
713
714            //     // FORHØJET MAX BELØB FOR HANDICAPPEDE OG STORFAMILIER
715            //     var max_allowed = 44592;
716            //     if(hasHandicap){
717            //         max_allowed *= 1.5;
718            //     } else if(numChildren >= 4){
719            //         max_allowed *= 1.25;
720            //     }
721
722            //     // MINDSTE SELVBETALING
723            //     var min_self_paid = 25400;
724            //     var aarlig_boligudgift = 12*husleje;
725            //     max_allowed = Math.min( max_allowed , (aarlig_boligudgift - min_self_paid) );
726
727            //     // MAX 15% FOR BARNLØSE UDEN HANDICAP
728            //     if(numChildren === 0 && !hasHandicap && !foertidsPensionist){
729            //         max_allowed = Math.min( max_allowed , (aarlig_boligudgift * 0.15) );
730            //     }
731
732            //     // BEREGNING
733            //     var udgifterDel = boligudgift_faktor * aarlig_boligudgift;
734            //     var husstands_indkomst_over_graense = Math.max( 0 , (husstandsIndkomst - indkomst_graense) );
735            //     var indkomstDel = husstandsindkomst_faktor * husstands_indkomst_over_graense;
736            //     var bolig_stoette_pr_aar = udgifterDel - indkomstDel;
737
738            //     console.log("Maks tilladt støtte:", max_allowed);
739            //     console.log("60% af årlig boligudgift ", udgifterDel);
740            //     console.log("Husstandsindkomst over grænse", husstands_indkomst_over_graense);
741            //     console.log("18% af husstandsindkomst ", indkomstDel);
742            //     console.log("Boligstøtte pr. år:", bolig_stoette_pr_aar);
743
744            //     bolig_stoette_pr_aar = Math.min( bolig_stoette_pr_aar , max_allowed )
745            //     console.log("Capped boligstøtte pr. år:", bolig_stoette_pr_aar);
746
747            //     // PR. MD.
748            //     var bolig_stoette_pr_md = Math.round(bolig_stoette_pr_aar / 12);
749            //     console.log("Boligstøtte pr. md:", bolig_stoette_pr_md);
750
751            //     // BAGATELGRÆNSE
752            //     var bagatel_graense_pr_md = 273
753            //     if(bolig_stoette_pr_md < bagatel_graense_pr_md) {
754            //         bolig_stoette_pr_md = 0;
755            //     }
756            //     console.log("Checker bundgrænse");
757
758            //     return bolig_stoette_pr_md;
759            // }
760        }
761
762        this.storeHusleje = function(){
763            husleje = parseInt(jQuery3_4_1(self.parent).closest(".sape-boliginfo-window").data("pris"));
764            jQuery3_4_1(self.parent).closest(".sape-boliginfo-window").removeAttr("data-pris");
765        }
766
767        this.getHusleje = function(){
768            return husleje;
769        }
770        this.clear = function(){
771            jQuery3_4_1(self.parent).find(".result").html("—");
772        }
773        this.formatCurrency = function(amount){
774            var str = "";
775            if(amount > 0) {
776                str = "-";
777            }
778            str += amount.toLocaleString('da-DK');
779            str += " kr.";
780            return str;
781        };
782
783        // EVENTS
784        this.beregn = function( indkomst, numChildren = 0, pensionist = false ){
785            var husleje = self.getHusleje();
786            var areal = 68;
787            var stoette = self.beregnBoligstoette(husleje, areal, indkomst, numChildren, pensionist);
788            jQuery3_4_1(self.parent).find(".result").html(self.formatCurrency(stoette));
789            ipeApplication.verboseConsoleLog("Husleje:",husleje);
790            ipeApplication.verboseConsoleLog("Areal:",areal);
791            ipeApplication.verboseConsoleLog("Indkomst:",indkomst);
792            ipeApplication.verboseConsoleLog("Antal børn:",numChildren);
793            ipeApplication.verboseConsoleLog("Pensionist:",pensionist);
794            ipeApplication.verboseConsoleLog("Boligstøtte:",stoette);
795        }
796        this.applyAutoNumeric = function(){
797            var elements = jQuery3_4_1('.boligstoette-beregner-modal .autoNumericPris');
798            elements.each(function(){
799                this.autoNumeric = new AutoNumeric(this, {
800                    allowDecimalPadding: "floats",
801                    currencySymbol: " kr.",
802                    decimalCharacter: ",",
803                    decimalPlaces: 0,
804                    digitGroupSeparator: ".",
805                    maximumValue: "1000000000",
806                    minimumValue: "0",
807                    modifyValueOnWheel: false,
808                    outputFormat: "number",
809                    currencySymbolPlacement:"s"
810                });
811            });
812        }
813        this.handleClick = function(event){
814            self.openModal(event);
815        }
816        this.registerEvents = function(){
817            jQuery3_4_1(self.parent).find(".calculate-button").on("click", (event)=>{ self.handleClick(event) });
818        };
819
820        // INIT
821        this.init = function(){
822            ipeApplication.consoleLog("Initializing Accordion Controller");
823            jQuery3_4_1(document).ready(function(){
824                self.registerEvents();
825                self.storeHusleje();
826            });
827        };
828
829        self.init();
830
831    }
832
833    return publicFunctions;
834}, false); // false = not public

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.