/************************************************************/
/* Team-Bank: DHTML Ratenrechner                            */
/* (c) etone Intermedia GmbH & Co KG, i.A. Team-Bank, Juli 2009     */
/************************************************************/

var TeamBank = new Object();

/**
* @class Implementierung des Teambank-Ratenrechners
* @requires jQuery, jQuery UI, jquery.selectdecorator.js
**/
TeamBank.RatenRechner = new Object();

/**
* initialisiert den Ratenrechner
* @param {Object}  config - Die Konfiguration des Ratenrechners
**/
TeamBank.RatenRechner.init = function (config) {
   this.config = config;   

   if (!this.config.selectors) {this.config.selectors = new Object();}
   if (!this.config.selectors.betrag) {this.config.selectors.betrag = ".wunschBetrag"}
   if (!this.config.selectors.laufzeit) {this.config.selectors.laufzeit = ".laufzeit"}
   if (!this.config.selectors.betragDisplay) {this.config.selectors.betragDisplay = ".betragDisplay"}
   if (!this.config.selectors.laufzeitDisplay) {this.config.selectors.laufzeitDisplay = ".laufzeitDisplay"}   
   if (!this.config.selectors.ratenDisplay) {this.config.selectors.ratenDisplay = ".ratenDisplay"}   
   if (!this.config.selectors.errorDisplay) {this.config.selectors.errorDisplay = "#RRErrorDisplay"}   
   if (!this.config.selectors.proceed) {this.config.selectors.proceed = "#Proceed"}  
   if (!this.config.selectors.ratenrechner) {this.config.selectors.ratenrechner = "#ratenrechner";}
   if (!this.config.selectors.starText) {this.config.selectors.starText = "#disclaimerContainer";}
   if (!this.config.kreditMax) {this.config.kreditMax = 75000;}
   if (!this.config.kreditMin) {this.config.kreditMin = 1000;}
   if (!this.config.kreditStep) {this.config.kreditStep = 500;}   
   if (!this.config.laufzeitStep) {this.config.laufzeitStep = 12;}
   if (!this.config.laufzeitMin) {this.config.laufzeitMin = 12;}
   if (!this.config.laufzeitMax) {this.config.laufzeitMax = 84;}
   if (!this.config.postURL) {this.config.postURL = "#";}
   if (!this.config.errorClassName) {this.config.errorClassName = "error";}
   if (!this.config.selectHolderClass) {this.config.selectHolderClass = "selectholder";}
   if (!this.config.showCents) {this.config.showCents = false;}
   
   // Suche nach Parameter "cost" oder nach Parameter "antrag.kreditWunsch"
   if (this.getURLParam('antrag.kreditWunsch') != null) {
      this.config.defaultBetrag = this.getURLParam('antrag.kreditWunsch');
   }
   else if (this.getURLParam('cost') != null) {
      this.config.defaultBetrag = this.getURLParam('cost');
   }
   else {
      // Default-Wert
      this.config.defaultBetrag = 9000;
   }
   
   //Fallback: Falls keine gueltige Zahl uebereben wurde, nimm Default-Einstellung
   if (isNaN(this.config.defaultBetrag)) {this.config.defaultBetrag = this.config.kreditMin;}
   
      
   this.config.defaultLaufzeit = (this.getURLParam('antrag.laufzeit') != null) ? this.getURLParam('antrag.laufzeit') : 60;
   
    // Aufbau grafische Selectbox
	var html = "";
	for (var i = this.config.laufzeitMin; i <= this.config.laufzeitMax; i+=this.config.laufzeitStep) {
	   html += "<option value="+i+">"+i+" Monate</option>";
	}
	jQuery(this.config.selectors.laufzeitDisplay).html(html);	
	
	jQuery(this.config.selectors.laufzeitDisplay).selectdecorator(
		{
			DIVClass : TeamBank.RatenRechner.config.selectHolderClass
		}									
	);
	
	// Falls dynamische Sternchentexte definiert sind: Update-Event zuweisen
	if (this.config.starTexts) {
	   jQuery(this.config.selectors.ratenrechner).bind("updateRR", function(e, data) {TeamBank.RatenRechner.updateStarText(e,data);});
	}

    this.loadRaten();	
}
/**
* Laed die Raten aus dem Konfigurationsfile
**/
TeamBank.RatenRechner.loadRaten = function () {
   if ((!this.config) || (!this.config.configFile)) {return;}
   jQuery.getJSON(this.config.configFile, function (data) {TeamBank.RatenRechner.onConfig(data);});
}

