function parseArray(d,bondClass,stockExType){
	row=1;
	var dataset=new Array();
	while(d[bondClass][stockExType][row]){
		dataset[row]=d[bondClass][stockExType][row];
		row++;
	}
	return(dataset);
}

function defineValues(){
	/* Erl&#239;&#191;&#189;uterung der Datenstruktur:

	d[1] sind die Courtage-Werte f&#239;&#191;&#189;r Aktien, Warrants und Anrechte
	d[2] sind die Courtage-Werte f&#239;&#191;&#189;r Obligationen
	d[3] sind die Courtage-Werte f&#239;&#191;&#189;r Fonds

	Analog dazu gilt:

	Erster Block:
	d[1][1] beinhaltet die Werte f&#239;&#191;&#189;r Aktien, Warrants und Anrechte eingeschr&#239;&#191;&#189;nkt auf die Schweiz, inkl. SMI-Titel und an der SWX kotierte Fonds
	d[1][2] beinhaltet die Werte f&#239;&#191;&#189;r Aktien, Warrants und Anrechte eingeschr&#239;&#191;&#189;nkt auf den Ausland

	Zweiter Block:
	d[2][1] beihaltet die Werte f&#239;&#191;&#189;r die in der Schweiz gehandelten Obligationen, Notes und Schuldscheine
	d[2][2] beihaltet die Werte f&#239;&#191;&#189;r die im Euromarkt und SWX gehandelten Optionen
	d[2][3] beihaltet die Werte f&#239;&#191;&#189;r die im Ausland exkl. virt-x gehandelten Optionen

	Dritter Block:
	d[3][1] beihaltet die Werte f&#239;&#191;&#189;r Geldmarktfonds
	d[3][2] beihaltet die Werte f&#239;&#191;&#189;r Aktienfonds
	d[3][3] beihaltet die Werte f&#239;&#191;&#189;r Obligationenfonds
	d[3][4] beihaltet die Werte f&#239;&#191;&#189;r Strategiefonds Nachhaltige Fonds

	Das Feld [min_web] ist die minimale Courtage bei Online-Handel.
	Das Feld [min_regular] ist die minimale Courtage bei nicht-online-Handel.
	Die Felder [min_web] und [min_regular] m&#239;&#191;&#189;ssen f&#239;&#191;&#189;r alle Bl&#239;&#191;&#189;cke festgelegt werden.
	Die Anzahl Zeilen nummeriert von 1 sind beliebig festlegbar. Die letzte Zeile muss mit Hilfe des Schl&#239;&#191;&#189;sselworts "inf" (siehe Weiter unten im Text) markiert werden.

	Die jeweiligen Prozentwerte sind in den Entsprechenden Bl&#239;&#191;&#189;cken mit einem Index zBsp: d[1][1][1] zu finden, als kommagetrennte Liste.
	Die Afbolge der Eintr&#239;&#191;&#189;ge ist dabei:

	<Kaufwert von>,<Kaufwert bis>,<Courtage>,<Courtage kumuliert>,<Rabatt>

	Bsp:

	1,20000,0.1,0.1,0.34

	Dabei muss <Kaufwert von> immer um eins h&#239;&#191;&#189;her sein, als <Kaufwert bis> der vorhergehenden Zeile.
	Alle Prozentangaben m&#239;&#191;&#189;ssen als reele Zahlen eingegeben werden, also 34% = 0.34.
	Die Markierung, dass keine Weiteren Abstufungen bei der Courtage-Prozents&#239;&#191;&#189;tzen folgt (also die Markierung der letzten Zeile eines Blocks) wird mit dem Schl&#239;&#191;&#189;sselwort "inf" gesetzt.

	So lautet eine G&#239;&#191;&#189;ltige letzte Zeile f&#239;&#191;&#189;r einen Block:

	<Kaufwert von>,inf,<Courtage>,inf,<Rabatt>

	Bsp:

	500001,inf,0.01,inf,0.34

	Das heisst, <Kaufwert bis> und <Courtage kumuliert> m&#239;&#191;&#189;ssen zwingend durch den Schl&#239;&#191;&#189;sselwort "inf" ersetzt werden.

	*/

	var d = new Array();
	d[1]=new Array();
	d[1][1]=new Object();

	d[1][1]['min_web']=40;
	d[1][1]['min_regular']=90;
	d[1][1]['min_courtage_limit']=900;
	d[1][1][1]='1,25000,0.011,0.011,0.34';
	d[1][1][2]='25001,50000,0.01,0.0105,0.34';
	d[1][1][3]='50001,100000,0.008,0.00925,0.34';
	d[1][1][4]='100001,150000,0.006,0.008167,0.34';
	d[1][1][5]='150001,200000,0.004,0.007125,0.34';
	d[1][1][6]='200001,250000,0.003,0.0063,0.34';
	d[1][1][7]='250001,500000,0.002,0.004150,0.34';
	d[1][1][8]='500001,inf,0.001,inf,0.34';

	d[1][2]=new Object();
	d[1][2]['min_web']=75;
	d[1][2]['min_regular']=120;
	d[1][2]['min_courtage_limit']=1200;
	d[1][2][1]='1,25000,0.018,0.018,0.34';
	d[1][2][2]='25001,50000,0.015,0.0165,0.34';
	d[1][2][3]='50001,100000,0.0135,0.015,0.34';
	d[1][2][4]='100001,150000,0.0105,0.0135,0.34';
	d[1][2][5]='150001,200000,0.0095,0.0125,0.34';
	d[1][2][6]='200001,250000,0.0075,0.0115,0.34';
	d[1][2][7]='250001,500000,0.0065,0.009,0.34';
	d[1][2][8]='500001,inf,0.004,inf,0.34';

	d[2]=new Array();
	d[2][1]=new Object();
	d[2][1]['min_web']=40;
	d[2][1]['min_regular']=90;
	d[2][1]['min_courtage_limit']=900;
	d[2][1][1]='1,25000,0.008,0.008,0.34';
	d[2][1][2]='25001,50000,0.007,0.0075,0.34';
	d[2][1][3]='50001,100000,0.005,0.00625,0.34';
	d[2][1][4]='100001,150000,0.004,0.0055,0.34';
	d[2][1][5]='150001,200000,0.002,0.004625,0.34';
	d[2][1][6]='200001,inf,0.001,inf,0.34';

	d[2][2]=new Object();
	d[2][2]['min_web']=75;
	d[2][2]['min_regular']=120;
	d[2][2]['min_courtage_limit']=1200;	
	d[2][2][1]='1,25000,0.009,0.009,0.34';
	d[2][2][2]='25001,50000,0.008,0.0085,0.34';
	d[2][2][3]='50001,100000,0.006,0.00725,0.34';
	d[2][2][4]='100001,150000,0.005,0.0065,0.34';
	d[2][2][5]='150001,200000,0.002,0.005375,0.34';
	d[2][2][6]='200001,inf,0.001,inf,0.34';

	/* Fonds */
	d[3] = new Array();
	/* Geldmarktfonds */
	d[3][1]=new Object();
	d[3][1]['coop']=0.004;
	d[3][1]['coopWeb']=0.66; // 34% of regular funds
	d[3][1]['thirdParty']=0.009;
	d[3][1]['thirdPartyWeb']=0.66; // 34% of regular funds
	/* Aktienfonds */
	d[3][2]=new Object();
	d[3][2]['coop']=0.0175;
	d[3][2]['coopWeb']=0.66; // 34% of regular funds
	d[3][2]['thirdParty']=0.025;
	d[3][2]['thirdPartyWeb']=0.66; // 34% of regular funds
	/* Obligationenfonds */
	d[3][3]=new Object();
	d[3][3]['coop']=0.01;
	d[3][3]['coopWeb']=0.66; // 34% of regular funds	
	d[3][3]['thirdParty']=0.015;
	d[3][3]['thirdPartyWeb']=0.66; // 34% of regular funds	
	/* Strategiefonds Nachhaltige Fonds */
	d[3][4]=new Object();
	d[3][4]['coop']=0.02;
	d[3][4]['coopWeb']=0.66; // 34% of regular funds	
	d[3][4]['thirdParty']=0.025;
	d[3][4]['thirdPartyWeb']=0.66; // 34% of regular funds	
	
	return(d);
}

