var Address = new Class({

  Implements: Options,

  options: {
    "denyOtherCountry": false
  },

  formCheck: null,

  straat: null,
  huisnummer: null,
  postcode: null,

  initialize: function ( options )
  {
    this.setOptions( options );
    if( $('land') ) $('land').addEvent('change', this.changeCountry.bind( this ) );
    if( $('checkAddress') ) $('checkAddress').addEvent('click', this.checkAddress.bind( this ) );
    document.getElement('body').adopt( new Element('select', { 'id': 'sugest' } ) );
    
    // Begint met NL
    $('straat').set( 'readonly', true );
    $('woonplaats').set( 'readonly', true );
  },

  registerFormCheck: function ( formCheckInstance )
  {
    this.formCheck = formCheckInstance;
  },

  changeCountry: function ()
  {
    this.setStatus( false, 'reset' );
    if ( $('warning') ) {
      if( $('submit_button') ) $('submit_button').fade( 'in' );
      $('warning').destroy();
    }

    if ( $('landOther') ) $('landOther').destroy();

    if( $('land').get('value') == "be" || $('land').get('value') == "lu" ) {
      $('provincie').getParent('tr').setStyle('display', '' );
      $('straat').set( 'readonly', false );
      $('straat').removeClass('disabled');
      $('woonplaats').set( 'readonly', true );
      $('provincie').set( 'readonly', true );

      // Move the check link
      $('controle_row').inject( $('straat_row'), 'after' );

      // Register addressfields
      var fieldArray = ['postcode', 'huisnummer', 'huisnummer_toevoeging', 'straat', 'woonplaats'];
      $each( fieldArray, function ( element ) {
        if( $( element ) ) {
          this.formCheck.register( $( element ) );
        }
      }.bind(this));
    } else if( $('land').get('value') == "nl" ) {
      $('provincie').getParent('tr').setStyle('display', 'none' );
      $('provincie').set('value', '');
      $('straat').set( 'readonly', true );
      $('straat').addClass('disabled');
      $('woonplaats').set( 'readonly', true );

      // Move the check link
      $('controle_row').inject( $('huisnummer_row'), 'after' );

      // Register addressfields
      var fieldArray = ['postcode', 'huisnummer', 'huisnummer_toevoeging', 'straat', 'woonplaats', 'provincie'];
      $each( fieldArray, function ( element ) { 
        if( $( element ) ) { 
          this.formCheck.register( $( element ) );
        } 
      }.bind(this));
    } else {
      if ( this.options.denyOtherCountry ) {
        if( $('submit_button') ) $('submit_button').fade( 'out' );
        if ( !$('warning') ) {
          var warning_message = $('warning_message') ? $('warning_message').get('value') : 'Helaas verzenden wij alleen naar adressen binnen Nederland, Belgi&euml; of Luxemburg. Je kunt natuurlijk wel lid worden van de <a href="http://www.johnfrieda.nl/eliteclub" target="_blank">John Frieda Elite Club</a>.';
          var warning = new Element( 'div', {'class':'notice', 'html': warning_message } );
          var tr = $('land').getParent( 'tr' );
          var newTr = new Element( 'tr', { 'id':'warning' } );
          var newTd = new Element( 'td', { 'colspan' : 2 } );
          newTd.inject( newTr );
          warning.inject( newTd );
          newTr.inject( tr, 'after' );

          // Deregister addressfields
          var fieldArray = ['postcode', 'huisnummer', 'huisnummer_toevoeging', 'straat', 'woonplaats', 'provincie'];
          $each( fieldArray, function ( element ) {
            if( $( element ) ) {
              $( element ).validation = [];
              this.formCheck.dispose( $( element ) );
            }
          }.bind(this));
        }
      } else {
        var txt = 'namelijk..';
        var input = new Element( 'input', {'name':$('land').get('name'), 'value':txt, 'id':'landOther', 'style':'width: 87px; margin-left: 3px; font-family: Tahoma, verdana, sans-serif; font-size: 100%;', 'type':'text'} );
        input.inject( $('land'), 'after' );
        input.addEvent( 'focus', function () { if ( input.get('value') == txt ) input.set( 'value', '' ); } );
        input.addEvent( 'blur', function () { if ( input.get('value') == '' ) input.set( 'value', txt ); } );
        input.highlight();
      }
    }

    $('postcode').set('value', '');
    $('huisnummer').set('value', '');
    $('straat').set('value', '');
    $('woonplaats').set('value', '');
    $('provincie').set('value', '');
  },

  checkAddress: function ( event )
  {
    event.stop();

    if( $('land').get('value') == "nl" ) {
      if( $('huisnummer').get('value') != this.huisnummer || $('postcode').get('value') != this.postcode ) {
        this.getAddress();
      }
    } else if( $('land').get('value') == "be" || $('land').get('value') == "lu" ) {
      if( $('straat').get('value') != this.straat || $('huisnummer').get('value') != this.huisnummer || $('postcode').get('value') != this.postcode ) {
        this.getAddress();
      }
    }
  },

  getAddress: function ()
  {
    if( $('land').get('value') == "nl" ) {
      if( $('postcode').get('value') && $('huisnummer').get('value') ) {
        this.setStatus( false, "loading" );

        new Request.JSON({ url: '/service/Webservices/address', method: 'post',
          onSuccess: function ( response ) {
            if( response ) {
              if( response.success ) {
                this.setAddress( response.data );
              } else {
                this.setStatus( false, "error" );
              }
            }
          }.bind(this)
        }).send('address=' + $('postcode').get('value') + $('huisnummer').get('value') );
      } else {
        alert('De velden Postcode en Huisnummer zijn verplicht');
      }
    } else if( $('land').get('value') == "be" || $('land').get('value') == "lu" ) {
      if( $('postcode').get('value') && $('huisnummer').get('value') && $('straat').get('value') ) {
        this.setStatus( false, "reset" );
        this.setStatus( "straat", "loading" );

        new Request.JSON({ url: '/service/Webservices/international-address', method: 'post',
          onSuccess: function ( response ) {
            if( response ) {
              if( response.success ) {
                $('sugest').empty();

                if( !response.data.result.item.length ) {
                  this.setInternationalAddress( response.data.result.item.address );
                } else {
									$each( response.data.result.item, function ( item, index ) {
										var optionElement = new Element('option', { value: item.address.street, text: item.address.street } );
										optionElement.store( 'address', item.address );
										$('sugest').adopt( optionElement );
									}.bind(this));

                  $('sugest').addEvent('click', function ( event ) {
                    $('sugest').setStyle( 'display', 'none' );
                    this.setInternationalAddress( $('sugest').getElement('option[selected]').retrieve('address') );
                  }.bind(this));

                  $('sugest').set('size', response.data.result.item.length < 8 ? response.data.result.item.length : 7 );
                  var coordinates = $('straat').getCoordinates();
                  $('sugest').setStyles({ display: 'block', top: coordinates.top + $('straat').getSize().y, left: coordinates.left });
                }
              }
            } else {
              this.setStatus( false, "error" );
            }
          }.bind(this)
        }).send('street=' + $('straat').get('value') + '&housenr=' + $('huisnummer').get('value') + '&postcode=' + $('postcode').get('value') + '&country=' + $('land').get('value') );
      } else {
        alert('De velden Straat, Huisnummer en Postcode zijn verplicht');
      }
    }
  },

  setAddress: function ( address )
  {
    this.postcode = $('postcode').get('value');
    this.huisnummer = $('huisnummer').get('value');

    this.setStatus( "straat", "ok" );
    $('straat').set('value', address.straatnaam );

    this.setStatus( "woonplaats", "ok" );
    $('woonplaats').set('value', address.plaatsnaam.toLowerCase().capitalize() );
  },

  setInternationalAddress: function ( address )
  {
    this.postcode = address.postcode;
    this.straat = address.street;
    this.huisnummer = $('huisnummer').get('value');

    $('postcode').set('value', address.postcode );

    this.setStatus( "straat", "ok" );
    $('straat').set('value', address.street );

    this.setStatus( "woonplaats", "ok" );
    $('woonplaats').set('value', address.locality.toLowerCase().capitalize() );

    this.setStatus( "provincie", "ok" );
    $('provincie').set('value', address.province.toLowerCase().capitalize() );
  },

  setStatus: function ( element, status )
  {
    if( !element ) {
      if( status == "loading" ) {
        $('straat_loader').setStyle('display', 'inline');
        $('straat_tick').setStyle('display', 'none');
        $('straat_cross').setStyle('display', 'none');

        $('woonplaats_loader').setStyle('display', 'inline');
        $('woonplaats_tick').setStyle('display', 'none');
        $('woonplaats_cross').setStyle('display', 'none');

        $('provincie_loader').setStyle('display', 'inline');
        $('provincie_tick').setStyle('display', 'none');
        $('provincie_cross').setStyle('display', 'none');
      } else if( status == "ok" ) {
        $('straat_loader').setStyle('display', 'none');
        $('straat_tick').setStyle('display', 'inline');
        $('straat_cross').setStyle('display', 'none');

        $('woonplaats_loader').setStyle('display', 'none');
        $('woonplaats_tick').setStyle('display', 'inline');
        $('woonplaats_cross').setStyle('display', 'none');

        $('provincie_loader').setStyle('display', 'none');
        $('provincie_tick').setStyle('display', 'inline');
        $('provincie_cross').setStyle('display', 'none');
      } else if( status == "error" ) {
        $('straat_loader').setStyle('display', 'none');
        $('straat_tick').setStyle('display', 'none');
        $('straat_cross').setStyle('display', 'inline');

        $('woonplaats_loader').setStyle('display', 'none');
        $('woonplaats_tick').setStyle('display', 'none');
        $('woonplaats_cross').setStyle('display', 'inline');
        $('woonplaats').set('value', '');

        $('provincie_loader').setStyle('display', 'none');
        $('provincie_tick').setStyle('display', 'none');
        $('provincie_cross').setStyle('display', 'inline');
        $('provincie').set('value', '');
      } else if( status == "reset" ) {
        $('straat_loader').setStyle('display', 'none');
        $('straat_tick').setStyle('display', 'none');
        $('straat_cross').setStyle('display', 'none');

        $('woonplaats_loader').setStyle('display', 'none');
        $('woonplaats_tick').setStyle('display', 'none');
        $('woonplaats_cross').setStyle('display', 'none');

        $('provincie_loader').setStyle('display', 'none');
        $('provincie_tick').setStyle('display', 'none');
        $('provincie_cross').setStyle('display', 'none');
      }
    } else {
      if( status == "loading" ) {
        $( element + '_loader').setStyle('display', 'inline');
        $( element + '_tick').setStyle('display', 'none');
        $( element + '_cross').setStyle('display', 'none');
      } else if( status == "ok" ) {
        $( element + '_loader').setStyle('display', 'none');
        $( element + '_tick').setStyle('display', 'inline');
        $( element + '_cross').setStyle('display', 'none');
      } else if( status == "error" ) {
        $( element + '_loader').setStyle('display', 'none');
        $( element + '_tick').setStyle('display', 'none');
        $( element + '_cross').setStyle('display', 'inline');
        $( element ).set('value', '');
      }
    }
  }
});

