// (C) (C) Copyright 2004 - 2010 Jeppessen Productions and TraciDesign
// Prepared for the Property Power Disc.
// Copyright: This software is protected by copyright laws and international copyright treaties, 
// as well as other intellectual property laws and treaties. The software is licensed not sold.
// Restriction: You may not attempt to reverse compile, modify, translate or disassemble this software 
// in whole or in part. You may not remove or modify any copyright notice.

function RoundNumbers(TheNum) {
	return TheNum;
}

function addComma(TheNum) {
    numVar=String(TheNum);
    var commaNumber = "";
    var thenumber = ""
    var thefraction = "";
    var j = numVar.indexOf(".");
    var l = numVar.length;
    //alert (TheNum);
    if (j > 0)     {    
	 tvar=numVar+"00"; 
	 numVar=numVar.substr(0,j);
         for(i = j; i<j+3; i++) {     
               thefraction = thefraction + tvar.charAt(i); }
    }  else { 
	    thefraction = ".00"; }
	j = numVar.length;

    for (i = j; i > 0; i--) {
         if ((i != j) && ((j - i) % 3 == 0))
                thenumber = thenumber + ",";
         thenumber = thenumber + numVar.charAt(i-1);
    }
    j = thenumber.length;
    for (i = j; i >= 0; i--)
        commaNumber = commaNumber + thenumber.charAt(i);
    
    commaNumber=commaNumber+thefraction; 
    return commaNumber;
}

function remComma(TheNum) {
    numVar=String(TheNum);
    var thenumber = "";
    var i = 0;
    
	if (numVar == "NaN") {
		numVar="0";
	}
	var l = numVar.length;
	
	if (l == 0) {
		thenumber = "0";
	} else {
		for (i = l; i >= 0; i--) {
			//alert ("i" + i);
			if (numVar.charAt(i) != ",") {
				thenumber=numVar.charAt(i)+thenumber;
			}
		}
	}
	i=(thenumber*1);
    return (i);
}

function ValidateNumberOnlyInput(allowdot) {
    if (!((event.keyCode>=48) && (event.keyCode<=57))) {
    	event.returnValue = false;}
    	
    if ((allowdot>0) && (event.keyCode==46)) {
        event.returnValue = true;
	}
}



function IRR(Guess,CashFlows) {
var T = 0.0;
var Y = 0;
var K = 0;
var Count = 0;
var MaxIterations = 15;
var irr = 0.0; 
var C1 = 0.000000000000001;
var C2 = 0.000000000001;
 
  K = CashFlows.length;
  if (K < 0) {
  	alert("IRR_a: Arguemnt Error"); 
  	return 0;
  }
  
  if (K == 0) {
      if (Guess <= -1.0)   {
      	alert("IRR_b: Arguemnt Error"); 
      	return 0;
	  }	
	  	T = -1 * (Math.log(1 + Guess));
      } else {
	  	T = 0.0;
      }

   for (Count = 1;Count <= MaxIterations; Count++) {
	var I = 0;
	var Neg = 0.0;
	var Pos = 0.0;
	var DNeg = 0.0;
	var DPos = 0.0;
	var X = 0.0;
	var s = "";

	X = Math.exp(T);
  	for (I = K-1;I >= 0; I--) {
	    DNeg = X * DNeg + Neg;
	    Neg = Neg * X;
	    DPos = ((X * DPos) + Pos);
	    Pos = Pos * X; 
	    if (CashFlows[I] >= 0.0) {
	      Pos = Pos + CashFlows[I];
	    } else {
	      Neg = Neg + CashFlows[I];
	    }
	}
    DNeg = DNeg * X;
    DPos = DPos * X;
//--------------------------------
	if (Pos <= Neg)   {
		alert("IRR_c: Arguemnt Error");
		return 0;
	}

	if ((Neg >= 0.0) || (Pos <= 0.0)) {
    	return (-1.0);
	}

	Y = Math.log((-1*Neg) / Pos) / (DNeg / Neg - DPos / Pos);    
    T = T - Y;
    if (Math.abs(Y) < (C1 + C2 * Math.abs(T))) {
		irr = Math.exp(-1 * T) - 1.0;
     	return (irr);
    }
  }  
  return irr;
 }
