/*
 * Stamrecht bereken module
 *
 * Bereken stamrecht aan de hand van zelf in te geven waarden.
 *
 * @author Pieter Hensen <pieter at izi-services dot nl>
 * @name stamrecht-berekenaar
 * @package izi-framework
 */
var stamrechtBerekenaar = new Class({
  result: null,
  inputs: null,
  onttrekking_vanaf: 0,
  interest_percentage: 0,
  oprichtingskosten: 0,
  beginkapitaal: 0,
  overige_jaarlijkse_kosten: 0,
  periodieke_onttrekking: 0,
  interest: 0,
  eindkapitaal: 0,
  year: 1,

  initialize: function() {
    this.result = $('stamrechtResultaat');
    this.inputs = $('stamrechtBerekenaarForm').getElements('input[type=text]');
    this.onttrekking_vanaf = this.inputs[0].value.toFloat();
    this.interest_percentage = this.inputs[1].value.toFloat();
    this.beginkapitaal = this.inputs[2].value.toFloat();
    this.periodieke_onttrekking = this.inputs[3].value.toFloat();
    this.eindkapitaal = this.beginkapitaal;
    this.year = 1;
  },

  start: function() {
    this.initialize();
    if ( this.result.getChildren().length > 0 ) {
      var child;
      while ( child = this.result.getLast() ) this.result.removeChild( child );
    }

    this.addRow( ['Jaar', 'Beginkapitaal', 'Onttrekking', 'Rente', 'Eindkapitaal'], true );

    this.beginkapitaal -= this.oprichtingskosten;

    while( this.year <= 40 && this.beginkapitaal.round(2) > 0 ) {
      this.calculateYear();
      this.addRow( [this.year, this.numberFormat(this.beginkapitaal, 2, ',', '.'), this.numberFormat( this.periodieke_onttrekking, 2, ',', '.'), this.numberFormat( this.interest, 2, ',', '.'), this.numberFormat( this.eindkapitaal, 2, ',', '.')] );
      this.beginkapitaal = this.eindkapitaal;
      this.year++;
    }
  },

  calculateYear: function() {
    if( this.eindkapitaal <= 0 ) {
      this.beginkapitaal = 0;
      this.interest = 0;
      this.periodieke_onttrekking = 0;
      this.eindkapitaal = 0;
    } else {
      this.interest = this.beginkapitaal * ( this.interest_percentage / 100 );

      if( this.onttrekking_vanaf > this.year ) {
        this.eindkapitaal = ( this.beginkapitaal + this.interest ) - this.overige_jaarlijkse_kosten;
        this.periodieke_onttrekking = 0;
      } else {
        this.periodieke_onttrekking = this.inputs[3].value.toFloat();
        this.eindkapitaal = ( ( this.beginkapitaal + this.interest ) - this.periodieke_onttrekking ) - this.overige_jaarlijkse_kosten;
      }
      if( this.eindkapitaal <= 0 ) {
        this.eindkapitaal = ( this.interest ) - this.overige_jaarlijkse_kosten;
        if( this.eindkapitaal <= 0 ) {
          this.eindkapitaal = 0;
        }
        this.periodieke_onttrekking = this.beginkapitaal;
      }
    }
  },

  addField: function( content, header ) {
   if( header ) {
      var field = new Element('th');
    } else {
      var field = new Element('td');
    }
    field.appendText( content );

    return field;
  },

  addRow: function( fields, header ) {
    var row = new Element('tr');

    fields.each(function( field ) {
      row.adopt( this.addField( field, header ) );
    }.bind( this ) );

    if( header ) {
      var rowwrap = new Element('thead');
    } else {
      var rowwrap = new Element('tbody');
    }
    rowwrap.adopt( row );
    this.result.adopt( rowwrap );
  },
  
  numberFormat: function( number, decimals, dec_point, thousands_sep )
  {
    decimals = Math.abs(decimals) + 1 ? decimals : 2;
    dec_point = dec_point || ',';
    thousands_sep = thousands_sep || '.';
    
    var matches = /(-)?(\d+)(\.\d+)?/.exec((isNaN(number) ? 0 : number) + ''); // returns matches[1] as sign, matches[2] as numbers and matches[3] as decimals
    var remainder = matches[2].length > 3 ? matches[2].length % 3 : 0;
    return (matches[1] ? matches[1] : '') + (remainder ? matches[2].substr(0, remainder) + thousands_sep : '') + matches[2].substr(remainder).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep) +
        (decimals ? dec_point + (+matches[3] || 0).toFixed(decimals).substr(2) : '');
  }
});
