/* import-globals-from ../common.js */
/* import-globals-from ../events.js */
/* import-globals-from ../states.js */

/**
 * Focus hyperlink invoker.
 *
 * @param aID             [in] hyperlink identifier
 * @param aSelectedAfter  [in] specifies if hyperlink is selected/focused after
 *                          the focus
 */
function focusLink(aID, aSelectedAfter) {
  this.node = getNode(aID);
  this.accessible = getAccessible(this.node);

  this.eventSeq = [];
  this.unexpectedEventSeq = [];

  var checker = new invokerChecker(EVENT_FOCUS, this.accessible);
  if (aSelectedAfter) {
    this.eventSeq.push(checker);
  } else {
    this.unexpectedEventSeq.push(checker);
  }

  this.invoke = function focusLink_invoke() {
    var expectedStates = aSelectedAfter ? STATE_FOCUSABLE : 0;
    var unexpectedStates =
      (!aSelectedAfter ? STATE_FOCUSABLE : 0) | STATE_FOCUSED;
    testStates(aID, expectedStates, 0, unexpectedStates, 0);

    this.node.focus();
  };

  this.finalCheck = function focusLink_finalCheck() {
    var expectedStates = aSelectedAfter ? STATE_FOCUSABLE | STATE_FOCUSED : 0;
    var unexpectedStates = !aSelectedAfter
      ? STATE_FOCUSABLE | STATE_FOCUSED
      : 0;
    testStates(aID, expectedStates, 0, unexpectedStates, 0);
  };

  this.getID = function focusLink_getID() {
    return "focus hyperlink " + prettyName(aID);
  };
}