function CalcIRR() {
  var Income = 0.0;
  var Return = 0.0;
  var Deposit = 0.0;
  var OutFlows = 0.0;
  var AnnualCostIncrease = 0.0;
  var MonthlyBondPayment = 0.0;
  var BondAmount = 0.0;
  var BondInterestRate = 0.0;
  var MonthlyRatesTaxesLevy = 0.0;
  var CapitalOutstanding = 0.0;
  var CapitalOutstandingSale = 0.0;
  var ExpectedInitialRent = 0.0;
  var AnnualRentalIncrease = 0.0;
  var NetCash = 0.0;
  var NetCashSale = 0.0;
  var TotalSalesProceed = 0.0;
  var PurchasePrice = 0.0;
  var AnnualPropPriceIncrease = 0.0;
  var SaleCostAgentCommission = 0.0;
  var ImprovementCostBeforeSale = 0.0;
  var x = 0.0;
  
  var Year = 0;
  var Years = 0;
  var YearsX = 0;
  var Month = 0;
  var AnnualMaintCost = 0;
  var BondTerm = 0;
  var NumMonthsNoTenant = 0;
  var TotalIncome = 0.0;
  var TotalOutflows  = 0.0;
   
    
   IRRa = new Array();
   

  
//---------------------------------------------------------------------

  NumMonthsNoTenant = (remComma(document.frmBuy2LetCalc.txtNoTenant.value) * 1);
  BondTerm = (remComma(document.frmBuy2LetCalc.txtTerm.value) * 1);	//20;
  BondInterestRate = (remComma(document.frmBuy2LetCalc.txtInt.value) * 1) / 100;	//10.5 / 100;
  ExpectedInitialRent = (remComma(document.frmBuy2LetCalc.txtInitialRental.value) * 1);	//5000;

  Years = 5;
  Income = 0;
  Return = 0;
  PurchasePrice = (remComma(document.frmBuy2LetCalc.txtPurchPrice.value) * 1);	//1000000;
  Deposit = (remComma(document.frmBuy2LetCalc.txtDeposit.value) * 1);	//86509;
  BondAmount = (remComma(document.frmBuy2LetCalc.txtBondAmt.value) * 1);	//1000000;
  AnnualMaintCost = (remComma(document.frmBuy2LetCalc.txtAnnualCost.value) * 1);	//5000;
  AnnualCostIncrease = (remComma(document.frmBuy2LetCalc.txtAnnualCostIncrease.value) * 1) / 100;	//5 / 100;
  SaleCostAgentCommission = (remComma(document.frmBuy2LetCalc.txtSaleCosts.value) * 1) / 100;	//7.5 /100;
  ImprovementCostBeforeSale = (remComma(document.frmBuy2LetCalc.txtImprovement.value) * 1);	//30000;
  AnnualPropPriceIncrease = (remComma(document.frmBuy2LetCalc.txtAnnualPropIncrease.value) * 1) / 100;	//10 / 100;

  AnnualRentalIncrease = (remComma(document.frmBuy2LetCalc.txtAnnualIncrease.value) * 1) / 100;	//5 / 100;
  MonthlyRatesTaxesLevy = (remComma(document.frmBuy2LetCalc.txtLevy.value) * 1);	//500;
  MonthlyBondPayment = (remComma(document.frmBuy2LetCalc.txtRepay.value) * 1);	//9983.7988697;

  TotalSalesProceed = PurchasePrice * Math.pow(1 + AnnualPropPriceIncrease,5)*(1 - SaleCostAgentCommission);


  CapitalOutstanding = BondAmount;
  CapitalOutstandingSale = 0;
  YearsX = Years * 12;
 
  for (Month = 1; Month <= YearsX; Month++) {
	    Year = Math.floor((Month-1) / 12) + 1;
	    if ((Month - (Year - 1)*12) == 1) {	
		      OutFlows = AnnualMaintCost * Math.pow((1+AnnualCostIncrease),(Year-1));
	    } else {
		    OutFlows = 0;
	    }
	    
	    OutFlows = OutFlows + MonthlyBondPayment + MonthlyRatesTaxesLevy * Math.pow(1+AnnualCostIncrease,Year-1); 
	    TotalOutflows = TotalOutflows + OutFlows;
	    if (Month > 1) {
		      CapitalOutstanding = CapitalOutstanding * (1 + BondInterestRate/12) - MonthlyBondPayment; 
		}




	
	    if (NumMonthsNoTenant >= (Month-(Year-1)*12)) {
	    	Income = 0;
	    } else {
	      	Income = ExpectedInitialRent * Math.pow(1 + AnnualRentalIncrease,Year - 1);
	    }	
	    TotalIncome = TotalIncome + Income;
	    if (Month == 1) {	// then
	      NetCash = Income - OutFlows - Deposit;
	    } else {
	      NetCash  = Income - OutFlows;
	    }
	    IRRa[Month-1]  = NetCash;
	}
	
 	CapitalOutstandingSale = CapitalOutstanding * (1 + BondInterestRate/12) - MonthlyBondPayment;
 	NetCashSale = TotalSalesProceed - ImprovementCostBeforeSale - CapitalOutstandingSale;
 	IRRa[Month-1]  = NetCashSale;
	x = (Math.pow((1 + IRR(0.01,IRRa)),12)-1) * 100;

	document.frmBuy2LetCalc.txtTotalIncome.value=addComma(TotalIncome); 
	document.frmBuy2LetCalc.txtTotalOutflows.value=addComma(TotalOutflows); 
	document.frmBuy2LetCalc.txtTotalReturn.value=addComma(x);
}


