var kantonrechterFormule = new Class(
{
  element: null,
  mode: 'normal',
  
  initialize: function ( mode )
  {
    this.mode = mode;
    document.addEvent( 'domready', this.boot.bind(this) );
  },
  
  boot: function ()
  {
    this.element = document.getElement( 'div.kantonrechterberekenaar' );
    this.element.getElement('form').addEvent( 'submit', function ( e ) {
      var event = new Event( e );
      event.preventDefault();
      this.handleSubmit();
    }.bind(this) );
  },
  
  checkInput: function ( silent )
  {
    var leeftijd = this.element.getElement( 'input[name=leeftijd]' ).get( 'value' ).toInt();
    var dienstverband = this.element.getElement( 'input[name=dienstverband]' ).get( 'value' ).toInt();
    var salaris = this.element.getElement( 'input[name=salaris]' ).get( 'value' ).toInt();
    var verschil = ( leeftijd - dienstverband );
    
    if (!dienstverband || !salaris || !leeftijd ) {
      if ( !silent ) alert( "U moet alle velden invullen" );
      return false;
    }
    
    if ( verschil < 0 ) {
      if ( !silent ) alert( "Heeft u misschien leeftijd en dienstverband omgedraaid?" );
      return false;
    }
    
    if ( verschil < 16 ) {
      if ( !silent ) alert( "Volgens de huidige waardes bent u voor uw 16e begonnen met werken." );
      return false;
    }
  
    if ( leeftijd > 66 ) {
      if ( !silent ) alert( "De opgegeven leeftijd is boven de 65" );
      return false;
    }
    
    if ( dienstverband > 50 ) {
      if ( !silent ) alert( "Het opgegeven aantal jaren dienstverband is te hoog." );
      return false;
    }
    
    return true;
  },
  
  handleSubmit: function ()
  {
    var result = this.checkInput();
    if ( !result ) return;
    if ( $('kantonrechterresulttable') ) $('kantonrechterresulttable').dispose();
    if ( $('kantonrechterresultmessage') ) $('kantonrechterresultmessage').dispose();
    var amount = this.calculate();
    var oldAmount = this.calculate( true );
    $('kantonResult').set( 'html', '&euro; ' + this.numberFormat( amount, 0 ) + ',-');
    this.drawMessage( amount );
    if ( this.mode != 'simple' ) this.drawTable( oldAmount, amount );
    var container = this.element.getElement( 'div.resultContainer' );
    if ( container.getStyle( 'display' ) == 'none' ) {
      container.setStyle( 'height', 0 );
      container.setStyle( 'display', 'block' );
      if ( this.mode == 'simple' ) {
        container.tween( 'height', [0, 160] );
      } else {
        container.tween( 'height', [0, 370] );
      }
    }
  },

  drawTable: function ( oldAmount, amount )
  {
    var table = new Element( 'table', {'class':'kantonrechterresult', 'id':'kantonrechterresulttable'} );
    var thead = new Element( 'thead' );
    var tr = new Element('tr');
    Element( 'th', {'html':'Correctie factor'} ).inject( tr );
    Element( 'th', {'html':'Oude kantonrechtersformule'} ).inject( tr );
    Element( 'th', {'html':'Nieuwe kantonrechtersformule'} ).inject( tr );
    tr.inject( thead );
    thead.inject( table );

    var tbody = new Element( 'tbody' );
    var factors = new Array( 0.5, 0.75, 1, 1.5, 2 );
    factors.each( function( factor, index ) {
      var trClass = (index % 2 === 0) ? 'even': 'odd';
      tr = new Element('tr', {'class':trClass} );
      if ( factor == 1 ) tr.addClass( 'bold' );
      Element( 'td', {'html':this.numberFormat(factor, 2)} ).inject( tr );
      Element( 'td', {'html':'&euro; ' + this.numberFormat(factor * oldAmount, 0) } ).inject( tr );
      Element( 'td', {'html':'&euro; ' + this.numberFormat(factor * amount, 0) } ).inject( tr );
      tr.inject( tbody );
    }.bind(this) );

    tbody.inject( table );

    var container = this.element.getElement( 'div.resultContainer' );
    table.inject( container, 'bottom' );
  },

  drawMessage: function ( amount )
  {
    var message;
    if ( amount > 70000 ) {
      message = "Fiscaal gezien is het oprichten van een <a href='/stamrecht-bv/'>stamrecht BV</a> het voordeligst voor de gouden handdruk. Wilt u meer informatie over <a href='/gouden-handdruk/wat-te-doen-met-uw-gouden-handdruk.html'>wat te doen met uw gouden handdruk</a>?";
    } else if ( amount > 25000 ) {
      message = "Fiscaal gezien is het afsluiten van een <a href='/gouden-handdruk/wat-te-doen-met-uw-gouden-handdruk/lijfrente-verzekering.html'>lijfrente verzekering</a> het voordeligst voor de gouden handdruk. Wilt u meer informatie over <a href='/gouden-handdruk/wat-te-doen-met-uw-gouden-handdruk.html' >wat te doen met uw gouden handdruk</a>?";
    } else {
      message = "Fiscaal gezien is het  <a href='/gouden-handdruk/wat-te-doen-met-uw-gouden-handdruk/direct-afrekenen-met-de-belastingdienst.html'>direct laten uitkeren</a> het voordeligst voor de gouden handdruk. Wilt u meer informatie over <a href='/gouden-handdruk/wat-te-doen-met-uw-gouden-handdruk.html'>wat te doen met uw gouden handdruk</a>?";
    }
    var container = this.element.getElement( 'div.resultContainer' );
    Element( 'p', {'html':message, 'id':'kantonrechterresultmessage'} ).inject( container, 'bottom' );
  },

  calculate: function ( oldversion )
  {
    var leeftijd = this.element.getElement( 'input[name=leeftijd]' ).get( 'value' ).toInt();
    var dienstverband = this.element.getElement( 'input[name=dienstverband]' ).get( 'value' ).toInt();
    var salaris = this.element.getElement( 'input[name=salaris]' ).get( 'value' ).replace(/[^0-9,]/g, '').toInt();
    var versie = oldversion ? 2008 : 2009;
    
    var startLeeftijd = leeftijd - dienstverband;
    var jaren = 0;
    
    if ( versie == 2008 ) {
      for ( i = startLeeftijd + 1 ; i <= leeftijd ; i++ ) {
        if ( i <= 40 )
          jaren += 1;
        if ( i > 40 && i <= 50 )
          jaren += 1.5;
        if ( i> 50 )
          jaren += 2;
      }    
    } else {
      for ( i = startLeeftijd + 1 ; i <= leeftijd ; i++ ) {
        if ( i <= 35 )
          jaren +=  0.5;
        if ( i > 35 && i <= 45 )
          jaren += 1;
        if ( i > 45 && i <= 55 )
          jaren += 1.5;
        if ( i> 55 )
          jaren += 2;
      }      
    }
    return salaris * jaren;
  },
  
  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) : '');
  }
} );
