/**
 * @archivo track-list.js
 * /
importar EventTarget desde '../event-target';
importar {isEvented} desde '../mixins/evented';

/**
 * Funcionalidad común entre {@link TextTrackList}, {@link AudioTrackList} y
 * {@link VideoTrackList}
 *
 * @extiende EventTarget
 * /
clase TrackList extiende EventTarget {
  /**
   * Crear una instancia de esta clase
   *
   * @param {Pista[]} pistas
   * Una lista de pistas para inicializar la lista.
   *
   * @abstracto
   * /
  constructor(pistas = []) {
    súper();

    this.tracks_ = [];

    /**
     * @memberof TrackList
     * @miembro {número} longitud
     * El número actual de 'Pistas' en este Trackist.
     * @instancia
     * /
    Object.defineProperty(esto, 'longitud', {
      conseguir() {
        devuelve this.tracks_.length;
      }
    });

    para (sea i = 0; i < pistas.longitud; i++) {
      this.addTrack(pistas[i]);
    }
  }

  /**
   * Agrega una {@link Track} a la `TrackList`
   *
   * @param {Pista} pista
   * La pista de audio, video o texto para agregar a la lista.
   *
   * @fires TrackList#addtrack
   * /
  addTrack(pista) {
    const index = this.tracks_.length;

    if (!('' + índice en esto)) {
      Object.defineProperty(este, índice, {
        conseguir() {
          devuelve esto.pistas_[índice];
        }
      });
    }

    // No agregar pistas duplicadas
    if (this.tracks_.indexOf(pista) === -1) {
      this.tracks_.push(pista);
      /**
       * Se activa cuando se agrega una pista a una lista de pistas.
       *
       * @event TrackList#addtrack
       * @type {Objetivo del evento~Evento}
       * @propiedad {Pista} pista
       * Una referencia a la pista que se agregó.
       * /
      este.disparador({
        pista,
        tipo: 'añadir pista',
        objetivo: este
      });
    }

    /**
     * Se activa cuando se cambia la etiqueta de una pista.
     *
     * @event TrackList#addtrack
     * @type {Objetivo del evento~Evento}
     * @propiedad {Pista} pista
     * Una referencia a la pista que se agregó.
     * /
    track.labelchange_ = () => {
      este.disparador({
        pista,
        tipo: 'cambio de etiqueta',
        objetivo: este
      });
    };

    if (isEvented(pista)) {
      track.addEventListener('cambio de etiqueta', track.cambio de etiqueta_);
    }
  }

  /**
   * Eliminar una {@link Track} de `TrackList`
   *
   * @param {Pista} rtrack
   * La pista de audio, video o texto para eliminar de la lista.
   *
   * @fires TrackList#removetrack
   * /
  removeTrack(rtrack) {
    dejar un rastro;

    para (sea i = 0, l = esta.longitud; i < yo; i++) {
      if (esta[i] === pista) {
        pista = esto[i];
        si (pista.off) {
          Seguimiento de();
        }

        this.tracks_.splice(i, 1);

        romper;
      }
    }

    si (!pista) {
      devolver;
    }

    /**
     * Se activa cuando se elimina una pista de la lista de pistas.
     *
     * @event TrackList#removetrack
     * @type {Objetivo del evento~Evento}
     * @propiedad {Pista} pista
     * Una referencia a la pista que se eliminó.
     * /
    este.disparador({
      pista,
      tipo: 'eliminar pista',
      objetivo: este
    });
  }

  /**
   * Obtenga una pista de TrackList por una identificación de pistas
   *
   * @param {string} id - el id de la pista a obtener
   * @método getTrackById
   * @return {Pista}
   * @privado
   * /
  obtenerTrackById(id) {
    dejar resultado = nulo;

    para (sea i = 0, l = esta.longitud; i < yo; i++) {
      const track = esto[i];

      if (pista.id === id) {
        resultado = pista;
        romper;
      }
    }

    resultado devuelto;
  }
}

/**
 * Se activa cuando se selecciona/habilita una pista diferente.
 *
 * @event TrackList#cambio
 * @type {Objetivo del evento~Evento}
 * /

/**
 * Eventos que se pueden llamar con on + eventName. Consulte {@link EventHandler}.
 *
 * @propiedad {Objeto} TrackList#eventospermitidos_
 * @privado
 * /
TrackList.prototype.allowedEvents_ = {
  cambia cambia',
  añadirpista: 'añadirpista',
  removetrack: 'removetrack',
  cambio de etiqueta: 'cambio de etiqueta'
};

// emular el soporte de EventHandler de atributo para permitir la detección de características
para (evento const en TrackList.prototype.allowedEvents_) {
  TrackList.prototype['on' + evento] = null;
}

exportar TrackList por defecto;