/**
* Ermittelt den Wert eines URL-Parameters
* @param {String}  paramName - Der Name des Parameters
* @returns den Wert des Parameters oder null, falls der Parameter nicht uebergeben wurde
**/
TeamBank.RatenRechner.getURLParam = function (paramName) {
   var url = location.href;
   var hostAndParams = url.split('?');
   if (hostAndParams.length < 2) {return(null);}
   var params = hostAndParams[1].split('&');
   for ( var i = 0; i < params.length; i++) {
      var nameAndValue = params[i].split('=');
	  if ((nameAndValue.length >= 2) && (nameAndValue[0] == paramName)) {
	  // Erkenne verschiedene Zahlenformate
	  value = unescape(nameAndValue[1]);
	  value = value.replace(/\./g,"");
	  value = value.replace(/,/,".");	  	  
	  return(parseFloat(value));
	  
	  }
   }
   return(null);
}

/**
* Wird beim vollstaendigen Laden der Ratenkonfiguration aufgerufen
* @param {Object}  data Das Datenobjekt aus der JSON-Datei
**/
TeamBank.RatenRechner.onConfig = function (data) {    
   this.config.raten = data.raten;
   if (data.betragParamConditions) {this.config.betragParamConditions = data.betragParamConditions;}
   
   // Slider initialisieren
   var betrag = jQuery(this.config.selectors.betrag);
   var laufzeit = jQuery(this.config.selectors.laufzeit);   
   betrag.slider({'min': this.config.kreditMin,
                  'max': this.config.kreditMax,
				  'value' : this.config.defaultBetrag,
				  'step' : this.config.kreditStep});
   
   laufzeit.slider({'min': this.config.laufzeitMin,
                  'max': this.config.laufzeitMax,
				  'value' : this.config.defaultLaufzeit,
				  'step' : this.config.laufzeitStep});

   betrag.bind('slide', function (event,ui) {TeamBank.RatenRechner.onSlide(ui.value,null);});
   laufzeit.bind('slide', function (event,ui) {TeamBank.RatenRechner.onSlide(null, ui.value);});   
   
   this.onSlide(null,null);
   
   // Textfelder mit Handlern versehen
   jQuery(this.config.selectors.laufzeitDisplay).bind("change", function() {
      var laufzeit = 0;
	  
	  laufzeit = parseInt(jQuery(TeamBank.RatenRechner.config.selectors.laufzeitDisplay).attr("value"));	
      if (isNaN(laufzeit)) {TeamBank.RatenRechner.error("Bitte geben Sie eine g&uuml;ltige Laufzeit ein."); return;}	  
      jQuery(TeamBank.RatenRechner.config.selectors.laufzeit).slider("value", laufzeit);	      	  
	  TeamBank.RatenRechner.onSlide(null,null);
	  
   });
   jQuery(this.config.selectors.betragDisplay).blur(TeamBank.RatenRechner.onBetragInput);
   jQuery(this.config.selectors.betragDisplay).bind("keyup", TeamBank.RatenRechner.onBetragInput);
   
   
   // Weiter-Button aktivieren
   jQuery(this.config.selectors.proceed).bind("click", function (event, ui) {
      
	  if ((jQuery(this).attr("target")) && (jQuery(this).attr("target") == "_blank")) {
	      TeamBank.RatenRechner.proceed(true);
	  }
	  else {
	      TeamBank.RatenRechner.proceed();
	  }
	  return(false);
		  
   }
   );   
}

/**
* Aktualisiert  den Ratentrechner bei Eingabe eines Betrages ins Textfeld
**/
TeamBank.RatenRechner.onBetragInput = function () {
   var betrag = 0;
   betrag = parseFloat(jQuery(TeamBank.RatenRechner.config.selectors.betragDisplay).attr("value").replace(/\./, "").replace(/,/,"."));
   if (isNaN(betrag)) {TeamBank.RatenRechner.error("Bitte geben Sie einen g&uuml;ltigen Betrag ein."); return;}	  
   jQuery(TeamBank.RatenRechner.config.selectors.betrag).slider("value", betrag);	  
   TeamBank.RatenRechner.onSlide(null,null);
   
}