function calculateFunds(amount, stockExType) {
	d=defineValues();
	coopFund = parseFloat(amount) * parseFloat(d[3][parseInt(stockExType)]['coop']);
	coopFundWeb = parseFloat(coopFund) * parseFloat(d[3][parseInt(stockExType)]['coopWeb']);
	thirdPartyFund = parseFloat(amount) * parseFloat(d[3][parseInt(stockExType)]['thirdParty']);
	thirdPartyFundWeb = parseFloat(thirdPartyFund) * parseFloat(d[3][parseInt(stockExType)]['thirdPartyWeb']);
	return coopFund+','+coopFundWeb+','+thirdPartyFund+','+thirdPartyFundWeb;
}

function calculateCourtage(amount,bondClass,stockExType){
/*	minCourtageLimit = 900;*/
	d=defineValues();
	origAmount=amount;
	totalCourtage=0;
	totalCourtageWeb=0;
	accountedFor=0;
	maxVal=0;
	finalVal=-1;
	rates=parseArray(d,bondClass,stockExType);
	rateLen=rates.length;
	for(i=1;i<rateLen;i++){
		var rateParts=rates[i].split(',');
		if(rateParts[1]=='inf' && finalVal==-1){
			finalVal=parseFloat(amount)-parseFloat(maxVal);
			// alert(finalVal+' plus '+rateParts[2]+' % end');
			totalCourtage+=parseFloat(finalVal)*parseFloat(rateParts[2]);
			totalCourtageWeb+=(parseFloat(finalVal)*parseFloat(rateParts[2]))*(1-parseFloat(rateParts[4]));
		}else{
			if(parseFloat(origAmount)-parseFloat(rateParts[1])>0){
				// alert(rateParts[1]+' plus '+rateParts[2]+' %');
				totalCourtage+=(parseFloat(rateParts[1])-parseFloat(rateParts[0])+1)*parseFloat(rateParts[2]);
				totalCourtageWeb+=((parseFloat(rateParts[1])-parseFloat(rateParts[0])+1)*parseFloat(rateParts[2]))*(1-parseFloat(rateParts[4]));
				maxVal=rateParts[1];
			}
			if(parseFloat(origAmount)-parseFloat(rateParts[1])<=0 && finalVal==-1){
				finalVal=parseFloat(amount)-parseFloat(maxVal);
				// alert(finalVal+' plus '+rateParts[2]+' % end');
				totalCourtage+=parseFloat(finalVal)*parseFloat(rateParts[2]);
				totalCourtageWeb+=(parseFloat(finalVal)*parseFloat(rateParts[2]))*(1-parseFloat(rateParts[4]));
			}
		}
	}

	// if courtage is below allowed minimum, use it.
	minCourtageRegular=d[bondClass][stockExType]['min_regular'];
	minCourtageWeb=d[bondClass][stockExType]['min_web'];
	
	if(totalCourtage<minCourtageRegular){
		if(parseFloat($F('myMoney'))<=d[bondClass][stockExType]['min_courtage_limit']){
			totalCourtage=0.1*parseFloat($F('myMoney'));
		}else{
			totalCourtage=minCourtageRegular;
		}
	}
	if(totalCourtageWeb<minCourtageWeb){
		if(0.1*parseFloat($F('myMoney'))<=minCourtageWeb){
			totalCourtageWeb=0.1*parseFloat($F('myMoney'));
		}else{
			totalCourtageWeb=minCourtageWeb;
		}
	}
	return(totalCourtage+','+totalCourtageWeb);
}

