function checkFormat( field, reg_exp, message, min, max )
{
    regular_exp = new RegExp( reg_exp );
    
    if( ! regular_exp.test( field.value ) )
    {
        alert( message );
        field.value = field.lastValid;
        return false;
    }
    else
    {
        if( ( min && min > parseFloatComma( field.value ) ) || ( max && max < parseFloatComma( field.value ) ) )
        {
            alert( "Zahl muß zwischen " + min + " und " + max + " liegen." )
            field.value = field.lastValid;
            return false;
        }
        
        return true;
    }
}

function reformatDate(field)
{
    var date = Date.getDateOutOfString( field.value );
    field.value = date.makeStringOutOfDate();    
}

function transformNumberToCurrency( field )
{
    field.value = parseCurrency( field.value, "EURO", "european" ).toCurrencyFormatedString( 2, "EURO", "european" );
}

function transformCurrencyToNumber( field )
{
    field.value = parseCurrency( field.value, "EURO", "european" ).formatNumber( 2, ",", null, null, null );
}

function transformPercentageToNumber( field )
{
    field.value = parseFromFormatedNumber( field.value, ",", null, "%", null ).formatNumber( 2, ",", null, null, null );
}

function transformNumberToPercentage( field )
{
    field.value = parseFromFormatedNumber( field.value, ",", null, null, null ).formatNumber(2,",",null,"%",null);
}

function calculate()
{
    var Loan_Amount        = parseCurrency( document.forms[0].Loan_Amount.value, "EURO", "european" );
    var Number_of_Payments = parseFloatComma( document.forms[0].Loan_years.value ) * 12;
    var Interest_Rate      = parseFromFormatedNumber( document.forms[0].Interest_Rate.value, ",", null, "%", null )/(12*100);
    var Monthly_Payment    = annuity( Interest_Rate, Number_of_Payments, Loan_Amount );
    var Total_Cost         = Number_of_Payments * Monthly_Payment;
    var Total_Interest     = Total_Cost - Loan_Amount;
    
    
    if( document.getElementById )
    {
        document.getElementById( "statistic" ).innerHTML = "<table width='100%'><tr><td class='normalFont' align='center'>Kalkulation läuft. Bitte warten ...<div class='progressbarOuter'><div class='progressbarInner' id='progress'></div></div></td></tr></table>";
        window.setTimeout( "drawCalculateValues(" + Number_of_Payments + "," + Monthly_Payment +","+ Loan_Amount+",'"+ document.forms[0].Loan_start.value+"',"+ Interest_Rate+","+ Total_Cost+","+ Total_Interest + ")", 100 );
//        document.getElementById("Number_of_Payments").innerHTML = Number_of_Payments;
//        document.getElementById("Total_Cost").innerHTML = Total_Cost.toCurrencyFormatedString( 2, "EURO", "european" );
//        document.getElementById("Total_Interest").innerHTML = Total_Interest.toCurrencyFormatedString( 2, "EURO", "european" );
//        createStatiticsTable( Number_of_Payments, Monthly_Payment, Loan_Amount, Loan_start, Interest_Rate );
    }
}

function drawCalculateValues( Number_of_Payments, Monthly_Payment, Loan_Amount, Loan_start, Interest_Rate, Total_Cost, Total_Interest )
{
    var Loan_start = Date.getDateOutOfString( document.forms[0].Loan_start.value );
    
    document.getElementById("Monthly_Payment").innerHTML = Monthly_Payment.toCurrencyFormatedString( 2, "EURO", "european" );
    document.getElementById("Number_of_Payments").innerHTML = Number_of_Payments;
    document.getElementById("Total_Cost").innerHTML = Total_Cost.toCurrencyFormatedString( 2, "EURO", "european" );
    document.getElementById("Total_Interest").innerHTML = Total_Interest.toCurrencyFormatedString( 2, "EURO", "european" );
    
    createStatiticsTable( Number_of_Payments, Monthly_Payment, Loan_Amount, Loan_start, Interest_Rate );
}


function drawIt()
{
    calculateLines.tableString +=    "</tbody>";
    calculateLines.tableString +=    "</table>";
    
    document.getElementById( "statistic" ).innerHTML = calculateLines.tableString;
}

