// "constants"
var IKA_PERCENTAGE          = 0.16;
var NUM_MONTHS              = 14;
var TAX_DISCOUNT_PERCENTAGE = 0.015;

// "state" global variables
var useNet    = false;
var firstTime = true;    // ugly!!

$(document).ready(function() {    
    $("#annual_gross").change(calc).focus();
    $("#monthly_gross").change(calcMonthly);
    $("#annual_net").change(invCalc);
    $("#monthly_net").change(invCalcMonthly);
    
    $("#year").change(recalc);
    $("input[name='is_old']").change(recalc);
    $("input[name='is_5year']").change(recalc);
    $("input[name='custom_percentage']").change(recalc);
    $("select[name='children_num']").change(recalc);
    
    $(".gross").click(activate).keypress(activate);
    $(".net").click(activate).keypress(activate);
    $("#insurance").change(toggleInsurance);
    $("#resetButton").click(resetPage);
        
    resetPage();
            
    //If the User resizes the window, recalculate & redraw graph
    $(window).bind("resize", recalc);
    
    if (location.href.indexOf("beta") != -1) {
        $("#betaMsg").text("BETA");
        $("title").append(" - BETA");
    }
});

function resetPage() {
    firstTime = true;
    $("#errorMsg a").remove();
    $("#insurance").val("IKA");
    $("input").val("");
    $("#graph_box").slideUp("slow");
    $("#insurance").change();
    $("#year").val(2010);
}

function activate() {
    $("#errorMsg a").remove();
    
    if (useNet != $(this).hasClass("net")) {
        useNet = !useNet;
        $(".gross, .net").toggleClass("active").toggleClass("inactive");
    }
}

function modifyYearList(yearsArray) {
    var selection = $("#year").val();
    
    $("#year").empty();
    
    for (var i = 0; i != yearsArray.length; i++) {
        $("#year").append("<option>" + yearsArray[i] + "</option>");
    }
    
    $("#year").val(selection);
}

function toggleInsurance() {
    $("#insurance_tip span").remove();
    $("#custom_input").hide();
    $("#old_flag").show();
    $("#five_year_flag").hide();
    
    switch($(this).val()) {
        case "IKA":
            modifyYearList([2010, 2009, 2008, 2007, 2006]);
            $("#insurance_tip").append("<span>16% του μικτού μισθού (κατηγορία ΜΙΚΤΑ-ΕΤΕΑΜ)</span>");
            break;
        case"TSMEDE":
            modifyYearList([2010, 2009]);
            $("#insurance_tip").append("<span>Κάτι για το ΤΣΜΕΔΕ</span>");
            $("#five_year_flag").show();
            break;
        case "custom":
            modifyYearList([2010, 2009, 2008, 2007, 2006]);
            $("#insurance_tip").append("<span>Καθορίστε το προσωπικό σας ποσοστό εισφορών</span>");
            $("#custom_input").show();
            $("#old_flag").hide();
            break;
    }
    
    recalc();
}

// Returns the float written in the text input,
// or NaN if error or number outside [min, max].
// min, max are optional.
function readNumber(input, min, max) { 
    var number = parseFloat(input);
    
    if (isNaN(number) || (undefined != min && number < min)
            || (undefined != max && number > max)) {
        return NaN;
    }
    
    return number;
}

// Returns the value of the custom insurance percentage input.
// Adjusts to IKA_PERCENTAGE if error encountered.
function readCustomInsurancePercentage() {
    var percentage = readNumber(document.forms['frm'].custom_percentage.value, 0, 99.9);
	
	if (isNaN(percentage)) {
	    percentage = IKA_PERCENTAGE * 100;    
	    document.forms['frm'].custom_percentage.value = percentage;
	}
	
	return percentage;
}

function calcMonthly() {
	var amount = readNumber(document.forms['frm'].monthly_gross.value, 0);
	
	if (isNaN(amount)) {
	    document.forms['frm'].monthly_gross.value = 0;
        calc();
        return;
	}
	
	document.forms['frm'].annual_gross.value = Math.round(amount * NUM_MONTHS);
		
	calc();
}

