Advertisement
Guest User

TRAFI hieno koodi

a guest
Jan 19th, 2017
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. // I'm so sorry if you have to read this. There was way too little time to
  3. // write this...
  4.  
  5. var $ = window.jQuery;
  6.  
  7. var numberRe = /^[0-9\.]+$/;
  8. var rangeRe = /^ *([0-9]+) *- *([0-9]+) *$/;
  9. var commaDecimalRe = /^ *([0-9]+) *, *([0-9]+) *$/;
  10.  
  11. function commaToDot(s) {
  12.     var m = commaDecimalRe.exec(s);
  13.     if (!m) {
  14.         return s;
  15.     }
  16.  
  17.     return m[1] + "." + m[2];
  18. }
  19.  
  20. function toPostiveFloat(s) {
  21.     if (typeof s === "number") {
  22.         return s;
  23.     }
  24.  
  25.     return Math.max(0, parseFloat(commaToDot(s.replace(/ /g, ""), 10)));
  26. }
  27.  
  28. function parseRange(s) {
  29.     var m = rangeRe.exec(s);
  30.     if (!m) {
  31.         throw new Error("Invalid range: " + s);
  32.     }
  33.     return [parseInt(m[1], 10), parseInt(m[2], 10)];
  34. }
  35.  
  36. function isInRange(range, i) {
  37.     if (typeof range === "string") {
  38.         range = parseRange(range);
  39.     }
  40.     return i >= range[0] && i <= range[1];
  41. }
  42.  
  43. function parseTSVNumbers(text) {
  44.     return text.split("\n").map(function(row) {
  45.         return row.split("\t").map(function(n) {
  46.             return numberRe.test(n) ? toPostiveFloat(n) : n;
  47.         });
  48.     });
  49. }
  50.  
  51.  
  52. var CO2DATA = parseTSVNumbers($("#co2").text());
  53. var MASSA_RANGES = parseTSVNumbers($("#massan-mukaan").text().trim());
  54. var AUTOVERO_2017 = parseTSVNumbers($("#autovero-2017").text().trim());
  55. var FORM = $("form#trafilaskuri");
  56. var CO2_INPUT = $("#input_co2");
  57.  
  58. var UUSI_PERUSOSA_KERROIN = 0.179;
  59. var POLTTOAINEVERO = 0.6813;
  60. var UUSI_POLTTOAINEVERO_KERROIN = 0.924;
  61. var VEROVUOSI_WTF = 1997;
  62. var ALV_KERROIN = 0.24;
  63. var OLD_CAR_YEAR = 2001;
  64.  
  65.  
  66. function formObject() {
  67.     return FORM.serializeArray().reduce(function(ob, item) {
  68.         ob[item.name] = toPostiveFloat(item.value) || 0;
  69.         return ob;
  70.     }, {});
  71. }
  72.  
  73. function intEquals(a, b) {
  74.     return parseInt(a, 10) === parseInt(b, 10);
  75. }
  76.  
  77. function getMassaItem(massa, index) {
  78.     var begin = MASSA_RANGES[0];
  79.     var end = MASSA_RANGES[MASSA_RANGES.length-1];
  80.  
  81.     if (begin[0] >= massa) {
  82.         return begin[index];
  83.     }
  84.  
  85.     if (end[0] <= massa) {
  86.         return end[index];
  87.     }
  88.  
  89.     var row = MASSA_RANGES.slice(1, -1).filter(function(row) {
  90.         return isInRange(row[0], massa);
  91.     })[0];
  92.  
  93.     return (row && row[index] || 0);
  94. }
  95.  
  96. function findAutovero(co2) {
  97.     if (co2 >= 360) {
  98.         return 0.5;
  99.     }
  100.     var row = AUTOVERO_2017.filter(function(row) {
  101.         return intEquals(row[0], co2);
  102.     })[0];
  103.  
  104.     return (row && row[1] || 0) / 100;
  105. }
  106.  
  107. function findOldCarNykAjoneuvovero(massa) {
  108.     return getMassaItem(massa, 1);
  109. }
  110.  
  111. function findOldCarAikaperustainenAjoneuvovero(massa) {
  112.     return getMassaItem(massa, 2);
  113. }
  114.  
  115. function findOldCarKmperustainenAjoneuvovero(massa) {
  116.     return getMassaItem(massa, 3);
  117. }
  118.  
  119. function getCO2Item(co2, index) {
  120.     var row = CO2DATA.filter(function(row) {
  121.         return intEquals(row[0], co2);
  122.     })[0];
  123.  
  124.     return (row && row[index] || 0);
  125. }
  126.  
  127. function findNykAjoneuvovero(co2) {
  128.     return getCO2Item(co2, 2);
  129. }
  130.  
  131. function findAikaperustainenAsiakasmaksu(co2) {
  132.     return getCO2Item(co2, 3);
  133. }
  134.  
  135. function findKmPerustainenAsiakasmaksu(co2) {
  136.     return getCO2Item(co2, 4);
  137. }
  138.  
  139. function sumMatching(re, source) {
  140.     return Object.keys(source).reduce(function(acc, key) {
  141.         if (re.test(key)) {
  142.             return acc + (source[key] || 0);
  143.         }
  144.  
  145.         return acc;
  146.  
  147.     }, 0);
  148. }
  149.  
  150. function calculateCosts(userInput) {
  151.  
  152.     userInput.massa = Math.min(3500, userInput.massa);
  153.     userInput.co2 = Math.min(400, (userInput.co2 || 0));
  154.  
  155.     var useMass = userInput.vuosi && userInput.vuosi < 2002;
  156.  
  157.     if (userInput.massa <= 2500 && userInput.vuosi === 2001) {
  158.         useMass = false;
  159.     }
  160.  
  161.     if (useMass) {
  162.         console.log("käytetään massaa");
  163.         CO2_INPUT.hide();
  164.     } else {
  165.         CO2_INPUT.show();
  166.         console.log("Käytetään CO2");
  167.     }
  168.  
  169.     var nykPerusosa = findNykAjoneuvovero(userInput.co2);
  170.     if (useMass) {
  171.         nykPerusosa = findOldCarNykAjoneuvovero(userInput.massa);
  172.     }
  173.  
  174.     var polttoainevero = (userInput.ajosuorite / 100) * userInput.kulutus * POLTTOAINEVERO;
  175.  
  176.     // vero on senteissa lomakkeella
  177.     var voimavero = (userInput.voimavero / 100) * (Math.floor(userInput.massa / 100) + 1) * 365;
  178.  
  179.     var aikaPerustainenAsiakasmaksu = findAikaperustainenAsiakasmaksu(userInput.co2);
  180.     if (useMass) {
  181.         aikaPerustainenAsiakasmaksu = findOldCarAikaperustainenAjoneuvovero(userInput.massa);
  182.     }
  183.     var aikaAsiakasmaksut = aikaPerustainenAsiakasmaksu / (1 + ALV_KERROIN);
  184.  
  185.  
  186.     var kmPerustainenAsiakasmaksu = findKmPerustainenAsiakasmaksu(userInput.co2);
  187.     if (useMass) {
  188.         kmPerustainenAsiakasmaksu = findOldCarKmperustainenAjoneuvovero(userInput.massa);
  189.     }
  190.     var kmAsiakasmaksut = userInput.ajosuorite * (userInput.osuusValtionTieverkolla / 100) * (kmPerustainenAsiakasmaksu / 100) / (1 + ALV_KERROIN);
  191.  
  192.     var autoveroProsentti = 0;
  193.     if (!useMass) {
  194.         autoveroProsentti = findAutovero(userInput.co2);
  195.     }
  196.  
  197.     return {
  198.         nykPerusosa: nykPerusosa,
  199.         kmPerusosa: nykPerusosa * UUSI_PERUSOSA_KERROIN,
  200.         aikaPerusosa: nykPerusosa * UUSI_PERUSOSA_KERROIN,
  201.  
  202.         nykVoimavero: voimavero,
  203.         kmVoimavero: voimavero,
  204.         aikaVoimavero: voimavero,
  205.  
  206.         nykPolttoainevero: polttoainevero,
  207.         kmPolttoainevero: polttoainevero * UUSI_POLTTOAINEVERO_KERROIN,
  208.         aikaPolttoainevero: polttoainevero * UUSI_POLTTOAINEVERO_KERROIN,
  209.  
  210.         nykAutovero: (userInput.arvo * autoveroProsentti) / (userInput.vuosi - VEROVUOSI_WTF),
  211.         kmAutovero: 0,
  212.         aikaAutovero: 0,
  213.  
  214.         kmAsiakasmaksut: kmAsiakasmaksut,
  215.         kmAsiakasmaksutAlv: kmAsiakasmaksut * ALV_KERROIN,
  216.  
  217.         aikaAsiakasmaksut: aikaAsiakasmaksut,
  218.         aikaAsiakasmaksutAlv: aikaAsiakasmaksut * ALV_KERROIN,
  219.  
  220.     };
  221. }
  222.  
  223. function injectResultsToDOM(res) {
  224.     Object.keys(res).forEach(function(key) {
  225.         var val = res[key];
  226.  
  227.         if (isReallyNaN(val)) {
  228.             val = "?";
  229.         } else {
  230.             val = val.toFixed(2);
  231.         }
  232.  
  233.         $("." + key).text(val);
  234.     });
  235. }
  236.  
  237. function isReallyNaN(n) {
  238.     return typeof n === "number" && isNaN(n);
  239. }
  240.  
  241. function debounce(func, wait, immediate) {
  242.     var timeout;
  243.     return function() {
  244.         var context = this, args = arguments;
  245.         var later = function() {
  246.             timeout = null;
  247.             if (!immediate) func.apply(context, args);
  248.         };
  249.         var callNow = immediate && !timeout;
  250.         clearTimeout(timeout);
  251.         timeout = setTimeout(later, wait);
  252.         if (callNow) func.apply(context, args);
  253.     };
  254. }
  255.  
  256. var render = debounce(function () {
  257.     var res = calculateCosts(formObject());
  258.  
  259.     res.kmYhteensa = sumMatching(/^km/, res);
  260.     res.aikaYhteensa = sumMatching(/^aika/, res);
  261.     res.nykYhteensa = sumMatching(/^nyk/, res);
  262.  
  263.     injectResultsToDOM(res);
  264.  
  265. }, 100);
  266.  
  267. FORM.on("change", render);
  268. $("input").on("keyup", render);
  269.  
  270.  
  271. var laskuritDialogInitialized = false;
  272.  
  273. $(document).ready(function(){
  274.     $('#tienkaytto-laskuri label i').each(function(){
  275.         $(this).click(function(e){
  276.             e.preventDefault();
  277.             e.stopPropagation();
  278.  
  279.             var title = false;
  280.             var info = false;
  281.  
  282.             if('undefined' != typeof TR_LASKURI_TEXTS[$(this).attr('data-info-field')]){
  283.                 title = $(this).parents('label:first').find('span').text();
  284.                 info = TR_LASKURI_TEXTS[$(this).attr('data-info-field')];
  285.             }
  286.  
  287.             if(title && info){
  288.                 dialog = getDialog({'title': title, 'description': info});
  289.  
  290.                 // open modal
  291.                 dialog.dialog('open');
  292.             }
  293.         });
  294.     });
  295. });
  296.  
  297. function getDialog(info){
  298.     var width = $(window).width() - 40;
  299.     var maxWidth = 700;
  300.  
  301.     if(width > maxWidth){
  302.         width = maxWidth;
  303.     }
  304.  
  305.     if(laskuritDialogInitialized !== true){
  306.         $('#laskuri_dialog').dialog({
  307.             bgiframe: false,
  308.             width: width,
  309.             //height: height,
  310.             modal: false,
  311.             autoOpen: false,
  312.             position: ['center', 100],
  313.             resizable: false,
  314.             draggable: false,
  315.             dialogClass: 'laskuri_dialog',
  316.             closeText: '',
  317.             close: function(event, ui){
  318.                 // empty content
  319.                 $('#laskuri_dialog .content').empty();
  320.                 // clear title
  321.                 $('#laskuri_dialog').dialog('option', 'title', '');
  322.             }
  323.         });
  324.  
  325.         this.dialogInitialized = true;
  326.     }
  327.     else{
  328.         $('#laskuri_dialog').dialog('option', 'width', width);
  329.     }
  330.  
  331.     // clear title
  332.     $('#laskuri_dialog').dialog('option', 'title', '');
  333.  
  334.     if('undefined' != typeof info){
  335.         $('#laskuri_dialog').dialog('option', 'title', info['title']);
  336.         $('#laskuri_dialog .content').html(info['description']);
  337.     }
  338.  
  339.     return $('#laskuri_dialog');
  340. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement