//	controller.js v 1.0 
//	Lars N. 12.12.2002
//	Redigert av H&aring;vard K. B. januar 2003
//  Støtte for standard mode av Dan L. H. juli 2008

var beregningsData = new Object(); // Objekt som holder alle inndata til beregningen

//-------------------------------------------------------------------------------------------------
// "Public" funksjoner.
//

// Denne metoden kj&oslash;res hver gang HTML-siden lastes inn i nettleseren
function controller_bodyOnload() {

	// Initierer modellen.
	model_init();
	
	// Sjekker at view'et inneholder alle felter som er p&aring;krevd.
	var felterSomMangler = new Array();
	sjekkOmAlleFelterErTilstede(felterSomMangler);
	if ( felterSomMangler.length != 0 ) {
		var feilmelding = "F&oslash;lgende felter mangler: ";
		for( var i = 0; i < felterSomMangler.length; i++ ) feilmelding += "\n" + felterSomMangler[i];
		view_settDisabled(true);
		alert(feilmelding);
		return false;
	}
	
	// Legger opp listeboks for de forskjellige l&aring;netypene
	settBetingelser(model_betBet);
	
	// Legger opp listebokser for nedbetaling
	settNbTid();
	
	
	//  Overlater resten av initieringen til view'et selv.
	view_init();
	
} // controller_bodyOnload

function controller_startBeregning() {

	
	// Sjekker at inndata er OK.
	if (sjekkInndata() != true) {
		view_visFeilmelding(model_resultat.feilmelding);
		return false;
	}

	var valgtBetBet = controller_getValgtBetBet();
	if ( valgtBetBet == null ) {
		view_visFeilmelding("Klarer ikke &aring; finne valgt betalingsbetingelse. Denne m&aring; legges inn i kalkulatoren - kontakt Cresco IT.");
		return false;
	}

	// Oppdaterer alle felt i beregningsData-objektet f&oslash;r vi starter beregning av l&aring;n.
	beregningsData = new Object();
	beregningsData.lanebelop = getLanebelop();
	beregningsData.terminbelop = getTerminbelop();
	beregningsData.nedbetTidAar = getNedbetTidAar();
	beregningsData.maxNedbetTerminer = valgtBetBet.maxAntTerminer;
	beregningsData.nedbetTidMnd = getNedbetTidMnd(); 
	beregningsData.rente = getRenteSats();
	beregningsData.termGebyr = valgtBetBet.terminGebyr;
	
	// Sjekker evt tinglysingsgebyr
	beregningsData.tinglysingsgebyr = parseInt(getTinglysingsgebyr());
	if ( isNaN(parseInt(beregningsData.tinglysingsgebyr)) ) {
		// Setter default tinglysningsgebyr for aktuell l&aring;netype
		if (valgtBetBet.pant == "J") 
			beregningsData.tinglysingsgebyr = MODEL_DEFAULT_TINGLGEBYR;
		else
			beregningsData.tinglysingsgebyr = 0;
	}

	if (valgtBetBet.tinglGebyrILaan == "J") 
		beregningsData.tinglGebyrTilleggesLaan = true;
	else
		beregningsData.tinglGebyrTilleggesLaan = false;
	
	beregningsData.beregnEtableringsgebyrSenere = false;
	beregningsData.etableringsgebyr = 0;

	// Sjekker etableringsgebyr
	if ( valgtBetBet.etabGebyr == "T") {
		if (getEtableringsgebyr().toString() != "") 
			beregningsData.etableringsgebyr = getEtableringsgebyr();
		else {	
			if (getLanebelop() == 0) 
				// L&aring;nebel&oslash;p m&aring; beregnes f&oslash;r vi finner etableringsgebyr 
				beregningsData.beregnEtableringsgebyrSenere = true;
			else
				beregningsData.etableringsgebyr = model_finnEtableringsgebyr(getLanebelop()); 
		}
	} else {
		beregningsData.etableringsgebyr = valgtBetBet.etabGebyr;
	}	
	
	beregningsData.etabGebyrTilLaan = false;
	if ( valgtBetBet.etabGebyrTilLaan == "J" ) {
			beregningsData.etabGebyrTilLaan = true;
	}
				
	// Setter eventuell nedre grense for termingebyr.
	beregningsData.saldoGrenseTermingebyr = valgtBetBet.saldoGrenseTermingebyr;
	
	// Setter prosentsats for gjeldsforsikringspremie.
	beregningsData.gjeldsforsikringspremiesats = valgtBetBet.gjeldsforsikringspremiesats;

	// Da er vi klar til &aring; beregne selve l&aring;net
	if (model_beregnLaan(beregningsData) == true) {
		// L&aring;neberegningen har g&aring;tt bra. Vi ber view'et om &aring; vise resultatet.
		view_visResultat();
	} else {
		view_visFeilmelding(model_resultat.feilmelding);
	}
}

