// Parameter f. Berechnung
var preWeeks = 'Alle';
var sufWeeks = 'Wochen';

// Auswahl „Ich wasche in der Woche“
var spans = new Array(
    'Jede Woche', 'Alle 2 Wochen', 'Alle 3 Wochen', 'Alle 4 Wochen'
);

numberStep 	= 1;
numberMin	= 1;
numberMax	= 7;
numberSuffix= ' x pro Woche';

costsStep 	= 0.5;
costsMin	= 5;
costsMax	= 25;
costsPrefix	= '€ ';

// Jahresflat berechnen
var fixPriceBaseFlat  = 4.9;
var fixPriceFlexiFlat  = 7.9;
var fixPriceSuperFlat = 9.9;

// Maximale Ersparnis pro Jahr ausrechnen
var maxSavingBaseFlatDays  = 3;
var maxSavingFlexiFlatDays  = 4;
var maxSavingSuperFlatDays = 7;

// Maximale Ersparnis pro Jahr anzeigen
var maxDaysBaseFlat = 3.5;
var maxDaysFlexiFlat = 5.5;

var fee			= 10;
var mini		= false;

function costsDec() {
	var val = parseValue('#calc-costs');
	val = Math.round(val/costsStep)*costsStep;
	val -= costsStep;
	val = Math.min(Math.max(costsMin, val), costsMax);
	updateCosts(val);
}
function costsInc() {
	var val = parseValue('#calc-costs');
	val = Math.round(val/costsStep)*costsStep;
	val += costsStep;
	val = Math.min(Math.max(costsMin, val), costsMax);
	updateCosts(val);
}
function costsChanged() {
	var val = parseValue('#calc-costs');
	val = Math.round(val/costsStep)*costsStep;
	val = Math.min(Math.max(costsMin, val), costsMax);
	updateCosts(val);
}
function spanDec() {
    var val = $('#calc-span').val();
    for ( var i = 0; i < spans.length; i++ ) {
        if ( val == spans[i] ) {
            if ( (i-1) >= 0 ) {
                updateSpan(spans[i-1]);
                return;
            }
        }
    }
}
function spanInc() {
	var val = $('#calc-span').val();
    for ( var i = 0; i < spans.length; i++ ) {
        if ( val == spans[i] ) {
            if ( spans.length > (i+1) ) {
                updateSpan(spans[i+1]);
                return;
            }
        }
    }
}
function spanChanged() {
	var val = parseValue('#calc-span');
    if ( val > 0 ) {
        for ( var i = 0; i < spans.length; i++ ) {
            if ( val == parseNumber(spans[i]) ) {
                updateSpan(spans[i]);
                return;
            }
        }
    }
    updateSpan(spans[0]);
}
function numberDec() {
	var val = parseValue('#calc-number');
	val = Math.round(val/numberStep)*numberStep;
	val -= numberStep;
	val = Math.min(Math.max(numberMin, val), numberMax);
	updateNumber(val);
}
function numberInc() {
	var val = parseValue('#calc-number');
	val = Math.round(val/numberStep)*numberStep;
	val += numberStep;
	val = Math.min(Math.max(numberMin, val), numberMax);
	updateNumber(val);
}
function numberChanged() {
	var val = parseValue('#calc-number');
	val = Math.round(val/numberStep)*numberStep;
	val = Math.min(Math.max(numberMin, val), numberMax);
	updateNumber(val);
}
/**
 * @param id
 * @return double
 */
function parseValue(id) {
	var v = $(id).val()+"";	

    return parseNumber(v);
}
function parseNumber(v) {
    v = v.replace(/[^0-9,\.]+/g, "");
	if(v == "") {
		v = "0,00";
    }

    var result = v.match(/^([0-9]*)(,([0-9]*))?$/);
	var d  = parseInt(result && result[1].length > 0 ? result[1] : 0);
	var f0 = parseInt(result && result[3] && result[3].length > 0 ? result[3].substr(0, 1) : 0);
	var f1 = parseInt(result && result[3] && result[3].length > 1 ? result[3].substr(1, 1) : 0);

	return d+f0/10+f1/100;
}
/**
 * @param double val
 * @param int dp
 * @return string
 */