function formatNumber(Number,Decimals){
 Number = "" + Number
 Decimals = "" + Decimals
 var OriginalNumber = Number
 var Sign = 1
 var Pad = ""
 var Count = 0
 if(parseFloat(Number)){
  Number = parseFloat(Number)} else {
  Number = 0}
 if((parseInt(Decimals,10)) || (parseInt(Decimals,10) == 0)){
  Decimals = parseInt(Decimals,10)} else {
  Decimals = 2}
 if(Number < 0){
  Sign = -1
  Number *= Sign
 }
 if(Decimals < 0)
  Decimals *= -1
 Number = "" + Math.floor(Number * Math.pow(10,Decimals + 1) + 5)
 if((Number.substring(1,2) == '.')||(Number=='NaN'))
  return(OriginalNumber)
 if(Number.length < Decimals +1)
 {
  for(Count = Number.length; Count <= Decimals; Count++)
   Pad += "0"
 }
 Number = Pad + Number
 if(Decimals == 0){
  Number = Number.substring(0, Number.length -1)} else {
 Number = Number.substring(0,Number.length - Decimals -1) +
          "." +
          Number.substring(Number.length - Decimals -1,
          Number.length -1)}
 if(Sign == -1)
  Number = "-" + Number  // Set sign of number.
 return(Number)
}