function controller_betingelseEndret() {
	// N&aring;r l&aring;nebetingelsene endres m&aring; vi sette opp nedbetalingstiden i.h.h.t. dette.
	settNbTid();
}

// Returnerer valgt betalingbetingelse, null hvis ingen blir funnet.
function controller_getValgtBetBet() { 
	var valgtBetBet = null;
	var valgtBetBetNr = getBetBetNr();
	for ( var k = 0; k < model_betBet.length; k++ ) {
		if ( parseInt(model_betBet[k].betNr) == parseInt(valgtBetBetNr) ) valgtBetBet = model_betBet[k];
	}
	return valgtBetBet;
}

//-------------------------------------------------------------------------------------------------
// "Private" funksjoner.
// 

function sjekkInndata() {
	var theform = document.getElementById("theform"); // Støtte for "standard mode"
	var retur = true;
	model_resultat.feilmelding = "";
	try {
		
		if (theform.lBelop.value == "" && theform.termBelop.value == "") {
			model_resultat.feilmelding = 'L&aring;nebel&oslash;p eller terminbel&oslash;p m&aring; fylles ut.';
			retur = false;
		} else if (theform.nbTidAar.value==0 && theform.nbTidMnd.value == 0) {
			retur = false;
			if (theform.lBelop.value == "")	model_resultat.feilmelding = 'Nedbetalingstid eller l&aring;nebel&oslash;p m&aring; fylles ut.';
			else if (theform.termBelop.value == "") model_resultat.feilmelding = 'Nedbetalingstid eller terminbel&oslash;p m&aring; fylles ut.';
			else retur = true; // Var ikke noe feil likevel.
		} else if (model_kr2num(theform.lBelop.value) > 0 && model_kr2num(theform.lBelop.value) < MODEL_MINSTE_LANEBELOP) {
			model_resultat.feilmelding = 'Angitt l&aring;nebel&oslash;p er for lavt. Minste l&aring;nebel&oslash;p er ' + MODEL_MINSTE_LANEBELOP + ' kr.';
			retur = false;
		} else if (model_kr2num(theform.termBelop.value) > 0 && model_kr2num(theform.termBelop.value) < MODEL_MINSTE_TERMINBELOP) {
			model_resultat.feilmelding = 'Angitt terminbel&oslash;p er for lavt. Minste terminbel&oslash;p er ' + MODEL_MINSTE_TERMINBELOP + ' kr.';
			retur = false;
		}

		if (theform.nbTidAar.value == "" || theform.nbTidMnd.value == "") {
			model_resultat.feilmelding = 'Nedbetalingstid inntil ' + (maxAntTerminer / 12) + ' &aring;r m&aring; fylles ut. &aring;r:' + theform.nbTidAar.value + ', mnd: ' + maxAntTerminer + '!';
			retur = false;
		}
		
		if (isNaN(model_kr2num(theform.lBelop.value))) {
			model_resultat.feilmelding = 'Feil med l&aring;nebel&oslash;p.';
			retur = false;
		}
    
		if (isNaN(model_kr2num(theform.termBelop.value))) {
			model_resultat.feilmelding = 'Feil med terminbel&oslash;p.';
			retur = false;
		}
		
	} catch(e) {
		if ( model_resultat.feilmelding == "" ) model_resultat.feilmelding = "E:" + e + " Noe er galt med dataene som er oppgitt. Rett opp feilen og pr&oslash;v p&aring; nytt.";
		retur = false;	
	}
	return retur;
} // sjekkInndata