/**
* Allgemeine Fehlerausgabe
* @param  {String}  message Die Fehlernachricht
**/
TeamBank.RatenRechner.error = function (message) {
   jQuery(this.config.selectors.errorDisplay).css({display:"block", visibility:"visible"}).html(message);
   jQuery(this.config.selectors.betragDisplay).addClass(this.config.errorClassName);
}
   

/**
* Ermittelt die aktuelle Rate
* @param {number} betrag der Wunschbetrag
* @param {number} laufzeit die gewuenschte Laufzeit
* @returns die aktuelle Rate
**/
TeamBank.RatenRechner.getRate = function (betrag,laufzeit) {   
   return(this.calculateRate(betrag,laufzeit,this.getConfigHashNameForBetrag("raten", betrag)));
}

/**
* Berechnet die Rate anhand der des Betrages, der Laufzeit und eines gegebenen Limits
* @param {Number} betrag Der Wunschbetrag
* @param {Number} laufzeit Die Laufzeit
* @param {limit} limit Das zu verwendenede Limit
**/
TeamBank.RatenRechner.calculateRate = function (betrag, laufzeit, limit) {
  if (typeof(this.config.raten[limit]) == "undefined") {return(-1);}
  var bspRate = this.config.raten[limit][laufzeit+''];
  if (isNaN(bspRate)) {this.error("Bitte w&auml;hlen Sie eine g&uuml;ltige Laufzeit."); bspRate = 0;}
  var zins = bspRate / parseFloat(limit);		 
  var rate = betrag*zins;	
  return(Math.ceil(rate));
}

/**
* Getter fuer den Betrag, ermittelt aus der Slider-Position
* @returns den eingestellten betrag
**/
TeamBank.RatenRechner.getBetrag = function () {
   var betrag = jQuery(this.config.selectors.betrag).eq(0).slider('option', 'value');
   return(betrag);
}
/**
* Getter fuer die Laufzeit, ermittelt aus der aktuellen Slider-Position
* @returns die eingestellte Laufzeit
**/
TeamBank.RatenRechner.getLaufzeit = function () {
   var laufzeit = jQuery(this.config.selectors.laufzeit).eq(0).slider('option', 'value');
   return(laufzeit);
}

/**
* Funktion zum Updaten aller werte, sollte beim "slide"-Event aufgerufen werden
* @param {number} betrag Betrag. Falls null angegeben wird, wird der Betrag aus dem Slider ermittelt
* @param {number}laufzeit Laufzeit. Falls null angegeben wird, wird die Laufzeit aus dem Slider ermittelt
**/
TeamBank.RatenRechner.onSlide = function (betrag,laufzeit) {
   jQuery(this.config.selectors.errorDisplay).css({display:"none", visibility:"hidden"});   
   jQuery(this.config.selectors.betragDisplay).removeClass(this.config.errorClassName);   
   if (betrag == null) {betrag = this.getBetrag();}
   if (laufzeit == null) {laufzeit = this.getLaufzeit();}
   var rate = this.getRate(betrag, laufzeit);   
   
   // Triger Update Event
   var e = new jQuery.Event("updateRR"); 
   var data = {'betrag' : betrag, 'laufzeit': laufzeit, 'rate': rate};   
   jQuery(this.config.selectors.ratenrechner).triggerHandler (e, data);
   
   
   if (betrag < this.config.kreditMin) {
      this.error("&le; "+this.config.kreditMin+" Euro Mindestbetrag unterschritten"); 	  
	  return;	  
   }   
   if (rate == 0) {return;}
   jQuery(this.config.selectors.betragDisplay).attr("value", this.formatPrice(betrag));
   
   // Auswahl in grafischer Selectbox ist etwas trickreicher
   jQuery("."+this.config.selectHolderClass+" ul>li").each(function(i) {
      
      if (jQuery(this).attr("val") == laufzeit) {
	    jQuery("."+TeamBank.RatenRechner.config.selectHolderClass).find('span').parent().unbind('click');
		jQuery(this).parent().hide();
		jQuery(this).parent().parent().find('span').html(jQuery(this).html());
	  }
   });
   
   
   jQuery(this.config.selectors.ratenDisplay).html(this.formatPrice(rate));
   if (rate <= 20) {this.error("&le; 20 Euro, Mindestrate unterschritten.");}   
}

