function Schnellrechner(_params){

	this.data=new SchnellrechnerData();	
	
//  ------------------------------------------- Feiertage
	
	this.MPD=86400000;
	this.FEIERTAGE_CACHE=new Array();

	// Datum des Ostersonntags im Jahre j für die Jahre 1583 - 2499
	this.getDateOfOsterSonntag=function(j){
	  var f=28;
	  if(j % 4 ==0 && j % 100 != 0 || j % 400 ==0)
	    f=29;
	   
	  var m=-1;
	  var n=-1; 
	  if(j>=1583 && j<=1699){
	    m=22;
	    n=2;
	  }else if(j>=1700 && j<=1799){
	    m=23;
	    n=3;
	  }else if(j>=1800 && j<=1899){
	    m=23;
	    n=4;
	  }else if(j>=1900 && j<=2099){
	    m=24;
	    n=5;
	  }else if(j>=2100 && j<=2199){
	    m=24;
	    n=6;
	  }else if(j>=2200 && j<=2299){
	    m=25;
	    n=0;
	  }else if(j>=2300 && j<=2399){
	    m=26;
	    n=1;
	  }else if(j>=2399 && j<=2499){
	    m=25;
	    n=1;
	  }
	  
	  if(m==-1)
	    return null;
	  
	  var a=j%19;
	  var b=j%4;
	  var c=j%7;
	  var d=(19*a+m)%30;
	  var e=(2*b+4*c+6*d+n)%7;
	  var o=31+f+21+d+e;
	  if(o-f==87)
	    o=o-7;
	  else if(a>10 && d==28 && o-f==86)
	    o=o-7;
	    
	  var d1=new Date(j,0,1,12,0,0,0);

	  return new Date(d1.getTime()+o*this.MPD);
	}

	this.getFeiertage=function(j){
	  if(this.FEIERTAGE_CACHE[j])
	    return this.FEIERTAGE_CACHE[j];
	  
	  var o=this.getDateOfOsterSonntag(j);
	  
	  if(o==null)
	    return null;

	  var ot=o.getTime();
	    
	  var ft=new Array();

	  // Umweg, damit es nicht Stundengenau ist.
	  var karf = new Date(ot-2*this.MPD);
	  var omon = new Date(ot+this.MPD);
	  var hifa = new Date(ot+39*this.MPD);
	  var pfim = new Date(ot+50*this.MPD);
	  
	  ft.push(new Date(j,0,1)); // Neujahr
	  ft.push(new Date(j,4,1)); // Maifeiertag
	  ft.push(new Date(j,9,3)); // Tag der Deutschen Einheit
	  ft.push(new Date(j,11,24)); // kein Bankarbeitstag
	  ft.push(new Date(j,11,25)); // 1. Weihnachtstag
	  ft.push(new Date(j,11,26)); // 2. Weihnachtstag
	  ft.push(new Date(j,11,31)); // kein Bankarbeitstag
	  ft.push(new Date(karf.getFullYear(),karf.getMonth(),karf.getDate(),0,0,0)); // Karfreitag
	  ft.push(new Date(omon.getFullYear(),omon.getMonth(),omon.getDate(),0,0,0)); // Ostermontag
	  ft.push(new Date(hifa.getFullYear(),hifa.getMonth(),hifa.getDate(),0,0,0)); // Christi Himmelfahrt
	  ft.push(new Date(pfim.getFullYear(),pfim.getMonth(),pfim.getDate(),0,0,0)); // Pfingstmontag
	  
	  this.FEIERTAGE_CACHE[j]=ft;
	  
	  return ft;
	}
	
//	-------------------------------------------	calc
	
//	kaufm. runden
	this.round=function(x) {
		  var k = (Math.round(x * 100) / 100).toString();
		  k += (k.indexOf('.') == -1)? '.00' : '00';
		  return k.substring(0, k.indexOf('.') + 3);
	}

//		auf ,-- runden
	this.roundOhneNachkomma=function(x) {
		return x.toFixed(0);
	}
	
	// Welche Spalte der Referenzbeträge?
	// TODO betrag ist mittlerweile egal, da es (z.Z.) nur einen Referenzbetrag gibt.
	this.getRefIndex=function(betrag){		
		for(var i=0;i<this.data.betraege.length;i++){	
			if(betrag<=this.data.betraege[i]){
				if(i==0){
					i=(this.resttage);
					i++;
				}else{
					i=(i*30)+(this.resttage)+1;
				}
				return(i);				
			}
		}
	}

	// Verhältnis Betrag/Rate bei Laufzeit
	this.getMultiByLaufzeit=function(laufzeit, iSpalte){		
		for(var i=0;i<this.data.matrix.length;i++){	
			if(this.data.matrix[i][0]==laufzeit){
				return (this.data.matrix[i][iSpalte]);
			}			
		}	
	}
	
	// Effektivzins aus Matrix bei Laufzeit
	this.getEffzinsByLaufzeit=function(laufzeit, iSpalte){		
		for(var i=0;i<this.data.effzinsMatrix.length;i++){	
			if(this.data.effzinsMatrix[i][0]==laufzeit){
				return (this.data.effzinsMatrix[i][iSpalte]);
			}			
		}	
	}	
	
	// Nominalzins aus Matrix bei Laufzeit
	this.getNomzinsByLaufzeit=function(laufzeit, iSpalte){		
		for(var i=0;i<this.data.nomzinsMatrix.length;i++){	
			if(this.data.nomzinsMatrix[i][0]==laufzeit){
				return (this.data.nomzinsMatrix[i][iSpalte]);
			}			
		}	
	}	

	// Rate bei Laufzeit und fix. Betrag (oder umgek.)
	this.berechneRate=function(laufzeit, betrag){
		var iSpalte=this.getRefIndex(betrag);		
		var multi=this.getMultiByLaufzeit(laufzeit, iSpalte);		
//		alert(iSpalte+";"+multi);
		return (this.round(betrag/multi));
	}

	// Laufzeit bei Rate und fix. Betrag
	this.berechneLaufzeit=function(betrag, rate){
		var iSpalte=this.getRefIndex(betrag); //51		
		var last;
		for(var i=0;i<this.data.matrix.length;i++){		
			if(rate>=betrag/this.data.matrix[i][iSpalte]){	
				return (this.data.matrix[i][0]);				
			}else{
				last=this.data.matrix[i][0];	
				if(last==null || last== "undefined")last=84;				
			}					
		}
		return (last);
	}

	// --- Hilfsmethoden

//		Mindestrate für einen bestimmten Betrag 
	this.berechneMinRate=function(betrag){
		var rate=this.berechneRate(parseInt(this.data.maxLaufzeit),betrag);
		return (rate);
	}

//		Maximalrate für einen bestimmten Betrag
	this.berechneMaxRate=function(betrag){
		var rate=this.berechneRate(parseInt(this.data.minLaufzeit),betrag);
		return (rate);
	}



//	------------------------------------------	util

	this.getFormat=function(val){
		val=val.toString();
		var posKomma = val.indexOf(",");
		var posPunkt = val.indexOf(".");

		if(posKomma<posPunkt){		
			return ("FLOAT");
		}
		if(posPunkt<posKomma){
			return ("DE");
		}
		return "";
	}
	
	this.conv4output_simple=function(val){
		var conv=val.toString();
		if(conv.length>3){				
			pre = conv.substr(0,conv.length-3);					
			suf = conv.substr(conv.length-3,conv.length-1);
			conv=pre+"."+suf;
		}
		return conv;
	}	
	
	this.conv4Output=function(val,toTyp){		
		var toconv = val.toString();
		var conv;
		var pre;
		var suf;
		
		if(toTyp=="DE"){
			
			conv = toconv.replace(",","");
			conv = toconv.replace(".",",");
			if(conv.indexOf(",")==-1){
				conv=conv+",00";
			}else if(conv.indexOf(",")+3>conv.length){
				conv=conv+"0";
			}
			
			if(conv.length>6){				
				pre = conv.substr(0,conv.length-6);					
				suf = conv.substr(conv.length-6,conv.length-1);
				conv=pre+"."+suf;
			}
		}
		
		// ohne Komma - Cents ggf. abschneiden
		if(toTyp=="DE_2"){
			conv=val.toString();
			if(conv.length>3){				
				pre = conv.substr(0,conv.length-3);					
				suf = conv.substr(conv.length-3,conv.length-1);
				conv=pre+"."+suf;
			}
		}
		
		if(toTyp=="FLOAT"){	
			conv=toconv;
			if(conv.indexOf(".")==-1){
				conv=conv+".00";
			}else if(conv.indexOf(".")+3>conv.length){
				conv=conv+"0";
			}
//			if(conv.length>6){
//				pre = conv.substr(0,conv.length-6);
//				suf = conv.substr(conv.length-6,conv.length-1);
//				conv=pre+","+suf;
//			}
		}

		return (conv);
	}
	
	this.conv4Input=function(val){
		
		var toconv = val.toString();		
		var conv;
		
		if(this.getFormat(val)=="FLOAT"){
			conv = toconv.replace(",","");			
		}
		if(this.getFormat(val)=="DE"){
			conv = toconv.replace(".","");
			conv = toconv.replace(",",".");
		}
		
		return (conv);
	}
	
	this.pre0=function(val,i){		
		if(val.toString().length<i){			
			for(var j=val.toString().length;j<i;j++){
				val="0"+val;
			}
		}		
		return val;
	}
	
	//	Setter/Checker für die gültigen zu befüllenden Outputfelder
	//	(input.text, input.hidden, div, span)
	this.setElValue=function(id,val){
		if(id!=null){			
			var el=document.getElementById(id);
			if(el==null)
				el=document.getElementsByName(id)[0];
			if(el!=null){
				if(el.type=="hidden" || el.type=="text"){				
					el.value=val;				
				}else{				
					el.innerHTML=val;
				}		
			}
		}
	}
	
	//	Getter/Checker für die gültigen zu befüllenden Outputfelder
	//	(input.text, input.hidden, div, span)
	this.getElValue=function(id){
		var el=document.getElementById(id);
		if(el==null)
			el=document.getElementsByName(id)[0];
		if(el.type=="hidden" || el.type=="text"){
			return (el.value);
		}else{
			return (el.innerHTML);
		}
	}
	
	this.isSchaltjahr=function(date){
		var jahr=date.getYear();
		if(
			(jahr%400=="0") ? (1) : (
				(jahr%100=="0") ? (0) : (
					(jahr%4=="0") ? (1) : (0)
				)
			)
		){
			return (true);
		}else{
			return (false);
		}
	}
	
	// Prüft, ob Zins sich geändert hat und setzt ihn ggf. neu für die Ausgabe
	this.checkAndSetEffzins=function(_laufzeit, _betrag){
		var _t_effzins = this.getEffzinsByLaufzeit(_laufzeit, this.getRefIndex(_betrag));
		if(this.effzins != _t_effzins){
			this.effzins=_t_effzins;
			this.setEffzins(_t_effzins);
			return true;
		}
		return false;
	}

	// Prüft, ob Zins sich geändert hat und setzt ihn ggf. neu für die Ausgabe
	this.checkAndSetNomzins=function(_laufzeit, _betrag){
		var _t_nomzins = this.getNomzinsByLaufzeit(_laufzeit, this.getRefIndex(_betrag));
		if(this.nomzins != _t_nomzins){
			this.nomzins=_t_nomzins;
			this.setNomzins(_t_nomzins);
			return true;
		}
		return false;
	}	
	
	//	--- Zugriff auf die HTML-Objekte
	
	//	Allgemeine Methode, um mehrere Outputfelder zu füllen
	this.setAllElValue=function(idO,idH,valO,valH){		
		this.setElValue(idO,valO);	
		this.setElValue(idH,valH);
	}
	
	//Befüllen des Ausgabeldes für Auszahlungsbetrag (und ggf. entsprechendes Hiddenfield)
	this.setBetrag=function(val){		
		this.setAllElValue(this.idBetragOutput,this.idBetragHidden,this.conv4Output(val, this.betragOutputFormat),this.conv4Output(val, this.betragHiddenFormat));  
	}

//		Befüllen des Ausgabeldes für Laufzeit (und ggf. entsprechendes Hiddenfield)
	this.setLaufzeit=function(val){
		this.setAllElValue(this.idLaufzeitOutput,this.idLaufzeitHidden,val,val);
	}

//		Befüllen des Ausgabeldes für Rate (und ggf. entsprechendes Hiddenfield)
	this.setRate=function(val){
		this.setAllElValue(this.idRateOutput,this.idRateHidden,this.conv4Output(val, this.rateOutputFormat),this.conv4Output(val, this.rateHiddenFormat));
	}

//		Flag für Wunschrate setzen (sofern Rate manuell geändert -> true, Laufzeit/Betrag -> false)
//		nur relevant für z.B. Form Richtung Kreditrechner (Hiddenfield)
	this.setIsWunschrate=function(val){
		this.setElValue(this.idIsWunschrate,val,val);
	}

//	Befüllen des Ausgabeldes für Effektivzins (und ggf. entsprechendes Hiddenfield)
	this.setEffzins=function(val){
		this.setAllElValue(this.idEffzinsOutput,this.idEffzinsHidden,this.conv4Output(val, this.zinsOutputFormat),this.conv4Output(val, this.zinsHiddenFormat));
	}	
	
//	Befüllen des Ausgabeldes für Nominalzins (und ggf. entsprechendes Hiddenfield)
	this.setNomzins=function(val){
		this.setAllElValue(this.idNomzinsOutput,this.idNomzinsHidden,this.conv4Output(val, this.zinsOutputFormat),this.conv4Output(val, this.zinsHiddenFormat));
	}	

//		--- Meldungen

//		optionales Feld für Meldungen füllen 
	this.writeMsg=function(text){
		if(this.idMeldungBox!=null){document.getElementById(this.idMeldungBox).style.visibility="visible";}
		if(this.idMeldung!=null){
			this.setElValue(this.idMeldung,text);
		}
	}

//		optionales Feld für Meldungen leeren
	this.clearMsg=function(){
		if(this.idMeldungBox!=null){document.getElementById(this.idMeldungBox).style.visibility="hidden";}
		if(this.idMeldung!=null){
			this.setElValue(this.idMeldung,"<br /><br />");
		}
	}
	
	//	Sonderregel: bei Betrag<2500 -> Laufzeit max 36 
	this.checkLaufzeitGrenze=function(){
		if(this.betrag<2500 && this.laufzeit>36){
			this.writeMsg("Bitte wählen Sie für einen Finanzierungsrahmen bis 2.500 Euro eine Laufzeit zwischen 12 und 36 Monaten.");		
			return (false);
		}	
		return (true);
	}
	
	this.ermittleAuszahlungstermin=function(){

		this.jahr=this.datum.getFullYear();
		this.feiertage=this.getFeiertage(this.jahr);
		
		this.tage=10;
		this.auszahldatum=new Date(this.datum.getFullYear(),this.datum.getMonth(),this.datum.getDate()+this.tage,0,0,0);
				
		do{
			this.azt=true;
			this.tmp_date=new Date(this.auszahldatum.getFullYear(),this.auszahldatum.getMonth(),this.auszahldatum.getDate());
			for(var i=0;i<this.feiertage.length;i++){				
				if(this.tmp_date.getTime()==this.feiertage[i].getTime()){
					this.azt=false;					
					this.tage++;
					this.auszahldatum=new Date(this.datum.getFullYear(),this.datum.getMonth(),this.datum.getDate()+this.tage,0,0,0);
				}
			}			
			
			if(this.auszahldatum.getDay()==0 || this.auszahldatum.getDay()==6){
				this.azt=false;
				this.tage++;
				this.auszahldatum=new Date(this.datum.getFullYear(),this.datum.getMonth(),this.datum.getDate()+this.tage,0,0,0);
			}
		}while(!this.azt);

		return this.auszahldatum;
	}
	
	this.ermittleResttage=function(){
		this.resttage = 0;
	}
	this.ermittleResttage_alt=function(){

		// Resttage ("Mehrtage") = Tage zw. Auszahlung und Tilgungsbeginn
		// AT______TB_____ER
		// |___MT___|__30__|
		// 
//			AT = 1.3.
//			RT = 30.
//			ER = 30.4.
//			TB = ER-30Tage
//			TB = 31.3.	(30.3.)
//			MT = TB-AT
//			MT = 29

		this.datum=new Date();
		//this.datum=new Date(2011,3,12,0,0,0);
		//this.auszahldatum=new Date(this.datum.getFullYear(),this.datum.getMonth(),this.datum.getDate()+10,0,0,0);
		this.auszahldatum=this.ermittleAuszahlungstermin();

		this.basisDatum=this.auszahldatum;
	
		// ErsteRate
		if (this.auszahldatum.getMonth() == 0 && this.ratentag > 28) {
			if (this.isSchaltjahr(this.basisDatum))
				this.basisDatum=new Date(this.basisDatum.getFullYear(),this.basisDatum.getMonth()+1,29,0,0,0);
			else
				this.basisDatum=new Date(this.basisDatum.getFullYear(),this.basisDatum.getMonth()+1,28,0,0,0);			

		} else {
			// Standardregelung:
			// nächster Ratentag 1 Monat nach Auszahlungstermin
			this.basisDatumTag=this.basisDatum.getDate();
			this.folgeDatum=new Date(this.basisDatum.getFullYear(),this.basisDatum.getMonth()+1,this.basisDatum.getDate(),0,0,0);
			if(this.basisDatumTag>this.folgeDatum.getDate())
				this.basisDatumTag=this.folgeDatum.getDate();
			this.basisDatum=new Date(this.basisDatum.getFullYear(),this.basisDatum.getMonth()+1,this.basisDatumTag,0,0,0);

			// Suchen des nächsten möglichen Rateneinzugtages
			//
			// Der Ratentag darf bei Auszahlungstermin 31. des Monats:
			// Ratentag darf nicht auf den 31. eines Monats gesetzt werden
			// Ausnahmebehandlung für die beiden Regelfälle unten
			if (this.basisDatum.getDate() == 31) {
				this.basisDatum=new Date(this.basisDatum.getFullYear(),this.basisDatum.getMonth(),this.ratentag,0,0,0);
			}
			
			if (this.basisDatum.getDate() > this.ratentag) {
				this.basisDatum=new Date(this.basisDatum.getFullYear(),this.basisDatum.getMonth()+1,this.ratentag,0,0,0);
			}

			if (this.basisDatum.getDate() < this.ratentag) {
				this.basisDatum=new Date(this.basisDatum.getFullYear(),this.basisDatum.getMonth(),this.ratentag,0,0,0);
			}
		}

		// ---			
		
	    	this.dateTagVorTilgungsbeginn = this.basisDatum;
	    	this.dateTagVorTilgungsbeginn = new Date(this.dateTagVorTilgungsbeginn.getFullYear(),this.dateTagVorTilgungsbeginn.getMonth()-1,this.dateTagVorTilgungsbeginn.getDate(),0,0,0);
  	
	    	this.resttageMonate = this.dateTagVorTilgungsbeginn.getMonth() - this.auszahldatum.getMonth();
	    	this.resttageJahre = this.dateTagVorTilgungsbeginn.getFullYear() - this.auszahldatum.getFullYear();

	    	
	    	this.intTagAuszahlung = this.auszahldatum.getDate();
	    	// Termin Auszahlung wird angenommen, dass kein 31. mgl. ist
	    	// stattdessen wird auf den 30.12. zurückgesetzt. Dies muss geprüft werden
	    	// 1. Regel: 31. ist kein Zinstag -> Rücksetzung auf 30. des Monats
	    	// 2. Regel: letzter Zinstag zählt -> Februar wird auf 30. gesetzt
   	
	    	this.auszahldatum=new Date(this.auszahldatum.getFullYear(),this.auszahldatum.getMonth(),this.auszahldatum.getDate()+1,0,0,0);
	    	if (this.auszahldatum.getDate() == 1) {
	    		this.intTagAuszahlung = 30;
	    	}
	    	this.auszahldatum=new Date(this.auszahldatum.getFullYear(),this.auszahldatum.getMonth(),this.auszahldatum.getDate()-1,0,0,0);
    	
	    	this.intTagVorTilgungsbeginnTag = this.dateTagVorTilgungsbeginn.getDate();

	    	// Problematik 28. Februar erste Rate -> ist letzter Februartag
	    	// Funktion ERste RAte gibt nicht den "virtuellen" 30. Februar als Ratentermin zurückl, sondern letzten Februartag
	    	this.dateTagNachErsteRate = this.basisDatum;	    	
	    	this.dateTagNachErsteRate=new Date(this.dateTagNachErsteRate.getFullYear(),this.dateTagNachErsteRate.getMonth(),this.dateTagNachErsteRate.getDate()+1,0,0,0);
	    	if (this.dateTagNachErsteRate.getDate() == 1) {
	    		this.intTagVorTilgungsbeginnTag = 30;
	    	}

	    	// nur für den Fall Tag vor Tilgungsbeginn im Februar (wg. 360 und feste Ratentage 15/30.)
	    	this.dateTagTilgungsbeginn = this.dateTagVorTilgungsbeginn;	    	
	    	this.dateTagTilgungsbeginn=new Date(this.dateTagTilgungsbeginn.getFullYear(),this.dateTagTilgungsbeginn.getMonth(),this.dateTagTilgungsbeginn.getDate()+1,0,0,0);	    	
	    	if (this.dateTagTilgungsbeginn.getDate() == 1) {
	    		this.intTagVorTilgungsbeginnTag = 30;
	    	}

	    	this.resttage = this.resttageJahre * 360;
	    	this.resttage = this.resttage + this.resttageMonate * 30;
	    	this.resttage = this.resttage + this.intTagVorTilgungsbeginnTag - this.intTagAuszahlung;
	    		
	    	
    		if(this.auszahldatum.getMonth()==1){    			
    			if(this.isSchaltjahr(this.auszahldatum)){	    				
    				this.resttage=this.resttage-1;
    			}else{    				
    				this.resttage=this.resttage-2;
    			}
    		}else{
//	    			this.resttage=this.resttage-30;
    			if(this.resttage>=30)
    				this.resttage=0;
    		}

	}
	
	//	-------------------------------------- schnellrechner
	
	this.params=_params;
	
	this.msgStack="";
	this.datum;
	this.auszahldatum;
	this.ratedatum;
	this.resttage;	
	this.ratentag=30;	
	if(this.params["_ratentag"]!=null)		
		this.ratentag=this.params["_ratentag"];	
	this.betragOutputFormat = "DE";
	this.betragHiddenFormat = "DE";
	this.rateOutputFormat = "DE";
	this.rateHiddenFormat = "DE";
	this.zinsOutputFormat = "DE";
	this.zinsHiddenFormat = "DE";
	
	//	IDs der Ausgabefelder
	this.idBetragOutput=null; this.idBetragHidden=null;
	this.idLaufzeitOutput=null; this.idLaufzeitHidden=null; 
	this.idRateOutput=null; this.idRateHidden=null;
	this.idIsWunschrate=null; this.idMeldungBox=null; this.idMeldung=null;
	this.idEffzinsOutput=null; this.idEffzinsHidden=null;
	this.idNomzinsOutput=null; this.idNomzinsHidden=null;
	
	this.rate; this.laufzeit; this.betrag; this.isWunschrate;
	this.effzins; this.nomzins;

	// Resttage
	this.ermittleResttage();
	
	//	nur für Init. des Ratenslider
	this.maxRate=parseFloat(this.berechneRate(parseInt(this.data.minLaufzeit),parseFloat(this.data.maxAuszahlungsbetrag)));
	this.minRate=parseFloat(this.berechneRate(parseInt(this.data.maxLaufzeit),parseFloat(this.data.minAuszahlungsbetrag)));

	// ---
	
	this.betrag=parseFloat(this.data.minAuszahlungsbetrag);	
	this.laufzeit=parseInt(this.data.minLaufzeit);
	
//
	
	if(this.checkLaufzeitGrenze()==false){
		this.laufzeit=36;	
		this.msgStack=this.msgStack+"Bitte wählen Sie für einen Finanzierungsrahmen bis 2.500 Euro eine Laufzeit zwischen 12 und 36 Monaten.";
	}
	
	this.rate=this.berechneRate(this.laufzeit,this.betrag);	
	this.isWunschrate=false;
	
	this.effzins=this.getEffzinsByLaufzeit(this.laufzeit, this.getRefIndex(this.betrag));
	this.nomzins=this.getNomzinsByLaufzeit(this.laufzeit, this.getRefIndex(this.betrag));
	
	// ---	
	
	this.init=function(){

		if(this.params["_idBetragHidden"]!=null)
			this.idBetragHidden=this.params["_idBetragHidden"];	
		if(this.params["_idLaufzeitHidden"]!=null)
			this.idLaufzeitHidden=this.params["_idLaufzeitHidden"];		
		if(this.params["_idRateHidden"]!=null)
			this.idRateHidden=this.params["_idRateHidden"];			
		if(this.params["_idIsWunschrate"]!=null)
			this.idIsWunschrate=this.params["_idIsWunschrate"];	
		if(this.params["_idMeldungBox"]!=null)
			this.idMeldungBox=this.params["_idMeldungBox"];		
		if(this.params["_idMeldung"]!=null)
			this.idMeldung=this.params["_idMeldung"];	
		if(this.params["_idEffzinsHidden"]!=null)
			this.idEffzinsHidden=this.params["_idEffzinsHidden"];
		if(this.params["_idNomzinsHidden"]!=null)
			this.idNomzinsHidden=this.params["_idNomzinsHidden"];		
		
		if(this.params["_idBetragOutput"]!=null)
			this.idBetragOutput=this.params["_idBetragOutput"];		
		if(this.params["_idLaufzeitOutput"]!=null)
			this.idLaufzeitOutput=this.params["_idLaufzeitOutput"];		
		if(this.params["_idRateOutput"]!=null)		
			this.idRateOutput=this.params["_idRateOutput"];	
		if(this.params["_idEffzinsOutput"]!=null)
			this.idEffzinsOutput=this.params["_idEffzinsOutput"];
		if(this.params["_idNomzinsOutput"]!=null)
			this.idNomzinsOutput=this.params["_idNomzinsOutput"];
		
		if(this.params["_ratentag"]!=null)		
			this.ratentag=this.params["_ratentag"];
		
		if(this.params["_betragOutputFormat"]!=null)
			this.betragOutputFormat=this.params["_betragOutputFormat"];
		if(this.params["_betragHiddenFormat"]!=null)
			this.betragHiddenFormat=this.params["_betragHiddenFormat"];
		if(this.params["_rateOutputFormat"]!=null)
			this.rateOutputFormat=this.params["_rateOutputFormat"];	
		if(this.params["_rateHiddenFormat"]!=null)
			this.rateHiddenFormat=this.params["_rateHiddenFormat"];
		if(this.params["_zinsOutputFormat"]!=null)
			this.zinsOutputFormat=this.params["_zinsOutputFormat"];			
		if(this.params["_zinsHiddenFormat"]!=null)
			this.zinsHiddenFormat=this.params["_zinsHiddenFormat"];		
		
		this.callback=null;
		if(this.params["_callback"]!=null)
			this.callback=this.params["_callback"];		
		
		this.ermittleResttage();

		if(document.getElementById("debug")!=null){
			this.setElValue("debug",this.getElValue("debug")+"<br />Betrag: "+this.betrag+"<br />Laufzeit: "+this.laufzeit+"<br />Rate: "+this.rate);
			this.setElValue("debug",this.getElValue("debug")+"<br />datumHeute: "+this.datum+"<br /> auszahldatum: "+this.auszahldatum);
			this.setElValue("debug",this.getElValue("debug")+"<br />datumErsteRate: "+this.basisDatum+"<br />Mehrtage: "+this.resttage);
		}
		
		if(this.msgStack!=""){
			this.writeMsg(this.msgStack);
			this.msgStack="";
		}
		this.clearMsg();
		
		this.setBetrag(this.betrag); 	
		this.setLaufzeit(this.laufzeit);
		this.setRate(this.rate);
		this.setIsWunschrate(this.isWunschrate);
		this.setEffzins(this.effzins);
		this.setNomzins(this.nomzins);
	}
	
	// --- Changemethoden
	
	//	Auszahlungsbetrag einstellen
	this.changeBetrag=function(_betrag){
//		_betrag=this.conv4Input(_betrag); uerbfluessig 
		this.betrag=parseFloat(_betrag);
		if(_betrag>this.data.maxAuszahlungsbetrag)
			_betrag=maxAuszahlungsbetrag;
		this.setBetrag(this.betrag);
		this.clearMsg();
		this.rate=this.berechneRate(this.laufzeit,this.betrag);
		this.setRate(this.rate);	
		this.isWunschrate=false;
		this.setIsWunschrate(this.isWunschrate);
	}
	
	//	Laufzeit einstellen
	this.changeLaufzeit=function(_laufzeit){
//		_laufzeit=this.conv4Input(_laufzeit);
		this.laufzeit=parseFloat(_laufzeit);
		this.setLaufzeit(this.laufzeit);
		this.clearMsg();
		this.rate=this.berechneRate(this.laufzeit,this.betrag);
		this.setRate(this.rate);
		this.isWunschrate=false;
		this.setIsWunschrate(this.isWunschrate);
		if(this.checkAndSetEffzins(this.laufzeit,this.betrag))if(this.callback!=null)this.callback();;
		this.checkAndSetNomzins(this.laufzeit,this.betrag);		
	}
	
	//	Rate einstellen
	this.changeRate=function(_rate){
		//_rate=this.conv4Input(_rate);
		// Anpassen der Rate, damit glatte 10er Schritte möglich 
		// (durch die Verhältnisrechnung entsteht immer eine Wunschrate von xxx5 &#8364;. Nun wird sie auf xx10 gerundet.)
		_rate=_rate/10;
		this.rate=parseFloat(this.roundOhneNachkomma(_rate));
		// Anheben auf xx20er-Schritte (100,120,140... und nicht 110,130,150...)
//		this.rate=(this.rate*10)+10;
		this.rate=(this.rate*10);

		//this.rate=parseFloat(this.round(_rate));
		this.setRate(this.rate);		
		this.clearMsg();
		this.laufzeit=this.berechneLaufzeit(this.betrag,this.rate);		
//		alert(this.betrag+" , "+this.rate+" = "+this.laufzeit);
		this.setLaufzeit(this.laufzeit);	
		this.isWunschrate=true;
		this.setIsWunschrate(this.isWunschrate);
		if(this.checkAndSetEffzins(this.laufzeit,this.betrag))if(this.callback!=null)this.callback();
		this.checkAndSetNomzins(this.laufzeit,this.betrag);
	}
	
	//	--- Getter 
	
	//	Ausgabelde Auszahlungsbetrag auslesen
	this.getBetrag=function(){
		return (this.betrag);
	}
	
	//	Ausgabelde Laufzeit auslesen
	this.getLaufzeit=function(){
		return (this.laufzeit);
	}
	
	//	Ausgabelde Rate auslesen
	this.getRate=function(){
		return (this.rate);
	}
	
	//	Flag für Wunschrate auslesen
	//	nur relevant für z.B. Form Richtung Kreditrechner (Hiddenfield)
	this.getIsWunschrate=function(){
		return (this.isWunschrate);
	}
	
	
	//	----------------------------
	
	this.getMaxRate=function(){
		return (this.maxRate);
	}
	
	this.getMinRate=function(){
		return (this.minRate);
	}
	
	this.getMinAuszahlungsbetrag=function(){
		return (this.data.minAuszahlungsbetrag);
	}
	this.getMaxAuszahlungsbetrag=function(){
		return (this.data.maxAuszahlungsbetrag);
	}
	this.getMinLaufzeit=function(){
		return (this.data.minLaufzeit);
	}
	this.getMaxLaufzeit=function(){
		return (this.data.maxLaufzeit);
	}
	this.getLaufzeitStep=function(){
		return (this.data.laufzeitStep);
	}

	//	----------------------------
	
	
	// --- Regeln (gültige Wertekombinationen)
	
	//	Check, wenn Auslöser = Auszahlungsbetrag
	this.checkCombiByBetrag=function(checks){
		
		if(checks==1){
			if(this.checkLaufzeitGrenze()==false){
				this.betrag=2500;
				this.setBetrag(this.betrag);
				this.rate=this.berechneRate(this.laufzeit,this.betrag);
				this.setRate(this.rate);
				return (false);
			}
		}
	}
	
	//	Check, wenn Auslöser = Laufzeit
	this.checkCombiByLaufzeit=function(checks){
			
		if(checks==1){
			if(this.checkLaufzeitGrenze()==false){	
				this.laufzeit=36;
				this.setLaufzeit(this.laufzeit);
				this.rate=this.berechneRate(this.laufzeit,this.betrag);
				this.setRate(this.rate);
				return (false);
			}
		}		
	}
	
	//	Check, wenn Auslöser = Rate
	this.checkCombiByRate=function(checks){	
		
		if(checks==1){
			if(this.checkLaufzeitGrenze()==false){
				this.laufzeit=36;
				this.setLaufzeit(this.laufzeit);
				this.rate=this.berechneRate(this.laufzeit,this.betrag);
				this.setRate(this.rate);		
				return (false);
			}	
		}
		
		var _minRate=parseFloat(this.berechneMinRate(this.betrag));
		var _maxRate=parseFloat(this.berechneMaxRate(this.betrag));
		// min/maxRate je Betrag
		if(this.rate < _minRate){
			this.writeMsg("Die vorgegebene Rate war zu gering und wurde aufgrund der Maximallaufzeit von 84 Monaten auf die Mindestrate angepasst.");
			this.rate=Math.ceil(_minRate);
			this.setRate(this.rate);  
			this.laufzeit=this.berechneLaufzeit(this.betrag,this.rate);
			this.setLaufzeit(this.laufzeit);
			return (false);
		}else if(this.rate > _maxRate){
			this.writeMsg("Die vorgegebene Rate war zu hoch und wurde aufgrund der Mindestlaufzeit von 12 Monaten auf die Maximalrate angepasst.");
			this.rate=Math.ceil(_maxRate);			
			this.setRate(this.rate);		
	//		laufzeit=berechneLaufzeit(betrag,rate);
			this.laufzeit=this.data.minLaufzeit;	//vorerst fix auf 12(minLaufzeit), da maxRate sowieso nur bei minLaufzeit möglich ist. (th. das gleich bei maxRate) - sonst teilw. bei maxRate nur 13Monate Laufzeit durch Rechnung
			this.setLaufzeit(this.laufzeit);		
			return (false);
		}
		
		return (true);
	
		return (true);
	}
	

	
	
	
	
	
}



