// BW-Bank Creditplus Script IB 1.3 - copyright brandperfection GmbH - 05.11.2007 
// Anpassung der zu verschickenden Parameter fuer das Retail-Portal LZ und KP


var bwbank = (window.bwbank ? window.bwbank : {});

/**
 * Creditplus Kreditrechner
 * ========================
 * Ueber die Funktion "doCalculation()" wird eine Schleifenberechnung
 * gestartet, die ueber die Namensraum-Variablen "laufzeiten" und
 * "effJahresZinsen" iteriert.
 *
 * Der Betrag fuer die Berechnungsgrundlage wird aus dem Eingabefeld mit der
 * in "amountInputFieldId" festgelegten ID genommen.
 *
 * Die Ausgabe wird direkt generiert. Unterhalb des Elements "rootOutputObj"
 * (Namenraumvariable) werden TRs mit der Funktion "_updateTable" 
 * aktualisiert.
 **/


bwbank.creditplus = function() {
    
    // ----------------
    // Klassenvariablen
    // ----------------
    
    // Minimal- und Maximalwerte fuer das zu berechnende Kreditvolumen
    this.kreditVolumenMin = 1000;
    this.kreditVolumenMax = 50000;
    
    // ID des Eingabefelds fuer den Betrag auf der Webseite
    this.amountInputFieldId = 'Betrag';
    // ID des Objekts, unter das das Ergebnis im DOM angehaengt werden soll
    this.rootOutputObj =      'AusgabeObj';

    // Fuer Iteration relevante Werte:
    // -------------------------------

    // Laufzeiten in Monaten, die bei der Kalkulationserstellung beachtet werden
    // sollen. Es koennen fuer mehrere Betraege unterschiedliche Laufzeiten
    // angegeben werden.
    // Format:
    // {bisZuBetrag 1}: [Laufzeit 1, Laufzeit 2, Laufzeit 3, ...]
    // {bisZuBetrag 2}: ...
    // ...
    this.laufzeiten = {
        2500:   [12, 18, 24, 36, 48],
        50000:  [12, 18, 24, 36, 48, 60, 72, 84]
    };
    // Effektive Jahreszinssaetze fuer die Kalkulation. Fuer mehrere Betraege
    // koennen unterschiedliche Zinssaetze definiert werden, s.o.
    this.effJahresZinsen = {
            2500: [5.99, 7.49, 7.49, 4.49, 6.79],
            50000: [5.99, 7.49, 7.49, 4.49, 6.79, 6.79, 6.69, 6.69]
    };
	
	//this.nomJahresZinsen = {
	//		2000: ['1,59', '1,59', '1,59', '1,59', '1,59', '1,59'],
    //        7999: ['4,59', '4,59', '4,59', '4,59', '4,59', '4,59', '4,79'],
    //        40000: ['4,59', '4,59', '4,59', '4,59', '4,59', '4,59', '4,79', '4,79']
    //};
	
    // Sonstige interne Variablen
    this.copsIdpat       = '';
    this.maxNumberOfRows = 0;
    this.result          = {
        betrag:             0,
        rates:              [],
        laufzeiten:         [],
        effJahresZinsen:    []
    };
    this.laufzeit = 7999;
    
    function runCalculation(idpat) {
		//Fehlermeldungen zuruecksetzen
		//fehlermeldungen_ausblenden();
	
        var tbody_obj, betrag_obj;
        this.copsIdpat = idpat;
        
        betrag_obj = document.getElementById(this.amountInputFieldId);
        tbody_obj  = document.getElementById(this.rootOutputObj);
        
        //this._doCalculation(betrag_obj.value);   
        this._doCalculation(umformatieren(betrag_obj.value,false)); 
		this._updateTable(tbody_obj);
        
        return false;
    }
    
    /**
     * Erstellt eine Uebersicht ueber Ratenhoehe, etc. fuer alle angeg. Laufzeiten
     *
     * @access public
     * @see this._checkAmountValidity()
     * @see this._calculateOneRate()
     * @return {boolean} false
     */
    function _doCalculation(betrag) {
        var rate;
        var values = {rates: [], laufzeiten: [], effJahresZinsen: []};
        var i;
        
        this._resetResult();
        this._setMaxNumberOfRows();
        
        // Betrag uebernehmen, wenn Kriterien erfuellt sind
        betrag = parseFloat(betrag);
        var checkAmountState = this._checkAmountValidity(betrag);
        
        if (checkAmountState === -1) {
            this._setAmountInField("10.000,00");
        }
        
        if (this._evaluateAmountCheck(checkAmountState) === false) {
            this._alertAmountCheck(checkAmountState);
            this._adjustCheckedAmountInField(checkAmountState);
            this.runCalculation(this.copsIdpat);
            return false;
        }

        this.result.betrag = betrag;

        // Laufzeiten festlegen (abhaengig von Betrag)
        for (i in this.laufzeiten) {
            if (this.result.betrag <= parseInt(i, 10)) {
                this.laufzeit = parseInt(i, 10);
                break;
            }
        }

        // Werte fuer neuen Kreditbetrag berechnen und in Tabelle eintragen
        for (i in this.laufzeiten[this.laufzeit]) {
            rate = this._calculateOneRate(
                        this.effJahresZinsen[this.laufzeit][i],
                        this.laufzeiten[this.laufzeit][i],
                        betrag);
            
            this.result.laufzeiten[i]       = this.laufzeiten[this.laufzeit][i];
            this.result.effJahresZinsen[i]  = this._formatNumberOutput(this.effJahresZinsen[this.laufzeit][i]);
            this.result.rates[i]            = this._formatNumberOutput(rate);
        }
    }
    
    /**
     * Prueft, ob der Betrag gueltig ist.
     *
     * @return {boolean}
     */
    function sendFromSidebox() {
        var betrag_obj       = document.getElementById(this.amountInputFieldId);
        var checkAmountState = this._checkAmountValidity(umformatieren(betrag_obj.value,false));
        this._alertAmountCheck(checkAmountState);
        this._adjustCheckedAmountInField(checkAmountState);
        
        if (this._evaluateAmountCheck(checkAmountState)) {
            var obj_form = document.getElementById('Creditplusrechner');
            obj_form.submit();
        }
        return false;
    }
    
    /**
     * Uebtraegt die Ergebniswerte in das unsichtbare Formular und schickt es ab.
     *
     * @param {integer} zeile: Nr. der Zeile, auf die User geklickt hat. Dieser
     *                         Wert wird als Index fuer das Ergebnisset verwendet.
     * @return {boolean} false
     */
    function sendForm(row) {
        if (row < 0 || row > 7) {
            row = 0;
        }
        var laufzeit     = this.result.laufzeiten[row];
        var effJZ        = this.result.effJahresZinsen[row];
        var rate         = this.result.rates[row];
		//alert(row+" | "+laufzeit+" | "+effJZ+" | "+rate);
		
		/*
		//Internetbanking:
        document.getElementById('Kr_laufzeit').value     = laufzeit;
        document.getElementById('Kr_effjz').value        = effJZ;
        document.getElementById('Kr_rate').value         = rate;
        document.getElementById('Kr_betrag').value       = this.result.betrag;
		*/
		
		//Retail-Portal
		document.getElementById('LZ').value     = laufzeit;
		document.getElementById('KP').value     = this.result.betrag;
				
		
        document.getElementById('Kreditform').submit();
        return false;
    }
    
    /**
     * Reduziert den uebergebenen Status auf true oder false
     *
     * @param {integer} state
     */
    function _evaluateAmountCheck(state) {
        if (state === -1) {
            return false;
        }
        if (state === -2) {
            return false;
        }
        if (state === -3) {
            return false;
        }
        return true;
    }
    
    /**
     * Gibt dem Status entsprechende Fehlermeldung aus.
     *
     * @param {integer} state
     */
    function _alertAmountCheck(state) {
        if (state === -1) {
			//alert('Bitte geben Sie eine Zahl ein.');
			if(document.getElementById){document.getElementById("errorMessage1").style.display= 'block';}
			else if(document.all){		document.all.errorMessage1.style.display= 'block';}
        }
        if (state === -2) {
            //alert('Das Mindestkreditvolumen betr&auml;gt ' + this._formatNumberOutput(this.kreditVolumenMin) + ' EUR');
			if(document.getElementById){document.getElementById("errorMessage2").style.display= 'block';}
			else if(document.all){		document.all.errorMessage2.style.display= 'block';}
        }
        if (state === -3) {
            //alert('Das maximale Kreditvolumen betr&auml;gt ' + this._formatNumberOutput(this.kreditVolumenMax) + ' EUR');
			if(document.getElementById){document.getElementById("errorMessage3").style.display= 'block';}
			else if(document.all){		document.all.errorMessage3.style.display= 'block';}
        }
    }
    
    /**
     * Setzt den Betrag im Eingabefeld entsprechend dem uebergebenen Status
     *
     * @param {integer} state
     */
    function _adjustCheckedAmountInField(state) {
        if (state === -2) {
            this._setAmountInField(this.kreditVolumenMin+",00");
        }
        if (state === -3) {
            this._setAmountInField("50.000,00"); //this.kreditVolumenMax
        }
    }
    
    /**
     * Sucht die hoechste Anzahl an Laufzeiten und damit die Anzahl der
     * zu aktualisierenden Zeilen heraus.
     *
     * Setzt die Namensraumvariable "maxNumberOfRows"
     */
    function _setMaxNumberOfRows() {
        var maxNumberOfRows = 0;
        var i;
        for (i in this.laufzeiten) {
            if (this.laufzeiten[i].length > maxNumberOfRows) {
                this.maxNumberOfRows = this.laufzeiten[i].length;
            }
        }
    }
    
    /**
     * Setzt den Speicher fuer die Berechnungsergebnisse auf Null zurueck.
     */
    function _resetResult() {
        this.result = {
            betrag:             0,
            rates:              [],
            laufzeiten:         [],
            effJahresZinsen:    []
        };
    }
   
    /**
     * Berechnet die Rueckzahlungsrate fuer einen Monat auf zwei Stellen
     * kaufmaennisch gerundet
     *
     * @access private
     * @see this._getMZF()
     * @see this._getMonthlyRate();
     * @return {float}
     */
    function _calculateOneRate(effJahresZins, laufzeit, betrag) {
        var mZF, rate;

        mZF     = this._getMZF(effJahresZins);
        rate    = this._getMonthlyRate(mZF, laufzeit, betrag);
        rate    = Math.round(rate * 100) / 100;

        return rate;
    }
    
    /**
     * Berechnet den monatlichen Aufzinsungsfaktor
     *
     * @access private
     * @param {integer|float} effJahresZins
     * @return {float}
     */
    function _getMZF(effJahresZins) {
        var factor = effJahresZins / 100 + 1;
        var mZF    = Math.pow(factor, (1/12));

        return mZF;
    }
    
    /**
     * Berechnet eine monatliche Rate anhand des mittleren Zinsfaktors
     *
     * @access private
     * @param {float} mZF
     * @param {integer} laufzeit
     * @return {float}
     */
    function _getMonthlyRate(mZF, laufzeit, betrag) {
        var part1   = Math.pow(mZF, laufzeit) / (Math.pow(mZF, laufzeit) - 1);
        var rate    = betrag * part1 * (mZF - 1);

        return rate;
    }
    
    /**
     * Prueft, ob ein Betrag als Berechnungsgrundlage in Frage kommt.
     *
     * Kriterien:
     * - Betrag muss eine Zahl sein; Fehlercode -1
     * - Betrag muss mindestens 2500,00 Eur betragen; Fehlercode -2
     * - Betrag darf hoechstens 40.000 Eur sein; Fehlercode -3
     *
     * @access private
     * @see this._setAmountInField()
     * @see this._doCalculation()
     * @param {integer|float} amount
     * @return {integer}: bei Erfolg 1
     */
    function _checkAmountValidity(amount) {
        // Komma mit Punkt ersetzen wegen deutschem Eingabeformat
        if (typeof amount === 'string') {
            amount = amount.replace(/,/, ".");
        }

        // Ist Betrag eine Zahl?
        if (isNaN(amount)) {
            return -1;
        }

        // ist Betrag >= Mindestkreditvolumen?
        if (amount < this.kreditVolumenMin) {
            return -2;
        }

        // ist Betrag <= Maximalkreditvolumen?
        if (amount > this.kreditVolumenMax) {
            return -3;
        }
        return 1;
    }
    
    /**
     * Setzt den gewuenschten Betrag ins Eingabefeld
     *
     * @access private
     * @param {integer} amount
     * @return {boolean}
     */
    function _setAmountInField(amount) {
        var amount_obj          = document.getElementById(this.amountInputFieldId);
            amount_obj.value    = amount;
    }
    
    /**
     * Formatiert eine Javascript-Zahl
     *
     * Zwei Nachkommastellen und Komma statt Punkt
     *
     * @access private
     * @param {integer|float} amount
     * @return {string}
     */
    function _formatNumberOutput(amount) {
        var k = (Math.round(amount * 100) / 100).toString();
        k += (k.indexOf('.') === -1)? '.00' : '00';
        return k.substring(0, k.indexOf('.') + 3).replace(/\./, ',');
    }

    /**
     * Aktualisiert die Tabelle mit den Ergebnissen
     *
     * @access private
     * @param {object} root_obj: HTML Object
     * @param {object} values
     */
    function _updateTable(root_obj) {
        for (var i = 0; i < this.maxNumberOfRows; i++) {
            var obj_lz = document.getElementById('LZ' + (i + 1));
            var obj_jz = document.getElementById('JZ' + (i + 1));
            var obj_ra = document.getElementById('RA' + (i + 1));
            var obj_bu = document.getElementById('BU' + (i + 1));
			//var obj_nom = document.getElementById('NOM' + (i + 1));

			if (this.result.rates[i]) {
                obj_lz.innerHTML = this.result.laufzeiten[i];
                obj_jz.innerHTML = this.result.effJahresZinsen[i] + "%";
                obj_ra.innerHTML = this.result.rates[i] + ' EUR';
				obj_bu.innerHTML = '<input type="radio" name="Laufzeit" value="'+ this.result.laufzeiten[i] +'" tabindex="'+ (i+5) +'" />';
				//obj_nom.innerHTML = this.nomJahresZinsen[this.laufzeit][i] + "%";
				//obj_bu.innerHTML = '<span class="majorlink"><a href="/formular/'+(this.copsIdpat)+'" onclick="return creditplus.sendForm('+(i)+')">Ausw&auml;hlen</a></span>';
				if(!document.all && document.getElementById("zeile"+(i + 1))){ document.getElementById("zeile"+(i + 1)).style.display='table-row';}
				else if(document.all){ document.all["zeile"+(i + 1)].style.display= 'block'}
			} else {
                obj_lz.innerHTML = "";
                obj_jz.innerHTML = "";
                obj_ra.innerHTML = "";
                obj_bu.innerHTML = "";
				//obj_nom.innerHTML = "";
				
				if(document.getElementById("zeile"+(i + 1))){ document.getElementById("zeile"+(i + 1)).style.display= 'none';}
            }
        }
    }
    
    // ---------------------
    // Oeffentliche Methoden
    // ---------------------
    this.runCalculation     = runCalculation;
    this.sendFromSidebox    = sendFromSidebox;
    this.sendForm           = sendForm;
    
    // ---------------------
    // Private Methoden
    // ---------------------
    this._doCalculation                 = _doCalculation;
    this._setMaxNumberOfRows            = _setMaxNumberOfRows;
    this._resetResult                   = _resetResult;
    this._calculateOneRate              = _calculateOneRate;
    this._getMZF                        = _getMZF;
    this._getMonthlyRate                = _getMonthlyRate;
    this._checkAmountValidity           = _checkAmountValidity;
    this._evaluateAmountCheck           = _evaluateAmountCheck;
    this._alertAmountCheck              = _alertAmountCheck;
    this._adjustCheckedAmountInField    = _adjustCheckedAmountInField;
    this._setAmountInField              = _setAmountInField;
    this._formatNumberOutput            = _formatNumberOutput;
    this._updateTable                   = _updateTable;
};

var creditplus = new bwbank.creditplus();





/*
function checkDatenWeiterleitung(){
	creditplus.runCalculation('');

	document.Weiterleitung.Betrag.value    = document.Creditplusrechner.Betrag.value;

	for(i=0;i<document.Creditplusrechner.Laufzeit.length;i++){
		if(document.Creditplusrechner.Laufzeit[i].checked==true){
			document.Weiterleitung.Laufzeit.value = document.Creditplusrechner.Laufzeit[i].value;
		}
	}
	
	if(document.Weiterleitung.Laufzeit.value==""){
		alert('Bitte w&auml;hlen Sie eine Laufzeit aus.');
		return false;
	}else if(document.Weiterleitung.Betrag.value==""){
		alert('Bitte geben Sie einen Betrag an.');
		return false;
	}else{
		return true;
	}
}
*/

function getlaufzeit(){
	fehlermeldungen_ausblenden();
	
	var laufzeit=false;
	for(i=0;i<document.Creditplusrechner.Laufzeit.length;i++){
		if(document.Creditplusrechner.Laufzeit[i].checked==true){
			laufzeit = i+1;
		}
	}

	if(laufzeit==false){
		//alert('Bitte w&auml;hlen Sie eine Laufzeit aus.');
		if(document.getElementById){ document.getElementById("errorMessage4").style.display= 'block';}
		else if(document.all){		document.all.errorMessage4.style.display= 'block';}
	}
	else if(document.form_einverstaendnis.einverstaendnis.checked!=true){
		//alert('Bitte stimmen Sie der &Uuml;bertragung zu.');
		if(document.getElementById){ document.getElementById("errorMessage5").style.display= 'block';}
		else if(document.all){		document.all.errorMessage5.style.display= 'block';}
	}
	else{
		creditplus.sendForm((laufzeit-1));
	}
}


function fehlermeldungen_ausblenden(){
	//Fehlermeldung verstecken
	if(document.getElementById){
		if(document.getElementById("errorMessage4")) document.getElementById("errorMessage4").style.display= 'none';
		if(document.getElementById("errorMessage1")) document.getElementById("errorMessage1").style.display= 'none';
		if(document.getElementById("errorMessage2")) document.getElementById("errorMessage2").style.display= 'none';
		if(document.getElementById("errorMessage3")) document.getElementById("errorMessage3").style.display= 'none';
		if(document.getElementById("errorMessage5")) document.getElementById("errorMessage5").style.display= 'none';
	}else if(document.all){
		if(document.all.errorMessage4) document.all.errorMessage4.style.display= 'none';
		if(document.all.errorMessage1) document.all.errorMessage1.style.display= 'none';
		if(document.all.errorMessage2) document.all.errorMessage2.style.display= 'none';
		if(document.all.errorMessage3) document.all.errorMessage3.style.display= 'none';
		if(document.all.errorMessage5) document.all.errorMessage5.style.display= 'none';
	}
}








// Eine zahl, die keine Punkte oder Kommas hat wird formatiert,
// eine zahl, die Punkte oder Kommas hat wird zur Integer
function umformatieren(zahl,formatieren){ //formatieren [true/false]
	var mynachkomma="";
	//in eine Integer wandeln
	if(!formatieren){
		myzahl = zahl;
		if(myzahl.match(/\./)){
			var array_myzahl= myzahl.split("."); //ist der Punkt ein tausender Punkt oder dient er als Kommma
			if(array_myzahl[1].length<3){ 
			//	myzahl = myzahl.substring(0,myzahl.length-3); //die Kommastelle abtrennen
			}
			else if(array_myzahl[1].length>=3){
				myzahl = array_myzahl[0]+""+array_myzahl[1];
			}
		}
		
		if(myzahl.match(/\,/)){
			var array_myzahl2= myzahl.split(",");
			if(array_myzahl2[1].length<3){ 
				myzahl = myzahl.replace(/\,/g, ".");
			//	myzahl = myzahl.substring(0,myzahl.length-3); //die Kommastelle abtrennen
			}
			else if(array_myzahl2[1].length>=3){
				myzahl = array_myzahl2[0]+""+array_myzahl2[1];
			}
		}
		
	
	//Dezimalzahl formatieren mit Komma und Tausenderpunkt
	}else{
		myzahl = zahl;
		if(myzahl.match(/\./)){ //Punkt ist drin
			var array_myzahl= myzahl.split(".");
			if(array_myzahl[1].length<3){
				myzahl = myzahl.substring(0,myzahl.length-3); //die Kommastelle abtrennen
				mynachkomma = array_myzahl[1];
			}
			else if(array_myzahl[1].length>=3){
				myzahl = array_myzahl[0]+""+array_myzahl[1]; //tausender Punkt entfernen
			}
		}
		if(myzahl.match(/\,/)){ //Komma ist drin
			var array_myzahl= myzahl.split(",");
			if(array_myzahl[1].length<3){ 
				myzahl = myzahl.substring(0,myzahl.length-3); //die Kommastelle abtrennen
				mynachkomma = array_myzahl[1];
			}
			else if(array_myzahl[1].length>=3){
				myzahl = array_myzahl[0]+""+array_myzahl[1];  //tausender Punkt entfernen
			}
		}
		
		
		if(!myzahl.match(/\./) && !myzahl.match(/\,/)){
			if(myzahl.length>3)myzahl = myzahl.substring(0,myzahl.length-3) + "." + myzahl.substring(myzahl.length-3,myzahl.length);
			
			if(mynachkomma.length==0){mynachkomma = "00";}
			else if(mynachkomma.length==1){mynachkomma = mynachkomma+"0";}
			else if(mynachkomma.length==2){mynachkomma = mynachkomma;}
			
			myzahl = myzahl + "," + mynachkomma; //Komma 
		}
		
		
		
	}
	//alert(myzahl);
	return myzahl;
}



function formatBetrag(){
	document.Creditplusrechner.Betrag.value = umformatieren(document.Creditplusrechner.Betrag.value,true);
}


// Laufzeit setzen beim klicken des Zurueckbutton (Wert wird Serverseitig gesetzt) 
function setLaufzeit_checked(laufzeit){
	for(i=0;i<document.Creditplusrechner.Laufzeit.length;i++){
		if(document.Creditplusrechner.Laufzeit[i].value==laufzeit){
			document.Creditplusrechner.Laufzeit[i].checked=true;
		}
	}
}