function printNiceCourtage(amount,bondClass,stockExType){
	$('price').hide();
	$('price_online').hide();
	$('fundCoop').hide();
	$('fundCoopWeb').hide();	
	$('fundThirdParty').hide();
	$('fundThirdPartyWeb').hide();	
	if (bondClass == 3) {
		courtages = calculateFunds(amount,stockExType);
		var courtageArray = courtages.split(',');
		$('courtageFundCoop').innerHTML = toCurrency(parseFloat(courtageArray[0]))+" CHF";
		$('courtageFundCoopWeb').innerHTML = toCurrency(parseFloat(courtageArray[1]))+" CHF";
		$('courtageFundThirdParty').innerHTML = toCurrency(parseFloat(courtageArray[2]))+" CHF";
		$('courtageFundThirdPartyWeb').innerHTML = toCurrency(parseFloat(courtageArray[3]))+" CHF";
		$('fundCoop').show();
		$('fundCoopWeb').show();
		$('fundThirdParty').show();
		$('fundThirdPartyWeb').show();
	} else {
		courtages = calculateCourtage(amount, bondClass, stockExType);
		var courtageArray = courtages.split(',');
		$('courtageRegular').innerHTML = toCurrency(parseFloat(courtageArray[0]))+" CHF";
		$('courtageWeb').innerHTML = toCurrency(parseFloat(courtageArray[1]))+" CHF";
		$('price').show();
		$('price_online').show();
	}
}

function toCurrency(number) {
	 number = parseFloat(number).toFixed(2);
	 number100 = Math.round(number*100);
	 number100Mod5 = number100 % 5
	 if (number100Mod5 == 0) {
	
	 } else if (number100Mod5 > 2) {
	 number100 += (5-number100Mod5);
	 } else {
	 number100 -= number100Mod5;
	 }
	 return (number100 / 100).toFixed(2);
}

function printNiceCourtageWithMap(amount,bondClass,stockExType){

      $('errorStockExType').innerHTML = '';

      $('errorBondClass').innerHTML = '';

      $('errorIstZahl').innerHTML = '';

      istZahl = Number(amount);

      if((bondClass==0) || (stockExType==0) || (!istZahl)){

            $('price').hide();

            $('price_online').hide();

            $('fundCoop').hide();

            $('fundCoopWeb').hide();            

            $('fundThirdParty').hide();
            
            $('fundThirdPartyWeb').hide();

            

            if(stockExType==0){

                  Error('stockExType');

            }

            if(bondClass==0){

                  Error('bondClass');

            }

            if(!istZahl){

                  Error('istZahl');

            }

            

      }else{

            if(bondClass==3){

                  $('price_online').hide();

            }else{

                  $('price_online').show();

            }

            printNiceCourtage(amount,bondClass,stockExType);

      }

}

 

function Error(type){

      switch (type){

            case 'stockExType':

                  $('errorStockExType').innerHTML = errorMessage['stockExType'];

            break;

            case 'bondClass':

                  $('errorBondClass').innerHTML = errorMessage['bondClass'];

            break;

            case 'istZahl':

                  $('errorIstZahl').innerHTML = errorMessage['istZahl'];

            default:

            break;

      }

}

