Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // I'm so sorry if you have to read this. There was way too little time to
- // write this...
- var $ = window.jQuery;
- var numberRe = /^[0-9\.]+$/;
- var rangeRe = /^ *([0-9]+) *- *([0-9]+) *$/;
- var commaDecimalRe = /^ *([0-9]+) *, *([0-9]+) *$/;
- function commaToDot(s) {
- var m = commaDecimalRe.exec(s);
- if (!m) {
- return s;
- }
- return m[1] + "." + m[2];
- }
- function toPostiveFloat(s) {
- if (typeof s === "number") {
- return s;
- }
- return Math.max(0, parseFloat(commaToDot(s.replace(/ /g, ""), 10)));
- }
- function parseRange(s) {
- var m = rangeRe.exec(s);
- if (!m) {
- throw new Error("Invalid range: " + s);
- }
- return [parseInt(m[1], 10), parseInt(m[2], 10)];
- }
- function isInRange(range, i) {
- if (typeof range === "string") {
- range = parseRange(range);
- }
- return i >= range[0] && i <= range[1];
- }
- function parseTSVNumbers(text) {
- return text.split("\n").map(function(row) {
- return row.split("\t").map(function(n) {
- return numberRe.test(n) ? toPostiveFloat(n) : n;
- });
- });
- }
- var CO2DATA = parseTSVNumbers($("#co2").text());
- var MASSA_RANGES = parseTSVNumbers($("#massan-mukaan").text().trim());
- var AUTOVERO_2017 = parseTSVNumbers($("#autovero-2017").text().trim());
- var FORM = $("form#trafilaskuri");
- var CO2_INPUT = $("#input_co2");
- var UUSI_PERUSOSA_KERROIN = 0.179;
- var POLTTOAINEVERO = 0.6813;
- var UUSI_POLTTOAINEVERO_KERROIN = 0.924;
- var VEROVUOSI_WTF = 1997;
- var ALV_KERROIN = 0.24;
- var OLD_CAR_YEAR = 2001;
- function formObject() {
- return FORM.serializeArray().reduce(function(ob, item) {
- ob[item.name] = toPostiveFloat(item.value) || 0;
- return ob;
- }, {});
- }
- function intEquals(a, b) {
- return parseInt(a, 10) === parseInt(b, 10);
- }
- function getMassaItem(massa, index) {
- var begin = MASSA_RANGES[0];
- var end = MASSA_RANGES[MASSA_RANGES.length-1];
- if (begin[0] >= massa) {
- return begin[index];
- }
- if (end[0] <= massa) {
- return end[index];
- }
- var row = MASSA_RANGES.slice(1, -1).filter(function(row) {
- return isInRange(row[0], massa);
- })[0];
- return (row && row[index] || 0);
- }
- function findAutovero(co2) {
- if (co2 >= 360) {
- return 0.5;
- }
- var row = AUTOVERO_2017.filter(function(row) {
- return intEquals(row[0], co2);
- })[0];
- return (row && row[1] || 0) / 100;
- }
- function findOldCarNykAjoneuvovero(massa) {
- return getMassaItem(massa, 1);
- }
- function findOldCarAikaperustainenAjoneuvovero(massa) {
- return getMassaItem(massa, 2);
- }
- function findOldCarKmperustainenAjoneuvovero(massa) {
- return getMassaItem(massa, 3);
- }
- function getCO2Item(co2, index) {
- var row = CO2DATA.filter(function(row) {
- return intEquals(row[0], co2);
- })[0];
- return (row && row[index] || 0);
- }
- function findNykAjoneuvovero(co2) {
- return getCO2Item(co2, 2);
- }
- function findAikaperustainenAsiakasmaksu(co2) {
- return getCO2Item(co2, 3);
- }
- function findKmPerustainenAsiakasmaksu(co2) {
- return getCO2Item(co2, 4);
- }
- function sumMatching(re, source) {
- return Object.keys(source).reduce(function(acc, key) {
- if (re.test(key)) {
- return acc + (source[key] || 0);
- }
- return acc;
- }, 0);
- }
- function calculateCosts(userInput) {
- userInput.massa = Math.min(3500, userInput.massa);
- userInput.co2 = Math.min(400, (userInput.co2 || 0));
- var useMass = userInput.vuosi && userInput.vuosi < 2002;
- if (userInput.massa <= 2500 && userInput.vuosi === 2001) {
- useMass = false;
- }
- if (useMass) {
- console.log("käytetään massaa");
- CO2_INPUT.hide();
- } else {
- CO2_INPUT.show();
- console.log("Käytetään CO2");
- }
- var nykPerusosa = findNykAjoneuvovero(userInput.co2);
- if (useMass) {
- nykPerusosa = findOldCarNykAjoneuvovero(userInput.massa);
- }
- var polttoainevero = (userInput.ajosuorite / 100) * userInput.kulutus * POLTTOAINEVERO;
- // vero on senteissa lomakkeella
- var voimavero = (userInput.voimavero / 100) * (Math.floor(userInput.massa / 100) + 1) * 365;
- var aikaPerustainenAsiakasmaksu = findAikaperustainenAsiakasmaksu(userInput.co2);
- if (useMass) {
- aikaPerustainenAsiakasmaksu = findOldCarAikaperustainenAjoneuvovero(userInput.massa);
- }
- var aikaAsiakasmaksut = aikaPerustainenAsiakasmaksu / (1 + ALV_KERROIN);
- var kmPerustainenAsiakasmaksu = findKmPerustainenAsiakasmaksu(userInput.co2);
- if (useMass) {
- kmPerustainenAsiakasmaksu = findOldCarKmperustainenAjoneuvovero(userInput.massa);
- }
- var kmAsiakasmaksut = userInput.ajosuorite * (userInput.osuusValtionTieverkolla / 100) * (kmPerustainenAsiakasmaksu / 100) / (1 + ALV_KERROIN);
- var autoveroProsentti = 0;
- if (!useMass) {
- autoveroProsentti = findAutovero(userInput.co2);
- }
- return {
- nykPerusosa: nykPerusosa,
- kmPerusosa: nykPerusosa * UUSI_PERUSOSA_KERROIN,
- aikaPerusosa: nykPerusosa * UUSI_PERUSOSA_KERROIN,
- nykVoimavero: voimavero,
- kmVoimavero: voimavero,
- aikaVoimavero: voimavero,
- nykPolttoainevero: polttoainevero,
- kmPolttoainevero: polttoainevero * UUSI_POLTTOAINEVERO_KERROIN,
- aikaPolttoainevero: polttoainevero * UUSI_POLTTOAINEVERO_KERROIN,
- nykAutovero: (userInput.arvo * autoveroProsentti) / (userInput.vuosi - VEROVUOSI_WTF),
- kmAutovero: 0,
- aikaAutovero: 0,
- kmAsiakasmaksut: kmAsiakasmaksut,
- kmAsiakasmaksutAlv: kmAsiakasmaksut * ALV_KERROIN,
- aikaAsiakasmaksut: aikaAsiakasmaksut,
- aikaAsiakasmaksutAlv: aikaAsiakasmaksut * ALV_KERROIN,
- };
- }
- function injectResultsToDOM(res) {
- Object.keys(res).forEach(function(key) {
- var val = res[key];
- if (isReallyNaN(val)) {
- val = "?";
- } else {
- val = val.toFixed(2);
- }
- $("." + key).text(val);
- });
- }
- function isReallyNaN(n) {
- return typeof n === "number" && isNaN(n);
- }
- function debounce(func, wait, immediate) {
- var timeout;
- return function() {
- var context = this, args = arguments;
- var later = function() {
- timeout = null;
- if (!immediate) func.apply(context, args);
- };
- var callNow = immediate && !timeout;
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- if (callNow) func.apply(context, args);
- };
- }
- var render = debounce(function () {
- var res = calculateCosts(formObject());
- res.kmYhteensa = sumMatching(/^km/, res);
- res.aikaYhteensa = sumMatching(/^aika/, res);
- res.nykYhteensa = sumMatching(/^nyk/, res);
- injectResultsToDOM(res);
- }, 100);
- FORM.on("change", render);
- $("input").on("keyup", render);
- var laskuritDialogInitialized = false;
- $(document).ready(function(){
- $('#tienkaytto-laskuri label i').each(function(){
- $(this).click(function(e){
- e.preventDefault();
- e.stopPropagation();
- var title = false;
- var info = false;
- if('undefined' != typeof TR_LASKURI_TEXTS[$(this).attr('data-info-field')]){
- title = $(this).parents('label:first').find('span').text();
- info = TR_LASKURI_TEXTS[$(this).attr('data-info-field')];
- }
- if(title && info){
- dialog = getDialog({'title': title, 'description': info});
- // open modal
- dialog.dialog('open');
- }
- });
- });
- });
- function getDialog(info){
- var width = $(window).width() - 40;
- var maxWidth = 700;
- if(width > maxWidth){
- width = maxWidth;
- }
- if(laskuritDialogInitialized !== true){
- $('#laskuri_dialog').dialog({
- bgiframe: false,
- width: width,
- //height: height,
- modal: false,
- autoOpen: false,
- position: ['center', 100],
- resizable: false,
- draggable: false,
- dialogClass: 'laskuri_dialog',
- closeText: '',
- close: function(event, ui){
- // empty content
- $('#laskuri_dialog .content').empty();
- // clear title
- $('#laskuri_dialog').dialog('option', 'title', '');
- }
- });
- this.dialogInitialized = true;
- }
- else{
- $('#laskuri_dialog').dialog('option', 'width', width);
- }
- // clear title
- $('#laskuri_dialog').dialog('option', 'title', '');
- if('undefined' != typeof info){
- $('#laskuri_dialog').dialog('option', 'title', info['title']);
- $('#laskuri_dialog .content').html(info['description']);
- }
- return $('#laskuri_dialog');
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement