var LineupPicker = {

  registerTeamPerson: function(id, name, positionCode, franchiseShortName, effectiveCapNumber, currentCapNumber) {
    var person = new Person(id, name, positionCode, franchiseShortName, effectiveCapNumber, currentCapNumber);
    LineupPicker._personPoolHash()[person.domId()] = person;
    LineupPicker._updateEmptySlot(person);
  },
  
  doneRegisteringTeamPeople: function() {
    LineupPicker._updateFooter(false);
    LineupPicker._updateNotices();
  },
  
  registerPoolPerson: function(id, name, positionCode, franchiseShortName, currentCapNumber) {
    var personDomId = 'person_' + id;
    var person = LineupPicker._personPoolHash()[personDomId];
    if (!person) {
      LineupPicker._personPoolHash()[personDomId] = new Person(id, name, positionCode, franchiseShortName, currentCapNumber, currentCapNumber); // effectiveCapNumber is the currentCapNumber in this case
    }
  },
  
  doneRegisteringPoolPeople: function(positionCode) {
    var slots = LineupPicker._allTeamMemberSlotsThatTakePosition(positionCode);
    slots.each(function(slot) {
      if (slot.person) {
        var poolPersonEl = $(slot.person.domId());
        if (poolPersonEl)
          poolPersonEl.hide();
      }
    });
    DOM.reclassifyEvenOddTableRows( $('player_pool_tables').select('table.' + positionCode)[0] );
  },
  
  setInitialErrorMessage: function(message) {
    $('lineup_error').update(message);
    $('lineup_error').show();
  },

  addToLineup: function(personDomId) {
    var person = LineupPicker._personPoolHash()[personDomId];
    var slot = LineupPicker._updateEmptySlot(person);
    
    if (slot) {
      var poolPersonEl = $(personDomId);
    
      poolPersonEl.hide();
      DOM.reclassifyEvenOddTableRows(poolPersonEl.up('.player_pool_table'));
    
      LineupPicker._updateFooter(true);
      new Effect.Highlight(slot, { duration: 1.5, endcolor: '#FDFBF8' });
    
      LineupPicker._updateNotices();
    }
    else {
      alert('No open lineup slots left!')
    }
  },
  
  removeFromLineup: function(dropLink) {
    slot = dropLink.up('.team_member');
    var person = slot.person;

    LineupPicker._blankOutSlot(slot);
    LineupPicker._updateFooter(true);
    LineupPicker._updateNotices();
    
    poolPersonEl = $(person.domId());
    if (poolPersonEl) {
      poolPersonEl.show();
      DOM.reclassifyEvenOddTableRows(poolPersonEl.up('.player_pool_table'));
    
      // tds = poolPersonEl.getElementsBySelector('td');
      // tds.each(function(td) { new Effect.Highlight(td, { duration: 1.5 }) } );
    }
  },

  beforeSaveLineup: function() {
    var form = LineupPicker._teamMembersDiv().getElementsByTagName('form')[0];
    var slots = LineupPicker._allTeamMemberSlots();
    slots.each(function(slot) {
      if (slot.person) {
        new Insertion.Bottom(form, '<input class="hidden_person_id" type="hidden" name="people[]" value="' + slot.person.id + '">');
      }
    });
  },
  
  afterSaveLineup: function() {
    var form = LineupPicker._teamMembersDiv().getElementsByTagName('form')[0];
    var elements = form.select('.hidden_person_id');
    elements.each(function(element) {
      element.remove();
    });
  },
  
  resetEffectiveCapNumbers: function(droppedPersonIds) {
    droppedPersonIds.each(
      function(id) {
        var person = LineupPicker._personPoolHash()['person_' + id];
        person.effectiveCapNumber = person.currentCapNumber;
      }
    );
  },
  
  // "PRIVATE" METHODS
  
  _personPoolHash: function() {
    if (LineupPicker._personPoolHash == null) {
      LineupPicker._personPoolHash = new Hash;
    }
    return LineupPicker._personPoolHash;
  },
  
  _teamMembersDiv: function() {
    return $('edit_team_members');
  },
  
  _allTeamMemberSlots: function() {
    return LineupPicker._teamMembersDiv().select('.team_member');
  },
  
  _allTeamMemberSlotsThatTakePosition: function(positionCode) {
    return LineupPicker._teamMembersDiv().select('.' + positionCode);
  },
  
  _nextEmptySlot: function(positionCode) {
    return LineupPicker._allTeamMemberSlotsThatTakePosition(positionCode).find( function(obj) { return obj.person == null; } );
  },
  
  _blankOutSlot: function(slotDiv) {
    slotDiv.person = null;
    slotDiv.getElementsByClassName('drop')[0].hide();
    slotDiv.getElementsByClassName('cap_number')[0].update('');
    slotDiv.getElementsByClassName('franchise_short_name')[0].update('');
    slotDiv.getElementsByClassName('name')[0].update('');
    slotDiv.getElementsByClassName('position_long_name')[0].show();
  },

  _validLineup: function() {
    var totalSalary = LineupPicker._calculateTotalSalary();
    return (totalSalary <= LineupPicker.salaryCap)
  },
  
  _updateEmptySlot: function(person) {
    var slot = LineupPicker._nextEmptySlot(person.positionCode);
    if (slot) {
     slot.person = person;
     slot.select('.position_long_name')[0].hide();
     slot.select('.name')[0].update(person.name);
     slot.select('.franchise_short_name')[0].update(person.franchiseShortName);
     slot.select('.cap_number')[0].update(person.effectiveCapNumber.toCurrency(0));
     slot.select('.drop')[0].show();
    }
    return slot;
  },
  
  _updateNotices: function() {
    if (LineupPicker._validLineup()) {
      $('lineup_error').hide();
      if (LineupPicker._isLineupDirty()) {
        $('lineup_notice').hide()
        DOM.enableLink('lineup_form_save_lineup_button');
        $('lineup_warning').show()
      }
      else {
        $('lineup_warning').hide();
        DOM.disableLink('lineup_form_save_lineup_button');
      }
    }
    else {
      $('lineup_warning').hide();
      $('lineup_notice').hide();
      DOM.disableLink('lineup_form_save_lineup_button');
      $('lineup_error').update('Total salary exceeds cap! Illegal lineup.');
      $('lineup_error').show();
    }
  },
  
  _isLineupDirty: function() {
    var person_ids = [];

    var slots = LineupPicker._allTeamMemberSlots();
    slots.each(function(slot) {
      if (slot.person) {
        person_ids.push(slot.person.id)
      }
    })
    
    return !LineupPicker.originalPersonIds.compare(person_ids);
  },
  
  _updateFooter: function(highlight) {
    var totalSalary = LineupPicker._calculateTotalSalary();
    var capSpace = LineupPicker.salaryCap - totalSalary
    
    totalSalaryEl = $('footer_total_salary')
    capSpaceEl = $('footer_cap_space')
    
    totalSalaryEl.update(totalSalary.toCurrency(0))
    if (capSpace < 0) {
      capSpaceEl.update('-' + capSpace.abs().toCurrency(0))
      capSpaceEl.addClassName('illegal')
    } 
    else {
      capSpaceEl.update(capSpace.toCurrency(0));
      capSpaceEl.removeClassName('illegal')
    }
    
    if (highlight) {
      new Effect.Highlight(totalSalaryEl, { duration: 1.5, endcolor: '#FDFBF8' })
      new Effect.Highlight(capSpaceEl, { duration: 1.5, endcolor: '#FDFBF8' })
    }
  },
  
  _calculateTotalSalary: function() {
    var slots = LineupPicker._allTeamMemberSlots();
    return slots.inject(0, function(acc, slot) { return acc + (slot.person ? slot.person.effectiveCapNumber : 0) })
  }
  
};
