<?xml version="1.0" encoding="UTF-8"?>
<Module>
  <ModulePrefs
    title="Bond Calculator - FTLabs.com"
    title_url='http://www.ftlabs.com'
    description="A bond calculator gadget that can be used to calculate price, yield, duration, convextiy and much more for US Treasury, Municipal, Corporate, and Agency bonds."
    author="Financial Technology Laboratories, Inc."
    author_email='development.ftlabs@gmail.com'
    author_affiliation="Financial Technology Laboratories, Inc."
    thumbnail='http://hosting.gmodules.com/ig/gadgets/file/106197835191167200205/FISACalculatorGGThumbNail.png'
    screenshot='http://hosting.gmodules.com/ig/gadgets/file/106197835191167200205/FISACalculatorGGScreenShot.png'
    category='finance'

    width="280"
    height="380">

    <Require feature="tabs"/>
    <Require feature="setprefs"/>
    <Require feature="analytics"/>
  </ModulePrefs>

  <UserPref name="market" default_value="US/Treasury" datatype="hidden"/>

  <Content type="html"><![CDATA[
<style>
  body {
/*
    background-color: #F7F6F3;
*/
  }

  td.label {
    text-align: right;
    font-weight: bold;
    font-size: 12px;
  }
  td.data, td.data-number {
    font-weight: normal;
    font-size: 12px;
  }
  td.data-number {
    text-align: right;
  }

  .sub-label {
    font-size: 12px;
  }

  .section {
    color: #555555;
    background-color: #F7F6F3;
    font-weight: bold;
    font-size: 12px;
    text-align: center;

    border: solid 1px #CCCCCC;
    padding-top: 2px;
    padding-bottom: 3px;
    padding-left: 0px;
    padding-right: 0px;

    margin-top: 2px;
    margin-bottom: 2px;
  }

  .tablib_content_container__MODULE_ID__ {
    height: 110px;
    padding-top: 5px;
    padding-bottom: 5px;
    padding-left: 10px;
    padding-right: 10px;
    text-align: center;

    border-bottom: solid 1px #999999;
    border-left: solid 1px #999999;
    border-right: solid 1px #999999;
  }

  .tablib_selected__MODULE_ID__ {
  }
</style>

<script language="JavaScript">
  CALCULATE_URL = 'http://www.ftlabs.com/AJAX/Calculate';
  DEFAULTS_URL = 'http://www.ftlabs.com/AJAX/MarketDefaults';

  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");
  }

  _IG_RegisterOnloadHandler( init );
  _IG_Analytics( "UA-3128541-1", "/GG_BondCalculator" );

  calculatorFields = new Array(
    "market",
    "quoteType",
    "quoteValue",
    "settlementDate",
    "quantity",
    "interestRate",
    "interestFrequency",
    "maturityDate"
  );

  function calculate() {
    _IG_Analytics( "UA-3128541-1", "/GG_BondCalculator/Calculate" );

    var url = CALCULATE_URL;
    var queryString = "";

    for ( var i=0; i<calculatorFields.length; i++ ) {
      var fieldName = calculatorFields[i];
      var field = document.forms["FISACalculator"].elements[fieldName];
      var value = field.value.trim();

      if ( value.length > 0 ) {
        if ( queryString.length > 0 ) queryString += "&";
        queryString += fieldName + "=" + value;
      }
    }

    _IG_FetchXmlContent( url + "?" + queryString,
      function ( response ) {
        if ( response == null || typeof( response ) != "object" ||
          response.firstChild == null )
        {
          //invalid data
          return;
        }

        var rootNode = response.firstChild;

        var calculateNode = rootNode.firstChild;
        while ( calculateNode != null ) {
          if ( calculateNode.nodeName == "results" ) {
            handleResults( calculateNode );
          }
          else if ( calculateNode.nodeName == "validation-errors" ) {
            handleValidationErrors( calculateNode );
          }
          else if ( calculateNode.nodeName == "calculation-error" ) {
            handleCalculationErrors( calculateNode );
          }

          calculateNode = calculateNode.nextSibling;
        }
      }
    );
  }

  function handleResults( calculateNode ) {
    var resultNode = calculateNode.firstChild;
    while ( resultNode != null ) {
      var name = resultNode.nodeName;
      var element = document.getElementById( name );
      if ( element != null ) {
        element.innerHTML = resultNode.firstChild.nodeValue.trim();
      }

      resultNode = resultNode.nextSibling;
    }
  }

  function handleCalculationErrors( calculateNode ) {
    alert( calculateNode.firstChild.nodeValue.trim() );
  }

  function handleValidationErrors( calculateNode ) {
    var errorMessage = "";
    var errorNode = calculateNode.firstChild;
    while ( errorNode != null ) {

      if ( errorNode.nodeName == "validation-error" ) {
        var fieldName = errorNode.getAttribute( "name" );
        var code = errorNode.getAttribute( "code" );
        var message = errorNode.firstChild.nodeValue.trim();

        errorMessage += fieldName + " " + message + "\n";
      }

       errorNode = errorNode.nextSibling;
    }

    if ( errorMessage.length > 0 )
      alert( "Please correct the following errors.\n\n" + errorMessage );
  }

  function setDefaults( marketName ) {
    _IG_FetchXmlContent( DEFAULTS_URL + "?market=" + marketName,
      function ( response ) {
        if ( response == null || typeof( response ) != "object" ||
          response.firstChild == null )
        {
          //invalid data
          return;
        }

        var rootNode = response.firstChild;
        var defaultNode = rootNode.firstChild;
        while ( defaultNode != null ) {
          if ( defaultNode.nodeName == "settlementDate" ) {
            document.forms["FISACalculator"].elements["settlementDate"].value =
              defaultNode.firstChild.nodeValue;
          }

          defaultNode = defaultNode.nextSibling;
        }
      }
    );
  }

  var resultsTabs = null;
  var prefs = new _IG_Prefs();

  function init() {
    resultsTabs = new _IG_Tabs( __MODULE_ID__, "Pricing", _gel( "results-tabs" ) );
    resultsTabs.alignTabs( "left" );
    resultsTabs.addTab( "Pricing", "results-pricing" );
    resultsTabs.addTab( "Risk", "results-risk" );
    resultsTabs.addTab( "Return", "results-return" );

    var marketName = prefs.getString( "market" );
    _gel( "market" ).value = marketName;
    setDefaults( marketName );
  }

</script>

<form name="FISACalculator" style="margin:0px;">
<div style="text-align: center; padding-top: 4px;"><!-- width: 235px; -->
  <img src="http://hosting.gmodules.com/ig/gadgets/file/106197835191167200205/ftl_logo_text_263x40.png"/>


  <table border="0" cellspacing="0" cellpadding="2">
    <tr>
      <td class="label">Market :</td>
      <td class="data">
        <select name="market" onChange="
          prefs.set( 'market', this.value );
          setDefaults( this.value );">
          <option value="US/Treasury">US/Treasury</option>
          <option value="US/Corporate">US/Corporate</option>
          <option value="US/Agency">US/Agency</option>
          <option value="US/Municipal">US/Municipal</option>
        </select>
      </td>
    </tr>

    <tr>
      <td class="label">Quote :</td>
      <td class="data" nowrap="true"><!--  colspan="3" -->
        <select name="quoteType">
          <option value="P">Price</option>
          <option value="Y">Yield</option>
        </select>
        <span class="sub-label">&#160;of&#160;</span>
        <input type="text" name="quoteValue" size="5"/>
      </td>
    </tr>

    <tr>
      <td class="label">Settlement :</td>
      <td class="data">
        <input title="Format : mm/dd/yyyy" type="text" name="settlementDate" size="8" maxLength="10"/>
      </td>
    </tr>

    <tr>
      <td class="label">Quantity :</td>
      <td class="data">
        <input type="text" name="quantity" size="8" maxLength="10" value="1"/>
      </td>
    </tr>

    <tr>
      <td class="label">Coupon :</td>
      <td class="data">
        <input type="text" name="interestRate" size="3" maxlength="10"/>
        <select name="interestFrequency">
          <option value="2">Semi-Ann.</option>
          <option value="4">Quarterly</option>
          <option value="1">Annual</option>
          <option value="12">Monthly</option>
        </select>
      </td>
    </tr>

    <tr>
      <td class="label">Maturity :</td>
      <td class="data">
        <input title="Format : mm/dd/yyyy" type="text" name="maturityDate" size="8"/>
      </td>
    </tr>
  </table>

<!--
    <tr>
      <td colspan="2" style="padding-left: 0px; padding-right: 0px;">
        <div class="section">Results</div>
      </td>
    </tr>
    <tr>
      <td colspan="2">
-->

    <div id="results-tabs" style="margin-top: 4px;"></div>
    <div id="results-pricing">
      <table border="0" cellspacing="0" cellpadding="2" width="200px">
        <tr>
          <td class="label">Yield :</td>
          <td class="data" width="100%"><span id="yield"></span></td>
        </tr>
        <tr>
          <td class="label" style="border-bottom: solid 1px black;">Price :</td>
          <td class="data" style="border-bottom: solid 1px black;"><span id="price"/>&#160;</td>
        </tr>
        <tr>
          <td class="label" style="padding-top: 3px;">Principal :</td>
          <td class="data-number"><span id="principal"/></td>
        </tr>
        <tr>
          <td class="label" style="border-bottom: solid 1px #555555;" nowrap="true">Accrued Int. :</td>
          <td class="data-number" style="border-bottom: solid 1px #555555;"><span id="accruedInterest">&#160;</span></td>
        </tr>
        <tr>
          <td class="label">Total :</td>
          <td class="data-number">&#160;<span id="total"/></td>
        </tr>
      </table>
    </div>

    <div id="results-risk">
      <table border="0" cellspacing="0" cellpadding="2" width="200px">
        <tr>
          <td class="label">Convexity :</td>
          <td class="data" width="100%"><span id="convexity"></span></td>
        </tr>
        <tr>
          <td class="label" title="Macaulay Duration" nowrap="true">Duration :</td>
          <td class="data"><span id="macaulayDuration"/>&#160;</td>
        </tr>
        <tr>
          <td class="label" title="Modified Duration" nowrap="true">Mod. Duration :</td>
          <td class="data"><span id="modifiedDuration"/>&#160;</td>
        </tr>
        <tr>
          <td class="label" title="The average change in price value for a basis point change in yield." nowrap="true">PVBP :</td>
          <td class="data"><span id="pv1bp"/>&#160;</td>
        </tr>
      </table>
    </div>

    <div id="results-return">
      <table border="0" cellspacing="0" cellpadding="2" width="200px">
        <tr>
          <td class="label" nowrap="true">Face Value :</td>
          <td class="data-number" width="100%"><span id="faceValue"/></td>
        </tr>
        <tr>
          <td class="label" title="Total Interest Payments" nowrap="true">Int. Payments :</td>
          <td class="data-number"><span id="couponPayments"/></td>
        </tr>
        <tr>
          <td class="label" style="border-bottom: solid 1px #555555;" nowrap="true" title="Interest on Interest">Int. On Int. :</td>
          <td class="data-number" style="border-bottom: solid 1px #555555;"><span id="interestOnInterest">&#160;</span></td>
        </tr>
        <tr>
          <td class="label">Total :</td>
          <td class="data-number">&#160;<span id="totalIncome"/></td>
        </tr>
      </table>
    </div>

<!--
      </td>
    </tr>
  </table>
-->

  <div style="margin-top: 5px;">
    <input style="width: 100px;" type="button" name="calculateButton" value="Calculate" onClick="calculate();"/>
  </div>


<!--
  <table border="0" cellspacing="0" cellpadding="1" width="100%" style="margin-top: 5px;">
    <tr>
      <td>
<img src="http://hosting.gmodules.com/ig/gadgets/file/106197835191167200205/ftltag.png"/>
      </td>
      <td style="text-align: right; vertical-align: middle;">
<input style="width: 100px;" type="button" name="calculateButton" value="Calculate" onClick="calculate();"/>
      </td>
    </tr>
  </table>
-->
</div>
</form>]]></Content>
</Module>





