function UpdateInfo() {
var TotalSaleProceeds = 0;
var PurchasePrice = 0;
var PropIncrease = 0;
var SaleCosts = 0;
var TotalTransferCost = 0;
var TotalBondCost = 0;
var PurchCosts = 0;
var Deposit = 0;
var Repay = 0;

	TotalSaleProceeds=remComma(document.frmBuy2LetCalc.txtTotalSaleProceeds.value*1);
	Deposit=remComma(document.frmBuy2LetCalc.txtDeposit.value*1);
	PurchasePrice=remComma(document.frmBuy2LetCalc.txtPurchPrice.value*1);
	PropIncrease=remComma(document.frmBuy2LetCalc.txtAnnualPropIncrease.value*1);
	SaleCosts=remComma(document.frmBuy2LetCalc.txtSaleCosts.value*1);
	PurchCosts=remComma(document.frmBuy2LetCalc.txtPurchCosts.value*1);
	
	TotalTransferCost=CalculateTransferFees(PurchasePrice);
	//alert("TotalTransferCost=" + TotalTransferCost);
	TotalBondCost=CalculateBondFees(PurchasePrice-Deposit);
//	alert("TotalBondCost=" + TotalBondCost + ", PurchasePrice=" + PurchasePrice);
	PurchCosts=TotalTransferCost+TotalBondCost;
	
	TotalSaleProceeds=PurchasePrice*(Math.pow(1+(PropIncrease/100),5))*(1-(SaleCosts/100));
	
//	Repay=CalculateRepayments(PurchasePrice-Deposit);
	Repay=CalculateRepayments(PurchasePrice+PurchCosts-Deposit);
	document.frmBuy2LetCalc.txtBondAmt.value=addComma(PurchasePrice+PurchCosts-Deposit);
//	document.frmBuy2LetCalc.txtBondAmt.value=addComma(PurchasePrice-Deposit);
	document.frmBuy2LetCalc.txtRepay.value=addComma(Repay);
	document.frmBuy2LetCalc.txtPurchCosts.value=addComma(PurchCosts);
	document.frmBuy2LetCalc.txtTotalSaleProceeds.value=addComma(TotalSaleProceeds);
	CalcIRR();
}


function UpdateRepayment() {
	CalculateRepayments();
}

// TRANSFERING ATTORNEYS FEES 
function GetTxferCost(Amt) {
var AmtTXfer1 = 1000;
var AmtTXfer2 = 500;
var AmtTXfer3 = 250;

	txfer=0;
	if (Amt<=80000) { txfer=3200; }
	if ((Amt>80000) && (Amt<=90000))  { txfer=3400; }
	if ((Amt>90000) && (Amt<=100000))  { txfer=3650; }
	if ((Amt>100000) && (Amt<=125000))  { txfer=3750; }
	if ((Amt>125000) && (Amt<=150000))  { txfer=3900; }
	if ((Amt>150000) && (Amt<=175000))  { txfer=4200; }
	if ((Amt>175000) && (Amt<=200000))  { txfer=4400; }
	if ((Amt>200000) && (Amt<=250000))  { txfer=4800; }
	if ((Amt>250000) && (Amt<=300000))  { txfer=5500; }
	if ((Amt>300000) && (Amt<=350000))  { txfer=5900; }
	if ((Amt>350000) && (Amt<=400000))  { txfer=6400; }
	if ((Amt>400000) && (Amt<=450000))  { txfer=6900; }
	if ((Amt>450000) && (Amt<=500000))  { txfer=7500; }

	x=0
	if (txfer==0) {
		txfer=txfer+7500;
	
		if ((Amt>500000) && (Amt<=1000000))  { 
			x=Math.ceil((Amt-500000)/100000);
			txfer=txfer+(x*AmtTXfer1);
		
		}
		if ((Amt>1000000) && (Amt<=5000000))  { 
			x=Math.ceil((Amt-1000000)/100000);
			//alert(x);		
			txfer=txfer+(5*AmtTXfer1);
			txfer=txfer+(x*AmtTXfer2);
		}
		
		if (Amt>5000000)  { 
			x=Math.ceil((Amt-5000000)/100000);		
			txfer=txfer+(5*AmtTXfer1);
			txfer=txfer+(40*AmtTXfer2);
			txfer=txfer+(x*AmtTXfer3);
		}
	}
	return txfer;			
	
}

