function ff_initialize(condition)
{if(condition=='formentry'){ff_rvb_bndroi_form_init();ff_rvb_bndroi_interestWhen_init(document.ff_form122.ff_elem3261,condition);ff_rvb_bndroi_interestOrValue_init(document.ff_form122.ff_elem3265,condition);}}
onload=function()
{ff_initialize('formentry');ff_initialize('pageentry');if(ff_processor.traceBuffer)ff_traceWindow();}
var ff_elements=[['ff_elem3246','ff_div3246','rvb_bndroi_compButton',1,3246],['ff_elem3248','ff_div3248','rvb_bndroi_adBigRect',1,3248],['ff_elem3249','ff_div3249','rvb_bndroi_presValCoupTxt',1,3249],
['ff_elem3250','ff_div3250','rvb_bndroi_nomInterestTxt',1,3250],['ff_elem3251','ff_div3251','rvb_bndroi_nomInterest',1,3251],['ff_elem3252','ff_div3252','rvb_bndroi_interestPeriodTxt',1,3252],['ff_elem3253','ff_div3253','rvb_bndroi_interestPeriod',1,3253],
['ff_elem3254','ff_div3254','rvb_bndroi_valueDateTxt',1,3254],['ff_elem3256','ff_div3256','rvb_bndroi_valueDate',1,3256],['ff_elem3257','ff_div3257','rvb_bndroi_endDateTxt',1,3257],['ff_elem3258','ff_div3258','rvb_bndroi_endDate',1,3258],
['ff_elem3259','ff_div3259','rvb_bndroi_afterBefore_txt',1,3259],['ff_elem3260','ff_div3260','rvb_bndroi_interestWhen',1,3260],['ff_elem3261','ff_div3261','rvb_bndroi_interestWhen',1,3261],['ff_elem3262','ff_div3262','rvb_bndroi_nomValueTxt',1,3262],['ff_elem3263','ff_div3263','rvb_bndroi_nomValue',1,3263],
['ff_elem3264','ff_div3264','rvb_bndroi_interestOrValue_txt',1,3264],['ff_elem3265','ff_div3265','rvb_bndroi_interestOrValue',1,3265],['ff_elem3266','ff_div3266','rvb_bndroi_interestOrValue',1,3266],['ff_elem3267','ff_div3267','rvb_bndroi_marketValueTxt',1,3267],
['ff_elem3268','ff_div3268','rvb_bndroi_marketValue',1,3268],['ff_elem3269','ff_div3269','rvb_bndroi_effInterestTxt',1,3269],['ff_elem3270','ff_div3270','rvb_bndroi_effInterest',1,3270],['ff_elem3271','ff_div3271','rvb_bndroi_addInterestTxt',1,3271],['ff_elem3272','ff_div3272','rvb_bndroi_addInterest',1,3272],
['ff_elem3388','ff_div3388','rvb_bndroi_Errormsg_txt',1,3388],['ff_elem3274','ff_div3274','rvb_bndroi_resultTxt',1,3274],['ff_elem3275','ff_div3275','rvb_bndroi_resultRoi',1,3275],['ff_elem3276','ff_div3276','rvb_bndroi_resultMarketValue',1,3276],
['ff_elem3277','ff_div3277','rvb_bndroi_valueWithCouponTxt',1,3277],['ff_elem3278','ff_div3278','rvb_bndroi_valueWithCoupon',1,3278],['ff_elem3281','ff_div3281','rvb_bndroi_couponSoFar_txt',1,3281],
['ff_elem3283','ff_div3283','rvb_bndroi_couponSoFar',1,3283],['ff_elem3279','ff_div3279','rvb_bndroi_modDurTxt',1,3279],['ff_elem3280','ff_div3280','rvb_bndroi_modDur',1,3280],
['ff_elem3281','ff_div3281','rvb_bndroi_presValCoup',1,3281]
];
function ff_getElementByIndex(index)
{if(index>=0&&index<ff_elements.length)
return eval('document.ff_form122.'+ff_elements[index][0]);return null;}
function ff_getElementByName(name)
{if(name.substr(0,6)=='ff_nm_')name=name.substring(6,name.length-2);for(var i=0;i<ff_elements.length;i++)
if(ff_elements[i][2]==name)
return eval('document.ff_form122.'+ff_elements[i][0]);return null;}
function ff_getDivByName(name)
{if(name.substr(0,6)=='ff_nm_')name=name.substring(6,name.length-2);for(var i=0;i<ff_elements.length;i++)
if(ff_elements[i][2]==name)
return document.getElementById(ff_elements[i][1]);return null;}
function resetResultFields()
{
var ROIYearlyElem = ff_getElementByName('rvb_bndroi_resultRoi');
var marketValueElem = ff_getElementByName('rvb_bndroi_resultMarketValue');
var valueWithCouponElem = ff_getElementByName('rvb_bndroi_valueWithCoupon');
var couponSoFarElem = ff_getElementByName('rvb_bndroi_couponSoFar');
var modifiedDurationElem = ff_getElementByName('rvb_bndroi_modDur');
var presentValCouponsOnlyElem = ff_getElementByName('rvb_bndroi_presValCoup');
ROIYearlyElem.value = '';
marketValueElem.value = '';
valueWithCouponElem.value = '';
couponSoFarElem.value = '';
modifiedDurationElem.value = '';
presentValCouponsOnlyElem.value = '';
} // end of function resetResultFields
function onInterestAddChanged()
{
resetResultFields();
var addInterestEl = ff_getElementByName('rvb_bndroi_addInterest');
var addInterest = addInterestEl.checked ? 1:0;
var computeWhat = ff_checkedValue('rvb_bndroi_interestOrValue');
var resultTextElem = ff_getDivByName('rvb_bndroi_valueWithCouponTxt');
if (computeWhat=='interest' && addInterest==0) {
resultTextElem.innerHTML =
'<b>Waarde zonder lopende couponrente:</b>';
} else resultTextElem.innerHTML = '<b>Waarde inclusief lopende couponrente:</b>';
resetResultFields();
} // end of function onInterestAddChanged()
function ff_rvb_bndroi_form_init()
{
setTimeout("retrieveFieldsFromCookie()",100);
}
function rvb_bndroi_which_radio()
{
var theone=0;var theone_interestWhen=0;
for(var i=0;i<ff_elements.length;i++)
if(ff_elements[i][2]=='rvb_bndroi_interestOrValue')
if(ff_getElementByIndex(i).checked)theone=i;
if(ff_getElementByIndex(theone).value=='value')
{
ff_getDivByName('rvb_bndroi_effInterestTxt').style.display='block';
ff_getElementByName('rvb_bndroi_effInterest').style.display='block';
ff_getDivByName('rvb_bndroi_marketValueTxt').style.display='none';
ff_getElementByName('rvb_bndroi_marketValue').style.display='none';
ff_getDivByName('rvb_bndroi_addInterestTxt').style.display='none';
ff_getElementByName('rvb_bndroi_addInterest').style.display='none';
ff_getElementByName('rvb_bndroi_resultRoi').style.display='none';
ff_getElementByName('rvb_bndroi_resultMarketValue').style.display='block';
ff_getDivByName('rvb_bndroi_resultTxt').innerHTML='<b>Waarde zonder lopende couponrente:</b>';
}
else {
ff_getDivByName('rvb_bndroi_effInterestTxt').style.display='none';
ff_getElementByName('rvb_bndroi_effInterest').style.display='none';
ff_getDivByName('rvb_bndroi_marketValueTxt').style.display='block';
ff_getElementByName('rvb_bndroi_marketValue').style.display='block';
ff_getDivByName('rvb_bndroi_addInterestTxt').style.display='block';
ff_getElementByName('rvb_bndroi_addInterest').style.display='block';
ff_getElementByName('rvb_bndroi_resultMarketValue').style.display='none';
ff_getDivByName('rvb_bndroi_resultTxt').innerHTML='<b>Rendement:</b>';
ff_getElementByName('rvb_bndroi_resultRoi').style.display='block';
}
onInterestAddChanged();
return '';
}
function rvbCommon_addMonths(d1,mnths,goFwd)
{var DObj=new Date(d1[0],d1[1],d1[2]);with(DObj){var Xd=getDate();setMonth(getMonth()+mnths);if(Xd!=getDate()){setDate(+goFwd);}}return[DObj.getFullYear(),DObj.getMonth(),DObj.getDate()];}
function rvbCommon_checkYYYYMMDD(dateValue)
{var T
if((T=/^(\d+)([-\/])(\d\d)(\2)(\d\d)$/.exec(dateValue))==null)
{return-2}for(var j=1;j<=5;j+=2)T[j]=+T[j]
if(!rvbCommon_isValidYMD(T[1],T[3]-1,T[5])){return-1}return[T[1],T[3],T[5]]
}function rvbCommon_isValidYMD(y,m,d)
{with(new Date(y,m,d)){return(getMonth()==m&&getDate()==d);}}
function rvbCommon_dateDifference(X,Y)
{var Dx=Date.UTC(X[0],X[1]-1,X[2]);var Dy=Date.UTC(Y[0],Y[1]-1,Y[2]);return(Dx-Dy)/86400000;}
function rvbCommon_DaysInMonth(Y,M)
{with(new Date(Y,M,1,12)){setDate(0);return getDate();}}
function rvbCommon_diffDateYMD(A1,A2)
{var dm,dd;dm=12*A1[0]+A1[1]-(12*A2[0]+A2[1]);dd=A1[2]-A2[2];if(dd<0){dm--;dd+=rvbCommon_DaysInMonth(A2[0],A2[1]);}return[dm/12|0,dm%12,dd];}
function ff_checkedValue(name)
{for(i=0;i<ff_elements.length;i++)
if(ff_elements[i][2]==name){e=ff_getElementByIndex(i);if(e.checked)return e.value;}return '';}
function rvb_pow(x,y)
{return Math.exp(y*Math.log(x));}
JSON.clone = function (obj) {
return JSON.parse( JSON.stringify( obj ) );
};
var cookieName = 'bondCalculator';
function retrieveFieldsFromCookie()
{
var data = jQuery.JSONCookie(cookieName);
if ('nominalInterest' in data) ff_getElementByName('rvb_bndroi_nomInterest').value = 100*data.nominalInterest;
if ('periodUnit' in data && 'periodUnitTag' in data) {
jQuery('#' +data.periodUnitTag).attr('selected', 'selected');
}
if ('valueDateUnparsed' in data) ff_getElementByName('rvb_bndroi_valueDate').value = data.valueDateUnparsed;
if ('endDateUnparsed' in data) ff_getElementByName('rvb_bndroi_endDate').value = data.endDateUnparsed;
if ('nominalValue' in data) ff_getElementByName('rvb_bndroi_nomValue').value = data.nominalValue;
if ('marketValue' in data) ff_getElementByName('rvb_bndroi_marketValue').value = data.marketValue;
if ('effectiveInterest' in data) ff_getElementByName('rvb_bndroi_effInterest').value = 100*data.effectiveInterest;
if ('computeWhat' in data) {
if (data.computeWhat=='value') jQuery('#ff_elem3266').attr('checked', 'checked'); else jQuery('#ff_elem3265').attr('checked', 'checked');
}
if ('interestWhen' in data) {
if (data.interestWhen=='before') jQuery('#ff_elem3260').attr('checked', 'checked'); else jQuery('#ff_elem3261').attr('checked', 'checked');
}
if ('addInterest' in data) {
if (data.addInterest==1) jQuery('#ff_elem3272').attr('checked', 'checked'); else jQuery('#ff_elem3272').removeAttr('checked');
}
rvb_bndroi_which_radio();
} // end of function retrieveFieldsFromCookie
function ff_rvb_bndroi_compButton_action(element, action)
{
switch (action) {
case 'click':
var errorElem = ff_getDivByName('rvb_bndroi_Errormsg_txt');
errorElem.innerHTML = '';
var data = {};
var maxPeriods = 500;
resetResultFields();
var nominalInterest;
try {
nominalInterest = 0.01*eval(ff_getElementByName('rvb_bndroi_nomInterest').value);
if (isNaN(nominalInterest)) throw new Error('');
} catch (err) {
errorElem.innerHTML = 'Ongeldige invoer veld <em>Nominale rente</em>.';
return;
}
data.nominalInterest = nominalInterest;
var periodUnitEl = ff_getElementByName('rvb_bndroi_interestPeriod');
var periodUnit = periodUnitEl.value.split("|")[0];
var periodUnitTag = periodUnitEl.value.split("|")[1];
data.periodUnit = periodUnit;
var valueDateUnparsed = ff_getElementByName('rvb_bndroi_valueDate').value;
var invalidDateStr = 'Ongeldige datum berekening.';
validValueDate = rvbCommon_checkYYYYMMDD(valueDateUnparsed);
if (validValueDate<0) {
errorElem.innerHTML = invalidDateStr;
ff_getElementByName('rvb_bndroi_valueDate').focus();
return;
}
var endDateUnparsed = ff_getElementByName('rvb_bndroi_endDate').value;
invalidDateStr = 'Ongeldige aflosdatum.';
validEndDate = rvbCommon_checkYYYYMMDD(endDateUnparsed);
if (validEndDate<0) {
errorElem.innerHTML = invalidDateStr;
ff_getElementByName('rvb_bndroi_endDate').focus();
return;
}
var daysDifference = rvbCommon_dateDifference(validEndDate, validValueDate);
if (daysDifference < 0) {
errorElem.innerHTML =
'Eind datum mag niet voor de datum waarde berekening liggen.';
return;
}
var nominalValue;
try {
nominalValue = eval(ff_getElementByName('rvb_bndroi_nomValue').value);
if (isNaN(nominalValue)) throw new Error('');
} catch (err) {
errorElem.innerHTML = 'Fout tijdens lezen veld <em>Nominale waarde</em>.';
ff_getElementByName('rvb_bndroi_nomValue').focus();
return;
}
data.nominalValue = nominalValue;
var interestWhen = ff_checkedValue('rvb_bndroi_interestWhen');
data.interestWhen = interestWhen;
var nPeriods = 0;
var fractionAccrued = 0; // fraction of a year
var nDaysFirstInterest = 0;
var nDaysAccrued = 0;
if (periodUnitTag.indexOf('month')!= -1) {
var diffYMD = rvbCommon_diffDateYMD(validEndDate, validValueDate);
// md is difference in months between start and end date
var md = diffYMD[1] +12*diffYMD[0];
nPeriods = Math.floor(md/(periodUnit*12));
// alert('md=' +md +', nPeriods=' +nPeriods);
firstInterestDate = rvbCommon_addMonths(validEndDate, -nPeriods*12*periodUnit, 0); //rvbCommon_addMonths(validEndDate, -nPeriods*12*periodUnit, 0);
previousInterestDate = rvbCommon_addMonths(firstInterestDate, -12*periodUnit, 0);
nDaysFirstInterest = rvbCommon_dateDifference(firstInterestDate, validValueDate);
if (interestWhen=='after') {
nDaysAccrued = rvbCommon_dateDifference(validValueDate, previousInterestDate);
}
else {
nDaysAccrued = nDaysFirstInterest;
}
fractionAccrued = nDaysAccrued/365.25;
// alert('prev intdt='+previousInterestDate +', next intdt= ' +firstInterestDate +', ndays=' +nDaysFirstInterest);
// alert('nDaysFirstInterest=' +nDaysFirstInterest +', fracAccrued=' +fractionAccrued);
} else {
nPeriods = Math.floor(daysDifference/(periodUnit*365.25));
nDaysAccrued = (nPeriods+1)*365.25*periodUnit -daysDifference;
fractionAccrued = nDaysAccrued/365.25;
nDaysFirstInterest = daysDifference -nPeriods*periodUnit*365.25;
if (interestWhen=='before') {
fractionAccrued = 1 -fractionAccrued;
}
}
nPeriods += 1;
data.nPeriods = nPeriods;
data.nDaysFirstInterest = nDaysFirstInterest;
var yearlyInterest = rvb_pow(1 +nominalInterest*periodUnit, 1/periodUnit) -1;
data.yearlyInterest = yearlyInterest;
couponSoFar = Math.exp(fractionAccrued*Math.log(1+yearlyInterest))*nominalValue -nominalValue;
if (interestWhen == 'before') couponSoFar = -couponSoFar;
// alert('yearlyInterest=' +yearlyInterest +', couponSoFar=' +couponSoFar);
data.couponSoFar = couponSoFar;
if (nPeriods > maxPeriods) {
errorElem.innerHTML = 'Verkort de periode tot maximaal ' +maxPeriods +' coupons.';
return;
}
var computeWhat = ff_checkedValue('rvb_bndroi_interestOrValue');
// data.computeWhat = computeWhat;
var marketValue = ff_getElementByName('rvb_bndroi_marketValue').value;
var effectiveInterest = ff_getElementByName('rvb_bndroi_effInterest').value;
if (computeWhat == 'interest') {
if (marketValue=='') {
errorElem.innerHTML = 'Voer marktwaarde in om effectief rendement te berekenen.';
ff_getElementByName('rvb_bndroi_marketValue').focus();
return;
}
try {
marketValue = eval(marketValue);
if (isNaN(marketValue)) throw new Error('');
} catch (err) {
errorElem.innerHTML = 'Fout tijdens lezen veld <em>Beurswaarde</em>.'
ff_getElementByName('rvb_bndroi_marketValue').focus();
return;
}
data.marketValue = marketValue;
}
else {
if (effectiveInterest=='') {
errorElem.innerHTML = 'Voer effectief rendement in om marktwaarde te berekenen';
ff_getElementByName('rvb_bndroi_effInterest').focus();
return;
} else {
try {
effectiveInterest = 0.01*eval(effectiveInterest);
if (isNaN(effectiveInterest)) throw new Error('');
} catch (err) {
errorElem.innerHTML = 'Fout tijdens lezen veld <em>Effectief rendement</em>.'
ff_getElementByName('rvb_bndroi_effInterest').focus();
return;
}
data.effectiveInterest = effectiveInterest;
}
}
var addInterestEl = ff_getElementByName('rvb_bndroi_addInterest');
var addInterest = addInterestEl.checked ? 1:0;
data.addInterest = addInterest;
var data4Cookie = JSON.clone(data);
data4Cookie.periodUnitTag = periodUnitTag;
data4Cookie.valueDateUnparsed = valueDateUnparsed;
data4Cookie.endDateUnparsed = endDateUnparsed;
data4Cookie.computeWhat = computeWhat;
if ('nDaysFirstInterest' in data4Cookie) delete data4Cookie.nDaysFirstInterest;
if ('nPeriods' in data4Cookie) delete data4Cookie.nPeriods;
if ('couponSoFar' in data4Cookie) delete data4Cookie.couponSoFar;
jQuery.JSONCookie(cookieName, data4Cookie, {path: '/'});
var dataString = JSON.stringify(data);
// alert(dataString);
jQuery.post('/otherCalculators/bondValueOrROI/bondValueOrROI.php', {data: dataString}, showBondValueOrROI, 'text');
break;
default:;
} // switch
} // ff_rvb_bndroi_compButton_action
function showBondValueOrROI(responseTxt, statusTxt)
{
// alert(responseTxt);
var response = JSON.parse(responseTxt);
var notFoundStr = 'niet gevonden';
var ROIYearlyElem = ff_getElementByName('rvb_bndroi_resultRoi');
var marketValueElem = ff_getElementByName('rvb_bndroi_resultMarketValue');
var valueWithCouponElem = ff_getElementByName('rvb_bndroi_valueWithCoupon');
var couponSoFarElem = ff_getElementByName('rvb_bndroi_couponSoFar');
var modifiedDurationElem = ff_getElementByName('rvb_bndroi_modDur');
var presentValCouponsOnlyElem = ff_getElementByName('rvb_bndroi_presValCoup');
if (response.gotError) {
var errorElem = ff_getDivByName('rvb_bndroi_Errormsg_txt');
errorElem.innerHTML = 'Fout tijdens berekening.';
return;
}
marketValueElem.value = response.valueWithoutCoupon;
valueWithCouponElem.value = response.valueWithCoupon;
couponSoFarElem.value = response.couponSoFar;
if (response.computeWhat=='interest') {
if ('ROIYearly' in response) ROIYearlyElem.value = response.ROIYearly; else ROIYearlyElem.value = notFoundStr;
if ('modifiedDuration' in response) modifiedDurationElem.value = response.modifiedDuration; else modifiedDurationElem.value = notFoundStr;
} else {
modifiedDurationElem.value = response.modifiedDuration;
}
if ('presentValueCouponsOnly' in response)
presentValCouponsOnlyElem.value = response.presentValueCouponsOnly; else presentValCouponsOnlyElem.value = notFoundStr;
} // end of function showBondValueOrROI(responseTxt, statusTxt)
function ff_setChecked(name,value,checked)
{if(arguments.length<3)checked=true;for(var i=0;i<ff_elements.length;i++)
if(ff_elements[i][2]==name){var e=ff_getElementByIndex(i);if(e.value==value){e.checked=checked;break;}}}
function ff_rvb_bndroi_interestWhen_init(element,condition)
{switch(condition){case 'formentry':var interestWhen="after";ff_setChecked('rvb_bndroi_interestWhen',interestWhen,'true');break;default:;}}
function ff_rvb_bndroi_interestOrValue_init(element,condition)
{switch(condition){case 'formentry':computeWhat="interest";ff_setChecked('rvb_bndroi_interestOrValue',computeWhat,'true');break;default:;}}
function ff_rvb_bndroi_interestOrValue_action(element,action)
{switch(action){case 'click':rvb_bndroi_which_radio();break;default:;}}
//-->
</script>