var RFTF = function() {
  // private vars
  var reg_type;
  
  function apply_event_handlers() {
    reg_type.observe('change', function(e) {
      handle_group_visibility();
    });

    // + add a runner
    $('add_runner').observe('click', function(e) {
      e.element().fire('proxy:click');
    });
    
    $('add_runner').observe('proxy:click', function(e) {
      add_runner();
      this.scrollTo();
    });
  }
  
  function handle_group_visibility() {
    var gf = $('group_fields');
    if (reg_type.value == 'Family' || reg_type.value == 'Team') {
      gf.show();
    } else {
      $('group_fields').hide();
    }
  }
  
  // TODO: extract the common part of these two functions
  function handle_address_visibility() {
    $$("select.address_option").each(function(select) {
      var ra = select.up('div').next('div[name=runner_address]');
      if (select.value === 'New address') {
        ra.show();
      } else {
        ra.hide();
      }
    });
  }
  
  function address_select_changed(e) {
    var ra = this.up('div').next('div[name=runner_address]');
    if (this.value === 'New address') {
      ra.show();
    } else {
      ra.hide();
    }
  }
  
  function add_runner() {
    var runner = $$('div.runner').last().cloneNode(true);
    pimp_address_select(runner.getElementsBySelector('select.address_option')[0]);
    $('add_runner').insert({before: runner.show()});
  }
  
  function runner_addresses() {
    var addrs = $$('input.runner_address1');
    addrs = addrs.pluck('value');
    return addrs.uniq().grep(/[a-zA-Z]/);
  }
  
  function pimp_address_select(elem) {
    runner_addresses().each(function(addr) {
      elem.options[elem.options.length] = new Option(addr);
    });
    elem.observe('change', address_select_changed);
    elem.observe('proxy:change', address_select_changed);
  }
  
  return {
    init: function() {
      if (reg_type = $('person_kind')) {
        apply_event_handlers();
        handle_group_visibility();
        handle_address_visibility();
      }
    },
    group_visibility: function() {
      handle_group_visibility();
    }
  };
}();

document.observe('dom:loaded', RFTF.init);