// BOND ATTORNEYS FEES 

function GetBondCost(Amt) {
var AmtBondC1 = 800;
var AmtBondC2 = 400;
var AmtBondC3 = 200;

	bond=0;
	if (Amt<=100000) { bond=2500; }
	if ((Amt>100000) && (Amt<=125000))  { bond=2600; }
	if ((Amt>125000) && (Amt<=150000))  { bond=2700; }
	if ((Amt>150000) && (Amt<=175000))  { bond=2900; }
	if ((Amt>175000) && (Amt<=200000))  { bond=3000; }
	if ((Amt>200000) && (Amt<=250000))  { bond=3300; }
	if ((Amt>250000) && (Amt<=300000))  { bond=3700; }
	if ((Amt>300000) && (Amt<=350000))  { bond=4100; }
	if ((Amt>350000) && (Amt<=400000))  { bond=4600; }
	if ((Amt>400000) && (Amt<=450000))  { bond=5000; }
	if ((Amt>450000) && (Amt<=500000))  { bond=5400; }	
	
	x=0
	if (bond==0) {
		bond=bond+5400;
	
		if ((Amt>500000) && (Amt<=1000000))  { 
			x=Math.ceil((Amt-500000)/100000);		
			bond=bond+(x*AmtBondC1);
		
		}
		if ((Amt>1000000) && (Amt<=5000000))  { 
			x=Math.ceil((Amt-1000000)/100000);		
			bond=bond+(5*AmtBondC1);
			bond=bond+(x*AmtBondC2);
		}
		
		if (Amt>5000000)  { 
			x=Math.ceil((Amt-5000000)/100000);		
			bond=bond+(5*AmtBondC1);
			bond=bond+(40*AmtBondC2);
			bond=bond+(x*AmtBondC3);
		}
	}
	return bond;	
}

// TRANSFER DUTY
function GetTxferDuty(Amt) {
	txfd=0;
	
		//purchaser is a natural person
		x=0;
		if (Amt<=500000) { txfd=0; }
		if ((Amt>500000) && (Amt<=1000000))  { 
			x=(Amt-500000)*(5/100);		
			txfd=x; }
		if (Amt>1000000) { 
			x=(500000)*(5/100);
			x=x+(Amt-1000000)*(8/100);		
			txfd=x; }	
	return (txfd);
}

function GetVat(Amt) {
	var VAT_rate=14
	return RoundNumbers(Amt * (VAT_rate / 100));
}

// PROPERTY TRANSFER FEES 
function CalculateTransferFees(Amt) {
	var Petties = 550;
	var SearchFee = 100;
	var Levies = 5000;
	var zz = 0;
	var Tfica = 250;
	var Tdocfee = 114;
	var tvat = 0;
	var runTotal = 0;
	

	v=Amt;
	tc=GetTxferCost(v);
	td=GetTxferDuty(v);
	tvat=GetVat(tc+Petties+SearchFee+Tfica+Tdocfee);
	
// PROPERTY TRANSFER DEEDS OFFICE LEVY (EXAMINATION) FEES 
	exam=0;
	if (v<=150000) { exam=70; }
	if ((v>150000) && (v<=300000))  { exam=300; }
	if ((v>300000) && (v<=500000))  { exam=400; }
	if ((v>500000) && (v<=1000000))  { exam=500; }
	if ((v>1000000) && (v<=2000000))  { exam=600; }
	if ((v>2000000) && (v<=3000000))  { exam=800; }
	if ((v>3000000) && (v<=5000000))  { exam=1000; }
	if (v>5000000) { exam=1200; }


//	document.frmBuy2LetCalc.txtTduty.value=addComma(td);
//	document.frmBuy2LetCalc.txtTtariff.value=addComma(tc);
//	document.frmBuy2LetCalc.txtTpost.value=addComma(Petties);
//	document.frmBuy2LetCalc.txtTsearch.value=addComma(SearchFee);
//	document.frmBuy2LetCalc.txtTVat.value=addComma(tvat);
//	document.frmBuy2LetCalc.txtTrates.value=addComma(Levies);
//	document.frmBuy2LetCalc.txtTexam.value=addComma(exam);
//	document.frmBuy2LetCalc.txtTfica.value=addComma(Tfica);
//	document.frmBuy2LetCalc.txtTdocfee.value=addComma(Tdocfee);	
	
	runTotal=td+exam+tc+Petties+SearchFee+tvat+Levies+Tfica+Tdocfee;
//	alert("Runtotal" & runTotal);
	return (runTotal);
}

