(function ($) {
AblePlayer.prototype.updateMeta = function (time) { if (this.hasMeta) { if (this.metaType === 'text') { this.$metaDiv.show(); this.showMeta(time || this.elapsed); } else { this.showMeta(time || this.elapsed); } } }; AblePlayer.prototype.showMeta = function(now) { var tempSelectors, m, thisMeta, cues, cueText, cueLines, i, line, showDuration, focusTarget; tempSelectors = []; if (this.meta.length >= 1) { cues = this.meta; } else { cues = []; } for (m = 0; m < cues.length; m++) { if ((cues[m].start <= now) && (cues[m].end > now)) { thisMeta = m; break; } } if (typeof thisMeta !== 'undefined') { if (this.currentMeta !== thisMeta) { if (this.metaType === 'text') { // it's time to load the new metadata cue into the container div this.$metaDiv.html(this.flattenCueForMeta(cues[thisMeta]).replace('\n', '<br>')); } else if (this.metaType === 'selector') { // it's time to show content referenced by the designated selector(s) cueText = this.flattenCueForMeta(cues[thisMeta]); cueLines = cueText.split('\n'); for (i=0; i<cueLines.length; i++) { line = $.trim(cueLines[i]); if (line.toLowerCase().trim() === 'pause') { // don't show big play button when pausing via metadata this.hideBigPlayButton = true; this.pauseMedia(); } else if (line.toLowerCase().substring(0,6) == 'focus:') { focusTarget = line.substring(6).trim(); if ($(focusTarget).length) { $(focusTarget).focus(); } } else { if ($(line).length) { // selector exists showDuration = parseInt($(line).attr('data-duration')); if (typeof showDuration !== 'undefined' && !isNaN(showDuration)) { $(line).show().delay(showDuration).fadeOut(); } else { // no duration specified. Just show the element until end time specified in VTT file $(line).show(); } // add to array of visible selectors so it can be hidden at end time this.visibleSelectors.push(line); tempSelectors.push(line); } } } // now step through this.visibleSelectors and remove anything that's stale if (this.visibleSelectors && this.visibleSelectors.length) { if (this.visibleSelectors.length !== tempSelectors.length) { for (i=this.visibleSelectors.length-1; i>=0; i--) { if ($.inArray(this.visibleSelectors[i],tempSelectors) == -1) { $(this.visibleSelectors[i]).hide(); this.visibleSelectors.splice(i,1); } } } } } this.currentMeta = thisMeta; } } else { // there is currently no metadata. Empty stale content if (typeof this.$metaDiv !== 'undefined') { this.$metaDiv.html(''); } if (this.visibleSelectors && this.visibleSelectors.length) { for (i=0; i<this.visibleSelectors.length; i++) { $(this.visibleSelectors[i]).hide(); } // reset array this.visibleSelectors = []; } this.currentMeta = -1; } }; // Takes a cue and returns the metadata text to display for it. AblePlayer.prototype.flattenCueForMeta = function (cue) { var result = []; var flattenComponent = function (component) { var result = [], ii; if (component.type === 'string') { result.push(component.value); } else if (component.type === 'v') { result.push('[' + component.value + ']'); for (ii = 0; ii < component.children.length; ii++) { result.push(flattenComponent(component.children[ii])); } } else { for (ii = 0; ii < component.children.length; ii++) { result.push(flattenComponent(component.children[ii])); } } return result.join(''); } for (var ii = 0; ii < cue.components.children.length; ii++) { result.push(flattenComponent(cue.components.children[ii])); } return result.join(''); };
})(jQuery);