function sjekkOmAlleFelterErTilstede(felterSomMangler) {
	// Felles inputfelter.
	if ( document.getElementById("betingelse") == null ) felterSomMangler[felterSomMangler.length] = "Type l&aring;n, id: 'betingelse'";
	if ( document.getElementById("lBelop") == null ) felterSomMangler[felterSomMangler.length] = "L&aring;nebel&oslash;p, id: 'lBelop'";
	if ( document.getElementById("termBelop") == null ) felterSomMangler[felterSomMangler.length] = "Terminbel&oslash;p, id: 'termBelop'";
	if ( document.getElementById("nbTidAar") == null ) felterSomMangler[felterSomMangler.length] = "Nedbetalingstid &aring;r, id: 'nbTidAar'";
	if ( document.getElementById("nbTidMnd") == null ) felterSomMangler[felterSomMangler.length] = "Nedbetalingstid m&aring;ned, id: 'nbTidMnd'";

	
	// Inputfelter for Personl&aring;n.
	if (LKProduktData_name == "PL") {
		if ( document.getElementById("etablGebyr") == null ) felterSomMangler[felterSomMangler.length] = "Opprettelsesgebyr, id: 'etablGebyr'";
		if ( document.getElementById("tinglGebyr") == null ) felterSomMangler[felterSomMangler.length] = "Tinglysningsgebyr, id: 'tinglGebyr'";
		if ( document.getElementById("renteSats") == null ) felterSomMangler[felterSomMangler.length] = "Rentesats, id: 'renteSats'";
	}

	// Andre felter.
	if ( document.getElementById("hjelpeTekst") == null ) felterSomMangler[felterSomMangler.length] = "Hjelp, id: 'hjelpeTekst'";
	if ( document.getElementById("beregnKnapp") == null ) felterSomMangler[felterSomMangler.length] = "Beregn, id: 'beregnKnapp'";
	if ( document.getElementById("blankUtKnapp") == null ) felterSomMangler[felterSomMangler.length] = "Blank ut, id: 'blankUtKnapp'";
	if ( document.getElementById("nedbetplan") == null ) felterSomMangler[felterSomMangler.length] = "Nedbetalingsplan, id: 'nedbetplan'";
}

//
// Funksjoner for &aring; hente ut verdier fra view'et.
//
function getLanebelop() {
	var theform = document.getElementById("theform"); // Støtte for "standard mode"
	if (theform.lBelop.value == "")	return 0;
	else return parseInt(model_kr2num(theform.lBelop.value));
}
function getTerminbelop() {
	var theform = document.getElementById("theform"); // Støtte for "standard mode"
	return parseInt(model_kr2num(theform.termBelop.value));
}
function getNedbetTidAar() {
	var theform = document.getElementById("theform"); // Støtte for "standard mode"
	return parseInt(theform.nbTidAar.value);
}
function getNedbetTidMnd() {
	var theform = document.getElementById("theform"); // Støtte for "standard mode"
	return parseInt(theform.nbTidMnd.value);
}
function getBetBetNr() {
	var theform = document.getElementById("theform"); // Støtte for "standard mode"
	return theform.betingelse.value;
}
function getEtableringsgebyr() {
	var theform = document.getElementById("theform"); // Støtte for "standard mode"
	if (theform.etablGebyr != null && theform.etablGebyr.value != "")	return parseInt(theform.etablGebyr.value);
	else return "";
}	
function getTinglysingsgebyr() {
	var theform = document.getElementById("theform"); // Støtte for "standard mode"
	if (theform.tinglGebyr != null && theform.tinglGebyr.value != "") return parseInt(theform.tinglGebyr.value);
	else return "";
}

