/*****************************************
(C) http://www.calculator.net all right reserved.  
*****************************************/
var dataArray=new Array();var theLoanTerm=0;totalCalcCycle=0;cutoffCalcCycle=1000;cutoffPrecision=1e-8;var delayShow=true;var cadditionatbeginning=false;function popMenu(A){Ua="";gObj("cendamount").style.display="block";gObj("cinvestlength").style.display="block";gObj("cstartingamount").style.display="block";gObj("creturnrate").style.display="block";gObj("ccontributeamount").style.display="block";gObj("ctype").value=A;if(A=="endamount"){Ua=Ua+'<li id=\'menuon\'><a href="#" onclick="popMenu(\'endamount\');">FV</a></li><li><a href="#" onclick="popMenu(\'contributeamount\');">PMT</a></li><li><a href="#" onclick="popMenu(\'returnrate\');">I/Y</a></li><li><a href="#" onclick="popMenu(\'investlength\');">N</a></li><li><a href="#" onclick="popMenu(\'startingamount\');">starting investment</a></li>';gObj("cendamount").style.display="none"}else{if(A=="investlength"){Ua=Ua+'<li><a href="#" onclick="popMenu(\'endamount\');">FV</a></li><li><a href="#" onclick="popMenu(\'contributeamount\');">PMT</a></li><li><a href="#" onclick="popMenu(\'returnrate\');">I/Y</a></li><li id=\'menuon\'><a href="#" onclick="popMenu(\'investlength\');">N</a></li><li><a href="#" onclick="popMenu(\'startingamount\');">starting investment</a></li>';gObj("cinvestlength").style.display="none"}else{if(A=="startingamount"){Ua=Ua+'<li><a href="#" onclick="popMenu(\'endamount\');">FV</a></li><li><a href="#" onclick="popMenu(\'contributeamount\');">PMT</a></li><li><a href="#" onclick="popMenu(\'returnrate\');">I/Y</a></li><li><a href="#" onclick="popMenu(\'investlength\');">N</a></li><li id=\'menuon\'><a href="#" onclick="popMenu(\'startingamount\');">starting investment</a></li>';gObj("cstartingamount").style.display="none"}else{if(A=="returnrate"){Ua=Ua+'<li><a href="#" onclick="popMenu(\'endamount\');">FV</a></li><li><a href="#" onclick="popMenu(\'contributeamount\');">PMT</a></li><li id=\'menuon\'><a href="#" onclick="popMenu(\'returnrate\');">I/Y</a></li><li><a href="#" onclick="popMenu(\'investlength\');">N</a></li><li><a href="#" onclick="popMenu(\'startingamount\');">starting investment</a></li>';gObj("creturnrate").style.display="none"}else{if(A=="contributeamount"){Ua=Ua+'<li><a href="#" onclick="popMenu(\'endamount\');">FV</a></li><li id=\'menuon\'><a href="#" onclick="popMenu(\'contributeamount\');">PMT</a></li><li><a href="#" onclick="popMenu(\'returnrate\');">I/Y</a></li><li><a href="#" onclick="popMenu(\'investlength\');">N</a></li><li><a href="#" onclick="popMenu(\'startingamount\');">starting investment</a></li>';gObj("ccontributeamount").style.display="none"}}}}}Ua="<ul>"+Ua+"</ul>";gObj("topmenu").innerHTML=Ua;calc()}function calcEndVal(C,E,B,D,A){Rh=C*Math.pow((1+E),D);if(A){E=Math.pow((E+1),1/12)-1;D=D*12}if(cadditionatbeginning){for(i=0;i<D;i++){Rh+=B*Math.pow((1+E),(D-i))}}else{for(i=1;i<=D;i++){Rh+=B*Math.pow((1+E),(D-i))}}return Rh}function getInvLength(F,G,B,D,C,A,E){GT=calcEndVal(F,G,D,A,C);totalCalcCycle++;if(totalCalcCycle>cutoffCalcCycle){if(GT>B){return A}}if((GT!=0)&&(B!=0)){if(Math.abs((GT-B)/B)<cutoffPrecision){return A}}else{if(Math.abs(GT-B)<cutoffPrecision){return A}}if(GT>B){return getInvLength(F,G,B,D,C,(A-0.7*E),(0.7*E))}else{return getInvLength(F,G,B,D,C,(A+0.7*E),(0.7*E))}}function getStartingAmount(G,F,B,D,C,A,E){GT=calcEndVal(A,F,D,G,C);totalCalcCycle++;if(totalCalcCycle>cutoffCalcCycle){return"too long"}if((GT!=0)&&(B!=0)){if(Math.abs((GT-B)/B)<cutoffPrecision){return A}}else{if(Math.abs(GT-B)<cutoffPrecision){return A}}if(GT>B){return getStartingAmount(G,F,B,D,C,(A-0.7*E),(0.7*E))}else{return getStartingAmount(G,F,B,D,C,(A+0.7*E),(0.7*E))}}function getReturnRate(G,F,A,D,C,B,E){GT=calcEndVal(F,B,D,G,C);totalCalcCycle++;if(totalCalcCycle>cutoffCalcCycle){return"too long"}if((GT!=0)&&(A!=0)){if(Math.abs((GT-A)/A)<cutoffPrecision){return B}}else{if(Math.abs(GT-A)<cutoffPrecision){return B}}if(GT>A){return getReturnRate(G,F,A,D,C,(B-0.7*E),(0.7*E))}else{return getReturnRate(G,F,A,D,C,(B+0.7*E),(0.7*E))}}function getContributeAmount(G,D,A,F,B,E,C){GT=calcEndVal(D,F,E,G,B);totalCalcCycle++;if(totalCalcCycle>cutoffCalcCycle){return"too long"}if((GT!=0)&&(A!=0)){if(Math.abs((GT-A)/A)<cutoffPrecision){return E}}else{if(Math.abs(GT-A)<cutoffPrecision){return E}}if(GT>A){return getContributeAmount(G,D,A,F,B,(E-0.7*C),(0.7*C))}else{return getContributeAmount(G,D,A,F,B,(E+0.7*C),(0.7*C))}}function calc(){showquickmsg("calculating...",true);gObj("resulttable").innerHTML="";setTimeout("process()",2)}function process(){var D=trimAll(gObj("cstartingprinciplev").value+"");var F=trimAll(gObj("cinterestratev").value+"");var E=trimAll(gObj("cyearsv").value+"");var A=trimAll(gObj("ctargetamountv").value+"");var C=trimAll(gObj("ccontributeamountv").value+"");var B=trimAll(gObj("ctype").value+"");WP=false;cadditionatbeginning=false;if(gObj("ciadditionat2").checked){cadditionatbeginning=false;hw="end"}else{cadditionatbeginning=true;hw="beginning"}if((!isNumber(D))&&(B!="startingamount")){showquickmsg("start principal need to be numeric",true);return }else{if((!isNumber(F))&&(B!="returnrate")){showquickmsg("average investment return need to be numeric",true);return }else{if(((F<0)||(F>200))&&(B!="returnrate")){showquickmsg("I/Y needs to be between 0 and 200",true);return }else{if((!isNumber(A))&&(B!="endamount")){showquickmsg("FV need to be numeric",true);return }else{if((!isNumber(C))&&(B!="contributeamount")){showquickmsg("PMT need to be numeric",true);return }else{if((!isNumber(E))&&(B!="investlength")){showquickmsg("N need to be numeric",true);return }}}}}}bb=0;oG=0;if(typeof (D)!="undefined"){D=parseFloat(D)}if(typeof (F)!="undefined"){F=parseFloat(F)}if(typeof (E)!="undefined"){E=parseFloat(E)}if(typeof (A)!="undefined"){A=parseFloat(A)}if(typeof (C)!="undefined"){C=parseFloat(C)}pC=parseInt(E*12);theLoanTerm=E;totalCalcCycle=0;rB="";if(B=="endamount"){}else{if(B=="investlength"){rx=getInvLength(D,F/100,A,C,WP,100,100);E=rx;theLoanTerm=E.toFixed(2);rB="<p>You will need to invest <font color='green'><b>"+rx.toFixed(3)+"</b></font> periods to reach the future value of "+formatAsMoney(A)+".</p>";pC=parseInt(E*12)}else{if(B=="startingamount"){rx=getStartingAmount(E,F/100,A,C,WP,A,A);if(rx=="too long"){showquickmsg("please use reasonable numbers.",true);return }D=rx;rB="<p>You will need to invest <font color='green'><b>"+formatAsMoney(rx)+"</b></font> at the beginning to reach the future value of "+formatAsMoney(A)+".</p>"}else{if(B=="returnrate"){rx=getReturnRate(E,D,A,C,WP,1,1);if(rx=="too long"){showquickmsg("please use reasonable numbers.",true);return }rx=rx*100;F=rx;rB="<p>You will need an annual return rate of <font color='green'><b>"+rx.toFixed(3)+"%</b></font> to reach the future value of "+formatAsMoney(A)+".</p>"}else{if(B=="contributeamount"){rx=getContributeAmount(E,D,A,F/100,WP,A,A);if(rx=="too long"){showquickmsg("please use reasonable numbers.",true);return }C=rx;rB="<p>You will need to contribute <font color='green'><b>"+formatAsMoney(rx)+"</b></font> at the "+hw+" of each period to reach the future value of "+formatAsMoney(A)+".</p>"}}}}}if(WP){Ht=0;rb=C}else{Ht=C;rb=0}qp=Math.log(F/100+1);YL=qp;XY=new Array();PJ=0;OV=0;for(i=1;i<=(E*12);i++){XY[(i-1)]=new Array();if(i==1){XY[(i-1)][0]=D;XY[(i-1)][1]=XY[(i-1)][0];if(cadditionatbeginning){XY[(i-1)][0]+=rb;XY[(i-1)][1]+=rb;if(((i-1)%12)==0){XY[(i-1)][0]+=Ht;XY[(i-1)][1]+=Ht}}}else{XY[(i-1)][0]=XY[(i-2)][4];XY[(i-1)][1]=XY[(i-2)][2];if(cadditionatbeginning){XY[(i-1)][0]+=rb;XY[(i-1)][1]+=rb;if(((i-1)%12)==0){XY[(i-1)][0]+=Ht;XY[(i-1)][1]+=Ht}}}XY[(i-1)][2]=XY[(i-1)][1]*Math.pow(Math.E,(qp/12));XY[(i-1)][3]=XY[(i-1)][2]-XY[(i-1)][1];XY[(i-1)][6]=XY[(i-1)][3]*bb/100;XY[(i-1)][2]=XY[(i-1)][2]-XY[(i-1)][6];if(!(cadditionatbeginning)){XY[(i-1)][4]=XY[(i-1)][0]+rb;XY[(i-1)][2]=XY[(i-1)][2]+rb;if((i%12)==0){XY[(i-1)][4]=XY[(i-1)][0]+Ht;XY[(i-1)][2]=XY[(i-1)][2]+Ht}}else{XY[(i-1)][4]=XY[(i-1)][0]}PJ+=XY[(i-1)][3];OV+=XY[(i-1)][6];XY[(i-1)][5]=PJ;XY[(i-1)][7]=OV}Xb=parseInt(E*12);Ks=E*12-Xb;if(Ks>0.0001){pC++;XY[Xb]=new Array();XY[Xb][0]=XY[(Xb-1)][4];XY[Xb][1]=XY[(Xb-1)][2];if(cadditionatbeginning){XY[Xb][0]+=rb;XY[Xb][1]+=rb;if((Xb%12)==0){XY[Xb][0]+=Ht;XY[Xb][1]+=Ht}}XY[Xb][2]=XY[Xb][1]*Math.pow(Math.E,(qp*Ks/12));XY[Xb][3]=XY[Xb][2]-XY[Xb][1];XY[Xb][6]=XY[Xb][3]*bb/100;XY[Xb][2]=XY[Xb][2]-XY[Xb][6];XY[Xb][4]=XY[Xb][0];PJ+=XY[Xb][3];OV+=XY[Xb][6];XY[Xb][5]=PJ;XY[Xb][7]=OV}Ew="<table border=0 cellpadding=3 width='100%'>";Ew+="<tr align=right bgcolor='#E0F0FE'><td>&nbsp;</td><td><b>start principal</b></td><td><b>start balance</b></td><td><b>interest</b></td><td><b>end balance</b></td><td><b>end principal</b></td></tr>";for(i=0;i<parseInt(E);i++){tData0=XY[(i*12)][0];tData1=XY[(i*12)][1];tData2=XY[(i*12+11)][2];tData3=0;tData4=XY[(i*12+11)][4];for(j=0;j<12;j++){idN=i*12+j;tData3+=XY[idN][3]}if((i%2)==1){Ew+="<tr align=right><td>"+(i+1)}else{Ew+="<tr align=right bgcolor='#dddddd'><td>"+(i+1)}Ew+="</td><td>"+formatAsMoney(tData0);Ew+="</td><td>"+formatAsMoney(tData1);Ew+="</td><td>"+formatAsMoney(tData3);Ew+="</td><td>"+formatAsMoney(tData2);Ew+="</td><td>"+formatAsMoney(tData4)+"</td></tr>"}if((E-parseInt(E))>0.0001){Xb=XY.length-1;i=parseInt(E);tData0=XY[(i*12)][0];tData1=XY[(i*12)][1];tData2=XY[(Xb)][2];tData3=0;tData4=XY[(Xb)][4];for(j=(i*12);j<=Xb;j++){idN=j;tData3+=XY[idN][3]}if((i%2)==1){Ew+="<tr align=right><td>"+(i+1)}else{Ew+="<tr align=right bgcolor='#dddddd'><td>"+(i+1)}Ew+="</td><td>"+formatAsMoney(tData0);Ew+="</td><td>"+formatAsMoney(tData1);Ew+="</td><td>"+formatAsMoney(tData3);Ew+="</td><td>"+formatAsMoney(tData2);Ew+="</td><td>"+formatAsMoney(tData4)+"</td></tr>"}Ew+="</table>";aG=XY[(pC-1)][2]*Math.pow((1+F/100),(-1*E));lP="<hr /><h2>Summary</h2><table cellpadding='3' width='80%'>";lP+="<tr bgcolor='#dddddd'><td><b>PV (present value)</b></td><td align=right><font color=green><b>"+formatAsMoney(aG)+"</b></font></td></tr>";lP+="<tr bgcolor='#dddddd'><td>FV (future value)</td><td align=right>"+formatAsMoney(XY[(pC-1)][2])+"</td></tr>";lP+="<tr bgcolor='#dddddd'><td>N (number of compounding periods)</td><td align=right>"+E.toFixed(3)+"</td></tr>";lP+="<tr bgcolor='#dddddd'><td>I/Y (interest rate per compounding period)</td><td align=right>"+F.toFixed(3)+"</td></tr>";lP+="<tr bgcolor='#dddddd'><td>PMT (annuity payment, or constant periodic cash flow)</td><td align=right>"+formatAsMoney(C)+"</td></tr>";lP+="<tr bgcolor='#dddddd'><td>starting investment</td><td align=right>"+formatAsMoney(D)+"</td></tr>";lP+="<tr bgcolor='#dddddd'><td>total principal</td><td align=right>"+formatAsMoney(XY[(pC-1)][4])+"</td></tr>";lP+="<tr bgcolor='#dddddd'><td>total interest</td><td align=right>"+formatAsMoney(XY[(pC-1)][5])+"</td></tr>";if(bb>0.0001){lP+="<tr bgcolor='#dddddd'><td>total tax</td><td align=right>"+formatAsMoney(XY[(pC-1)][7])+"</td></tr>"}lP+="</table>";dataArray=XY;showquickmsg(lP,false);gObj("resulttable").innerHTML="<hr /><h2>Schedule</h2>"+Ew;if((delayShow)&&(/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent))){delayShow=false;setTimeout("drawCurve()",2000)}else{delayShow=false;drawCurve()}}function drawCurve(){var F=[];var D=[];var C=[];if(dataArray.length<100){for(var B=0;B<dataArray.length;B++){F.push([(B+1)/12,dataArray[B][4]]);D.push([(B+1)/12,dataArray[B][2]]);C.push([(B+1)/12,dataArray[B][5]])}}else{if(dataArray.length<200){for(var B=0;B<dataArray.length;(B=B+2)){F.push([(B+1)/12,dataArray[B][4]]);D.push([(B+1)/12,dataArray[B][2]]);C.push([(B+1)/12,dataArray[B][5]])}}else{if(dataArray.length<300){for(var B=0;B<dataArray.length;(B=B+3)){F.push([(B+1)/12,dataArray[B][4]]);D.push([(B+1)/12,dataArray[B][2]]);C.push([(B+1)/12,dataArray[B][5]])}}else{for(var B=0;B<dataArray.length;(B=B+4)){F.push([(B+1)/12,dataArray[B][4]]);D.push([(B+1)/12,dataArray[B][2]]);C.push([(B+1)/12,dataArray[B][5]])}}}}function A(G){return G}var E=Flotr.draw($("container"),[{data:F,label:"principal"},{data:D,label:"balance"},{data:C,label:"interest"}],{legend:{position:"ne",labelFormatter:A,backgroundColor:"#D2E8FF"},xaxis:{ticks:[[1/12,""],formatNum(theLoanTerm*0.2),formatNum(theLoanTerm*0.4),formatNum(theLoanTerm*0.6),formatNum(theLoanTerm*0.8),theLoanTerm],max:theLoanTerm}})};