function calculateLines( totalcall, actualcall, Monthly_Payment, Loan_Amount, Interest_Rate, Number_of_Payments )
{    
    var payment_date;
    var end_of_month;
    var repayment_rate;
    var classname;
    
        classname = ( actualcall % 2 )?"flipLineB":"flipLineA";
        
        payment_date = new Date( calculateLines.Loan_start );
        payment_date.setMonth( payment_date.getMonth() + (actualcall+1) );

        calculateLines.tableString +="<tr>";
        calculateLines.tableString +="<td class='"+classname+"' align='center'><nobr>"+(actualcall+1)+"</nobr></td>";
        calculateLines.tableString +="<td class='"+classname+"' align='center'><nobr>"+payment_date.makeStringOutOfDate()+"</nobr></td>";
        calculateLines.tableString +="<td class='"+classname+"' align='center'><nobr>"+calculateLines.begin_of_month.toCurrencyFormatedString( 2, "EURO", "european" )+"</nobr></td>";
        calculateLines.tableString +="<td class='"+classname+"' align='center'><nobr>"+Monthly_Payment.toCurrencyFormatedString( 2, "EURO", "european" )+"</nobr></td>";

        end_of_month = restLoan( Loan_Amount, Interest_Rate, actualcall+1, Number_of_Payments );
        calculateLines.begin_of_month = end_of_month;
        repayment_rate = repayment( Monthly_Payment, Loan_Amount, Interest_Rate, actualcall+1 );
        
        calculateLines.tableString +="<td class='"+classname+"' align='center'><nobr>" + repayment_rate.toCurrencyFormatedString( 2, "EURO", "european" ) + "</nobr></td>";
        calculateLines.tableString +="<td class='"+classname+"' align='center'><nobr>" + (Monthly_Payment.toFixed(2)-repayment_rate.toFixed(2)).toCurrencyFormatedString( 2, "EURO", "european" ) + "</nobr></td>";
        calculateLines.tableString +="<td class='"+classname+"' align='center'><nobr>" + end_of_month.toCurrencyFormatedString( 2, "EURO", "european" )+ "</nobr></td>";
        calculateLines.tableString +="</tr>";
    
    if( totalcall > actualcall+1 )
    {
        document.getElementById("progress").style.width = (actualcall+1/totalcall)*(300/totalcall);
        window.setTimeout( "calculateLines( "+totalcall+"," + (++actualcall) +","+ Monthly_Payment+","+ Loan_Amount+","+ Interest_Rate+","+ Number_of_Payments +")",1);
    }
    else
    {
        drawIt();
    }
}
calculateLines.begin_of_month = null;
calculateLines.Loan_start     = null;
calculateLines.tableString    = "";


function createStatiticsTable( Number_of_Payments, Monthly_Payment, Loan_Amount, Loan_start, Interest_Rate )
{
    calculateLines.tableString = "<table border='1' cellspacing='0'>";
    calculateLines.tableString +=    "<tbody>";
    calculateLines.tableString +=    "<tr>";
    calculateLines.tableString +=      "<th class='tableheader'>Nr.</th>";
    calculateLines.tableString +=      "<th class='tableheader'>Zahlungsdatum</th>";
    calculateLines.tableString +=      "<th class='tableheader'>Restschuld zu Monatsbeginn</th>";
    calculateLines.tableString +=      "<th class='tableheader'>Zahlung</th>";
    calculateLines.tableString +=      "<th class='tableheader'>Tilgung</th>";
    calculateLines.tableString +=      "<th class='tableheader'>Zinsen</th>";
    calculateLines.tableString +=      "<th class='tableheader'>Restschuld zu Monatsende</th>";
    calculateLines.tableString +=    "</tr>";
    
    calculateLines.begin_of_month = Loan_Amount;
    calculateLines.Loan_start     = Loan_start;
    
    calculateLines( Number_of_Payments, 0, Monthly_Payment, Loan_Amount, Interest_Rate, Number_of_Payments, "" );
    
//    for( var i = 0; i < Number_of_Payments; i++ )
//    {
//        classname = ( i % 2 )?"statisticB":"statisticA";
//        
//        payment_date = new Date( Loan_start );
//        payment_date.setMonth( payment_date.getMonth() + (i+1) );
//
//        tableString +="<tr>";
//        tableString +="<td class='"+classname+"' align='center'><nobr>"+(i+1)+"</nobr></td>";
//        tableString +="<td class='"+classname+"' align='center'><nobr>"+payment_date.makeStringOutOfDate()+"</nobr></td>";
//        tableString +="<td class='"+classname+"' align='center'><nobr>"+begin_of_month.toCurrencyFormatedString( 2, "EURO", "european" )+"</nobr></td>";
//        tableString +="<td class='"+classname+"' align='center'><nobr>"+Monthly_Payment.toCurrencyFormatedString( 2, "EURO", "european" )+"</nobr></td>";



//        end_of_month = restLoan( Loan_Amount, Interest_Rate, i+1, Number_of_Payments );
//        begin_of_month = end_of_month;
//        repayment_rate = repayment( Monthly_Payment, Loan_Amount, Interest_Rate, i+1 );
        
//        tableString +="<td class='"+classname+"' align='center'><nobr>" + repayment_rate.toCurrencyFormatedString( 2, "EURO", "european" ) + "</nobr></td>";
//        tableString +="<td class='"+classname+"' align='center'><nobr>" + (Monthly_Payment.toFixed(2)-repayment_rate.toFixed(2)).toCurrencyFormatedString( 2, "EURO", "european" ) + "</nobr></td>";
//        tableString +="<td class='"+classname+"' align='center'><nobr>" + end_of_month.toCurrencyFormatedString( 2, "EURO", "european" )+ "</nobr></td>";
//        tableString +="</tr>";
//    }

//    tableString +=    "</tbody>";
//    tableString +=    "</table>";
    
//    document.getElementById( "statistic" ).innerHTML = tableString;
}


function updateProgressbar()
{
    
}