function getRenteSats() {
	var theform = document.getElementById("theform"); // Støtte for "standard mode"
	var valgtBetBet = controller_getValgtBetBet();
	if (theform.renteSats != null && theform.renteSats.value != "") return parseFloat(theform.renteSats.value.replace(/,/g,"."));
	else return valgtBetBet.rente / 100;
}


function getRadioValue(radioName) {
  //var collection = document.all[radioName];
  var collection = document.getElementsByName[radioName]; // Støtte for "standard mode"

  if(collection == null) {
	  // Kommer vi hit har vi ikke funnet noen verdi.
	  alert("Radiobuttons with name '" + radioName + "' not found.");
	  return "";
  }

  for (i=0;i<collection.length;i++) {
    if (collection[i].checked)
       return(collection[i].value);
  }

  // Kommer vi hit har vi ikke funnet noen verdi.
  return ""
}

//
// Funksjoner for &aring; sette verdier i view'et.
//
function settBetingelser(betBet) {
	var theform = document.getElementById("theform"); // Støtte for "standard mode"
	for(var i = 0; i < betBet.length; i++) {
		theform.betingelse.options[i] = new Option(betBet[i].fritekst, betBet[i].betNr);
	}
} // settBetingelser
function setRadioValue(radioName, theValue) {
  //var collection = document.all[radioName];
  var collection = document.getElementsByName[radioName]; // Støtte for "standard mode"
  if ( collection != null ) {
	  for (i = 0; i < collection.length; i++) {
		(collection[i].value == theValue) ? collection[i].checked = true : collection[i].checked = false;
	}
  }
} // setRadioValue
function settNbTid() {
	var theform = document.getElementById("theform"); // Støtte for "standard mode"
	var valgtBetBet = controller_getValgtBetBet();
	if ( valgtBetBet != null ) {
		var maxAntTerminer = valgtBetBet.maxAntTerminer;
		var minAntTerminer = valgtBetBet.minAntTerminer;
		var terminLengde = valgtBetBet.terminLengde;
		var maxAar = parseInt(maxAntTerminer / 12);
		var minAar = parseInt(minAntTerminer / 12);
		var minMnd = minAntTerminer % 12;

		var maxMnd;
		if (maxAntTerminer < 12) {
			maxMnd = maxAntTerminer % 12;
		} else {
			maxMnd = 12;
		}
		
		if (maxAntTerminer == minAntTerminer) {
			theform.nbTidAar.value = maxAar;
			theform.nbTidAar.disabled = true;
			theform.nbTidMnd.value = maxAntTerminer - (maxAar * 12);
			theform.nbTidMnd.disabled = true;
		} else {
			theform.nbTidAar.disabled = false;
			theform.nbTidMnd.disabled = false;
		
			// Sletter alle innslag i listenboksen med antall &aring;r nedbetaling.
			for( i = 0; i <= 20; i++ ) theform.nbTidAar.remove(0);
			var j = minAar;
			// Legger opp listeboks med antall &aring;r nedbetaling
			for(i = 0; i <= (maxAar - minAar); i++) {
				theform.nbTidAar.options[i] = new Option(j, j);
				j++;
			}
			theform.nbTidAar.value = minAar;


			// Legger opp listeboks med antall m&aring;neder nedbetaling		
			if (terminLengde == 12) {
				theform.nbTidMnd.value = 0;
				theform.nbTidMnd.disabled = true;
			} else {

				// Sletter alle innslag i listenboksen med antall &aring;r nedbetaling.
				for( i = 0; i < 12; i++ ) theform.nbTidMnd.remove(0);

				if (maxMnd == 0) maxMnd = 12;
				var j = 0;
				for(i = minMnd; i < maxMnd; i+= terminLengde)
					theform.nbTidMnd.options[j++] = new Option(i, i);
				theform.nbTidMnd.value = minMnd;
			}
		}
	}
}