function calc() {
    firstTime = false;

    var mainForm = document.forms['frm'];
	var grossAnnual = readNumber(mainForm.annual_gross.value, 0);
	
	if (isNaN(grossAnnual)) {
		mainForm.annual_gross.value = 0;
		calcMonthly();
		return;
	}
	
	var grossMonthly = grossAnnual / NUM_MONTHS;
					
	var year = parseInt($("#year").val());
	var insuranceAnnual, insuranceMonthly;
	
	if (year == 2010) {
	    $("#2010_warning").show();
	} else {
	    $("#2010_warning").hide();
	}
	
	if ($("#insurance").val() == "IKA") {
	    insuranceAnnual  = calcIKA(grossAnnual, year, mainForm.is_old.checked, IKA_PERCENTAGE);
	    insuranceMonthly = insuranceAnnual / NUM_MONTHS;
	} else if ($("#insurance").val() == "TSMEDE") {	        
	    insuranceMonthly = calcMonthlyTSMEDE(grossMonthly, year, 
	            mainForm.is_old.checked, mainForm.is_5year.checked);
	    insuranceAnnual = insuranceMonthly * NUM_MONTHS - 
	            adjustAnnualTSMEDE(mainForm.is_old.checked);
	} else {    // custom
	    insuranceAnnual  = readCustomInsurancePercentage() / 100 * grossAnnual;
	    insuranceMonthly = insuranceAnnual / NUM_MONTHS;
	}
	
	var taxableAnnual  = grossAnnual - insuranceAnnual;
	var taxableMonthly = grossMonthly - insuranceMonthly;
	
	if (taxableMonthly < 0 || taxableAnnual < 0) {
	    $("#errorMsg").append(
	        "<a class=err>!<span>Δοκιμάστε με μεγαλύτερο ποσό</span></a>");
        mainForm.annual_gross.value = 0;
        grossAnnual = grossMonthly = taxableAnnual = taxableMonthly =
                insuranceAnnual = insuranceMonthly = 0;
	}
	
	var taxAnnual= calcTax(taxableAnnual, year, mainForm.children_num.selectedIndex);
	var taxDiscount = TAX_DISCOUNT_PERCENTAGE * taxAnnual;
	
	var netAnnual  = taxableAnnual  - (taxAnnual - taxDiscount);
	var netMonthly = taxableMonthly - (taxAnnual - taxDiscount) / NUM_MONTHS;
	
    mainForm.annual_insurance.value  = Math.round(insuranceAnnual);
    mainForm.annual_taxable.value    = Math.round(taxableAnnual);
    mainForm.annual_tax.value        = Math.round(taxAnnual);
    mainForm.annual_discount.value   = Math.round(taxDiscount);
    mainForm.annual_net.value        = Math.round(netAnnual);
	mainForm.monthly_gross.value     = Math.round(grossMonthly);
	mainForm.monthly_insurance.value = Math.round(insuranceMonthly);
	mainForm.monthly_taxable.value   = Math.round(taxableMonthly);
	mainForm.monthly_tax.value       = Math.round(taxAnnual / NUM_MONTHS);
	mainForm.monthly_discount.value  = Math.round(taxDiscount / NUM_MONTHS);
	mainForm.monthly_net.value       = Math.round(netMonthly);
	
	
	if (grossAnnual > 0) {
	    $("#graph_box").slideDown("slow");
    	
    	drawGraph(grossAnnual, Math.round(insuranceAnnual), Math.round(taxAnnual), Math.round(taxDiscount), 
    	        Math.round(netAnnual));
    } else {
        $("#graph_box").slideUp("slow");
    }
}

function invCalcMonthly() {
    var amount = readNumber(document.forms['frm'].monthly_net.value, 0);
	
	if (isNaN(amount)) {
	    document.forms['frm'].monthly_net.value = 0;
        invCalc();
        return;
	}
	
	var annualAmount = amount * NUM_MONTHS;
	
	if ($("#insurance").val() == "TSMEDE") {
	    annualAmount += adjustAnnualTSMEDE(document.forms['frm'].is_old.checked);
	}
	
	document.forms['frm'].annual_net.value = Math.round(annualAmount);
	
		
	invCalc();
}