/**
* Ruft eine URL auf und fuegt die aktuell gewaehlten Werte ein
* param {boolean} windowed true, falls der neue Link in einem neuen Fenster geöffnet werden soll
**/
TeamBank.RatenRechner.proceed = function (windowed) {   
   var betragStr = this.getBetrag()+"";
   var url = this.config.postURL.replace(/###BETRAG###/g, (this.config.showCents ? betragStr.replace(/\./g, ",") : Math.floor(this.getBetrag()))); 
   url = url.replace(/###LAUFZEIT###/g, this.getLaufzeit());   
   url = this.appendURLParamsForBetrag(url);     
   if ((arguments.length > 0) && (windowed)) {window.open(url, '_blank');}
   else {window.location.href = url;}     
}

/**
* Formatiert einen Euro-Betrag entsprechend (mit . als Trennzeichen)
* @param  {number}  price der zu formatierende Betrag
**/
TeamBank.RatenRechner.formatPrice = function (price) {
   price += '';
   price = price.replace(".", ",");
   var idx = (price.indexOf(",") >= 0) ? price.indexOf(",") : price.length
   var decimal = price.substring(0, idx);
   var out = "";
   var cnt = 0;
   for (var i = decimal.length-1; i >= 0; i--) {
      out = decimal.substr(i,1)+out;
	  cnt++;
	  if ((cnt % 3 == 0) && (i > 0)) {out = "."+out;}
   }
   var cents = price.substring(idx+1, price.length);
   if (cents.length > 0) {
      cents = ","+cents;
      if (cents.length < 3) {cents += "0"}
   }
   if (this.config.showCents) {return(out+cents)}
   else {return(out);}   
}
	  
/**
* Aktualisiert den Sternchentext in Abhängigkeit von der ausgewählten Rate. Sollte mit einem "updateRR"-Event aufgerufen werden
*  @param {jQuery.Event} e das ausloesende Event
* @param {Object} data Die Daten des updateRR-Events
**/
TeamBank.RatenRechner.updateStarText = function (e, data) {
   if ((this.config.starTexts) && (this.config.selectors.starText)) {
      var text = "";
      for (var rate in this.config.starTexts) {
	     text = this.config.starTexts[rate];
	     if (data.betrag <= parseFloat(rate)) {
		    jQuery(this.config.selectors.starText).html(text);
			return;
		 }
	  }
	  // Default
	  jQuery(this.config.selectors.starText).html(text);
   }
}

/**
* Ermittelt Zusatzparameter fuer die Verkaufsstrecke, basierend auf dem aktuell eingestellten Betrag
* @param url die aktuelle URL
* @return die URL mit angehängten Parametern
**/
TeamBank.RatenRechner.appendURLParamsForBetrag = function (url) {
  var hashName = this.getConfigHashNameForBetrag("betragParamConditions");  
  if (hashName == "") {return(url);}
  var params = this.config.betragParamConditions[hashName];
  for (var i = 0; i < params.length; i++) {
     if (params[i].length == 2) {
	    url += ((url.indexOf("?")>= 0) ? "&" : "?") + params[i][0]+"="+params[i][1];
	 }
  }
  return(url);  
}
  
  
		    
/**
* Ermittelt den Namen des Hashes für den aktuellen Wert innerhalb der Ratenkonfiguration anhand des eingestellten Betrages
* @param  {String} parentNodeName Der name des Vaterknotens,z.b. "raten" oder "betragParamConditions"
* @param {betrag} der Betrag für den der Hashname ermittelt werden soll (optional; wenn nicht angegeben, ermittle selbständig den betrag aus den Einstellungen)
* @return Das Limit innerhalb der Konfiguration, das für diesen Betrag ermittelt wurde
**/
TeamBank.RatenRechner.getConfigHashNameForBetrag = function (parentNodeName, betrag) {
   if (!this.config[parentNodeName]) {return("");}
   
   var aktuellerBetrag = this.getBetrag();
   if (arguments.length >= 2) { aktuellerBetrag = betrag;}
   
   var maxLimit = 0;
   for (var limit in this.config[parentNodeName]) {
      maxLimit = Math.max(maxLimit, parseFloat(limit));
      if ((parseFloat(limit) != null) && (parseFloat(limit) >= aktuellerBetrag)) {
	     return(limit);
	  }
   }
   return(maxLimit);
}
		 
   




   
   


   
   