function numberFormat(val, dp) {
	var neg = false;
	if(val < 0) {
		val *= -1;
		neg = true;
	}
	var s = Math.floor(val)+"";
	if(dp > 0) {
		s += ",";
		val += "";
		var m = val.match(/(\.([0-9]+))$/);
		var r = m ? m[2] : "";
		if(r.length > dp) r = r.substr(0, dp);
		while(r.length < dp) r += "0";
		s += r;
	}
	if(neg)
		s = '-'+s;
	return s;
}
function updateNumber(val) {
	$('#calc-number').attr('value', numberFormat(val, 1)+numberSuffix);
	updateSavings();
}
function updateSpan(val) {
	$('#calc-span').attr('value', val);
	updateSavings();
}
function updateCosts(val) {
	$('#calc-costs').attr('value', costsPrefix+numberFormat(val, 2));
	updateSavings();
}
function round2(val) {
    var result = Math.round(val * 100) / 100;
    
    return result;
}

function updateSavings() {
    var number = parseNumber($('#calc-number').val()+"");
    var span   = parseNumber($('#calc-span').val()+"");
    var costs  = parseNumber($('#calc-costs').val()+"");

    if ( span == 0 ) {
        span = 1;
    }

    // Calcs Costs
    var costsYear = round2(number * costs * 52 / span);

    var numberQuantified = number / span;

    // Flat Costs
    var flatPriceYearBaseFlat  = round2(fixPriceBaseFlat * 52 + fee);
    var flatPriceYearFlexiFlat = round2(fixPriceFlexiFlat * 52 + fee);
    var flatPriceYearSuperFlat = round2(fixPriceSuperFlat * 52 + fee);

    // Savings
    var savingYearBaseFlat  = round2(costsYear - flatPriceYearBaseFlat);
    var savingYearFlexiFlat = round2(costsYear - flatPriceYearFlexiFlat);
    var savingYearSuperFlat = round2(costsYear - flatPriceYearSuperFlat);

    // Max Savings
    var savingYearBaseFlatMax  = round2(maxSavingBaseFlatDays  * costs * 52 / span - flatPriceYearBaseFlat );
    var savingYearFlexiFlatMax = round2(maxSavingFlexiFlatDays  * costs * 52 / span - flatPriceYearFlexiFlat );
    var savingYearSuperFlatMax = round2(maxSavingSuperFlatDays * costs * 52 / span - flatPriceYearSuperFlat );

    // Update HTML
    $('#costs-baseflat').html('&euro; ' + numberFormat(costsYear, 2));
    $('#costs-flexiflat').html('&euro; ' + numberFormat(costsYear, 2));
    $('#costs-superflat').html('&euro; ' + numberFormat(costsYear, 2));

    $('#input-number').val(number);
    $('#input-span').val(span);
    $('#input-costs').val(costs);
    $('#costs-year').val(costsYear);
    $('#sav-year-baseflat').val(savingYearBaseFlat);
    $('#sav-year-flexiflat').val(savingYearFlexiFlat);
    $('#sav-year-superflat').val(savingYearSuperFlat);

	if ( !mini ) {
	    // Base Flat
        if ( numberQuantified > maxDaysBaseFlat || savingYearBaseFlat <= 0 ) {
            $('#rate-baseflat').hide();
            $('#show-baseflat').val('0');
        }
        else {
            $('#rate-baseflat').show();
            $('#show-baseflat').val('1');
        }


        $('#savings-baseflat').html('&euro; ' + numberFormat(savingYearBaseFlat, 2));
        $('#max-savings-baseflat').html('&euro; ' + numberFormat(savingYearBaseFlatMax, 2));

        // Flexi Flat
        if ( numberQuantified > maxDaysFlexiFlat || savingYearFlexiFlat <= 0 ) {
            $('#rate-flexiflat').hide();
            $('#show-flexiflat').val('0');
        }
        else {
            $('#rate-flexiflat').show();
            $('#show-flexiflat').val('1');
        }


        $('#savings-flexiflat').html('&euro; ' + numberFormat(savingYearFlexiFlat, 2));
        $('#max-savings-flexiflat').html('&euro; ' + numberFormat(savingYearFlexiFlatMax, 2));

        // Super Flat
        if ( savingYearSuperFlat <= 0 ) {
            $('#rate-superflat').hide();
        }
        else {
            $('#rate-superflat').show();
        }


        $('#savings-superflat').html('&euro; ' + numberFormat(savingYearSuperFlat, 2));
        $('#max-savings-superflat').html('&euro; ' + numberFormat(savingYearSuperFlatMax, 2));
	}
    else {
        var maxSaving = savingYearFlexiFlat;
        if ( savingYearBaseFlat > savingYearFlexiFlat ) {
            maxSaving = savingYearBaseFlat;
        }
        if ( savingYearSuperFlat > maxSaving ) {
            maxSaving = savingYearSuperFlat;
        }

		$('#calc-yearly-costs').html('&euro; ' + numberFormat(maxSaving ,2));
	}
}
