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.