MyIRR

by ilancopelyn

HTML

<script src="http://cdn.sencha.com/ext/gpl/4.2.0/ext-all-dev.js"></script>
<!--
NOTE: In order to try different Ext versions you have to manually change "External Resources" on the left. 

CDN urls:
4.2.1 = http://cdn.sencha.com/ext/gpl/4.2.1/ext-all-dev.js (breaks - see javascript console)
4.2.0 = http://cdn.sencha.com/ext/gpl/4.2.0/ext-all-dev.js (ok but slow on switching)
4.1.1 = http://cdn.sencha.io/ext-4.1.1-gpl/ext-all.js (ok but old, and neptune theme broken)
-->

CSS

/*
Comment / uncomment appropriate CSS resources depending on the EXT framework version in use - see External Resources, and notes in HTML window
*/
@import 'http://cdn.sencha.com/ext/gpl/4.2.0/resources/css/ext-all-neptune.css'
/*
@import 'http://cdn.sencha.com/ext/gpl/4.2.1/resources/css/ext-all-neptune.css'
@import 'http://cdn.sencha.io/ext-4.1.1-gpl/resources/css/ext-all.css'
*/

JavaScript

Ext.override(Ext.Component, {
    toJQuery: function () {
        return $(this.getEl().dom);
    }
});

function Round(number, digits) {
    var multiple = Math.pow(10, digits);
    var rndedNum = Math.round(number * multiple) / multiple;
    return rndedNum;
};

function SAMoney(v) {
    /*if (typeof v === 'undefined')
        return '';*/
    if (v == null)
        return '';
    else if (isNaN(v))
        return '';
    else
        return Ext.util.Format.currency(v, 'R', 2);
}

function GreenRedSAMoney(v) {
    if (v == null) {
        return v;
    }

    if (v == 0) {
        return SAMoney(v);
    } else if (v > 0) {
        return '<span style="color:green;">' + SAMoney(v) + '</span>';
    } else {
        return '<span style="color:red;">' + SAMoney(v) + '</span>';
    }
}

function GreenRedNumber(v) {
    if (v == null) {
        return v;
    }

    if (v == 0) {
        return '0';
    } else if (v > 0) {
        return '<span style="color:green;">' + Round(v, 2) + '</span>';
    } else {
        return '<span style="color:red;">' + Round(v, 2) + '</span>';
    }
}

function GreenRedPercent(v) {
    if (v == null) {
        return v;
    }

    if (v == 0) {
        return '0%';
    } else if (v > 0) {
        return '<span style="color:green;">' + Round(v * 100, 2) + '%</span>';
    } else {
        return '<span style="color:red;">' + Round(v * 100, 2) + '%</span>';
    }
}

var IRRPerformanceGrid = (function () {
    var me = {};

    me.SelectedMenu = [],    // NOTE: 1-based index
    me.SubMenus = ['Summary', 'Source of Return', 'Change During Period', 'Opening &amp; Closing Positions'];
    me.SubMenuNodes = {};

    // Setup in init()
    me.Columns = [];
    me.performanceGrid = [];
    me.performanceGridBottom = [];
    me.performanceGridPeriod = [];

    me.init = function (irrMenu, performanceGrid, performanceGridBottom) {
        // Setup pointers to submenu DOM elements
        if (me.SubMenuNodes[irrMenu.id] === undefined) {
           ...