function invCalc() {
    var mainForm = document.forms['frm'];
    
    var annualNet = readNumber(mainForm.annual_net.value, 0);
	
	if (isNaN(annualNet)) {
		mainForm.annual_net.value = 0;
		invCalcMonthly();
		return;
	}
	
	var year = parseInt($("#year").val());
	
	if (year == 2010) {
	    $("#2010_warning").show();
	} else {
	    $("#2010_warning").hide();
	}
	
	var annualTaxable = invCalcTaxable(annualNet, year, mainForm.children_num.selectedIndex);
	
	if ($("#insurance").val() == "IKA") { 
		mainForm.annual_gross.value = Math.round(annualTaxable +
		        invCalcIKA(annualTaxable, year, mainForm.is_old.checked, IKA_PERCENTAGE));
		calc();
	} else if ($("#insurance").val() == "TSMEDE") {
	    var monthlyTaxable = (annualTaxable - adjustAnnualTSMEDE(mainForm.is_old.checked)) / NUM_MONTHS;
	    mainForm.monthly_gross.value = Math.round(monthlyTaxable +
	            invCalcMonthlyTSMEDE(monthlyTaxable, year, mainForm.is_old.checked, mainForm.is_5year.checked));
	    calcMonthly();
	} else {
	    var insurancePercentage = readCustomInsurancePercentage() / 100;
	    mainForm.annual_gross.value = Math.round(grossSalary / (1 - insurancePercentage));
	    calc();
	}	
}

function recalc() {
    if (firstTime) return;
    
    $("#errorMsg a").remove();
    
    return useNet ? invCalc() : calc();
}

function drawGraph(grossSalary, insuranceCost, tax, taxDiscount, netSalary) {
    var defaultGraphWidth = 800;
    
    var primaryColor   = '#6c0aab';
    var secondaryColor = '#9b3fd5';
    var bgColor        = '#ffe0ff';
    
    var graphWidth = $("#graph_box").width() - 30;

    var g = new Bluff.StackedBar('tax_graph', graphWidth + "x400");
    
    g.title = 'Υπολογισμός καθαρού μισθού';
    g.tooltips = true;
    g.hide_legend = true;
    g.sort = false;
    
    g.set_theme({
        colors: [primaryColor, bgColor, secondaryColor, secondaryColor, primaryColor],
        marker_color: bgColor,
        font_color: '#000000',
        background_colors: [bgColor, bgColor]
    });
    
    var seriesName, label;
    
    if ($("#insurance").val() == "IKA") {
        seriesName = "Εισφορές ΙΚΑ";
        label = "ΙΚΑ";
    } else if ($("#insurance").val() == "TSMEDE") {
        seriesName = "Εισφορές ΤΣΜΕΔΕ";
        label = "ΤΣΜΕΔΕ";
    } else {
        seriesName = "Ασφαλιστικές εισφορές";
        label = "Εισφορές";
    }
    
    g.set_font('helvetica');
    g.title_font_size  = Math.round(20 * defaultGraphWidth/ graphWidth);
    g.marker_font_size = Math.round(16 * defaultGraphWidth/ graphWidth); 
    
    var t_yp1 = grossSalary - insuranceCost;
    var t_yp2 = grossSalary - insuranceCost - tax + taxDiscount;
    var t_ik1 = insuranceCost;
    
    g.data("Μικτός μισθός", [grossSalary, 0, 0, 0]);
    g.data("Υπόλοιπο", [0, grossSalary - insuranceCost,
            grossSalary - insuranceCost - tax + taxDiscount, 0]);
    g.data(seriesName, [0, insuranceCost, 0, 0]);
    g.data("Φόρος εισοδήματος", [0, 0, tax - taxDiscount, 0]);
    g.data("Καθαρός μισθός", [0, 0, 0, netSalary]);
                
    g.labels = {0: 'Μικτά', 1: label, 2: 'Φόρος', 3: 'Καθαρά'};
    
    // Calculate a meaningful maximum value & increment for the y-axis
    if (grossSalary > 0) {
        var order = Math.floor(Math.log(grossSalary) / Math.log(10)) - 1;
        var yIncrement;
        var ySeeds = [1, 2, 5];
        var ticks = 100;
        
        do {
            for (var i = 0; i != ySeeds.length && ticks > 10; i++) {
                yIncrement = ySeeds[i] * Math.pow(10, order);
                ticks = Math.ceil(grossSalary / yIncrement);
            }
            order++;
        } while (ticks > 10)
                     
        g.maximum_value = ticks * yIncrement;
        g.y_axis_increment = yIncrement;
    }
    
    g.draw();
}