// TODO: kvoli rychlosti upravy je to mega sprasene, chce to prepisat
function calculate() {
    disableAndEnable();

    var price = 0;
    var pricePro = 0;

    var tax = 0;
    var taxConnect = 0;
    var taxLite = 0;
    var taxPro = 0;
    var taxCashDeskPro = 0;

    var maxFee = 1200;

    var serviceTax = tax;

    var web = false;

    $("calc_beds").value = Math.abs($("calc_beds").value);
    $("calc_rooms").value = Math.abs($("calc_rooms").value);
    var beds = $("calc_beds").value;
    var rooms = $("calc_rooms").value;

    if (!isNumeric(beds)) {
        $("calc_beds").value = 0;
        beds = 0;
    }
    if (!isNumeric(rooms)) {
        $("calc_rooms").value = 0;
        rooms = 0;
    }

    if ($("calc_schoolin").checked) {
        price += previoPrice['training'];
    }

    if ($("calc_web2").checked) {
        price += previoPrice['webTemplate'];
        web = true;
    }
    if ($("calc_web3").checked) {
        price += previoPrice['webCustom'];
        web = true;
    }

    if (web) {
        serviceTax += previoPrice['webTax'];
    } else {
        if ($("calc_reservationIframe").checked) {
            serviceTax += previoPrice['reservationIframe'];
        }
        if ($("calc_occupancyCalendar").checked) {
            serviceTax += previoPrice['occupancyCalendar'];
        }
        if ($("calc_pricelist").checked) {
            serviceTax += previoPrice['pricelist'];
        }
        if ($("calc_reviewsWidget").checked) {
            serviceTax += previoPrice['reviewsWidget'];
        }
    }

    if ($("previoLicencePro").checked) {
        price += previoPrice['licensePro'];

        // poplatky vztazene na luzka
        if ($("calc_beds").value) {
            // provoz a technicka podpora
            taxConnect = tax + (beds * (previoPrice['feeSupportConnect']));
            taxLite = tax + (beds * (previoPrice['feeSupportLite']));
            tax += beds * (previoPrice['feeSupportPro']);
            taxCashDeskPro = beds * (previoPrice['cashDeskProMonth']);
        }

        if ($("calc_cashdesk_pro").checked) {
            price += previoPrice['cashDeskPro'];
        }

    } else if ($("previoLicenceLite").checked) {
        price += previoPrice['licenseLite'];
        pricePro = price + previoPrice['licensePro'];

        // poplatky vztazene na luzka
        if ($("calc_beds").value) {
            // provoz a technicka podpora
            taxPro = tax + (beds * (previoPrice['feeSupportPro']));
            tax += beds * (previoPrice['feeSupportLite']);
            taxConnect = tax + (beds * (previoPrice['feeSupportConnect']));
            taxCashDeskPro = beds * (previoPrice['cashDeskProMonth']);
        }
    } else if ($("previoLicenceConnect").checked) {
        price += previoPrice['licenseConnect'];
        pricePro = price + previoPrice['licensePro'];
        // poplatky vztazene na luzka
        if ($("calc_beds").value) {
            // provoz a technicka podpora
            taxPro = tax + (beds * (previoPrice['feeSupportPro']));
            taxLite = tax + (beds * (previoPrice['feeSupportLite']));
            tax += beds * (previoPrice['feeSupportConnect']);
            taxCashDeskPro = beds * (previoPrice['cashDeskProMonth']);
        }
    }

    // prenasobeni poplatku podle poctu mistnosti - zvyhodnuje hotely s
    // vetsim poctem pokoju
    if ($("calc_rooms").value) {
        // vyse slevy je max 60%
        discount = Math.min(Math.abs($("calc_rooms").value), 60);
        tax *= (100 - discount) / 100;
        taxConnect *= (100 - discount) / 100;
        taxLite *= (100 - discount) / 100;
        taxPro *= (100 - discount) / 100;
        taxCashDeskPro *= (100 - discount) / 100;

        // jednorazovy poplatok len pre pro licenciu
        var oneTimeFee = $("calc_rooms").value * previoPrice['feeBed'];
        if ($("previoLicencePro").checked) {
            price += oneTimeFee;
        }
        pricePro += oneTimeFee;
    }

    // sleva pro hostel
    if ($("calc_hostel").checked) {
        tax *= 0.5;
        taxConnect *= 0.5;
        taxLite *= 0.5;
        taxPro *= 0.5;
    }

    var closed = $("calc_closed").options[$("calc_closed").selectedIndex].value;

    if (closed != 0) {
        var closedTax = ((12 - closed) / 12);
        taxConnect *= closedTax;
        taxLite *= closedTax;
        taxPro *= closedTax;
        tax *= closedTax;
    }

    if (tax < 100 && !$("previoLicenceConnect").checked) {
        tax = 100;
    }

    if (taxLite < 100) {
        taxLite = 100;
    }

    if (taxPro < 100) {
        taxPro = 100;
    }

    var priceRounded = Math.round(price);

    var taxRounded = Math.round(tax, 2);
    var taxLiteRounded = Math.round(taxLite, 2);
    var taxProRounded = Math.round(taxPro, 2);
    var taxCashDeskProRounded = Math.round(taxCashDeskPro, 2);

    // omezit měsíční poplatek
    taxRounded = Math.min(taxRounded, maxFee);
    taxLiteRounded = Math.min(taxLiteRounded, maxFee);
    taxProRounded = Math.min(taxProRounded, maxFee);
    taxCashDeskProRounded = Math.min(taxCashDeskProRounded, maxFee);

    if ($("calc_cashdesk_pro").checked) {
        serviceTax += taxCashDeskProRounded;
    }

    $("calc_price").innerHTML = priceRounded;
    if ($("previoLicencePro").checked) {
        $("calc_price_bracket_pro").innerHTML = getBracketPro(
            previoPrice['licensePro'], rooms, previoPrice['feeBed'], taxRounded);
        $("calc_price_cashdesk_pro").innerHTML = getBracketLite(
            previoPrice['cashDeskPro'], 0, previoPrice['feeBed'], taxCashDeskProRounded);

        $("calc_price_bracket_lite").innerHTML = getBracketLite(
            previoPrice['licenseLite'], 0, previoPrice['feeBed'],
            taxLiteRounded);
    } else if ($("previoLicenceLite").checked) {
        $("calc_price_bracket_lite").innerHTML = getBracketLite(
            previoPrice['licenseLite'], 0, previoPrice['feeBed'], taxRounded);

        $("calc_price_bracket_pro").innerHTML = getBracketPro(
            previoPrice['licensePro'], rooms, previoPrice['feeBed'], taxProRounded);
        $("calc_price_cashdesk_pro").innerHTML = getBracketLite(
            previoPrice['cashDeskPro'], 0, previoPrice['feeBed'], taxCashDeskProRounded);
    } else if ($("previoLicenceConnect").checked) {
        $("calc_price_bracket_pro").innerHTML = getBracketPro(
            previoPrice['licensePro'], rooms, previoPrice['feeBed'], taxProRounded);
        $("calc_price_cashdesk_pro").innerHTML = getBracketLite(
            previoPrice['cashDeskPro'], 0, previoPrice['feeBed'], taxCashDeskProRounded);

        $("calc_price_bracket_lite").innerHTML = getBracketLite(
            previoPrice['licenseLite'], 0, previoPrice['feeBed'],
            taxLiteRounded);
    }
    setPriceConnect();

    $("calc_tax").innerHTML = taxRounded + serviceTax;
};