// BOND REG. FEES 
function CalculateBondFees(Amt) {
	var runTotal = 0;
	var Petties = 550;
	var Aktex = 100;
	var InitFee = 2000;
	var xyz = 0;
	var Bfica = 250;
	var Bdocfee = 114;
	var bvat = 0;
	
	
	v=Amt;
//	alert("txtBondAmt=" + v);
	bc=GetBondCost(v);
	bvat=GetVat(bc+Petties+Aktex+Bfica+Bdocfee);
	
//	document.frmBuy2LetCalc.txtBtariff.value=addComma(bc);	
//	document.frmBuy2LetCalc.txtBpost.value=addComma(Petties);

// BOND REG. FEES 
	deeds=0;	
	if (v<=150000) { deeds=260; }
	if ((v>150000) && (v<=300000))  { deeds=300; }
	if ((v>300000) && (v<=500000))  { deeds=400; }
	if ((v>500000) && (v<=1000000))  { deeds=500; }
	if ((v>1000000) && (v<=2000000))  { deeds=650; }
	if ((v>2000000) && (v<=5000000))  { deeds=1000; }
	if (v>5000000) { deeds=2000; }
	
//	document.frmBuy2LetCalc.txtBdeeds.value=addComma(deeds);
//	document.frmBuy2LetCalc.txtBbank.value=addComma(InitFee);
//	document.frmBuy2LetCalc.txtBaktex.value=addComma(Aktex);
//	document.frmBuy2LetCalc.txtBfica.value=addComma(Bfica);
//	document.frmBuy2LetCalc.txtBdocfee.value=addComma(Bdocfee);
//	document.frmBuy2LetCalc.txtBvat.value=addComma(bvat);

	runTotal=deeds+InitFee+bc+Petties+Aktex+bvat+Bfica+Bdocfee;
	return (runTotal);
}

function CalculateRepayments(Amt) {
//=-C6*PMT(C8/12,C7*12,1,0,0)
	var int_perc = 0;
	var monthly_int_rate=0;
	var month_term=0;
	
	v=Amt;
	i=remComma(document.frmBuy2LetCalc.txtInt.value*1);
	y=remComma(document.frmBuy2LetCalc.txtTerm.value*1);
	
//	alert ("v=" + v + " : i=" + i + " : y=" + y);
	
	int_perc=i/100;
	monthly_int_rate=int_perc/12;
	month_term=12*y;
	
	p=Math.pow((1+monthly_int_rate),(-1*month_term));
	r=v*(monthly_int_rate/(1-p));
	
	//document.frmBuy2LetCalc.txtRepay.value=addComma(RoundNumbers(r));
	return(r);
}


function compute() { 
  var rate, endOfYear, annualAmt, nPer, answer; 
	
    rate = (frmBuy2LetCalc.txtInterest.value / 100) / 12; 
    nPer = frmBuy2LetCalc.txtMonths.value; 
    pmt = frmBuy2LetCalc.txtMaxRepay.value; 
    endOfYear = false;
    fv = 0; 
    answer = fv * Math.pow(1/(1+rate), nPer) + pmt * (1-Math.pow(1/(1+rate), nPer)) / rate; 

    if (endOfYear) { 
      answer = answer * (1+rate); 
    } 
  answer = Math.round(answer * 1000) / 1000; 
  return answer; 
} 


function UpdateInfoPV() {
	UpdateInfo();
	document.frmBuy2LetCalc.txtLoanQual.value=addComma(compute());	
}
