  /**
   * Selects one of two values according to the specified 
   * boolean flag indicating wether to choose the first or second.  
   */
  function choose(condition, value1, value2)
  {
    return condition ? value1 : value2;
  }

	/**
	 * Retrieve the earliest of two specified dates.
	 */
	function earliestDate(date1, date2)
	{
		date1 = convertStringToDate(dateString1); 
		date2 = convertStringToDate(dateString1); 
		
		if(date1 == null) return date2;
		if(date2 == null) return date1;

    return date1.getTime() <= date2.getTime() ? date1 : date2;
	}

	/**
	 * Retrieve the latest of two specified dates.
	 */
	function latestDate(date1, date2)
	{
		date1 = convertStringToDate(dateString1); 
		date2 = convertStringToDate(dateString1); 
		
		if(date1 == null) return date2;
		if(date2 == null) return date1;

    return date1.getTime() >= date2.getTime() ? date1 : date2;
	}

	/**
	 * Rundet eine zahl nach unten ab auf den naechsten Integer-Wert.
	 */	
	function floor(number)
	{
		return Math.floor(number);
	}

	/** Formatiert eine gegebene Gleitkommazahl in Waehrungsschreibweise, wobei auf die zweite Nachkommastelle gerundet wird.
	  * @param number Die zu formatierende Zahl. Falls null uebergeben wird, wird 0.0F angenommen.
	  * @return Liefert die uebergebene Zahl im Format x.xxx,xx . Falls null uebergeben wird, wird 0,00 geliefert
	  */
	function formatCurrency(number) 
	{
	    // Saftey first
	    if (number == null)
	    {
			log("formatCurrency(): PARAMETER_IS_NULL");
	        number = 0.0;
	    }
	    
	    number = Math.round(parseFloat(number) * 100.0) / 100.0; // Zweite Nachkommastelle runden

	    var ganz = "" + parseInt(number, 10);
	    var rest = "" + (parseInt(Math.abs(number) * 100.0 + 0.0000000001) % 100); while (rest.length < 2) { rest = "0" + rest; }
	    var out  = "";
	    
	    for (var i=0; i < ganz.length; i++)
	    {
	        out = ganz.charAt(ganz.length-1-i) + out;
	        
	        if ((i%3 == 2) && (i < ganz.length-1)){ out = "." + out; }
	    } 
	    
	    out += "," + rest;
	    
	    return out;
	}
	
	/**
     * like formatCurrency(number) just without floating-point decimals
     */
	function formatCurrencyShort(number) 
	{
	    out = "" + formatCurrency(number);
        return out.substring(0, out.indexOf(','));
	}

	/** @return Rundet eine gegebene Zahl bzgl. einer Basis.
      * @param number Die zu rundende Zahl.
      * @param base   Die Basis (ganzzahlig), bzgl. der gerundet werden soll.
      */
	function round(number, base)
	{
		// Safety first
		if (number == null) { number = 0.0; }
		if (base   == null) { base   = 1; }

		number = parseFloat(number);
		base   = parseInt  (base, 10);

		var out = Math.round(number / base) * base;

		log("round("+number+","+base+"): " + out);
		return out;
	}
	
	/** @return Rundet eine gegebene Zahl bzgl. einer Nachkommastelle.
      * @param number Die zu rundende Zahl.
      * @param base   Die Nachkommastelle (ganzzahlig), bzgl. der gerundet werden soll.
      */
	function mround(number, scale)
	{
		// Safety first
		if (number == null) { number = 0.0; }
		if (scale   == null) { scale   = 0; }

		number = parseFloat(number);
		scale   = parseFloat(scale);
		scale   = Math.pow(10,scale);

		var out = Math.round(number * scale) / scale;

		log("mround("+number+","+scale+"): " + out);
		return out;
	}
	
		/** @return Rundet eine gegebene Zahl bzgl. einer Basis.
      * @param number Die zu rundende Zahl.
      * @param base   Die Basis (ganzzahlig), bzgl. der gerundet werden soll.
      */
	function ceil(number, base)
	{
		// Safety first
		if (number == null) { number = 0.0; }
		if (base   == null) { base   = 1; }

		number = parseFloat(number);
		base   = parseInt  (base, 10);

		var out = Math.ceil(number / base) * base;

		log("ceil("+number+","+base+"): " + out);
		return out;
	}
	
	  /** @return Rundet eine gegebene Zahl auf bzgl. einer Basis und einem Maximalwert.
   * @param number Die zu rundende Zahl.
   * @param base   Die Basis (ganzzahlig), bzgl. der gerundet werden soll.
   * @param max    Wird der Maximalwert (ganzzahlig) Ueberschritten wird dieser Wert zur?ckgegeben.
   */
  function ceilUpperBound(number, base, max)
  {
		// Safety first
		if (number == null) { number = 0.0; }
		if (base   == null) { base   = 1; }
	  if (max    == null) { max    = 0; }

		number = parseFloat(number);
		base   = parseInt  (base, 10);
		max    = parseInt  (max, 10);

		var out = Math.ceil(number / base) * base;
    if (out > max) {
      out = max;
    }

		log("ceilUpperBound("+number+","+base+","+max+"): " + out);
		return out;
  }

    /** @return Liefert ein Array mit den Werten [DD, MM, YYYY]. Ist der uebergebene Paremeter null, so wird null geliefert.
      * @param dateString Der Datums-String, der geparst werden soll. Falls null uebergeben wird, wird null geliefert.
      */
    function getDMY(dateString)
    {
    	// Safety first
    	if (dateString == null) 
    	{
    		log("getDMY(): PARAMETER_IS_NULL");
    		return null;
    	}
    	
			var ds    = String(dateString);
					ds    = ds.split("-");		
			var year  = ds[0]; // xxxx-mm-dd
			var month = ds[1]; // yyyy-xx-dd
			var day   = ds[2]; // yyyy-mm-xx
		    
		    // Validierung
		    var ok    = ( checkInt(year) && checkInt(month) && checkInt(day) );
		    
			var d = parseInt(day,   10);
			var m = parseInt(month, 10);
			var y = parseInt(year,  10);
	
			ok &= (m >= 1) && (m <= 12) && (d >= 1) && (d <= getMonthDays(y)[m-1]);
	
		    if (!ok)
	        { 
	            return null;
	        }
	
			return [ day, month, year ];
    }
    
    /** @return Liefert ein Datum im Format yyyy-mm-dd. Ist einer der uebergebenen Parameter null, so wird null geliefert.
      * @param day
      * @param month
      * @param year
      */
    function getDateString(day, month, year)
    {
    	// Safety first
    	if ((day == null) || (month == null) || (year == null)) 
    	{ 
    		log("getDateString("+day+","+month+","+year+"): PARAMETER_IS_NULL");
    		
    		return null;
    	}
    	
    	var d = String(day);
    	var m = String(month);
    	var y = String(year);

    	if (d.length < 2) { d = "0" + d; }
    	if (m.length < 2) { m = "0" + m; }
    	if (y.length < 4) { y = "0" + y; }

    	return y + "-" + m + "-" + d;
    }
    
    /** Formatiert einen gegebenen DateString in das Format dd.mm.yyyy
      * @param dateString Der zu formatierende DateString 
      */
	function formatDateTime(dateString) 
	{
	    var dmy = getDMY(dateString);
	    
	    if (dmy == null) { return null; }
		
		return dmy[0] + "." + dmy[1] + "." + dmy[2];
	}

    /** @return Liefert das aktuelle Datum im Format yyyy-mm-dd
      */
	function currentDate() {
	 	return convertDateToString(new Date());
	}


	function currentDay() {
		var now = new Date();
		return now.getDate();
	}


	function currentMonth() {
		var now = new Date();
		return now.getMonth()+1;
	}


	function currentYear() {
		var now = new Date();
		return now.getFullYear();
	}
	
	/** 
	  * @param dateString
	  * @return Tag der Woche (1-Montag, 2-Dienstag, ...)
	  */
	function dayOfWeek(dateString){
        var date = convertStringToDate(dateString); if (date == null) { return -1; }
        var day = date.getDay();
	    //alert("'"checkday+ "'"+ checkmonth+ "'" + "'" checkyear+ "'");
//	    var dayDate = new Date();
//	    dayDate.setDate(checkday);
//	    dayDate.setMonth(checkmonth + 1);
//	    dayDate.setYear(checkyear);
//	    var day = dayDate.getDay();
//	    alert('->'+day);
        if (day == null) {day = -1;}
	    return day;
	}
	


	/** Vergleicht zwei gegebene Daten im Format yyyy-mm-dd
	  * @param referenceDate Das Referenzdatum
	  * @param compareDate Das Datum, das mit dem Referenzdatum verglichen werden soll.
	  * @return Liefert einen Wert > 0, falls das Vergleichsdatum groesser als das Referfenzdatum ist, einen Wert < 0 falls das Vergleichsdatum kleiner als das Referfenzdatum ist, und 0 falls die beiden Daten gleich sind. Ist eines der beiden Daten null, so wird ebenfalls 0 geliefert.  
	  */
	function compareDates(referenceDate, compareDate)
	{
		var ref  = convertStringToDate(referenceDate);
		var comp = convertStringToDate(compareDate);

		if ((ref == null) || (comp == null)) { log("compareDates("+referenceDate+","+compareDate+"): ILLEGAL_PARAMETER"); return 0; }
		
		var help = comp.getTime() - ref.getTime();
		
		// Rueckgabewert normieren
		if      (help  > 0) { return  1; }
		else if (help == 0) { return  0; }
		else                { return -1; }
	}

     /**
     * Funktion prueft, ob date1 vor date2 liegt.
     * @param dateString1
     * @param dateString2
     * @return true, wenn date1<date2 sonst false
     */
     
     function dateBefore(dateString1, dateString2) 
     {
				var now  = new Date(); 
				var date = convertStringToDate(dateString1); if (date == null) { return false; }
				
				now.setHours  (0);
				now.setMinutes(0);
				now.setSeconds(0);
				now.setMilliseconds(0);
        return date.getTime() < now.getTime();
		}
     
    /*
		function currentDateBefore(dateString) {
		var now  = new Date(); 
		var date = convertStringToDate(dateString); if (date == null) { return false; }
		
		now.setHours  (0);
		now.setMinutes(0);
		now.setSeconds(0);
		now.setMilliseconds(0);
		                    
		return date.getTime() > now.getTime();
	}


	function currentDateAfter(dateString) {
		var now  = new Date();
		var date = convertStringToDate(dateString); if (date == null) { return false; }
		
		now.setHours  (0);
		now.setMinutes(0);
		now.setSeconds(0);
		now.setMilliseconds(0);
		                    
		return date.getTime() < now.getTime();
	}
	*/
	
	
	/** Ermittelt die Tagesdifferenz zweier Daten. 
	  * @param Das erste Datum im Format YYYY-MM-DD.
	  * @param Das zweite Datum im Format YYYY-MM-DD.
	  * @return Liefert die Anzahl der Tage zwischen den beiden gegebenen Daten. Falls einer der Parameter ungueltig ist, wird 0 geliefert. 
	  */
	function getDifDateDay(startString, endString) {
		var dmy1       = getDMY(startString);
		var dmy2       = getDMY(endString);
		
		if ((dmy1 == null) || (dmy2 == null)) { return 0; }

		var startDay   = parseInt(dmy1[0],10);
		var startMonth = parseInt(dmy1[1],10);
		var startYear  = parseInt(dmy1[2],10);
		var endDay     = parseInt(dmy2[0],10);
		var endMonth   = parseInt(dmy2[1],10);
		var endYear    = parseInt(dmy2[2],10);
		
		var distance   = getDateDistance(startDay, startMonth, startYear, endDay, endMonth, endYear);
		
		return parseInt(distance[0],10);
	}
	
	
	/** Ermittelt die Monatsdifferenz zweier Daten. 
	  * @param Das erste Datum im Format YYYY-MM-DD.
	  * @param Das zweite Datum im Format YYYY-MM-DD.
	  * @return Liefert die Anzahl der vollen Monate zwischen den beiden gegebenen Daten. Falls einer der Parameter ungueltig ist, wird 0 geliefert. 
	  */
	function getDifDateMonth(startString, endString) {
		var dmy1       = getDMY(startString);
		var dmy2       = getDMY(endString);
		
		if ((dmy1 == null) || (dmy2 == null)) { return 0; }

		var startDay   = parseInt(dmy1[0],10);
		var startMonth = parseInt(dmy1[1],10);
		var startYear  = parseInt(dmy1[2],10);
		var endDay     = parseInt(dmy2[0],10);
		var endMonth   = parseInt(dmy2[1],10);
		var endYear    = parseInt(dmy2[2],10);
		
		var distance = getDateDistance(startDay, startMonth, startYear, endDay, endMonth, endYear);
		
		return parseInt(distance[1],10);
	}
	
	
	/** Ermittelt die Jahresdifferenz zweier Daten. 
	  * @param Das erste Datum im Format YYYY-MM-DD.
	  * @param Das zweite Datum im Format YYYY-MM-DD.
	  * @return Liefert die Anzahl der vollen Jahre zwischen den beiden gegebenen Daten. Falls einer der Parameter ungueltig ist, wird 0 geliefert. 
	  */
	function getDifDateYear(startString, endString) {
		var dmy1       = getDMY(startString);
		var dmy2       = getDMY(endString);
		
		if ((dmy1 == null) || (dmy2 == null)) { return 0; }

		var startDay   = parseInt(dmy1[0],10);
		var startMonth = parseInt(dmy1[1],10);
		var startYear  = parseInt(dmy1[2],10);
		var endDay     = parseInt(dmy2[0],10);
		var endMonth   = parseInt(dmy2[1],10);
		var endYear    = parseInt(dmy2[2],10);
		
		var distance = getDateDistance(startDay, startMonth, startYear, endDay, endMonth, endYear);
		
		return parseInt(distance[2],10);
	}
		
	
	/** Ermittelt die Distanz zwischen zwei gegebenen Daten.
      * Ist das zweite Datum kleiner als das erste, so werden negative Werte geliefert.
      *
      * ACHTUNG: Die Funktion unterscheidet sich von getDateDifference() darin, dass
      *          die absolute Anzahl (!) der Tage, Monate bzw. Jahre zwischen den Daten
      *          ausgegeben wird, ohne (!) dass die Tage auf 28-31 begrenzt wird.
      *          Beispiel: 01.01.2000 - 01.03.2001 = [366 + 31 + 28, 11 + 2, 0]
      *
      * @param d1 Der Tag   des kleineren Datums.
      * @param m1 Der Monat des kleineren Datums.
      * @param y1 Das Jahr  des kleineren Datums.
      * @param d2 Der Tag   des groesseren Datums.
      * @param m2 Der Monat des groesseren Datums.
      * @param y2 Das Jahr  des groesseren Datums.
      * @return Liefert Array, das den Abstand der gegebenen Daten im Format [ tage, monate, jahre ] angibt. Ist einer der uebergebenen Parameter null oder ungueltig, wird [ 0, 0, 0 ] geliefert. 
      */
	function getDateDistance(d1, m1, y1, d2, m2, y2)
	{
		// Safety first
		if ( (d1 == null) || (m1 == null) || (y1 == null) || 
			 (d2 == null) || (m2 == null) || (y2 == null) ) 
		{ 
			log("getDateDistance("+d1+","+m1+","+y1+","+d2+","+m2+","+y2+"): PARAMETER_IS_NULL");
			return [ 0, 0, 0 ]; 
		}
		if ((m1 < 1) || (m1 > 12) || (m2 < 1) || (m2 > 12))
		{
			log("getDateDistance("+d1+","+m1+","+y1+","+d2+","+m2+","+y2+"): ILLEGAL_PARAMETER");
			return [ 0, 0, 0 ]; 
		}
		
		var ddiff = 0;
		var mdiff = 0;
		var ydiff = 0;
		var h     = 0;
		var i     = 0;
		var days  = null;
		var out   = null;
		
		d1 = parseInt(d1, 10);
		m1 = parseInt(m1, 10);
		y1 = parseInt(y1, 10);
		d2 = parseInt(d2, 10);
		m2 = parseInt(m2, 10);
		y2 = parseInt(y2, 10);
		
		var factor = 1; // Indikator, dass (Datum_2 < Datum_1)
		
		if (  (y2 < y1)                ||
		     ((y2 == y1) && (m2 < m1)) ||
		     ((y2 == y1) && (m2 == m1) && (d2 < d1))
		   )  
		{	
			// (Datum_2 < Datum_1) -> vertauschen
			h = y1; y1 = y2; y2 = h;
			h = m1; m1 = m2; m2 = h;
			h = d1; d1 = d2; d2 = h;
			
			factor = -1;
		}
		
		days = getMonthDays(y1);
		
		if (y1 == y2)
		{
			if (m1 == m2) 
			{ 
				ddiff = d2 - d1; 
			}
			else
			{
				ddiff += days[m1-1] - d1;      // verbleibende Tage von m1
	
				for (i=m1+1; i < m2; i++)      // Monate zwischen (!=) m1 und m2
				{
					ddiff += days[i-1];
					mdiff++;
				}

    			if (d1 <= d2) { mdiff++; }
				
				ddiff += d2;                   // Tage von m2
			}
		}
		else
		{
			ddiff += days[m1-1] - d1;          // verbleibende Tage von m1
			
			for (i=m1+1; i <= 12; i++)         // verbleibende Monate von y1
			{
				ddiff += days[i-1];
				mdiff++;
			}
	
			for (i=y1+1; i < y2; i++)          // Jahre zwischen (!=) y1 und y2
			{
				ddiff += 365;
				mdiff += 12;
				
				if (isSchaltjahr(i)) 
				{ 
					ddiff++; 
				}
			}
			
			days = getMonthDays(y2);
			
			for (i=1; i < m2; i++)             // Monate zwischen Januar und (!=) m2
			{
				ddiff += days[i-1];
				mdiff++;
			}

			if (d1 <= d2) { mdiff++; }
	
			ydiff += parseInt(mdiff / 12, 10);
			
			ddiff += d2;                       // Tage von m2
		}
		
		out = [ ddiff * factor, mdiff * factor, ydiff * factor ];

		return out;
	}
	
	
	/** Bestimmt die Anzahl der Tage je Monat fuer ein gegebenes Jahr.
      * @param year Das Jahr, fuer das die Monatstage bestimmt werden sollen.
      * @return Liefert ein Array mit den Tagen je Monat des gegebenen Jahres.
      */
	function getMonthDays(year)
	{
		var max_day = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
		if (isSchaltjahr(year)) { max_day[1]++; }

		return max_day;
	}
	
	
	/** Bestimmt, ob es sich bei einem gegebenen Jahr um ein Schaltjahr handelt.
      * @param year Das Jahr, das geprueft werden soll. Wird null uebergeben, so wird false geliefert.
      * @return Liefert true, falls es sich um ein Schaltjahr handelt. Andernfalls wird false geliefert.
      */
	function isSchaltjahr(year)
	{
		// Safety first
		if (year == null) 
		{ 
			log("isLeapYear(): PARAMETER_IS_NULL");
			return false;
		}

		year = parseInt(year, 10);

		return ((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0);
	}
	
	
	/** Konvertiert einen DateString in ein Date-Objekt
	  * @param dateString Der zu konvertierende DateString im Format YYYY-MM-DD. 
	  * @return Liefert ein Date-Objekt. Wurde null oder ein ungueltiger Parameter uebergeben, so wird null geliefert.
	  */
	function convertStringToDate(dateString) {
		var dmy  = getDMY(dateString);
		if (dmy == null) { return null; }

		return new Date(parseInt(dmy[2],10),
		                parseInt(dmy[1],10)-1, 
		                parseInt(dmy[0],10), 0, 0, 0, 0);
	}

    /** @return Liefert ein Datum im Format yyyy-mm-dd. Ist der uebergebene Parameter null, so wird null geliefert.
     * @param cal Das zu formatierenden Datum.
     */
    function convertDateToString(cal) 
    {
    	var day   = 0;
    	var month = 0;
    	var year  = 0;
    	
    	if (cal == null)
    	{
    		log("convertDateToString: PARAMETER_IS_NULL");
    		return null;
    	}

        day   = cal.getDate();
        month = cal.getMonth()+1;
        year  = cal.getFullYear();
    	
    	return getDateString(day, month, year);
    }
    
    /** Berechnet das versicherungstechnische Alter einer Person
      * zu einem gegebenen Versicherungsbeginn-Zeitpunkt unter
      * Beruecksichtigung der Halbjaehrigkeit.
      * @param v        Datum des Versicherungsbeginns
      * @param g        Geburtsdatum
      * @param halbjahr Flag, ob die Halbjahresregelung greifen soll (true) oder nicht (false). 
      * @return Liefert das versicherungstechnische Alter einer Person. Ist einer der Parameter null, so wird 0 geliefert.
      */
    function getInsuranceAge(v, g, halbjahr)
    {
		var dmyV = getDMY(v);
		var dmyG = getDMY(g);

		if ((dmyV == null) || (dmyG == null)) { return 0; } // Urspruenglich eine zeitlang 64? !!!

		return getInsuranceAgeDMY(parseInt(dmyV[0], 10), 
				                      parseInt(dmyV[1], 10), 
				                      parseInt(dmyV[2], 10), 
				                      parseInt(dmyG[0], 10), 
				                      parseInt(dmyG[1], 10), 
				                      parseInt(dmyG[2], 10), 
				                      halbjahr);
    }
    
    /** Berechnet das versicherungstechnische Alter einer Person
      * zu einem gegebenen Versicherungsbeginn-Zeitpunkt unter
      * Beruecksichtigung der Halbjaehrigkeit.
      * @param vt Tag   des Versicherungsbeginns
      * @param vm Monat des Versicherungsbeginns
      * @param vj Jahr  des Versicherungsbeginns
      * @param gt Tag   des Geburtsdatums
      * @param gm Monat des Geburtsdatums
      * @param gj Jahr  des Geburtsdatums
      * @param halbjahr Flag, ob die Halbjahresregelung greifen soll (true) oder nicht (false). Dieser Parameter ist optional - der Default ist true. 
      * @return Liefert das versicherungstechnische Alter einer Person. Ist einer der Parameter null, so wird 0 geliefert.
      */
    function getInsuranceAgeDMY(vt, vm, vj, gt, gm, gj, halbjahr)
    {	

    	// Saftey first
    	if ( (vt == null) || (vm == null) || (vj == null) ||
    		 (gt == null) || (gm == null) || (gj == null) ) 
    	{ 
			log("getInsuranceAge("+vt+","+vm+","+vj+","+gt+","+gm+","+gj+","+halbjahr+"): PARAMETER_IS_NULL");
    		return 0; 
    	}
    	
    	vt = parseInt(vt, 10);
    	vm = parseInt(vm, 10);
    	vj = parseInt(vj, 10);
    	gt = parseInt(gt, 10);
    	gm = parseInt(gm, 10);
    	gj = parseInt(gj, 10);
    
    	if (typeof halbjahr == 'undefined')
    	{
    		halbjahr = true;
    	}
    	
    	var out = vj - gj;
    	if (halbjahr)
    	{
    		// Wenn der Monat des Geburtsdatums nach dem Monat des Versicherungsbeginns liegt, wird ein Jahr abgezogen. 
    		if (gm > vm) {out--};
    		
    		// Da der Versicherungsbeginn bei Halbjaehrigkeit 
    		// immer der erste eines Monats ist, werden die 
    		// Tage nicht beruecksichtigt
    		var delta_m = vm - gm;
    		if (delta_m < 0) { delta_m +=12; }
    		if (delta_m > 6) { out++; }
    	}
			else
			{
				if((gm > vm) ||  (gm == vm && gt > vt)) 
				{
					out--;
				}
			}
		return out;
    }
    
	/** Berechnet das kleinste erlaubte zurueckliegende Datum.
      * @param offset     Das Offset, das rueckdatiert werden darf.
      * @param offsetBase Die Basis des Offsets. Zugelassene Werte sind "months" und "days".
      * @param jahreswechsel_erlaubt Flag, ob ein Jahreswechsel erlaubt ist (true) oder nicht (false).
      * @param dateString Das Datum, ab dem die Rueckdatierung erfolgen soll im Format YYYY-MM-DD.
      * @param fix_t      Angabe eines vorgegebenen Tag des Versicherungsbeginns fuer die Ermittlung der Datumsuntergrenze. Dieser Parameter ist optional.
      *                   Bei Angabe eines Wertes <= 0 wird dieser Parameter ignoriert, andernfalls wird er fuer den Tag der Datumsuntergrenze genutzt.
      * @return Liefert das gewuenschte Datum als Date-Objekt. Ist einer der erforderlichen Parameter null, so wird null geliefert.
      */
    function getMinDate(offset, offsetBase, jahreswechsel_erlaubt, dateString, fix_day)
    {
        var dmy  = getDMY(dateString); if (dmy == null) { return null; }
        var date = getMinDateDMY(offset, offsetBase, jahreswechsel_erlaubt, dmy[0], dmy[1], dmy[2], fix_day);
        return convertDateToString(date);
    }
    
	/** Berechnet das kleinste erlaubte zurueckliegende Datum.
      * @param offset     Das Offset, das rueckdatiert werden darf.
      * @param offsetBase Die Basis des Offsets. Zugelassene Werte sind "months" und "days".
      * @param jahreswechsel_erlaubt Flag, ob ein Jahreswechsel erlaubt ist (true) oder nicht (false).
      * @param d       Der Tag,   ab dem das zurueckliegende Datum berechnet werden soll. Dieser Parameter ist optional. Der Default ist das aktuelle Datum.
      * @param m       Der Monat, ab dem das zurueckliegende Datum berechnet werden soll. 
      *                Dieser Parameter ist optional - muss jedoch gesetzt werden, falls t gesetzt wurde.
      * @param y       Das Jahr,  ab dem das zurueckliegende Datum berechnet werden soll.
      *                Dieser Parameter ist optional, - muss jedoch gesetzt werden, falls t gesetzt wurde.  
      * @param fix_day Angabe eines vorgegebenen Tag des Versicherungsbeginns fuer die Ermittlung der Datumsuntergrenze. Dieser Parameter ist optional.
      *                Bei Angabe eines Wertes <= 0 wird dieser Parameter ignoriert, andernfalls wird er fuer den Tag der Datumsuntergrenze genutzt.
      * @return Liefert das gewuenschte Datum als Calendar-Objekt. Ist einer der erforderlichen Parameter null, so wird null geliefert.
      */
    function getMinDateDMY(offset, offsetBase, jahreswechsel_erlaubt, d, m, y, fix_day)
    {
    	// Saftey first
		if (    (offset     == null)
		     || (offsetBase == null)
    	     || (jahreswechsel_erlaubt == null)  
    		 || ((d != null) && ((m == null) || (y == null))) 
    	   )  
    	{ 
    		log("getMinDate("+offset+","+offsetBase+","+jahreswechsel_erlaubt+","+d+","+m+","+y+","+fix_day+",): PARAMETER_IS_NULL");
    		return null;
    	}

        // Safety first	    
        if (typeof fix_day == "undefined") { fix_day = 0; } 
        else                               { fix_day = parseInt(fix_day, 10); }
    
    	var error = ((typeof d == "undefined") || (typeof m == "undefined") || (typeof y == "undefined"));

        offset = parseInt(offset, 10);
    	d      = parseInt(d, 10);
    	m      = parseInt(m, 10);
    	y      = parseInt(y, 10);
    	
    	error |= (d == 0) || (m == 0) || (y == 0);

        if (error)
    	{
    		var now = new Date();
    
    		d = now.getDate();
    		m = now.getMonth()+1;
    		y = now.getFullYear();
    	}
    	
    	var date = new Date(y, m-1, d, 0, 0, 0); 
    	
    	if (offsetBase == "days")
    	{
    	    // Tage abziehen
    	    date.setDate(date.getDate() - offset);
    	}
    	else if (offsetBase == "months")
    	{
        	// Monate abziehen
        	date.setMonth(date.getMonth() - offset);
        }
    	else
    	{
			log("getMinDate("+offset+","+offsetBase+","+jahreswechsel_erlaubt+","+d+","+m+","+y+","+fix_day+"): ILLEGAL_PARAMETER");
			return null;
    	}
            	
    	// Jahreswechsel pruefen
    	if ((date.getFullYear() < y) && !jahreswechsel_erlaubt)
    	{
    	    date.setFullYear(y);
    	    date.setMonth(0);
    	    date.setDate(1); d = 1;
    	}

    	// Festen Tag setzen
    	if (fix_day != 0) 
    	{
    	    d = date.getDate();
        	if      (d < fix_day) { date.setDate(fix_day); }
        	else if (d > fix_day) { date.setDate(fix_day); date.setMonth(date.getMonth()+1); }
    	}

    	return date;
    }
    
    
    /** Berechnet das groesste erlaubte voranliegende Datum.
      * @param offset     Das Offset, das vordatiert werden darf.
      * @param offsetBase Die Basis des Offsets. Zugelassene Werte sind "months" und "days".
      * @param jahreswechsel_erlaubt Flag, ob ein Jahreswechsel erlaubt ist (true) oder nicht (false).
      * @param dateString Das Datum, ab dem die Vordatierung erfolgen soll im Format YYYY-MM-DD.
      * @param fix_t      Angabe eines vorgegebenen Tag des Versicherungsbeginns fuer die Ermittlung der Datumsuntergrenze. Dieser Parameter ist optional.
      *                   Bei Angabe eines Wertes <= 0 wird dieser Parameter ignoriert, andernfalls wird er fuer den Tag der Datumsuntergrenze genutzt.
      * @return Liefert das gewuenschte Datum als Date-Objekt. Ist einer der erforderlichen Parameter null, so wird null geliefert.
      */
    function getMaxDate(offset, offsetBase, jahreswechsel_erlaubt, dateString, fix_day)
    {
        var dmy  = getDMY(dateString); if (dmy == null) { return null; }
        var date = getMaxDateDMY(offset, offsetBase, jahreswechsel_erlaubt, dmy[0], dmy[1], dmy[2], fix_day);
        return convertDateToString(date);
    }
    
    /** Berechnet das groesse erlaubte voranliegende Datum.
      * @param offset     Das Offset, das vordatiert werden darf.
      * @param offsetBase Die Basis des Offsets. Zugelassene Werte sind "months" und "days".
      * @param jahreswechsel_erlaubt Flag, ob ein Jahreswechsel erlaubt ist (true) oder nicht (false).
      * @param d       Der Tag,   ab dem das voranliegende Datum berechnet werden soll. Dieser Parameter ist optional. Der Default ist das aktuelle Datum.
      * @param m       Der Monat, ab dem das voranliegende Datum berechnet werden soll. 
      *                Dieser Parameter ist optional - muss jedoch gesetzt werden, falls t gesetzt wurde.
      * @param y       Das Jahr,  ab dem das voranliegende Datum berechnet werden soll.
      *                Dieser Parameter ist optional, - muss jedoch gesetzt werden, falls t gesetzt wurde.  
      * @param fix_day Angabe eines vorgegebenen Tag des Versicherungsbeginns fuer die Ermittlung der Datumsuntergrenze. Dieser Parameter ist optional.
      *                Bei Angabe eines Wertes <= 0 wird dieser Parameter ignoriert, andernfalls wird er fuer den Tag der Datumsuntergrenze genutzt.
      * @return Liefert das gewuenschte Datum als Date-Objekt. Ist einer der erforderlichen Parameter null, so wird null geliefert.
      */
    function getMaxDateDMY(offset, offsetBase, jahreswechsel_erlaubt, d, m, y, fix_day)
    {
    	// Saftey first
		if (    (offset     == null)
		     || (offsetBase == null)
    	     || (jahreswechsel_erlaubt == null)  
    		 || ((d != null) && ((m == null) || (y == null))) 
    	   )  
    	{ 
    		log("getMaxDate("+offset+","+offsetBase+","+jahreswechsel_erlaubt+","+d+","+m+","+y+","+fix_day+",): PARAMETER_IS_NULL");
    		return null;
    	}

        // Safety first	    
        if ((typeof fix_day == "undefined") || (fix_day == null)) { fix_day = 0; } 
        else                                                      { fix_day = parseInt(fix_day, 10); }
    
    	var error = ((typeof d == "undefined") || (typeof m == "undefined") || (typeof y == "undefined"));

        offset = parseInt(offset, 10);
    	d      = parseInt(d, 10);
    	m      = parseInt(m, 10);
    	y      = parseInt(y, 10);
    	
    	error |= (d == 0) || (m == 0) || (y == 0);

        if (error)
    	{
    		var now = new Date();
    
    		d = now.getDate();
    		m = now.getMonth()+1;
    		y = now.getFullYear();
    	}
    	
    	var date = new Date(y, m-1, d, 0, 0, 0); 
    	
    	if (offsetBase == "days")
    	{
    	    // Tage addieren
    	    date.setDate(date.getDate() + offset);
    	}
    	else if (offsetBase == "months")
    	{
    	    // Monate addieren
    	    date.setMonth(date.getMonth() + offset);

        	var mo = date.getMonth()+1;
        	if (mo < m) { mo += 12; }
        	if (mo - m > offset) { date.setDate(date.getDate()-1); }  
    	}
    	else
    	{
			log("getMaxDate("+offset+","+offsetBase+","+jahreswechsel_erlaubt+","+d+","+m+","+y+","+fix_day+"): ILLEGAL_PARAMETER");
			return null;
    	}

    	// Festen Tag setzen
    	if (fix_day != 0) 
    	{
    	    d = date.getDate();
        	if      (d > fix_day) { date.setDate(fix_day); }
        	else if (d < fix_day) { date.setDate(fix_day); date.setMonth(date.getMonth()-1); }
    	}

    	// Jahreswechsel pruefen
    	if ((date.getFullYear() > y) && !jahreswechsel_erlaubt)
    	{
    	    date.setFullYear(y);
    	    date.setMonth(11);
    	    if (fix_day == 0) { date.setDate(31); }
    	}

    	return date;
    }

    /** @return Liefert den Tag eines gegebenen Datums als Zahl - also ohne (!) evtl. fuehrende Nullen.
      * @param dateString Das Datum, das verwendet werden soll. Wird null oder ein ungueltig formatiertes Datum uebergeben, so wird 0 geliefert.
      */	
	function getDateDay(dateString)
	{
	    var dmy = getDMY(dateString); if (dmy == null) { return 0; }
	    return parseInt(dmy[0], 10); 
	}

   /** @return Liefert den Monat eines gegebenen Datums als Zahl - also ohne (!) evtl. fuehrende Nullen.
     * @param dateString Das Datum, das verwendet werden soll. Wird null oder ein ungueltig formatiertes Datum uebergeben, so wird 0 geliefert.
     */	
	function getDateMonth(dateString)
	{
	    var dmy = getDMY(dateString); if (dmy == null) { return 0; }
	    return parseInt(dmy[1], 10); 
	}

    /** @return Liefert das Jahr eines gegebenen Datums als Zahl - also ohne (!) evtl. fuehrende Nullen.
      * @param dateString Das Datum, das verwendet werden soll. Wird null uebergeben, so wird 0 geliefert.
      */	
	function getDateYear(dateString)
	{
	    var dmy = getDMY(dateString); if (dmy == null) { return 0; }
	    return parseInt(dmy[2], 10); 
	}
	 
    /** Ermittelt das Default Startdatum
      * @param dateString   Das Datum, fuer das das Defaultdatum bestimmt werden soll im Format YYYY-MM-DD.
      * @param day_offset   Die Anzahl der Tage, die mindestens vordatiert werden soll.
      * @param month_offset Die Anzahl der Monate, die mindestens vordatiert werden soll.
      * @param jahreswechsel_erlaubt Flag, ob ins Folgejahr vordatiert werden darf.
      * @param day_fix      Der Tag, der fest vorgegeben werden soll. Dieser Parameter ist optional.
      * @return Liefert das naechste moegliche Versicherungsstartdatum im Format YYYY-MM-DD. Ist einer der Parameter null oder ungueltig formatiert, so wird null geliefert.
      */
    function getDefaultStartDate(dateString, 
    		                         day_offset, 
    		                         month_offset, 
    		                         jahreswechsel_erlaubt,
    		                         day_fix)
    {
    	// Safety first
    	if (    (day_offset   == null) 
    	     || (month_offset == null) 
    	     || (jahreswechsel_erlaubt == null))
    	{
    		log("getDefaultStartDate(" + dateString  
    				             + "," + day_offset 
    				             + "," + month_offset          
    				             + "," + jahreswechsel_erlaubt 
    				             + "," + day_fix + "): PARAMETER_IS_NULL");
    		return null;
    	}
   
    	dateString = String(dateString);
    	
    	if (dateString == null)
		{
			dateString = convertDateToString(new Date()); 
		}
    	
    	day_offset   = parseInt(day_offset,   10);
    	month_offset = parseInt(month_offset, 10);
    	
    	var dmy = getDMY(dateString); if (dmy == null) { return null; }
    	var d   = parseInt(dmy[0], 10); 
    	var m   = parseInt(dmy[1], 10); 
    	var y   = parseInt(dmy[2], 10);
    	
    	// Saftey first
    	if (d == 0) { return null; }
    	
    	// Offset aufschlagen
    	var cal = new Date(y, m-1, d, 0, 0, 0, 0);
    	cal.setDate (cal.getDate()  + day_offset);   
    	cal.setMonth(cal.getMonth() + month_offset); 
    	
    	
    	// Ggfs auf Folgemonat aufruecken
    	if (day_fix != null) 
    	{
        	day_fix = parseInt(day_fix, 10);
        	if ((day_fix > 0) && (day_fix < d))
        	{
        		cal.setDate(day_fix); 
        		cal.setMonth(cal.getMonth() + 1);
    		  }
    		  else if ((day_fix > 0) && (day_fix > d))
    		  {
         		cal.setDate(day_fix); 
    		  }
    	}
    	
    	y = cal.getFullYear();

    	// Jahreswechsel pruefen
    	var now = new Date();
    	
    	if ( (now.getFullYear() < y) && !jahreswechsel_erlaubt)
    	{
    	    cal.setFullYear(now.getFullYear());
    	    cal.setMonth(11);
    	    if (day_fix == null || parseInt(day_fix, 10) == 0)      
          {  
      	      cal.setDate(31);
      	  }
    	}
    	
    	return convertDateToString(cal);
    }
    
	/** @return Liefert die Anrede in Abhaengigkeit vom gegebenen Geschlecht.
	  * @param sex Das Geschlecht.
	  */
    function getSalutation(sex)
    {
        if      (sex == "weiblich") { return "Frau"; }
        else if (sex == "Firma")    { return "Sehr geehrte Damen und Herren"; }
        else                        { return "Herr"; }
    }
    
	
    //--------------------------------
    // rentengarantiezeit.js
    //--------------------------------
    
	var m_rgz_minZeit  =  2; 
	var m_rgz_minAlter =  0; 
	var m_rgz_maxAlter = 90; 
	var m_rgz_default  =  5;

    //	 Tabellenformat:[ Alter, TGM, TGW, SGM, SGW ] 
    // TGM : tarifliche  Begrenzung maennlich
    // TGW : tarifliche  Begrenzung weiblich
    // SGM : steuerliche Begrenzung maennlich
    // SGW : steuerliche Begrenzung weiblich
	var m_rgz_tab = [ 
	[50, 28, 29, 20, 25], 
	[51, 28, 29, 20, 25], 
	[52, 27, 29, 20, 25], 
	[53, 27, 28, 20, 25], 
	[54, 27, 28, 20, 25], 
	[55, 26, 28, 20, 25], 
	[56, 26, 27, 20, 25], 
	[57, 25, 27, 19, 24], 
	[58, 25, 26, 19, 23], 
	[59, 25, 26, 18, 22], 
	[60, 24, 26, 17, 21], 
	[61, 24, 25, 16, 21], 
	[62, 23, 25, 16, 20], 
	[63, 23, 24, 15, 19], 
	[64, 22, 24, 14, 18], 
	[65, 22, 23, 14, 17], 
	[66, 22, 23, 13, 17], 
	[67, 21, 22, 12, 16], 
	[68, 21, 22, 12, 15], 
	[69, 20, 22, 11, 14], 
	[70, 19, 21, 10, 13], 
	[71, 19, 21, 10, 13], 
	[72, 18, 20, 9, 12], 
	[73, 17, 20, 9, 11], 
	[74, 16, 19, 8, 11], 
	[75, 15, 18, 8, 10], 
	[76, 14, 17, 7, 9], 
	[77, 14, 16, 7, 9], 
	[78, 13, 15, 6, 8], 
	[79, 12, 14, 6, 8], 
	[80, 11, 14, 6, 7], 
	[81, 11, 13, 5, 7], 
	[82, 10, 12, 5, 6], 
	[83, 10, 11, 5, 6], 
	[84, 9,  11, 4, 5], 
	[85, 8,  10, 4, 5], 
	[86, 8,  10, 4, 4], 
	[87, 8,   9, 3, 4], 
	[88, 7,   9, 3, 4], 
	[89, 7,   8, 3, 4], 
	[90, 6,   8, 3, 3] 
	]; 

	/** Liefert eine tarifliche Begrenzung in der Rentengarantiezeit (Retirement guarantee period).
	  * @param alter      Das Versicherungsende-Alter der Person, fuer die die Begrenzung ermittelt werden soll.
	  * @param geschlecht Das Geschlecht der Person, fuer die die Begrenzung ermittelt werden soll.
	  * @return Liefert die gewuenschte Begrenzung. Ist einer der Parameter null, wird 0 geliefert.
	  */
	function getRGPTarifLimit(alter, geschlecht) 
	{ 
	    return getRGPLimit(1, alter, geschlecht); 
	} 

	/** Liefert eine steuerliche Begrenzung in der Rentengarantiezeit (Retirement guarantee period).
	  * @param alter      Das Versicherungsende-Alter der Person, fuer die die Begrenzung ermittelt werden soll.
	  * @param geschlecht Das Geschlecht der Person, fuer die die Begrenzung ermittelt werden soll.
	  * @return Liefert die gewuenschte Begrenzung. Ist einer der Parameter null, wird 0 geliefert.
	  */
	function getRGPTaxLimit(alter, geschlecht) 
	{ 
        return getRGPLimit(3, alter, geschlecht); 
	} 

	/** Liefert eine Begrenzung in der Rentengarantiezeit (Retirement guarantee period).
	  * @param index Tarifliche Begrenzung 1, steuerliche Begrenzung 3
	  * @param alter      Das Versicherungsende-Alter der Person, fuer die die Begrenzung ermittelt werden soll.
	  * @param geschlecht Das Geschlecht der Person, fuer die die Begrenzung ermittelt werden soll.
	  * @return Liefert die gewuenschte Begrenzung. Ist einer der Parameter null, wird 0 geliefert.
	  */
	function getRGPLimit(index, alter, geschlecht) 
	{
//	    var alter = eval(alter.getValue());

		//log("getRGPLimit("+index+","+alter+","+geschlecht+")");
		
		// Safety first
		if ((index == null) || (alter == null) || (geschlecht == null))
		{
			log("getRGPLimit("+index+","+alter+","+geschlecht+"): PARAMETER_IS_NULL");
			return 0;
		}
		if ( ((index != 1) && (index != 3)) || ((geschlecht != "m?nnlich") && (geschlecht != "weiblich")) )
		{
			log("getRGPLimit("+index+","+alter+","+geschlecht+"): ILLEGAL_PARAMETER");
			return 0;
		}
		
		index      = parseInt(index, 10);
		alter      = parseInt(alter, 10);
	    geschlecht = String(geschlecht); 

        if (isNaN(index)) { index =  1; } 
        if (isNaN(alter)) {  alter = 65; } 
        
        if (alter < m_rgz_minAlter) { alter = m_rgz_minAlter; } 
        if (alter > m_rgz_maxAlter) { alter = m_rgz_maxAlter; } 
        
        // Auf Tabelle anpassen 
        if (alter <= 50) { alter  =  0; } 
        else             { alter -= 50; } 
        
        if (geschlecht == "weiblich") { index++; } 
        
        return m_rgz_tab[alter][index]; 
	}

    //--------------------------------
    // Ende rentengarantiezeit.js
    //--------------------------------


	
	//  --------------------------------
	//   sf_rueckstufung.js
	//  --------------------------------

	//	 -------------------------
	//	 Haftpflicht
	//	 -------------------------
    var sf_haftpflicht_table = [
    							[ "M", "M", "M", "M", "M" ],
                            	[ "0", "M", "M", "M", "M" ],
                            	[ "S", "M", "M", "M", "M" ],
                            	[ "1/2", "S", "M", "M", "M" ],
                            	[ "1", "1/2", "0", "M", "M" ],
                            	[ "2", "1/2", "0", "M", "M" ],
                            	[ "3", "1", "S", "M", "M" ],
                            	[ "4", "1", "S", "M", "M" ],
                            	[ "5", "2", "1/2", "M", "M" ],
                            	[ "6", "2", "1/2", "M", "M" ],
                            	[ "7", "3", "1", "S", "M" ],
                            	[ "8", "4", "1", "S", "M" ],
                            	[ "9", "4", "1", "S", "M" ],
                            	[ "10", "4", "1", "S", "M" ],
                            	[ "11", "5", "2", "1/2", "M" ],
                            	[ "12", "5", "2", "1/2", "M" ],
                            	[ "13", "5", "2", "1/2", "M" ],
                            	[ "14", "6", "2", "1/2", "M" ],
                            	[ "15", "6", "2", "1", "M" ],
                            	[ "16", "7", "3", "1", "M" ],
                            	[ "17", "7", "3", "1", "M" ],
                            	[ "18", "10", "4", "2", "M" ],
                            	[ "19", "10", "4", "2", "M" ],
                            	[ "20", "10", "4", "2", "M" ],
                            	[ "21", "10", "4", "2", "M" ],
                            	[ "22", "10", "4", "2", "M" ],
                            	[ "23", "10", "4", "2", "M" ],
                            	[ "24", "10", "4", "2", "M" ],
                            	[ "25", "10", "4", "2", "M" ],
                            	[ "26", "10", "4", "2", "M" ],
                            	[ "27", "10", "4", "2", "M" ],
                            	[ "28", "10", "4", "2", "M" ],
                            	[ "29", "10", "4", "2", "M" ],
                            	[ "30", "10", "4", "2", "M" ],
                            	[ "31", "10", "4", "2", "M" ],
                            	[ "32", "10", "4", "2", "M" ],
                            	[ "33", "10", "4", "2", "M" ],
                            	[ "34", "10", "4", "2", "M" ],
                            	[ "35", "10", "4", "2", "M" ],
                            	[ "36", "10", "4", "2", "M" ],
                            	[ "37", "10", "4", "2", "M" ],
                            	[ "38", "10", "4", "2", "M" ],
                            	[ "39", "10", "4", "2", "M" ],
                            	[ "40", "10", "4", "2", "M" ]                               
							];

    //	 -------------------------
	//	 Haftpflicht Zweitfahrzeug Vorschlagsart = 6 (Bei beiden Fahrzeugen bin ich der alleinige Fahrer.)
	//	 -------------------------
	var sf_haftpflicht_zweitwagen_6_table = [
								["M", "M" ],
                            	["0", "0" ],
                            	["S", "S" ],
                            	["1/2", "1/2" ],
                            	["1", "1" ],
                            	["2", "2" ],
                            	["3", "3" ],
                            	["4", "4" ],
                            	["5", "5" ],
                            	["6", "6" ],
                            	["7", "7" ],
                            	["8", "8" ],
                            	["9", "9" ],
                            	["10", "10" ],
                            	["11", "11" ],
                            	["12", "12" ],
                            	["13", "13" ],
                            	["14", "14" ],
                            	["15", "15" ],
                            	["16", "16" ],
                                ["17", "17" ],
                                ["18", "18" ],
                                ["19", "19" ],
                                ["20", "20" ],
                                ["21", "21" ],
                                ["22", "22" ],
                                ["23", "23" ],
                                ["24", "24" ],
                                ["25", "25" ],
                                ["26", "26" ],
                                ["27", "27" ],
                                ["28", "28" ],
                                ["29", "29" ],
                                ["30", "30" ],
                                ["31", "31" ],
                                ["32", "32" ],
                                ["33", "33" ],
                                ["34", "34" ],
                                ["35", "35" ],
                                ["36", "36" ],
                                ["37", "37" ],
                                ["38", "38" ],
                                ["39", "39" ],
                                ["40", "40" ],
                               ];       
                               
    //	 -------------------------
	//	 Haftpflicht Zweitfahrzeug Vorschlagsart = 7 (Neben mir nutzen weitere Personen ab 25 Jahren das Fahrzeug, die mit mir in hauuslicher Gemeinschaft wohnen.)
	//	 -------------------------
	var sf_haftpflicht_zweitwagen_7_table = [
								["M", "M" ],
                            	["0", "0" ],
                            	["S", "S" ],
                            	["1/2", "1/2" ],
                            	["1", "1" ],
                            	["2", "2" ],
                            	["3", "2" ],
                            	["4", "2" ],
                            	["5", "2" ],
                            	["6", "2" ],
                            	["7", "2" ],
                            	["8", "2" ],
                            	["9", "2" ],
                            	["10", "2" ],
                            	["11", "2" ],
                            	["12", "2" ],
                            	["13", "2" ],
                            	["14", "2" ],
                            	["15", "2" ],
                            	["16", "2" ],
                                ["17", "2" ],
                                ["18", "2" ],
                                ["19", "2" ],
                                ["20", "2" ],
                                ["21", "2" ],
                                ["22", "2" ],
                                ["23", "2" ],
                                ["24", "2" ],
                                ["25", "2" ],
                                ["26", "2" ],
                                ["27", "2" ],
                                ["28", "2" ],
                                ["29", "2" ],
                                ["30", "2" ],
                                ["31", "2" ],
                                ["32", "2" ],
                                ["33", "2" ],
                                ["34", "2" ],
                                ["35", "2" ],
                                ["36", "2" ],
                                ["37", "2" ],
                                ["38", "2" ],
                                ["39", "2" ],
                                ["40", "2" ],
                               ];              
                               
    //	 -------------------------
	//	 Haftpflicht Zweitfahrzeug Vorschlagsart = 8 (Neben mir nutzen weitere Personen unter 25 Jahren das Fahrzeug, die mit mir in hauuslicher Gemeinschaft wohnen.)
	//	 -------------------------
	var sf_haftpflicht_zweitwagen_8_table = sf_haftpflicht_zweitwagen_7_table; // as-1048 soll analog Vorschlagsart 7 laufen
	// [["M", "M" ],["0", "0" ],["S", "S" ],["1/2", "1/2" ],["1", "1/2" ],["2", "1/2" ],["3", "1/2" ],["4", "1/2" ],["5", "1/2" ],["6", "1/2" ],["7", "1/2" ],["8", "1/2" ],["9", "1/2" ],["10", "1/2" ],["11", "1/2" ],["12", "1/2" ],["13", "1/2" ],["14", "1/2" ],["15", "1/2" ],["16", "1/2" ],["17", "1/2" ],["18", "1/2" ],["19", "1/2" ],["20", "1/2" ],["21", "1/2" ],["22", "1/2" ],["23", "1/2" ],["24", "1/2" ],["25", "1/2" ],["26", "1/2" ],["27", "1/2" ],["28", "1/2" ],["29", "1/2" ],["30", "1/2" ],["31", "1/2" ],["32", "1/2" ],["33", "1/2" ],["34", "1/2" ],["35", "1/2" ],["36", "1/2" ],["37", "1/2" ],["38", "1/2" ],["39", "1/2" ],["40", "1/2" ],];                


	//	 -------------------------
	//	 Kasko PKW
	//	 -------------------------
    var sf_kasko_112_table = [
    							["M", "M", "M", "M", "M" ],
                            	["0", "M", "M", "M", "M" ],
                            	["S", "M", "M", "M", "M" ],
                            	["1/2", "0", "M", "M", "M" ],
                            	["1", "S", "M", "M", "M" ],
                            	["2", "1", "0", "M", "M" ],
                            	["3", "1", "S", "M", "M" ],
                            	["4", "2", "S", "M", "M" ],
                            	["5", "2", "1", "0", "M" ],
                            	["6", "3", "1", "0", "M" ],
                            	["7", "4", "1", "0", "M" ],
                            	["8", "4", "1", "0", "M" ],
                            	["9", "5", "2", "0", "M" ],
                            	["10", "6", "2", "0", "M" ],
                            	["11", "6", "2", "S", "M" ],
                            	["12", "7", "2", "S", "M" ],
                            	["13", "8", "2", "S", "M" ],
                            	["14", "8", "3", "S", "M" ],
                            	["15", "9", "4", "S", "M" ],
                            	["16", "9", "4", "S", "M" ],
                            	["17", "9", "5", "S", "M" ],
                            	["18", "10", "6", "1", "M" ],
                            	["19", "11", "6", "1", "M" ],
                            	["20", "12", "7", "1", "M" ],
                            	["21", "13", "8", "1", "M" ],
                            	["22", "14", "8", "1", "M" ],
                            	["23", "15", "9", "1", "M" ],
                            	["24", "15", "9", "1", "M" ],
                            	["25", "15", "9", "1", "M" ],
                            	["26", "15", "9", "1", "M" ],
                            	["27", "15", "9", "1", "M" ],
                            	["28", "15", "9", "1", "M" ],
                            	["29", "15", "9", "1", "M" ],
                            	["30", "15", "9", "1", "M" ],
                            	["31", "15", "9", "1", "M" ],
                            	["32", "15", "9", "1", "M" ],
                            	["33", "15", "9", "1", "M" ],
                            	["34", "15", "9", "1", "M" ],
                            	["35", "15", "9", "1", "M" ],
                            	["36", "15", "9", "1", "M" ],
                            	["37", "15", "9", "1", "M" ],
                            	["38", "15", "9", "1", "M" ],
                            	["39", "15", "9", "1", "M" ],
                            	["40", "15", "9", "1", "M" ]
                             ];

	//	 -------------------------
	//	 Kasko sonst
	//	 -------------------------
	var sf_kasko_sonst_table = [
								["M", "M", "M", "M", "M" ],
                            	["0", "M", "M", "M", "M" ],
                            	["S", "M", "M", "M", "M" ],
                            	["1/2", "0", "M", "M", "M" ],
                            	["1", "S", "M", "M", "M" ],
                            	["2", "S", "M", "M", "M" ],
                            	["3", "1/2", "0", "M", "M" ],
                            	["4", "1/2", "0", "M", "M" ],
                            	["5", "1/2", "0", "M", "M" ],
                            	["6", "1/2", "0", "M", "M" ],
                            	["7", "1/2", "0", "M", "M" ],
                            	["8", "1", "S", "M", "M" ],
                            	["9", "1", "S", "M", "M" ],
                            	["10", "3", "1/2", "0", "M" ],
                            	["11", "4", "1/2", "0", "M" ],
                            	["12", "5", "1/2", "0", "M" ],
                            	["13", "6", "1/2", "0", "M" ],
                            	["14", "7", "1/2", "0", "M" ],
                            	["15", "8", "1", "S", "M" ],
                            	["16", "8", "1", "S", "M" ],
                                ["17", "8", "1", "S", "M" ],
                                ["18", "8", "1", "S", "M" ],
                                ["19", "8", "1", "S", "M" ],
                                ["20", "8", "1", "S", "M" ],
                                ["21", "8", "1", "S", "M" ],
                                ["22", "8", "1", "S", "M" ],
                                ["23", "8", "1", "S", "M" ],
                                ["24", "8", "1", "S", "M" ],
                                ["25", "8", "1", "S", "M" ],
                                ["26", "8", "1", "S", "M" ],
                                ["27", "8", "1", "S", "M" ],
                                ["28", "8", "1", "S", "M" ],
                                ["29", "8", "1", "S", "M" ],
                                ["30", "8", "1", "S", "M" ],
                                ["31", "8", "1", "S", "M" ],
                                ["32", "8", "1", "S", "M" ],
                                ["33", "8", "1", "S", "M" ],
                                ["34", "8", "1", "S", "M" ],
                                ["35", "8", "1", "S", "M" ],
                                ["36", "8", "1", "S", "M" ],
                                ["37", "8", "1", "S", "M" ],
                                ["38", "8", "1", "S", "M" ],
                                ["39", "8", "1", "S", "M" ],
                                ["40", "8", "1", "S", "M" ]
                               ];
                               
                               
    //	 -------------------------
	//	 Kasko Zweitfahrzeug Vorschlagsart = 6 (Bei beiden Fahrzeugen bin ich der alleinige Fahrer.)
	//	 -------------------------
	var sf_kasko_zweitwagen_6_table = [
								["M", "M" ],
                            	["0", "0" ],
                            	["S", "S" ],
                            	["1/2", "1/2" ],
                            	["1", "1" ],
                            	["2", "2" ],
                            	["3", "3" ],
                            	["4", "4" ],
                            	["5", "5" ],
                            	["6", "6" ],
                            	["7", "7" ],
                            	["8", "8" ],
                            	["9", "9" ],
                            	["10", "10" ],
                            	["11", "11" ],
                            	["12", "12" ],
                            	["13", "13" ],
                            	["14", "14" ],
                            	["15", "15" ],
                            	["16", "16" ],
                                ["17", "17" ],
                                ["18", "18" ],
                                ["19", "19" ],
                                ["20", "20" ],
                                ["21", "21" ],
                                ["22", "22" ],
                                ["23", "23" ],
                                ["24", "24" ],
                                ["25", "25" ],
                                ["26", "26" ],
                                ["27", "27" ],
                                ["28", "28" ],
                                ["29", "29" ],
                                ["30", "30" ],
                                ["31", "31" ],
                                ["32", "32" ],
                                ["33", "33" ],
                                ["34", "34" ],
                                ["35", "35" ],
                                ["36", "36" ],
                                ["37", "37" ],
                                ["38", "38" ],
                                ["39", "39" ],
                                ["40", "40" ],
                               ];       
                               
    //	 -------------------------
	//	 Kasko Zweitfahrzeug Vorschlagsart = 7 (Neben mir nutzen weitere Personen ab 25 Jahren das Fahrzeug, die mit mir in hauuslicher Gemeinschaft wohnen.)
	//	 -------------------------
	var sf_kasko_zweitwagen_7_table = [
								["M", "M" ],
                            	["0", "0" ],
                            	["S", "S" ],
                            	["1/2", "1/2" ],
                            	["1", "1" ],
                            	["2", "2" ],
                            	["3", "2" ],
                            	["4", "2" ],
                            	["5", "2" ],
                            	["6", "2" ],
                            	["7", "2" ],
                            	["8", "2" ],
                            	["9", "2" ],
                            	["10", "2" ],
                            	["11", "2" ],
                            	["12", "2" ],
                            	["13", "2" ],
                            	["14", "2" ],
                            	["15", "2" ],
                            	["16", "2" ],
                                ["17", "2" ],
                                ["18", "2" ],
                                ["19", "2" ],
                                ["20", "2" ],
                                ["21", "2" ],
                                ["22", "2" ],
                                ["23", "2" ],
                                ["24", "2" ],
                                ["25", "2" ],
                                ["26", "2" ],
                                ["27", "2" ],
                                ["28", "2" ],
                                ["29", "2" ],
                                ["30", "2" ],
                                ["31", "2" ],
                                ["32", "2" ],
                                ["33", "2" ],
                                ["34", "2" ],
                                ["35", "2" ],
                                ["36", "2" ],
                                ["37", "2" ],
                                ["38", "2" ],
                                ["39", "2" ],
                                ["40", "2" ],
                               ];              
                               
    //	 -------------------------
	//	 Kasko Zweitfahrzeug Vorschlagsart = 8 (Neben mir nutzen weitere Personen unter 25 Jahren das Fahrzeug, die mit mir in hauuslicher Gemeinschaft wohnen.)
	//	 -------------------------
	var sf_kasko_zweitwagen_8_table = sf_kasko_zweitwagen_7_table; // as-1048 soll analog Vorschlagsart 7 laufen
	//	[["M", "M" ],["0", "0" ],["S", "S" ],["1/2", "1/2" ],["1", "1/2" ],["2", "1/2" ],["3", "1/2" ],["4", "1/2" ],["5", "1/2" ],["6", "1/2" ],["7", "1/2" ],["8", "1/2" ],["9", "1/2" ],["10", "1/2" ],["11", "1/2" ],["12", "1/2" ],["13", "1/2" ],["14", "1/2" ],["15", "1/2" ],["16", "1/2" ],["17", "1/2" ],["18", "1/2" ],["19", "1/2" ],["20", "1/2" ],["21", "1/2" ],["22", "1/2" ],["23", "1/2" ],["24", "1/2" ],["25", "1/2" ],["26", "1/2" ],["27", "1/2" ],["28", "1/2" ],["29", "1/2" ],["30", "1/2" ],["31", "1/2" ],["32", "1/2" ],["33", "1/2" ],["34", "1/2" ],["35", "1/2" ],["36", "1/2" ],["37", "1/2" ],["38", "1/2" ],["39", "1/2" ],["40", "1/2" ],];                                                                                              

	/** Ermittelt den zur SF-Klasse passenden Index in der Rueckstufungstabelle.
	  * @param sfklasse Die aktuelle SF-Klasse.
	  * @return Liefert den Index, unter dem in der Tabelle die Rueckstufungsdaten liegen.
	  */
	function getSF_Idx(sfklasse)
	{
		//log("getSF_Idx("+sfklasse+")");
		
		// Safety first
		if ((sfklasse == null) || (typeof sfklasse == 'undefined') || (sfklasse == "_")) 
		{ 
			log("getSF_Idx(): PARAMETER_IS_NULL");
		    return 0; 
		}
		
		if      (sfklasse == "M")   { return 0; }
		else if (sfklasse == "0")   { return 1; }
		else if (sfklasse == "S")   { return 2; }
		else if (sfklasse == "1/2") { return 3; }
		
		if (!checkInt(sfklasse)) 
		{ 
			log("getSF_Idx("+sfklasse+"): ILLEGAL_PARAMETER");
			return 0; 
		}

		return parseInt(sfklasse, 10) + 3;
	}

	/** Ermittelt die SF-Klasse zur Haftpflicht unter Beruecksichtigung der in der Vergangenheit aufgetretenen Schadensfaelle.
	  * @param wkz      Die aktuelle WKZ.
	  * @param schaeden Die Anzahl der in der Vergangenheit aufgetretenen Schadensfaelle.
	  * @param sfklasse Die aktuelle SF-KLasse.
	  * @param jahreswechsel Flag, ob der Versicherungsbeginn nach einem Jahreswechsel erfolgt (true) oder nicht (false).
	  * @return         Liefert die zukuenftige SF-Klasse unter Beruecksichtigung der in der Vergangenheit aufgetretenen Schadensfaelle. Ist einer der uebergebenen Parameter null, so wird ein Leerstring geliefert.
	  */
	function getSFKlasse_Haftpflicht(wkz, schaeden, sfklasse, jahreswechsel)
	{
		//alert("wkz: " + wkz + "\nschaeden: " + schaeden + "\nsfklasse: " + sfklasse + "\njahreswechsel: " + jahreswechsel);
        
		if ((schaeden == null) || (typeof schaeden == 'undefined') || (schaeden == '')) { schaeden = 0; }

		//log("getSFKlasse_Haftpflicht("+wkz+","+schaeden+","+sfklasse+","+jahreswechsel+")"); 
		
		// Safety first
		if ((wkz == null) || (typeof wkz == 'undefined') || (sfklasse == null) || (typeof sfklasse == 'undefined') || (sfklasse == "") || (sfklasse == "_") || (jahreswechsel == null) || (typeof jahreswechsel == 'undefined'))
		{
			log("getSFKlasse_Haftpflicht("+wkz+","+schaeden+","+sfklasse+","+jahreswechsel+"): PARAMETER_IS_NULL");
			return "";
		}
		
		schaeden = parseInt(schaeden, 10);
		
		if      (schaeden < 0) { schaeden = 0; }
		else if (schaeden > 4) { schaeden = 4; }
		
		if ((schaeden == 0) && jahreswechsel) { return getSFKlasse_Schadenfrei(wkz, sfklasse); }
		
		var idx   = getSF_Idx(sfklasse);
		var table = sf_haftpflicht_table;
        
        if (idx >= table.length) { idx = table.length-1; }
		
		return table[idx][schaeden];
	}
	
	/** Ermittelt die SF-Klasse zur Haftpflicht fuer ein Zweitwagen
	  * @param vorschlagsart      Die Vorschlagsart.
	  * @param sfklasse Die aktuelle SF-KLasse.
	  * @return         Liefert die SF-Klasse. Ist einer der uebergebenen Parameter null, so wird ein Leerstring geliefert.
	  */
	function getSFKlasse_Haftpflicht_Zweitwagen(vorschlagsart, sfklasse)
	{
		// Safety first
		if ((vorschlagsart == null) || (typeof vorschlagsart == 'undefined') || (sfklasse == null) || (typeof sfklasse == 'undefined') || (sfklasse == "_") || (sfklasse == ""))
		{
			log("getSFKlasse_Haftpflicht_Zweitwagen "+vorschlagsart+","+sfklasse+"): PARAMETER_IS_NULL");
			return "";
		}
		
		var idx   = getSF_Idx(sfklasse);
		var table = sf_haftpflicht_zweitwagen_6_table; 
		if (vorschlagsart == 7) { table = sf_haftpflicht_zweitwagen_7_table; }
		if (vorschlagsart == 8) { table = sf_haftpflicht_zweitwagen_8_table; }
		
		if (idx >= table.length) { idx = table.length-1; }
		
		return table[idx][1];
	}
	

	/** Ermittelt die SF-Klasse zur Kasko unter Beruecksichtigung der in der Vergangenheit aufgetretenen Schadensfaelle.
	  * @param wkz      Die aktuelle WKZ.
	  * @param schaeden Die Anzahl der in der Vergangenheit aufgetretenen Schadensfaelle.
	  * @param sfklasse Die aktuelle SF-KLasse.
	  * @param jahreswechsel Flag, ob der Versicherungsbeginn nach einem Jahreswechsel erfolgt (true) oder nicht (false).
	  * @return         Liefert die zukuenftige SF-Klasse unter Beruecksichtigung der in der Vergangenheit aufgetretenen Schadensfaelle. Ist einer der uebergebenen Parameter null, so wird ein Leerstring geliefert.
	  */
	function getSFKlasse_Kasko(wkz, schaeden, sfklasse, jahreswechsel)
	{
		if ((schaeden == null) || (typeof schaeden == "undefined") || (schaeden == '')) { schaeden = 0; }

		//log("getSFKlasse_Kasko("+wkz+","+schaeden+","+sfklasse+","+jahreswechsel+")"); 
		
		// Safety first
		if ((wkz == null) || (typeof wkz == 'undefined') || (sfklasse == null) || (typeof sfklasse == 'undefined') || (sfklasse == "") || (sfklasse == "_") || (jahreswechsel == null) || (typeof jahreswechsel == 'undefined'))
		{
			log("getSFKlasse_Kasko"+wkz+","+schaeden+","+sfklasse+","+jahreswechsel+"): PARAMETER_IS_NULL");
			return "";
		}
		
		schaeden = parseInt(schaeden, 10);

		if      (schaeden < 0) { schaeden = 0; }
		else if (schaeden > 4) { schaeden = 4; }
		
		if ((schaeden == 0) && jahreswechsel) { return getSFKlasse_Schadenfrei(wkz, sfklasse); }
		
		var idx   = getSF_Idx(sfklasse);
		var table = sf_kasko_112_table; if (wkz != 112) { table = sf_kasko_sonst_table; }
		
		if (idx >= table.length) { idx = table.length-1; }
		
		return table[idx][schaeden];
	}
	
	/** Ermittelt die SF-Klasse zur Kasko fuer ein Zweitwagen
	  * @param vorschlagsart      Die Vorschlagsart.
	  * @param sfklasse Die aktuelle SF-KLasse.
	  * @return         Liefert die SF-Klasse. Ist einer der uebergebenen Parameter null, so wird ein Leerstring geliefert.
	  */
	function getSFKlasse_Kasko_Zweitwagen(vorschlagsart, sfklasse)
	{
		// Safety first
		if ((vorschlagsart == null) || (typeof vorschlagsart == 'undefined') || (sfklasse == null) || (typeof sfklasse == 'undefined') || (sfklasse == "_") || (sfklasse == ""))
		{
			log("getSFKlasse_Kasko_Zweitwagen "+vorschlagsart+","+sfklasse+"): PARAMETER_IS_NULL");
			return "";
		}
		
		var idx   = getSF_Idx(sfklasse);
		var table = sf_kasko_zweitwagen_6_table; 
		if (vorschlagsart == 7) { table = sf_kasko_zweitwagen_7_table; }
		if (vorschlagsart == 8) { table = sf_kasko_zweitwagen_8_table; }
		
		if (idx >= table.length) { idx = table.length-1; }
		
		return table[idx][1];
	}

	/** Ermittelt die SF-Klasse bei keinen Schaeden in der Vergangenheit.
	  * @param wkz      Die aktuelle WKZ.
	  * @param sfklasse Die aktuelle SF-KLasse.
	  * @param jahreswechsel Flag, ob der Versicherungsbeginn nach einem Jahreswechsel erfolgt (true) oder nicht (false).
	  * @return         Liefert die zukuenftige SF-Klasse. Ist einer der uebergebenen Parameter null, so wird ein Leerstring geliefert.
	  */
	function getSFKlasse_Schadenfrei(wkz, sfklasse)
	{
		//log("getSFKlasse_Schadenfrei("++wkz+","+sfklasse+")"); 
		
		// Safety first
		if ((wkz == null) || (typeof wkz == 'undefined') || (sfklasse == null) || (typeof sfklasse == 'undefined') || (sfklasse == "_"))
		{
			log("getSFKlasse_Schadenfrei"+wkz+","+sfklasse+"): PARAMETER_IS_NULL");
			return "";
		}
		
		// ------------------------------------------
		// Sonderfall: Untere SF-Klassen
		// ------------------------------------------
		if      (sfklasse == "M")   { return 1; }
		else if (sfklasse == "0")   { return 1; }
		else if (sfklasse == "S")   { return 1; }
		else if (sfklasse == "1/2") { return 1; }

		// ------------------------------------------
		// Normalfall: Obere SF-Klassen
		// ------------------------------------------
		var out = parseInt(sfklasse, 10) + 1;
		var max = 1;

		// ------------------------------------------
		// Obere SF-Klassen nach oben "deckeln"
		// ------------------------------------------
		if      (wkz == 112) { max = 40; }
		else if (wkz ==   3) { max = 15; }
		else if (wkz ==  22) { max =  6; }
		else if (wkz ==  12) { max =  6; }
		else if (wkz == 127) { max = 15; }
		else if (wkz == 541) { max =  0; }

		if (out > max ) { out = max; }

		return "" + out;
	}

	//  --------------------------------
	//   Ende sf_rueckstufung.js
	//  --------------------------------

	// ------------------------------------------------------------------------
	// Help functions
	// ------------------------------------------------------------------------
	
function log(text) {
  //alert(text);
  //if(console) console.debug("Function - "+ text);
}

/** Prueft, ob es sich bei einem gegebenen Parameter um eine Zahl handelt.
 * @return Liefert true, falls der Parameter eine Zahl ist. Andernfalls wird false geliefert.
 */
function checkInt(value) {
  var exp = /^[0-9]+/
  return exp.test(value);
}

 // Functions

function openKfzSuche() {
	var hid = eform.models['herstellerId'].getValue();
	var tid = eform.models['typId'].getValue();
	window.open("../../tr/kfzSuche/Search.do?method=getHersteller&hsn=" + hid + "&typid=" + tid, "Fahrzeugtypen", "width=550px,height=450px,left=184,top=247,screenX=184,screenY=247");
}

// This function will only be called in the formular domain
function openKfzSucheFormular() {
	var hid = eform.models['herstellerId'].getValue();
	var tid = eform.models['typId'].getValue();
	window.open("../../tr/kfzSuche/Search.do?method=getHersteller&hsn=" + hid + "&typid=" + tid + "&formular=true", "Fahrzeugtypen", "width=550px,height=450px,left=184,top=247,screenX=184,screenY=247");
}  

function openJobSuche() {
    // Only popup window if occpation description length greater  
    // than 3 characters - is demanded from customer Asstel
    var occupation = eform.models['persondata[0].occupation'].getValue();
    if (null != occupation) {
      if (occupation.length > 3) {
  	    window.open("../job/job.do?method=search&jobname=" + occupation, "Berufsuche", "width=600px,height=450px,left=184,top=247,screenX=184,screenY=247");
  	}
	}
}

function openJobSuche(idx) {
  // Only popup window if occpation description length greater  
  // than 3 characters - is demanded from customer Asstel
  var model = idx == null ? "persondata[0].occupation" : "persondata[" + idx + "].occupation";
  var occupation = eform.models[model].getValue();
  if (null != occupation && idx != null) {
    if (occupation.length > 3) {
	    window.open("../job/job.do?method=search&jobname=" + occupation + "&idx=" + idx, "Berufsuche", "width=600px,height=450px,left=184,top=247,screenX=184,screenY=247");
	  }
	}
  else if (null != occupation) {
    if (occupation.length > 3) {
	    window.open("../job/job.do?method=search&jobname=" + occupation, "Berufsuche", "width=600px,height=450px,left=184,top=247,screenX=184,screenY=247");
  	}
  }
}

function openJobSucheTchibo() {
  // Only popup window if occpation description length greater  
  // than 3 characters - is demanded from customer Asstel
  var occupation = eform.models['persondata[0].occupation'].getValue();
  if (null != occupation) {
      if (occupation.length > 3) {
  	    window.open("../job/job.do?method=search&jobname=" + occupation, "Berufsuche", "width=600px,height=380px,left=184,top=247,screenX=184,screenY=247");
  	}
	}
}

function openJobSucheKranken(idx) {
  // Only popup window if occpation description length greater  
  // than 3 characters - is demanded from customer Asstel
  var idx = idx == null ? "0" : idx;
  var model = "persondata[" + idx + "].occupationName";
  var occupation = eform.models[model].getValue();
  if (null != occupation) {
    //if (occupation.length > 3) {
	    window.open("../../beruf.action?berufSuche=" + occupation + "&idx=" + idx, "Berufsuche", "width=600px,height=420px,left=184,top=247,screenX=184,screenY=247");
	//}
  }
}

function openPrintversion(pageId) {
  window.open("Print"+pageId+".do","Druckansicht","menubar=1,toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizeable=0,width=800,height=498");
}

function openPrintversionDynamic(pageId,formName) {
  window.open("../html/redirectPrintversion.html?pageId="+pageId+"&formName="+formName,"Druckansicht","menubar=1,toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizeable=0,width=800,height=498");
}

function openPrintversionDynamicRedirect() {
	var paramString = location.search;
	var namedValues = paramString.split("&");
	var paramsPage = namedValues[0].split("=");
	var paramsForm = namedValues[1].split("=");
	var pageId = paramsPage[1];
	var formName = paramsForm[1];
	
	initAction = window.opener.document.forms[formName].action;
	initTarget = window.opener.document.forms[formName].target;
	
	window.opener.document.forms[formName].action = "Print" + pageId + ".do";
	window.opener.document.forms[formName].target = "Druckansicht";
	window.opener.document.forms[formName].submit();
	
	window.opener.document.forms[formName].action = initAction;
	window.opener.document.forms[formName].target = initTarget;
}

function disableFields() {
  if(window.name == 'Druckansicht'){
    for(var i = 0; i < document.forms.length; i++){
      if((document.forms[i].action.indexOf('Wizard') + document.forms[i].action.indexOf('partnerkey')) > 0){
        for(var j = 0; j < document.forms[i].elements.length; j++){
          document.forms[i].elements[j].disabled=true;
        }
      }
    }
  }
}

function openPDF() {
  var infowin=window.open("../../FileDownloadAction.do?dummy=contract.pdf", "_blank", "toolbar=no,location=no,directories=no,status=no,scrollbars=no,resizable=yes,dependent=yes,width=480,height=640,left=10,top=10");
  if (null != infowin) {
    infowin.focus();
  }
}

function openPDFDruckantrag(id,trName) {
  var infowin=window.open("../../FileDownloadAction.do?name="+ trName +"-contract" + id, "_blank" + id, "toolbar=no,location=no,directories=no,status=no,scrollbars=no,resizable=yes,dependent=yes,width=480,height=640,left=10,top=10");
  if (null != infowin) {
    infowin.focus();
  }
}

function openPDFInfo(id,trName) {
  var infowin=window.open("../../FileDownloadAction.do?name="+ trName +"-info" + id, "_blank", "toolbar=no,location=no,directories=no,status=no,scrollbars=no,resizable=yes,dependent=yes,width=480,height=640,left=10,top=10");
  if (null != infowin) {
    infowin.focus();
  }
}

function openPDFPreview(id,trName) {
  // Target in blank to force opening in a new window
  var infowin=window.open("../../FileDownloadAction.do?name="+ trName +"-preview" + id, "_blank", "toolbar=no,location=no,directories=no,status=no,scrollbars=no,resizable=yes,dependent=yes,width=480,height=640,left=10,top=10");
  if (null != infowin) {
    infowin.focus();
  }
}

function openPDFPolice(id,trName) {
  // Target in blank to force opening in a new window
  var infowin=window.open("../../FileDownloadAction.do?name="+ trName +"-police" + id, "_blank", "toolbar=no,location=no,directories=no,status=no,scrollbars=no,resizable=yes,dependent=yes,width=480,height=640,left=10,top=10");
  if (null != infowin) {
    infowin.focus();
  }
}
         
function openMultiPDF(id,windowTarget) {
  var infowin=window.open("../../FileDownloadAction.do?name=" + id, windowTarget, "toolbar=no,location=no,directories=no,status=no,scrollbars=no,resizable=yes,dependent=yes,width=480,height=640,left=10,top=10");
  if (null != infowin) {
    infowin.focus();
  }
}

/*function openAdvicesUf() {
  window.open("https://www.asstel.de/apps/tr-uf/pdf/asstel/Schlusserklaerung_Unfall.pdf","TB","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}*/

/*function openAdvicesKranken() {
  window.open("https://www.asstel.de/apps/tr-kanken/pdf/asstel/","TB","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}*/

/*function openAdvicesRs() {
  window.open("https://www.asstel.de/apps/tr-rs/pdf/asstel/hinweise_und_erklaerungen.pdf","TB","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}*/

/*function openAdvicesRr() {
  window.open("https://www.asstel.de/apps/tr-rr/pdf/asstel/Schlusserklaerung_Classic.pdf","TB","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}*/

/*function openAdvicesSchaden() {
  window.open("https://www.asstel.de/apps/tr-schaden/pdf/asstel/Schlusserklaerung.pdf","TB","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}*/

/*function openAdvices() {
  window.open("https://www.asstel.de/apps/tr-kfz/pdf/asstel/Hinweise.pdf","TB","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}*/

/*function openAdvicesLv() {
  window.open("https://www.asstel.de/apps/tr-pr/pdf/asstel/Schlusserklaerung_LV_041207.pdf","TB","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}*/

/*function openTermsConditions() {
  window.open("https://www.asstel.de/apps/tr-kfz/pdf/asstel/Bedingungen_2006.pdf","AKB","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=234,top=247,screenX=234,screenY=247");
}*/

/*function openTermsConditions2008() {
  window.open("http://www.asstel.de/asstel/media/pdf/vers-bed/kfz/bed_kfz_2008.pdf","AKB","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=234,top=247,screenX=234,screenY=247");
}*/

function openDataSecurity(partner,trName) {
  window.open("../../tr/html/" + partner + "/popup-datenschutz.jspx?trName=" + trName,"Datenschutzerklaerung","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=626,height=750,left=184,top=207,screenX=184,screenY=247");
}

function openDataSecurityKranken(partner,trName) {
  window.open("../../tr/html/" + partner + "/popup-datenschutz-kranken.jspx?trName=" + trName,"Datenschutzerklaerung","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=626,height=750,left=184,top=207,screenX=184,screenY=247");
}

/*function openHintDataSecurity() {
  window.open("http://www.asstel.de/asstel/media/pdf/vers-bed/kv2008/hinweise/Erlaeuterungen_und_wichtigen_Hinweise_inkl_Datenschutz.pdf","Hinweise","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}*/

/*function openAccessoryList(partner,trName) {
  window.open("../html/" + partner + "/popup-attachments.jspx?trName=" + trName,"Ausstattung","toolbar=0,location=0,directories=0,status=0,scrollbars=0,resizable=0,width=550,height=432,left=184,top=247,screenX=184,screenY=247");
}*/

function openLeistungsumfang(partner,trName) {
  window.open("../../tr/html/" + partner + "/" + trName + "/popup-leistungsumfang.jspx?trName=" + trName,"Leistungsumfang","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=0,width=600,height=490,left=184,top=247,screenX=184,screenY=247");
}

/*function openLeistungsumfang(partner,trName,variante) {
  window.open("../../tr/html/" + partner + "/" + trName + "/popup-leistungsumfang.jspx?trName=" + trName + "&variante=" + variante,"Leistungsumfang","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=0,width=568,height=490,left=184,top=247,screenX=184,screenY=247");
}*/

function openLeistungsumfangKfz(partner,tarif) {
  if(tarif == 'vergleich' && partner == 'tchibo') {
    window.open("http://www.tchibo.de/is-bin/INTERSHOP.enfinity/eCS/Store/de/-/EUR/TdTchShowTemplate-ShowIt?TemplateId=insurance/tch_de_static_insurance_kfz_popup2.isml","Leistungsumfang","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=0,width=700,height=580,left=184,top=247,screenX=184,screenY=247");
  } else {
    window.open("../../tr/html/" + partner + "/kfz/popup-leistungsumfang.jspx?tarif=" + tarif,"Leistungsumfang","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=0,width=626,height=600,left=184,top=247,screenX=184,screenY=247");
  }
}

function openLeistungsumfangTchiboSchaden(partner,trName) {
  window.open("../html/" + partner + "/" + trName + "/popup-leistungsumfang.jspx?trName=" + trName,"Leistungsumfang","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=0,width=635,height=490,left=184,top=247,screenX=184,screenY=247");
}

/* function openLeistungsumfangTchibo() {
  window.open("http://www.tchibo.de/is-bin/INTERSHOP.enfinity/eCS/Store/de/-/EUR/TdTchShowTemplate-ShowIt?TemplateId=%2finsurance%2ftch_de_static_insurance_kfz_popup2","Ausstattung","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=0,width=626,height=600,left=184,top=247,screenX=184,screenY=247");
}*/

function openLeistungsumfangTchibo2009() {
  window.open("http://www.tchibo.de/is-bin/INTERSHOP.enfinity/eCS/Store/de/-/EUR/TdTchShowTemplate-ShowIt?TemplateId=%2finsurance%2ftch_de_static_insurance_kfz_popup2","Ausstattung","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=0,width=683,height=600,left=10,top=10,screenX=10,screenY=10");    
}

function openWerkstattwahl(partner,trName,variante) {
  window.open("../../tr/html/" + partner + "/popup-werkstattwahl.jspx?trName=" + trName + "&variante=" + variante,"Werkstattwahl","toolbar=0,location=0,directories=0,status=0,scrollbars=0,resizable=0,width=610,height=428,left=184,top=247,screenX=184,screenY=247");
}

function openWerkstattwahlGross(partner,trName,variante) {
  window.open("../../tr/html/" + partner + "/popup-werkstattwahl.jspx?trName=" + trName + "&variante=" + variante,"Werkstattwahl","toolbar=0,location=0,directories=0,status=0,scrollbars=0,resizable=0,width=610,height=580,left=184,top=247,screenX=184,screenY=247");
}

function openRabattschutz(partner,trName,variante) {
  window.open("../../tr/html/" + partner + "/popup-rabattschutz.jspx?trName=" + trName + "&variante=" + variante,"Rabattschutz","toolbar=0,location=0,directories=0,status=0,scrollbars=0,resizable=0,width=610,height=440,left=184,top=247,screenX=184,screenY=247");
}

function openGapDeckung(partner,trName,variante) {
  window.open("../../tr/html/" + partner + "/popup-gapdeckung.jspx?trName=" + trName + "&variante=" + variante,"Rabattschutz","toolbar=0,location=0,directories=0,status=0,scrollbars=0,resizable=0,width=610,height=440,left=184,top=247,screenX=184,screenY=247");
}

function openUnfallhilfe(partner,trName,variante) {
  window.open("../../tr/html/" + partner + "/popup-unfallhilfe.jspx?trName=" + trName + "&variante=" + variante,"Rabattschutz","toolbar=0,location=0,directories=0,status=0,scrollbars=0,resizable=0,width=610,height=440,left=184,top=247,screenX=184,screenY=247");
}

function openInsassenunfall(partner,trName,variante) {
  window.open("../../tr/html/" + partner + "/popup-insassenunfall.jspx?trName=" + trName + "&variante=" + variante,"Rabattschutz","toolbar=0,location=0,directories=0,status=0,scrollbars=0,resizable=0,width=610,height=440,left=184,top=247,screenX=184,screenY=247");
}

function openErkrankungen(partner,variante) {
  window.open("../../tr/html/" + partner + "/popup-kranken-erkrankungen.jspx?variante=" + variante,"Erkrankungen","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=0,width=610,height=550,left=184,top=247,screenX=184,screenY=247");
}

function openZulagenberechtigung(partner) {
  window.open("../../tr/html/" + partner + "/popup-zulagenberechtigung.jspx","Zulagenberechtigung","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=0,width=610,height=750,left=184,top=247,screenX=184,screenY=247");
}

function openAVB() {
  window.open("http://www.asstel.de/asstel/media/pdf/vers-bed/ark/MediTravel_208009p20071025.pdf","AVB","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}
function openProduktinfo() {
  window.open("http://www.asstel.de/asstel/media/pdf/vers-bed/ark/Produktinformationsblatt_20080104_Texte_fuer_MediTravel_S_und_F.pdf","Produktinfo","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}
function openDatenverarbeitung() {
  window.open("http://www.asstel.de/asstel/media/pdf/vers-bed/ark/Merkblatt_zur_Datenverarbeitung.pdf","DATA","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}

function openAVBkez1() {
  window.open("http://www.asstel.de/asstel/media/pdf/vers-bed/kv2008/kez/ABKK_2008_fuer_KEZ_u_MediGroupZ_A_und_S_212660p20071116.pdf","KEZ1","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}
function openAVBkez2() {
  window.open("http://www.asstel.de/asstel/media/pdf/vers-bed/kv2008/kez/KEZ_212662p20071002.pdf","KEZ2","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}
function openProduktinfoKEZ() {
  window.open("http://www.asstel.de/asstel/media/pdf/vers-bed/kv2008/kez/Produktinformationsblatt_20080104_Texte_fuer_KEZ.pdf","Produktinfo","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}
function openHinweiseDatenschutzKEZ() {
  window.open("http://www.asstel.de/asstel/media/pdf/vers-bed/kv2008/hinweise/Erlaeuterungen_und_wichtigen_Hinweise_inkl_Datenschutz.pdf","Produktinfo","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}
function openHinweiseAnzeigepflichtKEZ() {
  window.open("http://www.asstel.de/asstel/media/pdf/vers-bed/kv2008/hinweise/Wichtige_Hinweise_zur_Anzeigepflicht_1.pdf","Produktinfo","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}
function openProduktinfoZahnKombi() {
	  window.open("http://www.asstel.de/asstel/media/pdf/vers-bed/kvz_prophy/tarifinfo_2010.pdf","Produktinfo","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
	}
function openDeckungsumfangTchibo(partner,frName) {
  window.open("../../tr/html/" + partner + "/" + frName + "/popup-leistungsumfang.jspx?frName=" + frName,"Deckungsumfang","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=0,width=626,height=490,left=184,top=247,screenX=184,screenY=247");
}
/* function openBeitragTchibo(partner,frName) {
  window.open("../../tr/html/" + partner + "/" + frName + "/popup-beitragsumfang.jspx?frName=" + frName,"Beitragsumfang","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=0,width=626,height=490,left=184,top=247,screenX=184,screenY=247");
}*/
function openDataSecurityTchibo() {
  window.open("http://www.asstel.de/Tchibo/datenschutzerklaerung.pdf","DATAST","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=500,height=705,left=184,top=247,screenX=184,screenY=247");
}

function openSchlusserklaerung(partner,trName) {
  window.open("../../tr/html/" + partner + "/popup-schlusserklaerung.jspx?trName=" + trName,"Schlusserklaerung","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=626,height=378,left=184,top=207,screenX=184,screenY=247");
}
function openSchadeninfos(partner,variante) {
  window.open("../../tr/html/" + partner + "/popup-schadeninfos.jspx?variante=" + variante,"Schadeninfos","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=1,width=626,height=378,left=184,top=207,screenX=184,screenY=247");
}

function openSchweigepflicht(partner,trName) {
  window.open("../../tr/html/" + partner + "/" + trName + "/popup-schweigepflicht.jspx?trName=" + trName,"Schweigepflicht","toolbar=0,location=0,directories=0,status=0,scrollbars=1,resizable=0,width=620,height=490,left=184,top=247,screenX=184,screenY=247");
}

function playSound(url) {
  if(eplayer && eplayer.startPlaying) {
      eplayer.startPlaying(url);
  }
}

function urlencode(url) {
  if(url == null || url == ""){ return "";}
  return escape(url);
}

function contains(sValue, items) {
  return containEvaluator(sValue, items, ";");
}

function containEvaluator(sValue, items, separator) {
  if(sValue == null || sValue == "")
    return false;
  var itemList = items.split(separator);
  var isRegEx = false;
  for (var i = 0; i < itemList.length; i++) {
    if(itemList[i].indexOf('[idx]') > 0){
      itemList[i] = itemList[i].replace(/\[idx\]/g,'\\[\\d+\\]');
      isRegEx = true;
    } else {
        isRegEx = false;
    }
    if ((itemList[i] == sValue) || (isRegEx && sValue.match(itemList[i])))
      return true;
  }
  return false;
}

/** Liefert eine Zeichkette aus dem gegebenen Array mit dem Attribut name
  * @param list        Array mit Item Objekten
  * @param separator   Trennzeichen
  * @return            Zeichkette
  */
function listToSeperatedString(list, separator) {
    if(list != null){
        var simpleList = new Array();
        for(var i=0; i<list.length; i++){
            simpleList.push(list[i].name)
        }
        return simpleList.join(separator);
    }
    return "";
}

function rrCheck(rObj1,rObj2) {
    valid1 = false;
    valid2 = false;
    for(var i=0; i<rObj1.length; i++){
        if (rObj1[i].checked) valid1 = true;
    }
    for(var j=0; j<rObj2.length; j++){
        if (rObj2[j].checked) valid2 = true;
    }
    if(valid1 && valid2) document.getElementById('vStartValidationField').value='true';
}

// Tabellenformat:[ Alter, Beitrag Mann, Beitrag Frau ]
// Alter 19(Kinder) 20(Jugendliche)
var aamena = [
    [19,6.56,6.56],
    [20,7.24,11.01],
    [21,7.78,11.19],
    [22,7.96,11.66],
    [23,8.14,12.1],
    [24,8.34,12.55],
    [25,8.55,12.98],
    [26,8.76,13.4],
    [27,8.99,13.82],
    [28,9.23,14.21],
    [29,9.47,14.59],
    [30,9.71,14.95],
    [31,9.94,15.31],
    [32,10.16,15.63],
    [33,10.37,15.95],
    [34,10.57,16.24],
    [35,10.77,16.52],
    [36,10.95,16.78],
    [37,11.13,17.02],
    [38,11.31,17.22],
    [39,11.47,17.39],
    [40,11.63,17.55],
    [41,11.8,17.7],
    [42,11.96,17.83],
    [43,12.13,17.95],
    [44,12.3,18.06],
    [45,12.47,18.17],
    [46,12.63,18.25],
    [47,12.79,18.33],
    [48,12.95,18.42],
    [49,13.11,18.49],
    [50,13.26,18.56],
    [51,13.4,18.63],
    [52,13.55,18.7],
    [53,13.7,18.77],
    [54,13.85,18.84],
    [55,13.98,18.92],
    [56,14.12,18.99],
    [57,14.25,19.05],
    [58,14.38,19.13],
    [59,14.51,19.19],
    [60,14.64,19.27],
    [61,14.76,19.33],
    [62,14.88,19.36],
    [63,15,19.38],
    [64,15.11,19.39],
    [65,15.22,19.39],
    [66,15.32,19.39],
    [67,15.43,19.39]
];

// Tabellenformat:[ Alter, Beitrag Mann, Beitrag Frau ]
// Alter 19(Kinder) 20(Jugendliche)
var aamenamvs = [
    [19,6.23,6.23],
    [20,6.88,10.46],
    [21,7.26,10.4],
    [22,7.44,10.87],
    [23,7.62,11.31],
    [24,7.82,11.76],
    [25,8.03,12.19],
    [26,8.24,12.61],
    [27,8.47,13.03],
    [28,8.71,13.42],
    [29,8.95,13.8],
    [30,9.19,14.16],
    [31,9.42,14.52],
    [32,9.64,14.84],
    [33,9.85,15.16],
    [34,10.05,15.45],
    [35,10.25,15.73],
    [36,10.43,15.99],
    [37,10.61,16.23],
    [38,10.79,16.43],
    [39,10.95,16.6],
    [40,11.11,16.76],
    [41,11.28,16.91],
    [42,11.44,17.04],
    [43,11.61,17.16],
    [44,11.78,17.27],
    [45,11.95,17.38],
    [46,12.11,17.46],
    [47,12.27,17.54],
    [48,12.43,17.63],
    [49,12.59,17.7],
    [50,12.74,17.77],
    [51,12.88,17.84],
    [52,13.03,17.91],
    [53,13.18,17.98],
    [54,13.33,18.05],
    [55,13.46,18.13],
    [56,13.6,18.2],
    [57,13.73,18.26],
    [58,13.86,18.34],
    [59,13.99,18.4],
    [60,14.12,18.48],
    [61,14.24,18.54],
    [62,14.36,18.57],
    [63,14.48,18.59],
    [64,14.59,18.6],
    [65,14.7,18.6],
    [66,14.8,18.6],
    [67,14.91,18.6]
];

/** Ermittelt den Beitrag f?r MediNatura.
  * @param age     Das Alter.
  * @param sex     Das Geschlecht 1=Mann 2=Frau.
  * @return        Liefert den entsprechenden Beitrag.
  */
function aamenaBeitrag(age, sex, scope){
    if(age < 16){age = 19;}
    else if(age < 21){age = 20;}
    index = -19 + age;
    if (scope == 'metro'){
    return formatCurrency(aamenamvs[index][sex]);}
    else {
    return formatCurrency(aamena[index][sex]);}
}

function rsBeitrag( singleTarif, zahlweise, 
                    privatBerufRs, verkehrRs, 
                    wohnRs, verkehrRs1Fzg) {
  if (singleTarif != null) {
    if(privatBerufRs && verkehrRs == false) { // Privat- und Berufs-RS mit/ohne Wohn-RS
      if (zahlweise == "jährlich") {
        if (singleTarif) { // Single
          return wohnRs == false ? 143.88 : 190.08;
        } else { // Familie
          return wohnRs == false ? 159.86 : 206.06;
        }
      } else if (zahlweise == "halbjährlich") {
        if (singleTarif) { // Single
          return wohnRs == false ? 74.10 : 97.89;
        } else { // Familie
          return wohnRs == false ? 82.33 : 106.12;
        }            
      } else if (zahlweise == "vierteljährlich") {
        if (singleTarif) { // Single
          return wohnRs == false ? 37.77 : 49.90;
        } else { // Familie
          return wohnRs == false ? 41.96 : 54.09;
        }
      }
    } else if (privatBerufRs && verkehrRs) { // Privat-. Berufs-RS und Verkehr-RS mit/ohne Wohn-RS
      if (zahlweise == "jährlich") {
        if (singleTarif) { // Single
          if(verkehrRs1Fzg) {
            return wohnRs == false ? 189.88 : 236.08;
          } else {
            return wohnRs == false ? 197.46 : 243.66;
          }
        } else { // Familie
          return wohnRs == false ? 219.40 : 265.60;
        }
      } else if (zahlweise == "halbjährlich") {
        if (singleTarif) { // Single
          if(verkehrRs1Fzg) {
            return wohnRs == false ? 97.79 : 121.58;
          } else {
            return wohnRs == false ? 101.69 : 125.48;
          }
        } else { // Familie
          return wohnRs == false ? 112.99 : 136.78;
        }
      } else if (zahlweise == "vierteljährlich") {
        if (singleTarif) { // Single
          if(verkehrRs1Fzg) {
            return wohnRs == false ? 49.85 : 61.98;
          } else {
            return wohnRs == false ? 51.83 : 63.96;
          }
        } else { // Familie
          return wohnRs == false ? 57.59 : 69.72;
        }
      }
    } else if (verkehrRs && privatBerufRs == false) { // Verkehr-RS mit/ohne Wohn-RS
      if (zahlweise == "jährlich") {
        if (singleTarif && verkehrRs1Fzg) { // Single + 1 Fahrzeug
          return 46.00;
        } else { // Familie || Single + alle Fahrzeug
          return 68.00;
        }
      } else if (zahlweise == "halbjährlich") {
        if (singleTarif && verkehrRs1Fzg) { // Single + 1 Fahrzeug
          return 23.69;
        } else { // Familie || Single + alle Fahrzeug
          return 35.02;
        }
      } else if (zahlweise == "vierteljährlich") {
        if (singleTarif && verkehrRs1Fzg) { // Single + 1 Fahrzeug
          return 12.08;
        } else { // Familie || Single + alle Fahrzeug
          return 17.85;
        }
      }
    }
  }
  return 0.0;
}

function oaarkBeitrag(contribution, duration) {
	if (contribution != null && duration != null) {
		if(contribution == 'einzelperson') {
		  switch (duration) {
	        case "6 Wochen":	return "9,12";break;
	        case "7 Wochen":    return "14,40";break;
	        case "8 Wochen":	return "17,28";break;
	        case "9 Wochen":	return "20,16";break;
	        case "10 Wochen":	return "23,04";break;
	        case "11 Wochen":	return "25,92";break;
	        case "12 Wochen":	return "28,80";break;
	        default: return "0";
	      }
		 } else {
		  switch (duration) {
	        case "6 Wochen":	return "22,80";break;
	        case "7 Wochen":    return "28,80";break;
	        case "8 Wochen":	return "34,80";break;
	        case "9 Wochen":	return "40,80";break;
	        case "10 Wochen":	return "46,80";break;
	        case "11 Wochen":	return "52,80";break;
	        case "12 Wochen":	return "58,80";break;
	        default: return "0,00";
		  }
		 }
	}
	return "0,00";
}

/** Ermittelt eine alternative Anzeige fuer die Zahlweise.
  * @param payment basisdata.payment.
  * @param layout  Das Layout 1=Nomen 2=Großschreibung mit 'er' am Ende.
  * @return        Liefert  eine alternative Anzeige fuer die Zahlweise.
  */
function paymentDecorator(payment,layout) {
  if(layout == 1) {
      switch (payment) {
        case "jährlich":        return "Jahr";break;
        case "halbjährlich":    return "Halbjahr";break;
        case "vierteljährlich": return "Vierteljahr";break;
        case "monatlich":       return "Monat";break;
        default: return ""; 
      }
  } else {
      switch (payment) {
        case "jährlich":        return "Jährlicher";break;
        case "halbjährlich":    return "Halbjährlicher";break;
        case "vierteljährlich": return "Vierteljährlicher";break;
        case "monatlich":       return "Monatlicher";break;
        default: return ""; 
      }
  }
}

/** Prueft ob gegebene Daten im Format yyyy-mm-dd innerhalb eines Zeitraums liegen
  * @param referenceDate Das Referenzdatum
  * @param rangeStartDate Das Datum, das den Beginn des Zeitraums markiert.
  * @param rangeEndDate Das Datum, das das Ende des Zeitraums markiert.
  * @return Liefert true, wenn das Referenzdatum innerhalb des Zeitraums liegt, sonst wird false geliefert.  
  */
function isDateInRange(referenceDate, rangeStartDate, rangeEndDate)	{
	if(compareDates(referenceDate, rangeStartDate) <= 0 && compareDates(referenceDate, rangeEndDate) >= 0) {
	    return true;
	}
	return false;
}

function getItemValue(model) {
    return eform.models[model].getCurrentItemName();
}

function replaceValue(model, search, replace) {
    //for (var i = 0; i < searchList.length; i++) {
        var searcher = new RegExp(search,"g");
        //var replacer = replaceList[i];
        model = model.replace(searcher, replace);
    //}
    return model;
}

//jQuery Area
function hiddensubmit(params){
	$.ajax({
		type: "POST",  
		url: $("form.eform").attr("action"),  
		data: params, 
		success: function(){
    		window.location.href = '../../my/dispatch.action?method=store&type=' + $("form.eform").attr("id");
		}
	});
}
$(document).ready(function(){
    $(".buttonOfferDataStorage > input").click(function(event){
        window.location.href = '../../my/dispatch.action?method=store&type=' + $("form.eform").attr("id");
        return false;
    });
    // rounded corners
    if(currentScope == 'asstel' || currentScope == 'metro'){
    	Custom.init();
    }
    /*$(".vcAddressCorrection label").click(function(event){
    	idx = event['originalTarget']['id'];
    	if(typeof idx != 'undefined'){
	    	idx = idx.substring(idx.indexOf('__')+2,idx.indexOf('Field'));
	    	$("#vDecisionKorrektur__"+idx+"Facade").attr("checked", "checked");
    	}
    });
    if(currentPartner == 'ASSTEL'){
    	var urlCityComplete = '/applications/ort.action';
    	// postcode search with related city
	    //$("input[name$='\\].postcode']").autocomplete(
	    $("input[name$='hausratRisikoortPostcode']").autocomplete(
	    	urlCityComplete,
	    	{	matchContains:false,
	    		max:15,
	    		width:250,
	    		formatItem:function(item){
	    			return item[0] + ' ' + item[1];
	    		},
	    		formatResult:function(item){
	    			return item[0];
	    		}
	    	}
	    	).result(function(event, data, formatted){
	          //inputCity = this.name.substring(0,this.name.indexOf('.')+1) + 'city';
	          //if($("input[name='"+ inputCity +"']").val()=='')
	        	  //$("input[name='"+ inputCity +"']").val(data[1]);
	        }
	      )
	    ;
	    // city search with related postcode
	    $("input[name$='\\].city']").autocomplete(
	    	urlCityComplete,
	    	{	matchContains:true,
	    		max:15,
	    		width:250,
	    		formatItem:function(item){
	    			return item.postcode + ' ' + item.city;
	    		},
	    		formatResult:function(item){
	    			return item.city;
	    		}
	    	}
	    	).result(function(event, data, formatted){
	    		inputPostcode = this.name.substring(0,this.name.indexOf('.')+1) + 'postcode';
	    		if($("input[name='"+ inputPostcode +"']").val()=='')
	    			$("input[name='"+ inputPostcode +"']").val(data.postcode);
	        }
	      )
	    ;
    }*/
});