function disableAndEnable() {
    var elements = [
    $("calc_reservationIframe"),
    $("calc_occupancyCalendar"),
    $("calc_pricelist"),
    $("calc_web2"),
    $("calc_web3")
    ];
    if ($("previoLicenceConnect").checked) {
        disableAndUncheck(elements);
        unselectWeb();
    } else {
        enable(elements);
    }

    var proElements = [ $("calc_cashdesk_pro") ];
    if ($("previoLicencePro").checked) {
        enable(proElements);
    } else {
        disableAndUncheck(proElements);
    }
};

function disableAndUncheck(elements) {
    elements.each(function(element) {
        element.disable();
        element.checked = false;
    });
};

function unselectWeb() {
    $("calc_web1").checked = true;
}

function enable(elements) {
    elements.each(function(element) {
        element.enable();
    });
};

/**
* nieco ako toString, format zatvorky pri vybere licencie
*
* @param license
* @param rooms
* @param feeBed
* @param taxRounded
* @return String
*/
function getBracketPro(license, rooms, feeBed, taxRounded) {
    return license + (rooms  * feeBed) + ',- jednorázově a ' + taxRounded + ',- /měsíc';
};

function getBracketLite(license, rooms, feeBed, taxRounded) {
    return license + ',- jednorázově a ' + taxRounded + ',- /měsíc';
};

/**
 * pokud je argument ciselneho typu , vrati true
 */
function isNumeric(x) {
    // regular expression that validates a value is numeric
    var regExp = /^(-)?(\d+)(\.?)(\d*)$/; // Note: this WILL allow a number
    // that ends in a decimal: -452.
    // vedecky format /^[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?$/
    re = new RegExp(regExp);
    var result = re.test(x);
    return result;
};

function roundNumber(num, dec) {
    var result = Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
    return result;
};

function setPriceConnect() {
    $("calc_price_bracket_connect").innerHTML = "zdarma";
}

function refreshCaptcha() {
    new Ajax.Request(
            '/captcha/new/',
            { method: "get",
              onSuccess: function(response) {
                  $('captcha_image').src = response.responseJSON.src;
                  $('captcha_id').value = response.responseJSON.id;
              }
            }
        );
}

/**
 * Handles input focus event
 * - we don't have to prevent default behaviour when the tab is pressed
 * - we shouldn't calculate again until onblur when the field was emptied
 *
 * @param event
 * @returns {Boolean}
 */
function handleFocus(event, input) {
    if ( event.keyCode == 9 || input.value == '' ) {
        return false;
    } else {
        calculate();
    }
}
